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()); } @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(); } } } 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("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); if (currentFile != null) { try { chooser.setSelectedFile(currentFile); } catch (Exception 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(); String json = JsonSerializer.encode(model.getDataVector(), 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); model.setDataVector(vector, 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(); 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(); buttonOpen = new javax.swing.JButton(); buttonSave = new javax.swing.JButton(); checkAutoSaveArgs = new javax.swing.JCheckBox(); buttonScienta = 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); } }); 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); } }); 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 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) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(buttonOpen) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(buttonSave))) .addContainerGap()) ); jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonAdd, buttonDelete, buttonOpen, buttonSave}); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 130, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(buttonOpen) .addComponent(buttonSave)) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(buttonAdd) .addComponent(buttonDelete))) .addContainerGap()) ); checkAutoSaveArgs.setText("Auto save scan parameters"); buttonScienta.setText("Scienta Panel"); buttonScienta.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonScientaActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel1, 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, 2, Short.MAX_VALUE) .addComponent(buttonStart, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(33, 33, 33) .addComponent(buttonAbort) .addGap(0, 2, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addComponent(checkAutoSaveArgs) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(buttonScienta))) .addContainerGap()) ); layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonAbort, buttonStart}); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(checkAutoSaveArgs) .addComponent(buttonScienta)) .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, 10.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 // 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 buttonSave; private javax.swing.JButton buttonScienta; private javax.swing.JButton buttonStart; private javax.swing.JCheckBox checkAutoSaveArgs; private javax.swing.JEditorPane jEditorPane1; private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JTable table; // End of variables declaration//GEN-END:variables }