import ch.psi.pshell.device.Device; import ch.psi.pshell.device.DeviceAdapter; import ch.psi.pshell.epics.ChannelDouble; import ch.psi.pshell.epics.ChannelString; import ch.psi.utils.State; import java.io.IOException; import javax.swing.JTextField; /* * Copyright (c) 2015 Paul Scherrer Institute. All rights reserved. */ /** * * @author boccioli_m */ public class Kollimators extends javax.swing.JPanel { /** * global variables needed by the class */ ChannelDouble channel; String g_deviceName; /** * Creates new form Kollimators * !!!! COMPULSORY FOR THE CALL FROM THE PLUGIN TESTINGLIST !!!!! * . * Called by TestingList when it opens this panel. * @param params currently not used */ public Kollimators(String params) { initComponents(); } /** * animate the panel (caget/caset) * !!!! COMPULSORY FOR THE CALL FROM THE PLUGIN TESTINGLIST !!!!! * . * Called from TestingList when it starts animating this panel. * This function MUST EXISTS in every custom panel callable from TestingList * @param deviceName string containing the device name (without pv name, i.e. KMA5 and not KMA5:COM:1) */ public void animate(String deviceName) { g_deviceName = deviceName; jLabelDeviceName.setText(deviceName); connectString(deviceName+":STA:2", jTextSta); //connect (like camon) for Strings connect(deviceName+":DIST:2", jTextDist);//connect (like camon) for Numbers connect(deviceName+":IST1:1", jTextIst1);//connect (like camon) for Numbers connect(deviceName+":IST2:1", jTextIst2);//connect (like camon) for Numbers connect(deviceName+":REF1:1", jTextRef1);//connect (like camon) for Numbers connect(deviceName+":REF2:1", jTextRef2);//connect (like camon) for Numbers connect(deviceName+":IST1:1", jTextDir);//TODO: real channel?? connect(deviceName+":STA2:1", jTextRes);//TODO: real channel?? } //Overridable callbacks public void onInitialize(int runCount) { initComponents(); } /** * Connect to the PVs. * And animate the corresponding test field on the panel. * * @param channelName name of the channel to connect to. Example: KMA5:STA2:1 * @param textField name of the text field to animate with the value of the channel */ public void connect(String channelName, JTextField textField) { try { ChannelDouble channel = new ChannelDouble(channelName, channelName, 3); channel.setMonitored(true); channel.initialize(); channel.addListener(new DeviceAdapter() { @Override public void onValueChanged(Device channelName, Object value, Object former) { Double val = (Double )value; textField.setText(String.valueOf(val)); textField.setToolTipText(channelName.getName()); } }); //channel.close(); } catch (Exception ex) { System.out.println(ex.toString()); } } /** * Connect to the PVs. * And animate the corresponding test field on the panel. * * @param channelName name of the channel to connect to. Example: KMA5:STA2:1 * @param textField name of the text field to animate with the value of the channel */ public void connectString(String channelName, JTextField textField) { try { ChannelString channel = new ChannelString(channelName, channelName); channel.setMonitored(true); channel.initialize(); channel.addListener(new DeviceAdapter() { @Override public void onValueChanged(Device channelName, Object value, Object former) { String val = (String )value; textField.setText(val); textField.setToolTipText(channelName.getName()); } }); //channel.close(); } catch (Exception ex) { System.out.println(ex.toString()); } } /** * Send stop command to the motor. * Send signal 0 to the motor communication channel */ public void stopMotor() { try { ChannelDouble channel = new ChannelDouble(g_deviceName+":COM:2", g_deviceName+":COM:2", 0); Object stopVal = 0; channel.write( (Double) stopVal); } catch (InterruptedException ex) { System.out.println(ex.toString()); } catch (IOException ex) { System.out.println(ex.toString()); } } /** * 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") // //GEN-BEGIN:initComponents private void initComponents() { jLabel1 = new javax.swing.JLabel(); jTextSta = new javax.swing.JTextField(); jLabel2 = new javax.swing.JLabel(); jTextIst1 = new javax.swing.JTextField(); jLabel3 = new javax.swing.JLabel(); jTextIst2 = new javax.swing.JTextField(); jLabel4 = new javax.swing.JLabel(); jTextDir = new javax.swing.JTextField(); jLabel5 = new javax.swing.JLabel(); jTextRef1 = new javax.swing.JTextField(); jLabel6 = new javax.swing.JLabel(); jTextRef2 = new javax.swing.JTextField(); jLabel7 = new javax.swing.JLabel(); jTextDist = new javax.swing.JTextField(); jTextRes = new javax.swing.JTextField(); jLabel8 = new javax.swing.JLabel(); jLabelDeviceName = new javax.swing.JLabel(); jButtonReconnect = new javax.swing.JButton(); jButtonStopMotor = new javax.swing.JButton(); jLabel1.setText("STA:"); jTextSta.setEditable(false); jLabel2.setText("IST1:"); jTextIst1.setEditable(false); jLabel3.setText("IST2:"); jTextIst2.setEditable(false); jLabel4.setText("Direction:"); jTextDir.setEditable(false); jLabel5.setText("REF1:"); jTextRef1.setEditable(false); jLabel6.setText("REF2:"); jTextRef2.setEditable(false); jLabel7.setText("DIST:"); jTextDist.setEditable(false); jTextRes.setEditable(false); jLabel8.setText("Resolution:"); jLabelDeviceName.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabelDeviceName.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT); jButtonReconnect.setText("Refresh"); jButtonReconnect.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButtonReconnectActionPerformed(evt); } }); jButtonStopMotor.setText("Stop motor"); jButtonStopMotor.setToolTipText("Immediately stop the collimator motor"); jButtonStopMotor.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButtonStopMotorActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(3, 3, 3) .addComponent(jLabelDeviceName, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addComponent(jButtonReconnect) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButtonStopMotor) .addGap(0, 0, Short.MAX_VALUE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextSta, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextIst1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(jLabel7) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextDist, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextIst2, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(layout.createSequentialGroup() .addComponent(jLabel5) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextRef1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addComponent(jLabel6) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextRef2, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addComponent(jLabel4) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextDir, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addComponent(jLabel8) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextRes, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGap(0, 0, 0)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(0, 0, 0) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(jTextSta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel2) .addComponent(jTextIst1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel5) .addComponent(jTextRef1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel4) .addComponent(jTextDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabelDeviceName, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(jTextIst2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel6) .addComponent(jTextRef2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel7) .addComponent(jTextDist, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel8) .addComponent(jTextRes, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jButtonReconnect) .addComponent(jButtonStopMotor)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); }// //GEN-END:initComponents private void jButtonReconnectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonReconnectActionPerformed // TODO add your handling code here: animate(g_deviceName); }//GEN-LAST:event_jButtonReconnectActionPerformed private void jButtonStopMotorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonStopMotorActionPerformed // TODO add your handling code here: stopMotor(); }//GEN-LAST:event_jButtonStopMotorActionPerformed // // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton jButtonReconnect; private javax.swing.JButton jButtonStopMotor; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; private javax.swing.JLabel jLabelDeviceName; private javax.swing.JTextField jTextDir; private javax.swing.JTextField jTextDist; private javax.swing.JTextField jTextIst1; private javax.swing.JTextField jTextIst2; private javax.swing.JTextField jTextRef1; private javax.swing.JTextField jTextRef2; private javax.swing.JTextField jTextRes; private javax.swing.JTextField jTextSta; // End of variables declaration//GEN-END:variables // }