From 41aa11866ffced6ba960e206c65e66c132c45cf8 Mon Sep 17 00:00:00 2001 From: gac-S_Changer Date: Thu, 28 Feb 2019 16:38:32 +0100 Subject: [PATCH] --- config/devices.properties | 4 +- config/settings.properties | 6 +- devices/C3.properties | 4 +- plugins/Commands.form | 47 +++++++++++- plugins/Commands.java | 54 ++++++++++++- plugins/MXSC-1.10.0.jar | Bin 272126 -> 272395 bytes plugins/WagoPanel.form | 81 ++++++++++++++++++++ plugins/WagoPanel.java | 152 ++++++++++++++++++++++++++++++------- script/devices/RobotSC.py | 10 +++ script/devices/Wago.py | 30 ++++++++ script/local.py | 18 +++++ script/motion/recover.py | 33 ++++++-- 12 files changed, 389 insertions(+), 50 deletions(-) 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 67b5faf1337a63cc0e93270161e1acfd2cc136f0..d2d27c694521cf816764219e735a86128640c1af 100644 GIT binary patch delta 38163 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 XFyR@>TikRS|0;%=rx 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 WrGNHe@{L71L!E^{ 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%0D$@XEIzpL>xdZq!>F#AnJaWj1X zEa=!j+;Y8p*nm04Fom)?}z+vH~5IF!G|ID2%$`yUG2fKC4mTf=yKC3l^ z^%ul7lA?da>KNLgT0+6G@VH;N$aK7Y0FE8*!gHFW7BggNPkysTE!Ab(xh%~gjKf}Y z8&^jYmBR4}^$dHCVAmt{--PW0uGxc@*#pn7xdT3&W45xZj(_=wzGfB11%u$z8dDOd zCbkwJHL>+sQzi;e@187}+*?dK;Fy6hTB2iMc=~CntABdx#+y;e>o`-SDQsXKb?tFg zA?06qQ$Mnz!l5$9R|5tuOBWTXCZ;8Vk136 z43nr_&}R6`Nx;FGVhjRD(XaPF4Udo-AkDu&v(J+CBF>Ch72FEn5T}c-zk+f zbXqDBmH7?Z+QyQUMq(HzLzMBx^6aPb^I67DZ#chVsepR89~v%|`zSepYwtO$1AY`M zEHnHC)#2brbnE<=u|g;cH+xC+himAH4}UQ`&10_{=m4|W--&46lOqu&kv*(+?1(xe zOt}G$;SN5tjDoYdc=AqvFDdODHs&Ml=%ww5E0@w%`f-PjQ+>Jv&i3x-5;9Z*1B7e$ z4;Ro15`p(VFPy{2sV?0CI3vgVyvD)`d-rOI88h?G0igZECPra^Z+F0S%!~{XOF`5A z{qD%baqe@#>g^pLk1)W`FrW`z&nc@yj9+NhZ_Q3%73_VCgc}Xm7>VqciJWjKK-#TM zlc@UQ8+L!69Bk633|pKo#os_?DMZN6nA+h{2K4)Q27Ii^0|I_!)aZ_%SuZFkap!0wDnLfBt;NAiUAh|ECfUac!IH@UOGyKMhmT3^GPY%#0}#D6}?; zbqG%g$bUWBayB87!2i!;-iFBf4;$ZwfPnlzY~}#s1_SwjLl-skss{WU+ArgF6C5*x z_5ZbXtuav@QF!;x0TyIoVR2blSaw-Jk%vXl`bNe2LLQ2uRHZbQXj=qqOpP&`ViT0@j7*GQ1A8W&9DlHvalbN`6X4WjZQVYwDAg(@vP4px5 zYcflcsx_6}mgr$R8!FYTEcUic?Zgmv!bBt1WHXiJYIZhM6J;|E8S{AmD3f85A}3F&oXSVnJeV zHO0Mz$HJE5CmB!b|04+^dF^8sxN$Qi&&V>yr+8ROk;iYrWs9GO<>Zz&?)i4xt>*TT zb8<%Iuu-hE@!q!f3);DeYj=W=thzO|wDIJ&_nP;fyc1skZq@kRnFAy7EJvdj!GbV= z!64F!F+!Hel@}Qyo4`gRq!T!8gh7<)BO^RZ%wP>B5Ll@}9!V`4Oef%BC<%uZ45pIJ zAqIs6LI7qFSO}0$;2_{|5j40omp%qEAvK$u2gY7k7M=$nEdH&ER6UK2m%-@MCY{pOc7%QX^8MXYo zi9~93$*OQ%1}3Se6#>F7@Tyo%RkPnvO%A4pm|42tOD$^VA;g^*!tzIG3QECyIn1FXS0%Crj9&mIv-6bZP5pVzYv9K4=j)pw!)Cb z?`)^g%gZ?4W`|UofH;u<0#>wlRz*e9U$I54IvwxM%c5}A%VtUqk9e1{dLI7WHMu4H zc$A7IPHP^5Z`TrhyQb(C`0cInl}LYy(cq@Ex*f#Z&2;HpVHzpU<@HbPdg7bJ6F>j< z$feu%;cT2ZWp}q>gLcSa)jPFdel{F}=_h%DOIAg=`e`@RN$hJx^fgoHsd9ia)KS;Z8N8P|#&( zh<5O`PFw}?u>2Tl?fa|zkW;-le-p%;*Lh}WUJyJj@b2r-P0ym z+CA_aNU#I9HU8rrEi$cV@jACmc#Cu|Uc-HjZ+)yeIBuQ-I%mQcyU<;^PiYMGjsC}rq=h6peKY99mTx>;cjuCUD3+3}fa-ulvh14)uNLenC)~!j${7>PJYXzod@0M28Xg($p zBDgI<%{L_h$G(yy*|`Z2O~IB4HZNDOcHW5p5Zf%+>v@uO6yT=V=Z0X4c=X!zb6FU% z*kmxobcWI c5bI&_X*jb(42j+NK7{ap`hmqC-}NZ}52NkI2mk;8 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)