/** * Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT * All rights reserved. Use is subject to license terms. See LICENSE.TXT */ package org.diirt.datasource.sample; import org.diirt.vtype.VStatistics; import org.diirt.datasource.sim.SimulationDataSource; import org.diirt.datasource.PVReader; import org.diirt.datasource.PVManager; import org.diirt.datasource.PVReaderListener; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; import static org.diirt.datasource.ExpressionLanguage.*; import org.diirt.datasource.PVReaderEvent; import static org.diirt.datasource.vtype.ExpressionLanguage.*; import static org.diirt.util.concurrent.Executors.swingEDT; import static org.diirt.util.time.TimeDuration.*; /** * * @author carcassi */ public class MockTablePVFrame2 extends javax.swing.JFrame { /** Creates new form MockPVFrame */ public MockTablePVFrame2() { PVManager.setDefaultNotificationExecutor(swingEDT()); PVManager.setDefaultDataSource(SimulationDataSource.simulatedData()); initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); pvTable = new javax.swing.JTable(); jLabel6 = new javax.swing.JLabel(); scanRateSpinner = new javax.swing.JSpinner(); createPVButton = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); nPVSpinner = new javax.swing.JSpinner(); jLabel3 = new javax.swing.JLabel(); updateRateSpinner = new javax.swing.JSpinner(); jSeparator1 = new javax.swing.JSeparator(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); pvTable.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { {null, null, null, null}, {null, null, null, null}, {null, null, null, null}, {null, null, null, null} }, new String [] { "Average", "Standard deviation", "Minimum", "Maximum" } ) { boolean[] canEdit = new boolean [] { false, false, false, false }; public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit [columnIndex]; } }); jScrollPane1.setViewportView(pvTable); jLabel6.setText("UI scan rate (Hz):"); scanRateSpinner.setModel(new javax.swing.SpinnerNumberModel(1, 1, 50, 1)); createPVButton.setText("Create "); createPVButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { createPVButtonActionPerformed(evt); } }); jLabel1.setText("N PVs:"); nPVSpinner.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(1), Integer.valueOf(1), null, Integer.valueOf(1))); jLabel3.setText("PV update rate (Hz):"); updateRateSpinner.setModel(new javax.swing.SpinnerNumberModel(1, 1, 1000, 1)); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 764, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 740, Short.MAX_VALUE) .addComponent(createPVButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 740, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(jLabel6) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(scanRateSpinner, javax.swing.GroupLayout.DEFAULT_SIZE, 633, Short.MAX_VALUE)) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(nPVSpinner, javax.swing.GroupLayout.DEFAULT_SIZE, 697, Short.MAX_VALUE)) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(updateRateSpinner, javax.swing.GroupLayout.DEFAULT_SIZE, 610, Short.MAX_VALUE))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 416, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(updateRateSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(scanRateSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel6)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(nPVSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(createPVButton) .addContainerGap()) ); pack(); }// </editor-fold>//GEN-END:initComponents PVReader<List<VStatistics>> pv; private void createPVButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createPVButtonActionPerformed if (pv != null) pv.close(); int nPvs = ((Integer) nPVSpinner.getModel().getValue()).intValue(); double timeIntervalSec = (1.0 / ((Integer) updateRateSpinner.getModel().getValue()).intValue()); String pvName = "gaussian(0.0, 1.0, " + timeIntervalSec + ")"; int scanRate = ((Integer) scanRateSpinner.getModel().getValue()).intValue(); pv = PVManager.read(listOf(statisticsOf(vDoubles(Collections.nCopies(nPvs, pvName))))).maxRate(ofHertz(scanRate)); pv.addPVReaderListener(new PVReaderListener<Object>() { @Override public void pvChanged(PVReaderEvent<Object> event) { final List<VStatistics> values = pv.getValue(); if (values != null) { TableModel model = new AbstractTableModel() { List<String> names = Arrays.asList("Average", "Standard deviation", "Minimum", "Maximum"); @Override public int getRowCount() { return values.size(); } @Override public int getColumnCount() { return names.size(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { if (values.get(rowIndex) == null) return null; switch(columnIndex) { case 0: return values.get(rowIndex).getAverage(); case 1: return values.get(rowIndex).getStdDev(); case 2: return values.get(rowIndex).getMin(); case 3: return values.get(rowIndex).getMax(); } throw new IllegalStateException(); } }; pvTable.setModel(model); } } }); }//GEN-LAST:event_createPVButtonActionPerformed /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new MockTablePVFrame2().setVisible(true); } }); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton createPVButton; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel6; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JSeparator jSeparator1; private javax.swing.JSpinner nPVSpinner; private javax.swing.JTable pvTable; private javax.swing.JSpinner scanRateSpinner; private javax.swing.JSpinner updateRateSpinner; // End of variables declaration//GEN-END:variables }