From 911022b078b4affa73cbb474d4ebab184bea89de Mon Sep 17 00:00:00 2001 From: gac-S_Changer Date: Tue, 5 Feb 2019 15:54:27 +0100 Subject: [PATCH] --- config/config.properties | 4 +- config/settings.properties | 8 +- devices/A1.properties | 3 + devices/A2.properties | 3 + devices/A3.properties | 3 + devices/A4.properties | 3 + devices/A5.properties | 3 + devices/B1.properties | 3 + devices/B2.properties | 3 + devices/B3.properties | 3 + devices/B4.properties | 3 + devices/B5.properties | 3 + devices/C1.properties | 3 + devices/C2.properties | 3 + devices/C3.properties | 3 + devices/C4.properties | 3 + devices/C5.properties | 3 + devices/D1.properties | 3 + devices/D2.properties | 3 + devices/D3.properties | 3 + devices/D4.properties | 3 + devices/D5.properties | 3 + devices/E1.properties | 3 + devices/E2.properties | 3 + devices/E3.properties | 3 + devices/E4.properties | 3 + devices/E5.properties | 3 + devices/F1.properties | 3 + devices/F2.properties | 3 + devices/F3.properties | 3 + devices/F4.properties | 3 + devices/F5.properties | 3 + devices/smart_magnet.properties | 6 +- devices/smc_current.properties | 4 +- plugins/MXSC-1.10.0.jar | Bin 268613 -> 271145 bytes plugins/PuckDetectionPanel.form | 17 +++- plugins/PuckDetectionPanel.java | 31 +++++++- plugins/SmartMagnetPanel.form | 81 ++++++++++++++++--- plugins/SmartMagnetPanel.java | 130 +++++++++++++++++++++++++------ script/devices/Hexiposi.py | 6 +- script/devices/SmartMagnet.py | 18 +++-- script/local.py | 30 ++++++- script/motion/homing_hexiposi.py | 4 +- script/motion/mount.py | 63 ++++++++------- script/motion/recover.py | 6 +- script/motion/tools.py | 2 + script/motion/unmount.py | 51 ++++++++---- script/test/then.py | 3 + 48 files changed, 456 insertions(+), 98 deletions(-) create mode 100644 devices/A1.properties create mode 100644 devices/A2.properties create mode 100644 devices/A3.properties create mode 100644 devices/A4.properties create mode 100644 devices/A5.properties create mode 100644 devices/B1.properties create mode 100644 devices/B2.properties create mode 100644 devices/B3.properties create mode 100644 devices/B4.properties create mode 100644 devices/B5.properties create mode 100644 devices/C1.properties create mode 100644 devices/C2.properties create mode 100644 devices/C3.properties create mode 100644 devices/C4.properties create mode 100644 devices/C5.properties create mode 100644 devices/D1.properties create mode 100644 devices/D2.properties create mode 100644 devices/D3.properties create mode 100644 devices/D4.properties create mode 100644 devices/D5.properties create mode 100644 devices/E1.properties create mode 100644 devices/E2.properties create mode 100644 devices/E3.properties create mode 100644 devices/E4.properties create mode 100644 devices/E5.properties create mode 100644 devices/F1.properties create mode 100644 devices/F2.properties create mode 100644 devices/F3.properties create mode 100644 devices/F4.properties create mode 100644 devices/F5.properties create mode 100644 script/test/then.py diff --git a/config/config.properties b/config/config.properties index b95ee3a..f2b87fd 100644 --- a/config/config.properties +++ b/config/config.properties @@ -1,4 +1,4 @@ -#Thu Jan 24 14:24:44 CET 2019 +#Tue Feb 05 08:51:03 CET 2019 autoSaveScanData=true commandExecutionEvents=false createSessionFiles=true @@ -13,7 +13,7 @@ depthDimension=0 hostName=null instanceName=X06SA logDaysToLive=30 -logLevel=Finer +logLevel=Fine logLevelConsole=Off logPath={logs}/{date}_{time} notificationLevel=null diff --git a/config/settings.properties b/config/settings.properties index b384c6a..81386ef 100644 --- a/config/settings.properties +++ b/config/settings.properties @@ -1,10 +1,12 @@ -#Thu Jan 24 14:40:47 CET 2019 +#Tue Feb 05 15:50:04 CET 2019 barcode_reader_scan_pucks=false -dry_mount_counter=0 -dry_timestamp=1.548326732257E9 +dry_mount_counter=5 +dry_timestamp=1.549363107489E9 force_dry_mount_count=20 force_dry_timeout=0 imaging_enabled=false led_level=0.0 +mounted_sample_position=E53 +pin_offset=0.0 puck_types=true room_temperature_enabled=false diff --git a/devices/A1.properties b/devices/A1.properties new file mode 100644 index 0000000..ffc6cf1 --- /dev/null +++ b/devices/A1.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:22:35 CET 2019 +detection=Both +disabled=true diff --git a/devices/A2.properties b/devices/A2.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/A2.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/A3.properties b/devices/A3.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/A3.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/A4.properties b/devices/A4.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/A4.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/A5.properties b/devices/A5.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/A5.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/B1.properties b/devices/B1.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/B1.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/B2.properties b/devices/B2.properties new file mode 100644 index 0000000..e9ea95f --- /dev/null +++ b/devices/B2.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:30:50 CET 2019 +detection=Both +disabled=false diff --git a/devices/B3.properties b/devices/B3.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/B3.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/B4.properties b/devices/B4.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/B4.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/B5.properties b/devices/B5.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/B5.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/C1.properties b/devices/C1.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/C1.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/C2.properties b/devices/C2.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/C2.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/C3.properties b/devices/C3.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/C3.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/C4.properties b/devices/C4.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/C4.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/C5.properties b/devices/C5.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/C5.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/D1.properties b/devices/D1.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/D1.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/D2.properties b/devices/D2.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/D2.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/D3.properties b/devices/D3.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/D3.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/D4.properties b/devices/D4.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/D4.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/D5.properties b/devices/D5.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/D5.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/E1.properties b/devices/E1.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/E1.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/E2.properties b/devices/E2.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/E2.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/E3.properties b/devices/E3.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/E3.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/E4.properties b/devices/E4.properties new file mode 100644 index 0000000..8d60a33 --- /dev/null +++ b/devices/E4.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:52:26 CET 2019 +detection=Both +disabled=false diff --git a/devices/E5.properties b/devices/E5.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/E5.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/F1.properties b/devices/F1.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/F1.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/F2.properties b/devices/F2.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/F2.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/F3.properties b/devices/F3.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/F3.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/F4.properties b/devices/F4.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/F4.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/F5.properties b/devices/F5.properties new file mode 100644 index 0000000..81154ea --- /dev/null +++ b/devices/F5.properties @@ -0,0 +1,3 @@ +#Tue Feb 05 15:17:58 CET 2019 +detection=Both +disabled=false diff --git a/devices/smart_magnet.properties b/devices/smart_magnet.properties index 04f7166..b74c530 100644 --- a/devices/smart_magnet.properties +++ b/devices/smart_magnet.properties @@ -1,8 +1,8 @@ -#Fri Jan 18 11:16:24 CET 2019 -holdingCurrent=40.0 +#Tue Feb 05 11:22:07 CET 2019 +holdingCurrent=50.0 mountCurrent=20.0 remanenceCurrent=-10.0 -restingCurrent=20.0 +restingCurrent=30.0 reverseCurrent=-10.0 reverseTime=0.4 unmountCurrent=20.0 diff --git a/devices/smc_current.properties b/devices/smc_current.properties index aa71f58..9d9ba17 100644 --- a/devices/smc_current.properties +++ b/devices/smc_current.properties @@ -1,5 +1,5 @@ -#Tue Jun 19 16:41:20 CEST 2018 -maxValue=50.0 +#Wed Jan 30 11:33:15 CET 2019 +maxValue=70.0 minValue=-50.0 offset=0.0 precision=2 diff --git a/plugins/MXSC-1.10.0.jar b/plugins/MXSC-1.10.0.jar index 065c111c421727ec35c2629e2d0d199fb8eda4e3..992d5bb88b75c78ce4fbae8d30c78d4cbed4beec 100644 GIT binary patch delta 36005 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 DF6l92 delta 33750 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 F{{SNsAF==d diff --git a/plugins/PuckDetectionPanel.form b/plugins/PuckDetectionPanel.form index 9d644a4..550d155 100644 --- a/plugins/PuckDetectionPanel.form +++ b/plugins/PuckDetectionPanel.form @@ -116,12 +116,19 @@ + + + + + - + + + @@ -173,6 +180,14 @@ + + + + + + + + diff --git a/plugins/PuckDetectionPanel.java b/plugins/PuckDetectionPanel.java index e36c4db..1326665 100644 --- a/plugins/PuckDetectionPanel.java +++ b/plugins/PuckDetectionPanel.java @@ -78,6 +78,7 @@ public class PuckDetectionPanel extends DevicePanel { jPanel1 = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); table = new javax.swing.JTable(); + buttonConfigure = new javax.swing.JButton(); deviceStatePanel1 = new ch.psi.pshell.swing.DeviceStatePanel(); jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Raspberry Pi ")); @@ -186,6 +187,13 @@ public class PuckDetectionPanel extends DevicePanel { }); jScrollPane1.setViewportView(table); + buttonConfigure.setText("Configure"); + buttonConfigure.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonConfigureActionPerformed(evt); + } + }); + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( @@ -194,11 +202,17 @@ public class PuckDetectionPanel extends DevicePanel { .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) .addContainerGap()) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonConfigure) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 274, Short.MAX_VALUE) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 282, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(buttonConfigure) .addContainerGap()) ); @@ -236,9 +250,24 @@ public class PuckDetectionPanel extends DevicePanel { execute("start_puck_detection()", false); }//GEN-LAST:event_buttonPuckDetStartActionPerformed + private void buttonConfigureActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonConfigureActionPerformed + try { + if (table.getSelectedRow()<0){ + throw new Exception("Select a puck"); + } + String name = table.getModel().getValueAt(table.getSelectedRow(), 0).toString(); + Puck puck = getDevice().getPuck(name); + DevicePanel.showConfigEditor(this, puck, true, false); + } catch (Exception ex) { + showException(ex); + } + + }//GEN-LAST:event_buttonConfigureActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton buttonConfigure; private javax.swing.JButton buttonPuckDetCheck; private javax.swing.JButton buttonPuckDetStart; private javax.swing.JButton buttonPuckDetStop; diff --git a/plugins/SmartMagnetPanel.form b/plugins/SmartMagnetPanel.form index f9de056..432e7bd 100644 --- a/plugins/SmartMagnetPanel.form +++ b/plugins/SmartMagnetPanel.form @@ -18,10 +18,9 @@ - - - - + + + @@ -33,6 +32,8 @@ + + @@ -171,7 +172,7 @@ - + @@ -183,7 +184,11 @@ - + + + + + @@ -194,7 +199,9 @@ - + + + @@ -205,16 +212,72 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/SmartMagnetPanel.java b/plugins/SmartMagnetPanel.java index 2108837..2bfd831 100644 --- a/plugins/SmartMagnetPanel.java +++ b/plugins/SmartMagnetPanel.java @@ -5,8 +5,12 @@ import ch.psi.pshell.swing.DevicePanel; import ch.psi.pshell.core.Context; import ch.psi.utils.State; import java.awt.Color; +import java.io.IOException; import java.lang.reflect.Method; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.script.ScriptException; /** * @@ -30,38 +34,37 @@ public class SmartMagnetPanel extends DevicePanel { this.startTimer(1000, 100); } - @Override - protected void onTimer(){ - Color color = Color.RED; - try{ - if (Context.getInstance().evalLineBackground("in_mount_position").equals(Boolean.TRUE)){ - color = Color.GREEN; - } - } catch (Exception ex){ - } - ledMountPosition.setColor(color); - } - @Override protected void onDeviceStateChanged(State state, State former) { switch(state){ + case Paused: + ledSupressed.setColor(Color.ORANGE); + ledStatus.setColor(Color.GREEN); + ledMounted.setColor(Color.RED); + break; case Ready: + ledSupressed.setColor(Color.BLACK); ledStatus.setColor(Color.GREEN); ledMounted.setColor(Color.GREEN); break; case Busy: + ledSupressed.setColor(Color.BLACK); ledStatus.setColor(Color.GREEN); ledMounted.setColor(Color.ORANGE); break; case Fault: + ledSupressed.setColor(Color.RED); ledStatus.setColor(Color.RED); ledMounted.setColor(Color.RED); break; default: + ledSupressed.setColor(Color.BLACK); ledStatus.setColor(Color.BLACK); ledMounted.setColor(Color.BLACK); break; } + buttonSupressOn.setEnabled((state==State.Ready) || (state == State.Busy)); + buttonSupressOff.setEnabled(state == State.Paused); } @Override @@ -89,7 +92,11 @@ public class SmartMagnetPanel extends DevicePanel { panelCurrent = new ch.psi.pshell.swing.ProcessVariablePanel(); jPanel2 = new javax.swing.JPanel(); jLabel2 = new javax.swing.JLabel(); - ledMountPosition = new ch.psi.pshell.swing.Led(); + ledSupressed = new ch.psi.pshell.swing.Led(); + buttonSupressOn = new javax.swing.JButton(); + buttonSupressOff = new javax.swing.JButton(); + jPanel3 = new javax.swing.JPanel(); + buttonConfiguration = new javax.swing.JButton(); jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Status")); @@ -164,12 +171,26 @@ public class SmartMagnetPanel extends DevicePanel { panelCurrent.setBorder(javax.swing.BorderFactory.createTitledBorder("Current")); panelCurrent.setDeviceName("smc_current"); - jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Gonio")); + jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Supress")); jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jLabel2.setText("Mount Position:"); + jLabel2.setText("Supressed:"); - ledMountPosition.setFont(new java.awt.Font("SansSerif", 0, 18)); // NOI18N + ledSupressed.setFont(new java.awt.Font("SansSerif", 0, 18)); // NOI18N + + buttonSupressOn.setText("On"); + buttonSupressOn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonSupressOnActionPerformed(evt); + } + }); + + buttonSupressOff.setText("Off"); + buttonSupressOff.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonSupressOffActionPerformed(evt); + } + }); javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); @@ -179,16 +200,51 @@ public class SmartMagnetPanel extends DevicePanel { .addContainerGap() .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(ledMountPosition, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ledSupressed, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonSupressOn) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(buttonSupressOff) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); + + jPanel2Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonSupressOff, buttonSupressOn}); + jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) .addComponent(jLabel2) - .addComponent(ledMountPosition, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(ledSupressed, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(buttonSupressOn) + .addComponent(buttonSupressOff)) + .addContainerGap()) + ); + + jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Configuration")); + + buttonConfiguration.setText("Configuration"); + buttonConfiguration.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonConfigurationActionPerformed(evt); + } + }); + + javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); + jPanel3.setLayout(jPanel3Layout); + jPanel3Layout.setHorizontalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonConfiguration) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + jPanel3Layout.setVerticalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() + .addContainerGap() + .addComponent(buttonConfiguration) .addContainerGap()) ); @@ -198,9 +254,9 @@ public class SmartMagnetPanel extends DevicePanel { layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(panelState, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(panelCurrent, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(panelCurrent, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -211,21 +267,51 @@ public class SmartMagnetPanel extends DevicePanel { .addGap(0, 0, 0) .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) + .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0) .addComponent(panelState, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) ); }// //GEN-END:initComponents + private void buttonSupressOnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSupressOnActionPerformed + try { + Context.getInstance().evalLineBackground("smart_magnet.set_supress(True)"); + } catch (Exception ex) { + Logger.getLogger(SmartMagnetPanel.class.getName()).log(Level.SEVERE, null, ex); + } + }//GEN-LAST:event_buttonSupressOnActionPerformed + + private void buttonSupressOffActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSupressOffActionPerformed + try { + Context.getInstance().evalLineBackground("smart_magnet.set_supress(False)"); + } catch (Exception ex) { + Logger.getLogger(SmartMagnetPanel.class.getName()).log(Level.SEVERE, null, ex); + } + }//GEN-LAST:event_buttonSupressOffActionPerformed + + private void buttonConfigurationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonConfigurationActionPerformed + try { + this.showConfigEditor(true, false); + } catch (Exception ex) { + Logger.getLogger(SmartMagnetPanel.class.getName()).log(Level.SEVERE, null, ex); + } + }//GEN-LAST:event_buttonConfigurationActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton buttonConfiguration; + private javax.swing.JButton buttonSupressOff; + private javax.swing.JButton buttonSupressOn; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel5; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; - private ch.psi.pshell.swing.Led ledMountPosition; + private javax.swing.JPanel jPanel3; private ch.psi.pshell.swing.Led ledMounted; private ch.psi.pshell.swing.Led ledStatus; + private ch.psi.pshell.swing.Led ledSupressed; private ch.psi.pshell.swing.ProcessVariablePanel panelCurrent; private ch.psi.pshell.swing.DeviceValuePanel panelCurrentRb; private javax.swing.JPanel panelPowerCtr; diff --git a/script/devices/Hexiposi.py b/script/devices/Hexiposi.py index 7c7c452..dbe248a 100644 --- a/script/devices/Hexiposi.py +++ b/script/devices/Hexiposi.py @@ -117,7 +117,7 @@ class Hexiposi(DiscretePositionerBase): self.update() def is_in_position(self, pos): - return take() == pos + return self.take() == pos def assert_in_position(self, pos): @@ -128,6 +128,10 @@ class Hexiposi(DiscretePositionerBase): if self.homed == False: raise Exception ("Hexiposi is not homed") + def assert_in_known_position(self): + self.get_status() + if self.rback == 'Unknown': + raise Exception("Hexiposi is in an unknown position, please home.") #def isReady(self): # self.get_status() diff --git a/script/devices/SmartMagnet.py b/script/devices/SmartMagnet.py index 29e70b7..8039798 100644 --- a/script/devices/SmartMagnet.py +++ b/script/devices/SmartMagnet.py @@ -31,8 +31,9 @@ class SmartMagnet(DeviceBase): return smc_magnet_status.read() def assert_status(self): - if self.get_status() == False: - raise Exception("Smart Magnet is in faulty status.") + pass + #if self.get_status() == False: + # raise Exception("Smart Magnet is in faulty status.") def is_mounted(self): self.assert_status() @@ -72,7 +73,9 @@ class SmartMagnet(DeviceBase): def doUpdate(self): try: - if self.is_mounted(): + if self.get_supress(): + self.setState(State.Paused) + elif self.is_mounted(): self.setState(State.Busy) else: self.setState(State.Ready) @@ -104,15 +107,18 @@ class SmartMagnet(DeviceBase): return self.get_current() == self.config.getFieldValue("restingCurrent") - #Setting resting current to better detect sample - def enforce_sample_detection(self): + def apply_reverse(self): reverse_wait = float(self.config.getFieldValue("reverseTime")) if reverse_wait >0: self.set_reverse_current() time.sleep(reverse_wait) + + #Setting resting current to better detect sample + def apply_resting(self): if not self.is_resting_current(): self.set_resting_current() - time.sleep(0.2) + + add_device(SmartMagnet("smart_magnet"), force = True) diff --git a/script/local.py b/script/local.py index 2110c3d..d709fad 100644 --- a/script/local.py +++ b/script/local.py @@ -149,6 +149,8 @@ def system_check(robot_move=True): raise Exception("Air pressure is not ok") if not n2_pressure_ok.read(): raise Exception("N2 pressure is not ok") + hexiposi.assert_in_known_position() + if robot_move: if not feedback_local_safety.read(): raise Exception("Local safety not released") @@ -165,9 +167,15 @@ def system_check_msg(): return "Ok" except: return sys.exc_info()[1] - + +def get_puck_dev(segment, puck): + if type(segment) is int: + segment = chr( ord('A') + (segment-1)) + + return Controller.getInstance().getPuck(str(segment).upper() + str(puck)) + def get_puck_elect_detection(segment, puck): - return str(Controller.getInstance().getPuck(str(segment).upper() + str(puck)).detection) + return str(get_puck_dev(segment, puck).detection) def get_puck_img_detection(segment, puck): return str(Controller.getInstance().getPuck(str(segment).upper() + str(puck)).imageDetection) @@ -198,6 +206,18 @@ def get_detected_pucks(): ret.append(str(p.getName())) return ret +def get_pucks_info(): + ret = [] + for i in range(30): + p = BasePlate.getPucks()[i] + name = p.getName() + det = str(p.getDetection()) + barcode = "" if p.getId() is None else p.getId() + + ret.append({"puckAddress": name, "puckState": det, "puckBarcode":barcode}) + return json.dumps(ret) + + ################################################################################################### # Device initialization ################################################################################################### @@ -253,6 +273,12 @@ if is_imaging_enabled(): except: print >> sys.stderr, traceback.format_exc() +#TODO: The Smart Magnet keeps moving sample if detecting is enabled +# Detection keeps disabled unless during moount/unmount +try: + smart_magnet.set_supress(True) +except: + print >> sys.stderr, traceback.format_exc() #gripper_cam.paused = True ################################################################################################### diff --git a/script/motion/homing_hexiposi.py b/script/motion/homing_hexiposi.py index 3b91519..5c99f9e 100644 --- a/script/motion/homing_hexiposi.py +++ b/script/motion/homing_hexiposi.py @@ -12,5 +12,7 @@ def homing_hexiposi(): set_status("Homing hexiposi") hexiposi.move_home() - hexiposi.waitState(State.Ready,-1) + hexiposi.waitState(State.Ready,-1) + hexiposi.move_pos(1) + \ No newline at end of file diff --git a/script/motion/mount.py b/script/motion/mount.py index 9ce9b2c..b49673f 100644 --- a/script/motion/mount.py +++ b/script/motion/mount.py @@ -7,13 +7,13 @@ def mount(segment, puck, sample, force=False, read_dm=False, auto_unmount=False) global mount_sample_id, mount_sample_detected print "mount: ", segment, puck, sample, force - start = time.time() - + start = time.time() + #time.sleep(2) is_aux = (segment == AUX_SEGMENT) #ZACH - #needs_chilling = not is_aux and (not robot.is_cold()) - #needs_drying = is_aux and robot.is_cold() + needs_chilling = not is_aux and (not robot.is_cold()) + needs_drying = is_aux and robot.is_cold() puck_address = get_puck_address(puck) if puck_address is None: @@ -47,17 +47,21 @@ def mount(segment, puck, sample, force=False, read_dm=False, auto_unmount=False) try: #ZACH - #if needs_chilling: - # robot.move_cold() - # time.sleep(30.0) + if needs_chilling: + robot.move_cold() + time.sleep(30.0) - smart_magnet.enforce_sample_detection() + if smart_magnet.get_supress() == True: + smart_magnet.set_supress(False) + time.sleep(0.2) + #To better dectect sample + smart_magnet.apply_resting() if smart_magnet.check_mounted(idle_time=0.25, timeout = 1.0) == True: if auto_unmount and (get_setting("mounted_sample_position") is not None): - unmount(force = True) + #auto_unmount set to true so detection remains enabled + unmount(force = True, auto_unmount = True) else: - raise Exception("Pin detected on gonio") - + raise Exception("Pin detected on gonio") set_status("Mounting: " + str(segment) + str(puck) + str(sample)) #location = robot.get_current_point() @@ -65,8 +69,9 @@ def mount(segment, puck, sample, force=False, read_dm=False, auto_unmount=False) enable_motion() #ZACH - #if needs_drying: - # dry(wait_cold=-1) + # a room temp pin is being mounted but the gripper is cold + if needs_drying: + dry(wait_cold=-1) # move to park after dry if is_aux: if not robot.is_aux(): @@ -85,9 +90,7 @@ def mount(segment, puck, sample, force=False, read_dm=False, auto_unmount=False) robot.get_dewar(segment, puck, sample) - - set_setting("mounted_sample_position", get_sample_name(segment, puck, sample)) - + if read_dm: barcode_reader.start_read(10.0) robot.move_scanner() @@ -100,12 +103,11 @@ def mount(segment, puck, sample, force=False, read_dm=False, auto_unmount=False) print "Datamatrix: " , mount_sample_id else: mount_sample_id = None - - smart_magnet.set_mount_current() + robot.put_gonio() - + try: dry_mount_count = int(get_setting("dry_mount_counter")) except: @@ -117,18 +119,21 @@ def mount(segment, puck, sample, force=False, read_dm=False, auto_unmount=False) else: robot.move_cold() - mount_sample_detected = smart_magnet.check_mounted(idle_time=0.25, timeout = 1.0) - #TODO: Should do on finally? - update_samples_info_sample_mount(get_puck_name(segment, puck), sample, mount_sample_detected, mount_sample_id) - if mount_sample_detected == False: - raise Exception("No pin detected on gonio") + mount_sample_detected = smart_magnet.check_mounted(idle_time=0.25, timeout = 1.0) + update_samples_info_sample_mount(get_puck_name(segment, puck), sample, mount_sample_detected, mount_sample_id) + if mount_sample_detected == False: + raise Exception("No pin detected on gonio") + - if is_force_dry(): - smart_magnet.set_default_current() - print "Auto dry" - log("Starting auto dry", False) - dry() + if is_force_dry(): + smart_magnet.set_default_current() + print "Auto dry" + log("Starting auto dry", False) + set_exec_pars(then = "dry()") + + set_setting("mounted_sample_position", get_sample_name(segment, puck, sample)) return [mount_sample_detected, mount_sample_id] finally: smart_magnet.set_default_current() + smart_magnet.set_supress(True) diff --git a/script/motion/recover.py b/script/motion/recover.py index d372a46..06b628e 100644 --- a/script/motion/recover.py +++ b/script/motion/recover.py @@ -40,7 +40,7 @@ def get_dist_to_segment(segment): l = Line3D(v1, v2, 0.01) d = l.distance(v) - pj = get_pojection_at_line(segment) + pj = get_projection_at_line(segment) d1, d2 = v1.distance(v), v2.distance(v) dp1, dp2 = v1.distance(pj), v2.distance(pj) @@ -61,7 +61,7 @@ def is_on_segment(segment): #print "Current robot position " + str(p) + " on segment " + str(segment) + " - distance=" + str(d) return True -def get_pojection_at_line(segment): +def get_projection_at_line(segment): tolerance = segment[2] p1, p2 = robot.get_pnt(segment[0]), robot.get_pnt(segment[1]) p = get_robot_position() @@ -91,7 +91,7 @@ def move_to_segment(segment): tolerance = segment[2] p = get_robot_position() v = Vector3D(p[0], p[1], p[2]) - lv = get_pojection_at_line(segment) + lv = get_projection_at_line(segment) dlv = lv.distance(v) if dlv> (tolerance + 0.1): raise Exception( "Error moving from " + str(p) + " to segment - distance=" + str(dlv)) diff --git a/script/motion/tools.py b/script/motion/tools.py index efdd5f9..3cb76ef 100644 --- a/script/motion/tools.py +++ b/script/motion/tools.py @@ -140,6 +140,8 @@ def assert_valid_address(segment, puck, sample): raise Exception ("Invalid puck") if sample<=0 or sample >16: raise Exception ("Invalid sample") + if get_puck_dev(segment, puck).isDisabled(): + raise Exception ("Puck is disabled") def assert_valid_sample(sample): if sample<=0 or sample >16: diff --git a/script/motion/unmount.py b/script/motion/unmount.py index 495c2e5..45065d8 100644 --- a/script/motion/unmount.py +++ b/script/motion/unmount.py @@ -1,7 +1,12 @@ -def unmount(segment = None, puck = None, sample = None, force=False): +def unmount(segment = None, puck = None, sample = None, force=False, auto_unmount = False): """ """ - print "unmount: ", segment, puck, sample, force + print "unmount: ", segment, puck, sample, force + + #ZACH + is_aux = (segment == AUX_SEGMENT) + needs_chilling = not is_aux and (not robot.is_cold()) + needs_drying = is_aux and robot.is_cold() if (segment is None) or (puck is None) or (sample is None): pos = get_setting("mounted_sample_position") @@ -9,10 +14,11 @@ def unmount(segment = None, puck = None, sample = None, force=False): raise Exception("Mounted sample position is not defined") segment, puck , sample = pos[0:1], int(pos[1]), int(pos[2:]) print "Mounted sample position: ", segment, puck , sample - is_aux = (segment == AUX_SEGMENT) #Initial checks + print "assert valid address" assert_valid_address(segment, puck, sample) + print "asser puck detected" assert_puck_detected(segment, puck) if robot.simulated: @@ -20,23 +26,33 @@ def unmount(segment = None, puck = None, sample = None, force=False): update_samples_info_sample_unmount(get_puck_name(segment, puck), sample) set_setting("mounted_sample_position", None) return - + + print "assert no task" robot.assert_no_task() + print "reset motion" robot.reset_motion() + print "wait ready" robot.wait_ready() + print "assert cleared" robot.assert_cleared() #robot.assert_in_known_point() + print "assert homed" hexiposi.assert_homed() + print "assert mount pos" assert_mount_position() set_status("Umounting: " + str(segment) + str(puck) + str(sample)) try: - if not force: - smart_magnet.enforce_sample_detection() - if smart_magnet.check_mounted(idle_time=0.5, timeout = 3.0) == False: - raise Exception("No pin detected on gonio") + if smart_magnet.get_supress() == True: + smart_magnet.set_supress(False) + time.sleep(0.2) + + smart_magnet.apply_resting() + if not force: + if smart_magnet.check_mounted(idle_time=0.5, timeout = 3.0) == False: + raise Exception("No pin detected on gonio") #Enabling enable_motion() @@ -46,16 +62,24 @@ def unmount(segment = None, puck = None, sample = None, force=False): if not force: visual_check_hexiposi(segment) - + if needs_chilling: + robot.move_cold() + time.sleep(30.) + else: + if needs_drying: + dry(wait_cold=-1) #location = robot.get_current_point() if not robot.is_gonio(): robot.move_gonio() - smart_magnet.set_unmount_current() - + #smart_magnet.set_unmount_current() + robot.get_gonio() + #smart_magnet.apply_reverse() + #smart_magnet.apply_resting() + if is_aux: robot.move_aux() robot.put_aux( sample) @@ -66,5 +90,6 @@ def unmount(segment = None, puck = None, sample = None, force=False): robot.put_dewar(segment, puck, sample) set_setting("mounted_sample_position", None) finally: - smart_magnet.set_default_current() - + if not auto_unmount: + smart_magnet.set_default_current() + smart_magnet.set_supress(True) diff --git a/script/test/then.py b/script/test/then.py new file mode 100644 index 0000000..fcbe1bb --- /dev/null +++ b/script/test/then.py @@ -0,0 +1,3 @@ +time.sleep(3.0) + +set_exec_pars(then = "time.sleep(5.0)") \ No newline at end of file