diff --git a/src/main/java/ch/psi/mxsc/Controller.java b/src/main/java/ch/psi/mxsc/Controller.java index 2ba9ad1..a4c2b68 100644 --- a/src/main/java/ch/psi/mxsc/Controller.java +++ b/src/main/java/ch/psi/mxsc/Controller.java @@ -25,6 +25,7 @@ import ch.psi.pshell.swing.SwingUtils; import ch.psi.pshell.utils.State.StateException; import java.awt.BorderLayout; import java.awt.Dimension; +import java.awt.Point; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; @@ -463,25 +464,83 @@ public class Controller { } - public Boolean isDoorClosed() { + //Non-blocking + public boolean isDoorOpen() { + try { + return doorsOpened; + //if (getMainFrame().getState().isInitialized()){ + // return getMainFrame().eval("is_door_closed()", true).equals(false); + // } + } catch (Exception ex) { + } + return false; + } + + //Non-blocking + public boolean isRobotParked() { try { if (getMainFrame().getState().isInitialized()){ - return getMainFrame().eval("is_door_closed()", true).equals(true); + return getMainFrame().eval("'pPark' in robot.get_current_points_cached()", true).equals(true); } } catch (Exception ex) { } - return null; - } + return false; + } + + Point fmm; + public void onCoverDetection(Point fmm ){ + this.fmm = fmm; + checkPuckLoading(); + } + + public boolean isCoverDetected() { + return fmm!=null; + } + boolean doorsOpened; + boolean doorsHaveOpened; + public void onDoorsOpenChange(boolean value){ + doorsOpened = value; + doorsHaveOpened =value; + checkPuckLoading(); + } + public void setServiceMode(boolean value){ try{ String state = value ? "True" : "False"; - getMainFrame().evalAsync("set_service_mode(" + state + ")"); + getMainFrame().eval("set_service_mode(" + state + ")", true); } catch (Exception ex) { Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex); } + checkPuckLoading(); } + public boolean canSetPuckLoading(){ + if (isServiceMode()){ + return true; + } + return !isCoverDetected() && isDoorOpen() && isRobotParked() && getState().isInitialized(); + } + + private void checkPuckLoading(){ + try{ + if (isServiceMode()){ + //Open/close manually in service mode + } else { + if (!canSetPuckLoading()){ + setPuckLoading(false); + } else { + //Opens automatically once after door is oppen + if (doorsHaveOpened){ + doorsHaveOpened=false; + //setPuckLoading(true); + } + } + } + } catch (Exception ex) { + Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex); + } + } public Boolean isBarcodeReaderScanPucks() { try { @@ -700,14 +759,12 @@ public class Controller { boolean puckReaderOk = true; String insertedPuckDatamatrix; Puck removedPuck; - - //true->load - //false->unload - //null->finish transfer mode + void setPuckLoading(boolean load) { if (load != puckLoading) { - if (load){ - if (isDoorClosed()){ + if (load){ + if (!canSetPuckLoading()){ + Logger.getLogger(Controller.class.getName()).warning("Cannot set puck loading"); return; } insertedPuckDatamatrix = null; @@ -752,7 +809,16 @@ public class Controller { } catch (Exception ex) { errorHandler.apply(null, ex); } - onPuckLoadingModeChange(puckLoading); + + if ( hasLoadDialog()) { + if (puckLoading) { + showDialogPuckLoading(); + mainFrame.setViewDesign(); + } else { + hideDialogPuckLoading(); + mainFrame.setViewCamera(); + } + } } } } @@ -772,8 +838,10 @@ public class Controller { return puckLoading; } + String laserPos; public void setLaserPos(String pos){ try { + laserPos = pos; getMainFrame().evalAsync("set_laser_pos(" + ((pos==null) ? "" : ("'" + pos + "'") ) + ")" ,true); getMainFrame().basePlatePanel.pointPuck((pos==null) ? null : basePlate.getPuckByName(pos)); } catch (StateException ex) { @@ -790,6 +858,10 @@ public class Controller { } } + + public String getLaserPos(){ + return laserPos; + } void playSound(String name) { try { @@ -1007,11 +1079,11 @@ public class Controller { } - void showDialogPuckLoading(boolean load) { + void showDialogPuckLoading() { if ((dialogPuckLoading != null) && (dialogPuckLoading.isVisible())) { return; } - dialogPuckLoading = new PuckLoadingDialog(mainFrame.getTopLevel(), load, false); + dialogPuckLoading = new PuckLoadingDialog(mainFrame.getTopLevel(), false); dialogPuckLoading.setLocationRelativeTo(mainFrame); dialogPuckLoading.setVisible(true); checkPuckDetectionEnabling(); @@ -1048,23 +1120,13 @@ public class Controller { } } - public void onPuckLoadingModeChange(boolean puckLoadMode) { - if ( hasLoadDialog()) { - if (puckLoadMode) { - showDialogPuckLoading(puckLoadMode); - mainFrame.setViewDesign(); - } else { - hideDialogPuckLoading(); - mainFrame.setViewCamera(); - } - } - } public void onPuckScanned(String datamatrix) { + Logger.getLogger(Controller.class.getName()).info("Scanned puck: " + datamatrix); if (isPuckLoading()) { getMainFrame().setPuckDatamatrix(datamatrix); if ( hasLoadDialog()) { - showDialogPuckLoading(puckLoading); + showDialogPuckLoading(); dialogPuckLoading.onPuckScanned(datamatrix); } } else { @@ -1093,7 +1155,7 @@ public class Controller { } if (hasLoadDialog()) { - showDialogPuckLoading(puckLoading); + showDialogPuckLoading(); dialogPuckLoading.onPuckMounted(puck, datamatrix); } else { if ((datamatrix == null) || (datamatrix.isEmpty())){ @@ -1110,11 +1172,11 @@ public class Controller { clearPuckMountedSample(puck); Controller.getInstance().linkPuckDatamatrix(puck, null, !hasLoadDialog()); if ( hasLoadDialog()) { - showDialogPuckLoading(puckLoading); + showDialogPuckLoading(); dialogPuckLoading.onPuckUnmounted(puck); } removedPuck = puck; - } + } void clearPuckMountedSample(Puck puck){ try{ diff --git a/src/main/java/ch/psi/mxsc/MainPanel.java b/src/main/java/ch/psi/mxsc/MainPanel.java index 3e38fbe..9514557 100644 --- a/src/main/java/ch/psi/mxsc/MainPanel.java +++ b/src/main/java/ch/psi/mxsc/MainPanel.java @@ -79,8 +79,7 @@ public class MainPanel extends Panel { StatusBar statusBar; JPopupMenu samplePopupMenu; JMenuItem menuMountSample; - JMenuItem menuUnmoountSample; - boolean doorsHaveOpened; + JMenuItem menuUnmoountSample; public enum BasePlateLayout { @@ -412,12 +411,14 @@ public class MainPanel extends Panel { feedback_psys_safety.addListener(new DeviceListener() { @Override public void onValueChanged(Device device, Object value, Object former) { - doorsHaveOpened = Boolean.FALSE.equals(value); + Controller.getInstance().onDoorsOpenChange(Boolean.FALSE.equals(value)); updatePsysSafety(value); } }); feedback_psys_safety.request(); - updatePsysSafety(((Device) getDevice("feedback_psys_safety")).take()); + Object psys_safety=((Device) getDevice("feedback_psys_safety")).take(); + Controller.getInstance().onDoorsOpenChange(Boolean.FALSE.equals(psys_safety)); + updatePsysSafety(psys_safety); ((Device) getDevice("robot")).addListener(new DeviceListener() { @Override public void onValueChanged(Device device, Object value, Object former) { @@ -642,9 +643,7 @@ public class MainPanel extends Panel { return; } - boolean doors_open = !Boolean.TRUE.equals(Controller.getInstance().isDoorClosed()); - boolean cover_pos_detected = isCoverPosDetected(); - buttonSampleLoad.setEnabled(doors_open && !cover_pos_detected && getState().isInitialized()); + buttonSampleLoad.setEnabled(Controller.getInstance().canSetPuckLoading() || Controller.getInstance().isServiceMode()); buttonCamera.setEnabled(getState().isInitialized()); buttonDrawing.setEnabled(getState().isInitialized()); } @@ -655,8 +654,7 @@ public class MainPanel extends Panel { }); return; } - - + if ((value == null) || !(value instanceof Boolean)) { ledPsysSafety.setColor(Color.BLACK); } else if (Boolean.TRUE.equals(manualMode)) { @@ -666,13 +664,6 @@ public class MainPanel extends Panel { } else { ledPsysSafety.setColor(Color.RED); } - if (!Boolean.TRUE.equals(value)){ - try { - Controller.getInstance().setPuckLoading(false); - } catch (Exception ex) { - getLogger().log(Level.WARNING, null, ex); - } - } updateButtonState(); } @@ -848,7 +839,9 @@ public class MainPanel extends Panel { if (expert == false) { - Controller.getInstance().setServiceMode(false); + if (getState().isInitialized()){ + Controller.getInstance().setServiceMode(false); + } // buttonCamera.setSelected(true); // buttonDrawing.setSelected(false); // updateViewType(); @@ -1132,21 +1125,8 @@ public class MainPanel extends Panel { textCoverDet.setText("No Cover"); } else { textCoverDet.setText((fmm==null) ? "" :fmm.x + ", " + fmm.y); - if ( getState().isReady() && - !checkExpert.isSelected() && - Boolean.FALSE.equals(Controller.getInstance().isDoorClosed())){ - try{ - if ((fmm!=null)){ - Controller.getInstance().setPuckLoading(false); - } else { - if (doorsHaveOpened){ - doorsHaveOpened=false; - Controller.getInstance().setPuckLoading(true); - } - } - } catch (Exception e) { - getLogger().log(Level.WARNING, null, e); - } + if ( getState().isReady()){ + Controller.getInstance().onCoverDetection(fmm); } } updateButtonState(); @@ -2266,6 +2246,7 @@ public class MainPanel extends Panel { private void buttonSampleLoadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSampleLoadActionPerformed try { + getLogger().info("Button Sample Load"); Controller.getInstance().setPuckLoading(true); } catch (Exception ex) { showException(ex); diff --git a/src/main/java/ch/psi/mxsc/PuckLoadingDialog.form b/src/main/java/ch/psi/mxsc/PuckLoadingDialog.form index 0bc374e..cd82428 100644 --- a/src/main/java/ch/psi/mxsc/PuckLoadingDialog.form +++ b/src/main/java/ch/psi/mxsc/PuckLoadingDialog.form @@ -133,6 +133,9 @@ + + + diff --git a/src/main/java/ch/psi/mxsc/PuckLoadingDialog.java b/src/main/java/ch/psi/mxsc/PuckLoadingDialog.java index 5fa4c4a..1b4d462 100644 --- a/src/main/java/ch/psi/mxsc/PuckLoadingDialog.java +++ b/src/main/java/ch/psi/mxsc/PuckLoadingDialog.java @@ -22,7 +22,6 @@ import javax.swing.table.DefaultTableModel; public class PuckLoadingDialog extends JDialog { Path dialogPersistPath; DefaultTableModel model; - final boolean load; final int INDEX_USER = 0; final int INDEX_DEWAR = 1; @@ -31,10 +30,9 @@ public class PuckLoadingDialog extends JDialog { /** * Creates new form PuckLoadingDialog */ - public PuckLoadingDialog(java.awt.Frame parent, boolean load, boolean modal) { - super(parent, load ? "Puck Loading" : "Puck Unloading", modal); + public PuckLoadingDialog(java.awt.Frame parent, boolean modal) { + super(parent, "Puck Loading", modal); initComponents(); - this.load = load; this.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); this.setName("PuckLoadingDialog"); dialogPersistPath = Paths.get(Setup.getContextPath(), getClass().getSimpleName()); @@ -282,6 +280,11 @@ public class PuckLoadingDialog extends JDialog { table.setRowHeight(40); table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); table.getTableHeader().setReorderingAllowed(false); + table.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseReleased(java.awt.event.MouseEvent evt) { + tableMouseReleased(evt); + } + }); panelTable.setViewportView(table); buttonSet.setFont(new java.awt.Font("Lucida Grande", 0, 24)); // NOI18N @@ -397,6 +400,23 @@ public class PuckLoadingDialog extends JDialog { } }//GEN-LAST:event_buttonClearDatamatrixActionPerformed + private void tableMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tableMouseReleased + try { + int row = table.getSelectedRow(); + String position = (row >= 0) ? String.valueOf(table.getValueAt(row, INDEX_POSITION)) : null; + if ((position!=null) && (!position.isBlank())){ + Puck puck = Controller.getInstance().getPuck(position); + if (puck!=null) { + Controller.getInstance().setLaserPos(puck); + } else { + Controller.getInstance().setLaserPos((Puck)null); + } + } + } catch (Exception ex) { + SwingUtils.showException(this, ex); + } + }//GEN-LAST:event_tableMouseReleased + /** * @param args the command line arguments */ @@ -427,7 +447,7 @@ public class PuckLoadingDialog extends JDialog { /* Create and display the dialog */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { - PuckLoadingDialog dialog = new PuckLoadingDialog(new javax.swing.JFrame(), true, true); + PuckLoadingDialog dialog = new PuckLoadingDialog(new javax.swing.JFrame(), true); dialog.addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosing(java.awt.event.WindowEvent e) {