diff --git a/config/devices.properties b/config/devices.properties index 61a1f7c..3c5720b 100644 --- a/config/devices.properties +++ b/config/devices.properties @@ -43,6 +43,8 @@ RT_sample_detection=ch.psi.pshell.modbus.DigitalInput|wago 16||1000| smc_magnet_status=ch.psi.pshell.modbus.DigitalInput|wago 17||1000| smc_mounted_1=ch.psi.pshell.modbus.DigitalInput|wago 18||1000| smc_mounted_2=ch.psi.pshell.modbus.DigitalInput|wago 19||1000| +valve_open=ch.psi.pshell.modbus.DigitalInput|wago 20||1000| +valve_close=ch.psi.pshell.modbus.DigitalInput|wago 21||1000| relays=ch.psi.pshell.modbus.DigitalOutputArray|wago 0 16||1000| release_local_safety=ch.psi.pshell.modbus.DigitalOutput|wago 0||| release_psys_safety=ch.psi.pshell.modbus.DigitalOutput|wago 1||| @@ -56,7 +58,7 @@ valve_1=ch.psi.pshell.modbus.DigitalOutput|wago 8||| valve_2=ch.psi.pshell.modbus.DigitalOutput|wago 9||| valve_3=ch.psi.pshell.modbus.DigitalOutput|wago 10||| valve_4=ch.psi.pshell.modbus.DigitalOutput|wago 11||| -#spare_do_1=ch.psi.pshell.modbus.DigitalOutput|wago 12||| +valve_cmd=ch.psi.pshell.modbus.DigitalOutput|wago 12||| smc_sup_det=ch.psi.pshell.modbus.DigitalOutput|wago 13||| #spare_do_3=ch.psi.pshell.modbus.DigitalOutput|wago 14||| #spare_do_4=ch.psi.pshell.modbus.DigitalOutput|wago 15||| diff --git a/config/settings.properties b/config/settings.properties index 8bf9909..7ed1d82 100644 --- a/config/settings.properties +++ b/config/settings.properties @@ -1,12 +1,13 @@ -#Thu Feb 21 14:15:23 CET 2019 +#Thu Feb 28 15:18:27 CET 2019 barcode_reader_scan_pucks=true beamline_status_enabled=false -dry_mount_counter=6 +dry_mount_counter=60 dry_timestamp=1.543854393748E9 force_dry_mount_count=0 force_dry_timeout=0 imaging_enabled=false led_level=0.0 +mounted_sample_position=R46 pin_angle_offset=0.0 pin_offset=0.0 puck_types=true @@ -15,3 +16,4 @@ roi_w=1000 roi_x=337 roi_y=139 room_temperature_enabled=true +valve_control=true diff --git a/devices/C3.properties b/devices/C3.properties index 7bb91cd..b92091b 100644 --- a/devices/C3.properties +++ b/devices/C3.properties @@ -1,3 +1,3 @@ -#Thu Feb 14 10:34:24 CET 2019 -detection=Both +#Thu Feb 28 13:30:05 CET 2019 +detection=Mechanical disabled=false diff --git a/plugins/Commands.form b/plugins/Commands.form index 5c19cf0..9af5d1f 100644 --- a/plugins/Commands.form +++ b/plugins/Commands.form @@ -431,11 +431,22 @@ - + - - - + + + + + + + + + + + + + + @@ -448,6 +459,12 @@ + + + + + + @@ -470,6 +487,28 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/Commands.java b/plugins/Commands.java index cd3b981..d08bca6 100644 --- a/plugins/Commands.java +++ b/plugins/Commands.java @@ -23,6 +23,7 @@ public class Commands extends Panel { ((JSpinner.DefaultEditor)spinnerSegment.getEditor()).getTextField().setHorizontalAlignment(JTextField.CENTER); ((JSpinner.DefaultEditor)spinnerPuck.getEditor()).getTextField().setHorizontalAlignment(JTextField.CENTER); ((JSpinner.DefaultEditor)spinnerSample.getEditor()).getTextField().setHorizontalAlignment(JTextField.CENTER); + startTimer(2000, 200); } //Overridable callbacks @@ -63,6 +64,14 @@ public class Commands extends Panel { public void onExecutedFile(String fileName, Object result) { } + @Override + protected void onTimer() { + try{ + textGripperType.setText(String.valueOf(eval("robot.get_tool()", true))); + } catch (Exception ex){ + textGripperType.setText(""); + } + } //Callback to perform update - in event thread @Override protected void doUpdate() { @@ -154,6 +163,9 @@ public class Commands extends Panel { jPanel1 = new javax.swing.JPanel(); buttonGripperScan = new javax.swing.JButton(); buttonTrash = new javax.swing.JButton(); + buttonGripperDetect = new javax.swing.JButton(); + jLabel8 = new javax.swing.JLabel(); + textGripperType = new javax.swing.JTextField(); tabAdvanced = new javax.swing.JPanel(); pnLowLevel = new javax.swing.JPanel(); buttonMovePark = new javax.swing.JButton(); @@ -421,15 +433,36 @@ public class Commands extends Panel { } }); + buttonGripperDetect.setText("Detect Type"); + buttonGripperDetect.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonGripperDetectActionPerformed(evt); + } + }); + + jLabel8.setText("Type:"); + + textGripperType.setEditable(false); + textGripperType.setBackground(new java.awt.Color(204, 204, 204)); + textGripperType.setHorizontalAlignment(javax.swing.JTextField.CENTER); + 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() - .addComponent(buttonGripperScan, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(buttonTrash, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addComponent(buttonGripperScan, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonTrash, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addComponent(buttonGripperDetect, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(56, 56, 56) + .addComponent(jLabel8) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(textGripperType))) .addContainerGap()) ); jPanel1Layout.setVerticalGroup( @@ -439,6 +472,11 @@ public class Commands extends Panel { .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(buttonGripperScan) .addComponent(buttonTrash)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(buttonGripperDetect) + .addComponent(jLabel8) + .addComponent(textGripperType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); @@ -933,9 +971,14 @@ public class Commands extends Panel { }//GEN-LAST:event_buttonPutRTActionPerformed private void buttonMoveRTActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonMoveRTActionPerformed - execute("move_aux()"); + execute("move_rt()"); }//GEN-LAST:event_buttonMoveRTActionPerformed + private void buttonGripperDetectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonGripperDetectActionPerformed + execute("update_robot_tool()"); + onTimer(); + }//GEN-LAST:event_buttonGripperDetectActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton buttonClearSampleDb; private javax.swing.JButton buttonDry; @@ -944,6 +987,7 @@ public class Commands extends Panel { private javax.swing.JButton buttonGetDewar; private javax.swing.JButton buttonGetGonio; private javax.swing.JButton buttonGetRT; + private javax.swing.JButton buttonGripperDetect; private javax.swing.JButton buttonGripperScan; private javax.swing.JButton buttonMount; private javax.swing.JButton buttonMoveAux; @@ -977,6 +1021,7 @@ public class Commands extends Panel { private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; + private javax.swing.JLabel jLabel8; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel5; private javax.swing.JTabbedPane jTabbedPane1; @@ -992,5 +1037,6 @@ public class Commands extends Panel { private javax.swing.JSpinner spinnerSegment; private javax.swing.JPanel tabAdvanced; private javax.swing.JPanel tabCommands; + private javax.swing.JTextField textGripperType; // End of variables declaration//GEN-END:variables } diff --git a/plugins/MXSC-1.10.0.jar b/plugins/MXSC-1.10.0.jar index 67b5faf..d2d27c6 100644 Binary files a/plugins/MXSC-1.10.0.jar and b/plugins/MXSC-1.10.0.jar differ diff --git a/plugins/WagoPanel.form b/plugins/WagoPanel.form index 9864ffa..a6f6b08 100644 --- a/plugins/WagoPanel.form +++ b/plugins/WagoPanel.form @@ -20,6 +20,7 @@ + @@ -31,6 +32,8 @@ + + @@ -163,5 +166,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/WagoPanel.java b/plugins/WagoPanel.java index cacadcd..9ddd1e2 100644 --- a/plugins/WagoPanel.java +++ b/plugins/WagoPanel.java @@ -1,6 +1,9 @@ + import ch.psi.mxsc.Controller; import ch.psi.pshell.core.Context; +import ch.psi.pshell.device.DeviceBase; import ch.psi.pshell.swing.DevicePanel; +import java.awt.Color; import java.util.concurrent.CompletableFuture; import javax.swing.border.TitledBorder; @@ -11,46 +14,65 @@ public class WagoPanel extends DevicePanel { public WagoPanel() { initComponents(); - this.startTimer(10000); + this.startTimer(1000); } - CompletableFuture future; - + @Override - public void onTimer(){ - if ((getDevice()!=null)){ + public void onTimer() { + if ((getDevice() != null)) { updateTitle(); } } - - void updateTitle(){ - Boolean roomTemp = (Controller.getInstance().isLedRoomTemp()); - if (roomTemp==null){ - ((TitledBorder)panelDewar.getBorder()).setTitle("Dewar Light"); - } else if (roomTemp==true){ - ((TitledBorder)panelDewar.getBorder()).setTitle("Dewar Light (room temperature)"); - } else { - ((TitledBorder)panelDewar.getBorder()).setTitle("Dewar Light (LN2)"); - } - } - - - void execute(String statement){ + + int count10s = 10; + + void updateTitle() { + if (count10s++ >= 10) { + count10s = 0; + Boolean roomTemp = (Controller.getInstance().isLedRoomTemp()); + if (roomTemp == null) { + ((TitledBorder) panelDewar.getBorder()).setTitle("Dewar Light"); + } else if (roomTemp == true) { + ((TitledBorder) panelDewar.getBorder()).setTitle("Dewar Light (room temperature)"); + } else { + ((TitledBorder) panelDewar.getBorder()).setTitle("Dewar Light (LN2)"); + } + } + + + + try { + DeviceBase valveOpen = (DeviceBase) Context.getInstance().getDevicePool().getByName("valve_open"); + ledOpen.setColor(Boolean.TRUE.equals(valveOpen.take()) ? Color.GREEN : Color.BLACK); + } catch (Exception ex) { + ledOpen.setColor(Color.RED); + } + try { + DeviceBase valveClose = (DeviceBase) Context.getInstance().getDevicePool().getByName("valve_close"); + ledClose.setColor(Boolean.TRUE.equals(valveClose.take()) ? Color.GREEN : Color.BLACK); + } catch (Exception ex) { + ledClose.setColor(Color.RED); + } + + } + + void execute(String statement) { try { Context.getInstance().evalLineBackgroundAsync(statement).handle((ret, ex) -> { - if (WagoPanel.this.isShowing()){ - if (ex != null){ - showException((Exception)ex); - } + if (WagoPanel.this.isShowing()) { + if (ex != null) { + showException((Exception) ex); + } } return ret; }); } catch (Exception ex) { showException(ex); - } + } } - + @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { @@ -63,6 +85,11 @@ public class WagoPanel extends DevicePanel { buttonHeater = new javax.swing.JToggleButton(); buttonStream = new javax.swing.JToggleButton(); panelDewar = new ch.psi.pshell.swing.ProcessVariablePanel(); + panelRobot2 = new javax.swing.JPanel(); + ledOpen = new ch.psi.pshell.swing.Led(); + ledClose = new ch.psi.pshell.swing.Led(); + buttonOpenValve = new javax.swing.JButton(); + buttonCloseValve = new javax.swing.JButton(); deviceStatePanel1.setDeviceName("wago"); @@ -154,6 +181,58 @@ public class WagoPanel extends DevicePanel { panelDewar.setShowSlider(true); panelDewar.setShowStop(false); + panelRobot2.setBorder(javax.swing.BorderFactory.createTitledBorder("Valve")); + + ledOpen.setFont(new java.awt.Font("SansSerif", 0, 18)); // NOI18N + + ledClose.setFont(new java.awt.Font("SansSerif", 0, 18)); // NOI18N + + buttonOpenValve.setText("Open"); + buttonOpenValve.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonOpenValveActionPerformed(evt); + } + }); + + buttonCloseValve.setText("Close"); + buttonCloseValve.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonCloseValveActionPerformed(evt); + } + }); + + javax.swing.GroupLayout panelRobot2Layout = new javax.swing.GroupLayout(panelRobot2); + panelRobot2.setLayout(panelRobot2Layout); + panelRobot2Layout.setHorizontalGroup( + panelRobot2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelRobot2Layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(panelRobot2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(buttonOpenValve) + .addComponent(buttonCloseValve)) + .addGap(37, 37, 37) + .addGroup(panelRobot2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(ledClose, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(ledOpen, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + panelRobot2Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonCloseValve, buttonOpenValve}); + + panelRobot2Layout.setVerticalGroup( + panelRobot2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelRobot2Layout.createSequentialGroup() + .addContainerGap() + .addGroup(panelRobot2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) + .addComponent(ledOpen, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(buttonOpenValve)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(panelRobot2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) + .addComponent(ledClose, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(buttonCloseValve)) + .addGap(3, 3, 3)) + ); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -162,6 +241,7 @@ public class WagoPanel extends DevicePanel { .addComponent(panelSafety, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(panelRobot1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(panelDewar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(panelRobot2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -172,6 +252,8 @@ public class WagoPanel extends DevicePanel { .addGap(0, 0, 0) .addComponent(panelRobot1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) + .addComponent(panelRobot2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0) .addComponent(deviceStatePanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) ); }// //GEN-END:initComponents @@ -185,23 +267,35 @@ public class WagoPanel extends DevicePanel { }//GEN-LAST:event_buttonReleaseLocalActionPerformed private void buttonHeaterActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonHeaterActionPerformed - execute("set_heater(" + (buttonHeater.isSelected() ? "True": "False") + ")"); + execute("set_heater(" + (buttonHeater.isSelected() ? "True" : "False") + ")"); }//GEN-LAST:event_buttonHeaterActionPerformed private void buttonStreamActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonStreamActionPerformed - execute("set_air_stream(" + (buttonStream.isSelected()? "True": "False")+ ")"); + execute("set_air_stream(" + (buttonStream.isSelected() ? "True" : "False") + ")"); }//GEN-LAST:event_buttonStreamActionPerformed - - + private void buttonOpenValveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonOpenValveActionPerformed + execute("open_valve()"); + }//GEN-LAST:event_buttonOpenValveActionPerformed + + private void buttonCloseValveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCloseValveActionPerformed + execute("close_valve()"); + }//GEN-LAST:event_buttonCloseValveActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton buttonCloseValve; private javax.swing.JToggleButton buttonHeater; + private javax.swing.JButton buttonOpenValve; private javax.swing.JButton buttonReleaseLocal; private javax.swing.JButton buttonReleasePsys; private javax.swing.JToggleButton buttonStream; private ch.psi.pshell.swing.DeviceStatePanel deviceStatePanel1; + private ch.psi.pshell.swing.Led ledClose; + private ch.psi.pshell.swing.Led ledOpen; private ch.psi.pshell.swing.ProcessVariablePanel panelDewar; private javax.swing.JPanel panelRobot1; + private javax.swing.JPanel panelRobot2; private javax.swing.JPanel panelSafety; // End of variables declaration//GEN-END:variables } diff --git a/script/devices/RobotSC.py b/script/devices/RobotSC.py index f878955..404b582 100644 --- a/script/devices/RobotSC.py +++ b/script/devices/RobotSC.py @@ -65,16 +65,26 @@ class RobotSC(RobotTCP): pin_offset = get_pin_offset() pin_angle_offset = get_pin_angle_offset() print "Pin offset = " + str(pin_offset) + if is_valve_controlled(): + self.assert_gonio() + open_valve(10.0) self.start_task('putGonio', pin_offset) self.wait_task_finished(TASK_WAIT_ROBOT_POLLING) self.assert_gonio() + if is_valve_controlled(): + close_valve() def get_gonio(self): pin_offset = get_pin_offset() print "Pin offset = " + str(pin_offset) + if is_valve_controlled(): + self.assert_gonio() + open_valve(10.0) self.start_task('getGonio', pin_offset) self.wait_task_finished(TASK_WAIT_ROBOT_POLLING) self.assert_gonio() + if is_valve_controlled(): + close_valve() def get_aux(self, sample): self.assert_aux() diff --git a/script/devices/Wago.py b/script/devices/Wago.py index fda8d4e..57d34d4 100644 --- a/script/devices/Wago.py +++ b/script/devices/Wago.py @@ -149,4 +149,34 @@ def get_robot_tool_id(): id = (id + gripperID_.read()) << 1 id = id + gripperID_LSB.read() return id + +################################################################################################### +# Valve +################################################################################################### +def open_valve(timeout = -1): + valve_cmd.write(True) + if timeout>=0: + start = time.time() + while not is_valve_open(): + if time.time() - start > timeout: + raise Exception("Timeout waiting valve to open") + time.sleep(0.01) + +def close_valve(timeout = -1): + if not is_valve_controlled(): + raise Exception("Cannot close valve: valve is not controlled") + valve_cmd.write(False) + if timeout>=0: + start = time.time() + while not is_valve_close(): + if time.time() - start > timeout: + raise Exception("Timeout waiting valve to close") + time.sleep(0.01) + + +def is_valve_close(): + return valve_close.read() + +def is_valve_open(): + return valve_open.read() \ No newline at end of file diff --git a/script/local.py b/script/local.py index 89cda60..f287148 100644 --- a/script/local.py +++ b/script/local.py @@ -24,6 +24,7 @@ PUCK_TYPES_PREFERENCE = "puck_types" BARCODE_READER_SCAN_PUCKS = "barcode_reader_scan_pucks" ROOM_TEMPERATURE_ENABLED_PREFERENCE = "room_temperature_enabled" BEAMLINE_STATUS_ENABLED_PREFERENCE = "beamline_status_enabled" +VALVE_CONTROL_ENABLED_PREFERENCE = "valve_control" def is_imaging_enabled(): setting = get_setting(IMAGING_ENABLED_PREFERENCE) @@ -54,6 +55,14 @@ def is_barcode_reader_scan_pucks(): def set_barcode_reader_scan_pucks(value): set_setting(BARCODE_READER_SCAN_PUCKS, True if value else False ) +def is_valve_controlled(): + setting = get_setting(VALVE_CONTROL_ENABLED_PREFERENCE) + return False if setting is None else setting.lower() == "true" + +def set_valve_controlled(value): + set_setting(VALVE_CONTROL_ENABLED_PREFERENCE, True if value else False ) + + def reset_mounted_sample_position(): set_setting("mounted_sample_position", None) @@ -68,6 +77,7 @@ def get_puck_barcode_reader(): set_imaging_enabled(is_imaging_enabled()) set_puck_types(get_puck_types()) set_barcode_reader_scan_pucks(is_barcode_reader_scan_pucks()) +set_valve_controlled(is_valve_controlled()) force_dry_mount_count = get_setting("force_dry_mount_count") @@ -301,6 +311,14 @@ try: except: print >> sys.stderr, traceback.format_exc() +try: + if not is_valve_controlled(): + open_valve() +except: + print >> sys.stderr, traceback.format_exc() + + + #gripper_cam.paused = True ################################################################################################### # Device monitoring diff --git a/script/motion/recover.py b/script/motion/recover.py index ff67e16..27b2bfd 100644 --- a/script/motion/recover.py +++ b/script/motion/recover.py @@ -3,18 +3,19 @@ import org.apache.commons.math3.geometry.euclidean.threed.Vector3D as Vector3D import org.apache.commons.math3.geometry.euclidean.threed.Line as Line3D RECOVER_DESC = "mRecovery" -RECOVER_TOOL = TOOL_DEFAULT +#RECOVER_TOOL = TOOL_DEFAULT -known_segments = [ ("pHome", "pPark", 50), \ +known_segments = [ ("pPark", "pHome", 50), \ + ("pGonio", "pGonioG", 10), \ + ("pHome", "pHe", 230), \ ("pHome", "pGonio", 30), \ ("pHome", "pScan", 25), \ ("pHome", "pHeater", 75), \ - ("pHome", "pDewar", 10), \ - ("pHome", "pHelium", 230), \ - ("pGonio", "pGonioG", 10), \ + ("pHome", "pDewar", 10), \ ("pPark", "pHeat", 40), \ ("pHeater", "pHeatB", 10), \ ("pPark", "pAux", 50), \ + ("pPark", "pRT", 100), \ ] @@ -101,7 +102,7 @@ def move_to_segment(segment): print "Moving from " + str(p) + " to segment " + str(segment) + " - distance=" + str(dlv) + " - dest=" + str(d) try: - robot.movel(d, tool=RECOVER_TOOL, desc=RECOVER_DESC, sync=True) + robot.movel(d, tool=None, desc=RECOVER_DESC, sync=True) print "Done" except: print sys.exc_info()[1] @@ -112,10 +113,10 @@ def move_to_safest_point(segment, vicinity_tolerance = 100): #Always moving to primary point if False : #(d2<=d1) and (d2 <= vicinity_tolerance): print "Moving to secondary point " + str(segment[1] + " - d1=" + str(d1) + " d2=" + str(d2) ) - robot.movel(segment[1], tool=RECOVER_TOOL, desc=RECOVER_DESC, sync=True) + robot.movel(segment[1], tool=None, desc=RECOVER_DESC, sync=True) else: print "Moving to primary point " + str(segment[0] + " - d1=" + str(d1) + " d2=" + str(d2) ) - robot.movel(segment[0], tool=RECOVER_TOOL, desc=RECOVER_DESC, sync=True) + robot.movel(segment[0], tool=None, desc=RECOVER_DESC, sync=True) print "Done" #print "Recovered to point " + str(robot.get_curjoint_or_pointrent_point()) @@ -149,6 +150,22 @@ def recover(move_park = True): print "Success recovered to point: " + str(location) if move_park: robot.move_park() + if is_valve_controlled(): + try: + if robot.take()["mode"]=="remote": + close_valve() + except: + pass + + refj = robot.get_jnt("jPark") + hj = robot.herej() + print "Here: ", hj + print "Ref : ", refj + if abs( refj[5] - hj[5]) > 180: + print "Rotating to JPARK" + robot.movej("jPark", desc=RECOVER_DESC, sync=True) + if not robot.is_park(): + raise Exception("Robot was twisted. Perform another recovery.") return "Success recovered to park position" else: return "Success recovered to point: " + str(location)