import ch.psi.pshell.core.JsonSerializer; import ch.psi.pshell.epics.Positioner; import ch.psi.pshell.ui.Panel; import ch.psi.utils.IO; import ch.psi.utils.State; import ch.psi.utils.Sys; import ch.psi.utils.swing.SwingUtils; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFileChooser; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.table.DefaultTableModel; /** * */ public class EnergyScan extends Panel { final DefaultTableModel model; Positioner energy; File currentFile; public static final String FILE_EXTENSION = "ens"; public static final String DEFAULT_FOLDER = "{home}/parameters"; public EnergyScan() { initComponents(); model = (DefaultTableModel) table.getModel(); } //Overridable callbacks @Override public void onInitialize(int runCount) { energy = (Positioner) this.getDevice("energy"); } @Override public void onStateChange(State state, State former) { buttonStart.setEnabled(state==State.Ready); buttonAbort.setEnabled(state.isProcessing()); buttonScienta.setEnabled(state.isInitialized()); updateSeq(); } void updateSeq(){ try{ textFileId.setText(String.valueOf(getContext().getFileSequentialNumber())); } catch (Exception ex){ textFileId.setText(""); } } @Override public void onExecutedFile(String fileName, Object result) { } //Callback to perform update - in event thread @Override protected void doUpdate() { } void checkValues(){ if (model.getRowCount() == 0){ throw new IllegalArgumentException(); } for (int i=0; i< model.getRowCount(); i++){ Double start = (Double) model.getValueAt(i, 0); Double stop = (Double) model.getValueAt(i, 1); Double step = (Double) model.getValueAt(i, 2); if ( Double.isNaN(start) || Double.isNaN(stop) || Double.isNaN(step) || (start >= stop) || (step<0) || (start < energy.getMinValue()) || (stop > energy.getMaxValue()) ){ throw new IllegalArgumentException(); } } } String getScanName(){ String name = textName.getText().strip(); return name.isEmpty() ? null : name; } void start() throws Exception{ checkValues(); String lastOutput = getContext().getDataManager().getLastOutput(); HashMap args = new HashMap(); ArrayList regions = new ArrayList(); for (int i=0; i< model.getRowCount(); i++){ ArrayList region = new ArrayList(); region.add(model.getValueAt(i, 0)); region.add(model.getValueAt(i, 1)); region.add(model.getValueAt(i, 2)); regions.add(region); } args.put("NAME", getScanName()); args.put("REGIONS", regions); this.runAsync("templates/EnergyScan", args).handle((ret,ex)->{ if (ex!=null){ } if (checkAutoSaveArgs.isSelected()){ //Save scan attributes String output = getContext().getDataManager().getLastOutput(); if ((output!=null) && !output.isEmpty() &&!output.equals(lastOutput)){ try { save(Paths.get(output + "." + FILE_EXTENSION)); } catch (IOException e) { Logger.getLogger(EnergyScan.class.getName()).log(Level.WARNING, null, e); } } } return ret; }); } public void save() throws IOException { JFileChooser chooser = new JFileChooser(getContext().getSetup().expandPath(DEFAULT_FOLDER)); FileNameExtensionFilter filter = new FileNameExtensionFilter("Energy scan definition file", FILE_EXTENSION); chooser.setFileFilter(filter); chooser.setFileHidingEnabled(false); try { if (currentFile != null) { chooser.setSelectedFile(currentFile); } else if (getScanName()!=null){ File file = Paths.get(chooser.getCurrentDirectory().getAbsolutePath(),getScanName()).toFile(); chooser.setSelectedFile(file); } } catch (Exception ex) { this.showException(ex); } int rVal = chooser.showSaveDialog(this); if (rVal == JFileChooser.APPROVE_OPTION) { String fileName = chooser.getSelectedFile().getAbsolutePath(); if (IO.getExtension(chooser.getSelectedFile().getAbsolutePath()).isEmpty()) { fileName += "." + FILE_EXTENSION; } save(Paths.get(fileName)); } } public void save(Path path) throws IOException { currentFile = path.toFile(); ArrayList data = new ArrayList(); data.add(new Object[][]{new Object[]{textName.getText()}}); data.add(model.getDataVector()); String json = JsonSerializer.encode(data, true); Files.write(path, json.getBytes()); } public void open() throws IOException { JFileChooser chooser = new JFileChooser(getContext().getSetup().expandPath(DEFAULT_FOLDER)); FileNameExtensionFilter filter = new FileNameExtensionFilter("Energy scan definition file", FILE_EXTENSION); chooser.setFileFilter(filter); chooser.setFileHidingEnabled(true); int rVal = chooser.showOpenDialog(this); if (rVal == JFileChooser.APPROVE_OPTION) { open(chooser.getSelectedFile().toPath()); } } public void open(Path path) throws IOException { String json = new String(Files.readAllBytes(path)); currentFile = path.toFile(); Object[][][] vector = (Object[][][]) JsonSerializer.decode(json, Object[][][].class); textName.setText(String.valueOf(vector[0][0][0])); model.setDataVector(vector[1], SwingUtils.getTableColumnNames(table)); } @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { jScrollPane2 = new javax.swing.JScrollPane(); jEditorPane1 = new javax.swing.JEditorPane(); buttonStart = new javax.swing.JButton(); buttonAbort = new javax.swing.JButton(); checkAutoSaveArgs = new javax.swing.JCheckBox(); buttonScienta = new javax.swing.JButton(); jPanel2 = new javax.swing.JPanel(); textName = new javax.swing.JTextField(); jPanel1 = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); table = new javax.swing.JTable(); buttonAdd = new javax.swing.JButton(); buttonDelete = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); buttonOpen = new javax.swing.JButton(); buttonSave = new javax.swing.JButton(); jLabel2 = new javax.swing.JLabel(); textFileId = new javax.swing.JTextField(); buttonResetId = new javax.swing.JButton(); jScrollPane2.setViewportView(jEditorPane1); buttonStart.setText("Start"); buttonStart.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonStartActionPerformed(evt); } }); buttonAbort.setText("Abort"); buttonAbort.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonAbortActionPerformed(evt); } }); checkAutoSaveArgs.setText("Auto save parameters"); buttonScienta.setText("Scienta Panel"); buttonScienta.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonScientaActionPerformed(evt); } }); jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Parameters")); jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Regions")); table.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { }, new String [] { "Start", "End", "Step" } ) { Class[] types = new Class [] { java.lang.Double.class, java.lang.Double.class, java.lang.Double.class }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } }); jScrollPane1.setViewportView(table); buttonAdd.setText("Add"); buttonAdd.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonAddActionPerformed(evt); } }); buttonDelete.setText("Delete"); buttonDelete.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonDeleteActionPerformed(evt); } }); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(buttonAdd) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(buttonDelete) .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonAdd, buttonDelete}); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 103, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(buttonAdd) .addComponent(buttonDelete)) .addContainerGap()) ); jLabel1.setText("Name:"); buttonOpen.setText("Open"); buttonOpen.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonOpenActionPerformed(evt); } }); buttonSave.setText("Save"); buttonSave.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonSaveActionPerformed(evt); } }); javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(jPanel2Layout.createSequentialGroup() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(textName) .addGap(18, 18, 18) .addComponent(buttonOpen) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(buttonSave))) .addContainerGap()) ); jPanel2Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonOpen, buttonSave}); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(textName) .addComponent(buttonOpen) .addComponent(buttonSave) .addComponent(jLabel1)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGap(12, 12, 12)) ); jLabel2.setText("File ID:"); textFileId.setEditable(false); textFileId.setHorizontalAlignment(javax.swing.JTextField.CENTER); buttonResetId.setText("Reset"); buttonResetId.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonResetIdActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) .addComponent(buttonStart, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(33, 33, 33) .addComponent(buttonAbort) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(checkAutoSaveArgs) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(textFileId, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addComponent(buttonScienta) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(buttonResetId))) .addContainerGap()))) ); layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonAbort, buttonStart}); layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonResetId, textFileId}); layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonScienta, checkAutoSaveArgs}); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGap(7, 7, 7) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(checkAutoSaveArgs) .addComponent(jLabel2) .addComponent(textFileId, 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(buttonScienta) .addComponent(buttonResetId)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(buttonStart) .addComponent(buttonAbort)) .addContainerGap()) ); }// //GEN-END:initComponents private void buttonStartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonStartActionPerformed try{ start(); } catch (Exception ex){ showException(ex); } }//GEN-LAST:event_buttonStartActionPerformed private void buttonAbortActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonAbortActionPerformed try{ abort(); } catch (Exception ex){ showException(ex); } }//GEN-LAST:event_buttonAbortActionPerformed private void buttonAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonAddActionPerformed try{ //model.addRow(new Object[]{energy.getMinValue(), energy.getMaxValue(), 10.0}); model.addRow(new Object[]{500.0, 1000.0, 100.0}); } catch (Exception ex){ showException(ex); } }//GEN-LAST:event_buttonAddActionPerformed private void buttonDeleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonDeleteActionPerformed try{ if ((model.getRowCount()>0) && (table.getSelectedRow()>=0)){ model.removeRow(table.getSelectedRow()); } } catch (Exception ex){ showException(ex); } }//GEN-LAST:event_buttonDeleteActionPerformed private void buttonOpenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonOpenActionPerformed try{ open(); } catch (Exception ex){ showException(ex); } }//GEN-LAST:event_buttonOpenActionPerformed private void buttonSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSaveActionPerformed try{ save(); } catch (Exception ex){ showException(ex); } }//GEN-LAST:event_buttonSaveActionPerformed private void buttonScientaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonScientaActionPerformed try{ this.showDevicePanel("scienta"); } catch (Exception ex){ showException(ex); } }//GEN-LAST:event_buttonScientaActionPerformed private void buttonResetIdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonResetIdActionPerformed try{ this.getContext().setFileSequentialNumber(0); updateSeq(); } catch (Exception ex){ showException(ex); } }//GEN-LAST:event_buttonResetIdActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton buttonAbort; private javax.swing.JButton buttonAdd; private javax.swing.JButton buttonDelete; private javax.swing.JButton buttonOpen; private javax.swing.JButton buttonResetId; private javax.swing.JButton buttonSave; private javax.swing.JButton buttonScienta; private javax.swing.JButton buttonStart; private javax.swing.JCheckBox checkAutoSaveArgs; private javax.swing.JEditorPane jEditorPane1; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JTable table; private javax.swing.JTextField textFileId; private javax.swing.JTextField textName; // End of variables declaration//GEN-END:variables }