From 6a8de5b9133f767beea23db6b56222645cc652a5 Mon Sep 17 00:00:00 2001 From: gac-S_Changer Date: Tue, 19 Mar 2019 10:32:57 +0100 Subject: [PATCH] --- config/config.properties | 3 +- config/devices.properties | 2 +- config/settings.properties | 9 +- devices/C5.properties | 4 +- devices/img.properties | 20 +- devices/led_ctrl_1.properties | 2 +- devices/led_ctrl_2.properties | 2 +- devices/led_ctrl_3.properties | 2 +- plugins/Commands.java | 4 +- plugins/MXSC-1.10.0.jar | Bin 272181 -> 272446 bytes plugins/PuckDetectionPanel.form | 18 +- plugins/PuckDetectionPanel.java | 13 +- script/imgproc/CameraCalibration.py | 5 +- script/local.py | 827 ++++++++++++++-------------- script/motion/tools.py | 16 +- 15 files changed, 473 insertions(+), 454 deletions(-) diff --git a/config/config.properties b/config/config.properties index bd42d04..0b4b39a 100644 --- a/config/config.properties +++ b/config/config.properties @@ -1,4 +1,4 @@ -#Wed Feb 06 11:13:25 CET 2019 +#Tue Mar 19 08:37:33 CET 2019 autoSaveScanData=true commandExecutionEvents=false createSessionFiles=true @@ -10,6 +10,7 @@ dataScanPreserveTypes=false dataScanReleaseRecords=false dataServerPort=-1 depthDimension=0 +hideServerMessages=true hostName=null instanceName=X06SA logDaysToLive=30 diff --git a/config/devices.properties b/config/devices.properties index d3f0723..5c89c68 100644 --- a/config/devices.properties +++ b/config/devices.properties @@ -1,4 +1,4 @@ -img=ch.psi.pshell.prosilica.Prosilica|204464 "PacketSize=1504;PixelFormat=Mono8;BinningX=1;BinningY=1;RegionX=300;RegionY=200;Width=1000;Height=1000;MulticastEnable=Off"||-200|false +img=ch.psi.pshell.prosilica.Prosilica|204464 "PacketSize=1504;PixelFormat=Mono8;BinningX=1;BinningY=1;RegionX=290;RegionY=130;Width=1000;Height=1000;MulticastEnable=Off"||-200|false gripper_cam=ch.psi.pshell.imaging.MjpegSource|http://axis-accc8ea5e463.psi.ch/axis-cgi/mjpg/video.cgi?camera=1 reopen||-200|false monitoring_cam=ch.psi.pshell.imaging.MjpegSource|http://axis-accc8ea5e463.psi.ch/axis-cgi/mjpg/video.cgi?camera=2 reopen||-200| #top_cam=ch.psi.pshell.imaging.MjpegSource|http://axis-accc8ea5e463.psi.ch/axis-cgi/mjpg/video.cgi?camera=3 true||-200| diff --git a/config/settings.properties b/config/settings.properties index 1f0c014..ec63f39 100644 --- a/config/settings.properties +++ b/config/settings.properties @@ -1,12 +1,17 @@ -#Tue Feb 19 12:07:34 CET 2019 +#Tue Mar 19 08:36:08 CET 2019 barcode_reader_scan_pucks=false beamline_status_enabled=false dry_mount_counter=0 -dry_timestamp=1.550572774662E9 +dry_timestamp=1.552980281686E9 force_dry_mount_count=15 force_dry_timeout=0 imaging_enabled=false led_level=0.0 pin_offset=0.0 puck_types=true +roi_h=1000 +roi_w=1000 +roi_x=286 +roi_y=127 room_temperature_enabled=false +valve_control=false diff --git a/devices/C5.properties b/devices/C5.properties index c4df46c..5df0b2a 100644 --- a/devices/C5.properties +++ b/devices/C5.properties @@ -1,3 +1,3 @@ -#Wed Feb 06 11:02:19 CET 2019 +#Mon Mar 11 10:22:44 CET 2019 detection=Mechanical -disabled=false +disabled=true diff --git a/devices/img.properties b/devices/img.properties index 9dffde8..966291b 100644 --- a/devices/img.properties +++ b/devices/img.properties @@ -1,4 +1,4 @@ -#Wed Sep 12 14:06:31 CEST 2018 +#Tue Mar 12 14:02:05 CET 2019 colormap=Grayscale colormapAutomatic=false colormapMax=18.133 @@ -9,16 +9,16 @@ grayscale=false invert=false rescaleFactor=1.0 rescaleOffset=0.0 -roiHeight=899 -roiWidth=893 -roiX=48 -roiY=45 -rotation=230.05382605006437 +roiHeight=959 +roiWidth=958 +roiX=21 +roiY=20 +rotation=90.09354404670171 rotationCrop=true scale=1.0 -spatialCalOffsetX=-447.0 -spatialCalOffsetY=-450.0 -spatialCalScaleX=0.5262180258614136 -spatialCalScaleY=0.5227145226413789 +spatialCalOffsetX=-479.0 +spatialCalOffsetY=-480.0 +spatialCalScaleX=0.49018322600904013 +spatialCalScaleY=0.489795265579423 spatialCalUnits=mm transpose=false diff --git a/devices/led_ctrl_1.properties b/devices/led_ctrl_1.properties index 6867617..5aed24d 100644 --- a/devices/led_ctrl_1.properties +++ b/devices/led_ctrl_1.properties @@ -1,4 +1,4 @@ -#Wed Feb 13 10:40:48 CET 2019 +#Mon Mar 11 10:54:31 CET 2019 maxValue=1.0 minValue=0.0 offset=0.0 diff --git a/devices/led_ctrl_2.properties b/devices/led_ctrl_2.properties index 6867617..5aed24d 100644 --- a/devices/led_ctrl_2.properties +++ b/devices/led_ctrl_2.properties @@ -1,4 +1,4 @@ -#Wed Feb 13 10:40:48 CET 2019 +#Mon Mar 11 10:54:31 CET 2019 maxValue=1.0 minValue=0.0 offset=0.0 diff --git a/devices/led_ctrl_3.properties b/devices/led_ctrl_3.properties index 6867617..5aed24d 100644 --- a/devices/led_ctrl_3.properties +++ b/devices/led_ctrl_3.properties @@ -1,4 +1,4 @@ -#Wed Feb 13 10:40:48 CET 2019 +#Mon Mar 11 10:54:31 CET 2019 maxValue=1.0 minValue=0.0 offset=0.0 diff --git a/plugins/Commands.java b/plugins/Commands.java index c1f41b5..46bcbbb 100644 --- a/plugins/Commands.java +++ b/plugins/Commands.java @@ -838,12 +838,12 @@ public class Commands extends Panel { private void buttonGetAuxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonGetAuxActionPerformed int sample = (Integer) spinnerSample.getValue(); - execute("get_aux('" + sample + ")"); + execute("get_aux('" + sample + "')"); }//GEN-LAST:event_buttonGetAuxActionPerformed private void buttonPutAuxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonPutAuxActionPerformed int sample = (Integer) spinnerSample.getValue(); - execute("put_aux('" + sample + ")"); + execute("put_aux('" + sample + "')"); }//GEN-LAST:event_buttonPutAuxActionPerformed private void checkAuxiliaryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkAuxiliaryActionPerformed diff --git a/plugins/MXSC-1.10.0.jar b/plugins/MXSC-1.10.0.jar index e03fb608c8b86879a5770697664d138cfd95ab19..04ee83472de5be6b47e6327b1552663210b8e313 100644 GIT binary patch delta 38295 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�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 WzBrD4n|k3Xkd{U*{`m@Qj`A - + @@ -111,16 +111,18 @@ - + - + + + + + + + + - - - - - diff --git a/plugins/PuckDetectionPanel.java b/plugins/PuckDetectionPanel.java index 1326665..e07dde6 100644 --- a/plugins/PuckDetectionPanel.java +++ b/plugins/PuckDetectionPanel.java @@ -83,7 +83,7 @@ public class PuckDetectionPanel extends DevicePanel { jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Raspberry Pi ")); - buttonPuckDetCheck.setText("Ckeck"); + buttonPuckDetCheck.setText("Check"); buttonPuckDetCheck.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonPuckDetCheckActionPerformed(evt); @@ -200,12 +200,13 @@ public class PuckDetectionPanel extends DevicePanel { jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() - .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(buttonConfigure) + .addGap(0, 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) diff --git a/script/imgproc/CameraCalibration.py b/script/imgproc/CameraCalibration.py index 07b123c..a89510d 100644 --- a/script/imgproc/CameraCalibration.py +++ b/script/imgproc/CameraCalibration.py @@ -2,9 +2,10 @@ import ch.psi.pshell.device.Camera as Camera import ch.psi.pshell.imaging.RendererMode as RendererMode import ch.psi.pshell.imaging.Calibration as Calibration from ch.psi.pshell.imaging.Overlays import * +import ch.psi.pshell.imaging.Pen as Pen import ch.psi.utils.swing.SwingUtils as SwingUtils import javax.swing.SwingUtilities as SwingUtilities -from swingutils.threads.swing import callSwing +#from swingutils.threads.swing import callSwing #SIMULATION = ch.psi.pshell.imaging.FileSource """ img.camera.setColorMode(Camera.ColorMode.Mono) @@ -17,7 +18,7 @@ img.camera.setGain(0.0) img.config.rotationCrop=True """ -MOVE_HEXIPOSI = True +MOVE_HEXIPOSI = not is_manual_mode() ROTATION_OFFSET = 180.0 if MOVE_HEXIPOSI: diff --git a/script/local.py b/script/local.py index 738f1ad..5ab54a5 100644 --- a/script/local.py +++ b/script/local.py @@ -1,413 +1,422 @@ ################################################################################################### # Deployment specific global definitions - executed after startup.py ################################################################################################### -import traceback -from ch.psi.pshell.serial import TcpDevice -from ch.psi.pshell.modbus import ModbusTCP -import ch.psi.mxsc.Controller as Controller -import ch.psi.pshell.core.Nameable as Nameable -import ch.psi.utils.Chrono as Chrono -import ch.psi.mxsc.Controller as Controller - - - -run("setup/Layout") - - - -################################################################################################### -# Configuration -################################################################################################### - -IMAGING_ENABLED_PREFERENCE = "imaging_enabled" -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" - -def is_imaging_enabled(): - setting = get_setting(IMAGING_ENABLED_PREFERENCE) - return not (str(setting).lower() == 'false') - -def set_imaging_enabled(value): - set_setting(IMAGING_ENABLED_PREFERENCE, (True if value else False) ) - -def assert_imaging_enabled(): - if is_imaging_enabled() == False: - raise Exception ("Imaging is disabled") - -#"unipuck", "minispine" or "mixed" -def set_puck_types(value): - set_setting(PUCK_TYPES_PREFERENCE, True if value else False ) - -def get_puck_types(): - setting = get_setting(PUCK_TYPES_PREFERENCE) - if setting == "unipuck" or setting == "minispine": - return setting - return "mixed" - - -def is_barcode_reader_scan_pucks(): - setting = get_setting(BARCODE_READER_SCAN_PUCKS) - return False if setting is None else setting.lower() == "true" - -def set_barcode_reader_scan_pucks(value): - set_setting(BARCODE_READER_SCAN_PUCKS, True if value else False ) - -def reset_mounted_sample_position(): - set_setting("mounted_sample_position", None) - - -def get_puck_barcode_reader(): - if is_barcode_reader_scan_pucks(): - return barcode_reader - else: - return barcode_reader_puck - -#In order to apply current config -set_imaging_enabled(is_imaging_enabled()) -set_puck_types(get_puck_types()) -set_barcode_reader_scan_pucks(is_barcode_reader_scan_pucks()) - - -force_dry_mount_count = get_setting("force_dry_mount_count") -if force_dry_mount_count is None: - set_setting("force_dry_mount_count", 0) - -force_dry_timeout = get_setting("force_dry_timeout") -if force_dry_timeout is None: - set_setting("force_dry_timeout", 0) - - - -def is_room_temperature_enabled(): - setting = get_setting(ROOM_TEMPERATURE_ENABLED_PREFERENCE) - return str(setting).lower() == 'true' - -set_setting(ROOM_TEMPERATURE_ENABLED_PREFERENCE, is_room_temperature_enabled()) - - -def is_beamline_status_enabled(): - setting = get_setting(BEAMLINE_STATUS_ENABLED_PREFERENCE) - return str(setting).lower() == 'true' - -set_setting(BEAMLINE_STATUS_ENABLED_PREFERENCE, is_beamline_status_enabled()) - -################################################################################################### -# Scripted devices and pseudo-devices -################################################################################################### - -for script in ["devices/RobotSC", "devices/Wago", "devices/BarcodeReader", "devices/LaserDistance", \ - "devices/LedCtrl", "devices/SmartMagnet", "devices/HexiPosi", "devices/Gonio"]: - try: - run(script) - except: - print >> sys.stderr, traceback.format_exc() - -#if is_imaging_enabled(): -if get_device("img") is not None: - add_device(img.getContrast(), force = True) - add_device(img.getCamera(), force = True) - - -################################################################################################### -# Utility modules -################################################################################################### - -run("data/samples") -run("data/pucks") -run("motion/tools") -run("motion/mount") -run("motion/unmount") -run("motion/get_dewar") -run("motion/put_dewar") -run("motion/get_gonio") -run("motion/put_gonio") -run("motion/move_dewar") -run("motion/move_gonio") -run("motion/move_heater") -run("motion/move_home") -run("motion/move_park") -run("motion/move_cold") -run("motion/move_scanner") -run("motion/move_aux") -run("motion/get_aux") -run("motion/put_aux") -run("motion/dry") -run("motion/trash") -run("motion/homing_hexiposi") -run("motion/calibrate_tool") -run("motion/scan_pin") -run("motion/robot_recover") -run("motion/recover") -run("tools/Math") -if is_imaging_enabled(): - run("imgproc/Utils") - -def system_check(robot_move=True): - if not air_pressure_ok.read(): - 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") - auto = not is_manual_mode() - if auto: - if not feedback_psys_safety.read(): - raise Exception("Psys safety not released") - if not guiding_tool_park.read(): - raise Exception("Guiding tool not parked") - -def system_check_msg(): - try: - system_check(True) - 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(get_puck_dev(segment, puck).detection) - -def get_puck_img_detection(segment, puck): - return str(Controller.getInstance().getPuck(str(segment).upper() + str(puck)).imageDetection) - -def assert_puck_detected(segment, puck): - if (segment == AUX_SEGMENT) and (puck == 1): - return - if get_puck_elect_detection(segment, puck) != "Present": - raise Exception ("Puck " + str(segment).upper() + str(puck) + " not present") - - -def start_puck_detection(): - run("tools/RestartPuckDetection") - -def check_puck_detection(): - return run("tools/CheckPuckDetection") - -def stop_puck_detection(): - run("tools/StopPuckDetection") - - - -def get_detected_pucks(): - ret = [] - for i in range(30): - p = BasePlate.getPucks()[i] - if (str(p.getDetection()) == "Present"): - 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 -################################################################################################### - -try: - set_heater(False) - set_air_stream(False) -except: - print >> sys.stderr, traceback.format_exc() - - -try: - release_local_safety.write(False) - release_psys_safety.write(False) -except: - print >> sys.stderr, traceback.format_exc() - -try: - hexiposi.polling=500 -except: - print >> sys.stderr, traceback.format_exc() - -try: - robot.setPolling(DEFAULT_ROBOT_POLLING) - robot.set_tool(TOOL_DEFAULT) - robot.set_frame(FRAME_DEFAULT) - robot.set_motors_enabled(True) - robot.set_joint_motors_enabled(True) -except: - print >> sys.stderr, traceback.format_exc() - -if is_imaging_enabled(): - try: - import ch.psi.pshell.device.Camera as Camera - #img.camera.setColorMode(Camera.ColorMode.Mono) - #img.camera.setDataType(Camera.DataType.UInt8) - img.camera.setGrabMode(Camera.GrabMode.Continuous) - img.camera.setTriggerMode(Camera.TriggerMode.Fixed_Rate) - img.camera.setExposure(25.00) - img.camera.setAcquirePeriod(200.00) - img.camera.setGain(0.0) - #img.camera.setROI(200, 0,1200,1200) - """ - img.camera.setROI(300, 200,1000,1000) - img.config.rotation=17 - img.config.rotationCrop=True - img.config.roiX,img.config.roiY, img.config.roiWidth,img.config.roiHeight = 50,50,900,900 - """ - img.camera.setROI(int(get_setting("roi_x")), int(get_setting("roi_y")), int(get_setting("roi_w")), int(get_setting("roi_h"))) - - img.camera.stop() - img.camera.start() - 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 -################################################################################################### -# Device monitoring -################################################################################################### - -DEWAR_LEVEL_RT = 5.0 -is_room_temperature = False - -def is_room_temp(): - return is_room_temperature - - -class DewarLevelListener (DeviceListener): - def onValueChanged(self, device, value, former): - global is_room_temperature - if value is not None: - is_room_temperature = value <= DEWAR_LEVEL_RT -dewar_level_listener = DewarLevelListener() - -for l in dewar_level.listeners: - #if isinstance(l, DewarLevelListener): #Class changes... - if Nameable.getShortClassName(l.getClass()) == "DewarLevelListener": - dewar_level.removeListener(l) - -dewar_level.addListener(dewar_level_listener) -dewar_level_listener.onValueChanged(dewar_level, dewar_level.take(), None) - - - - -class HexiposiListener (DeviceListener): - def onValueChanging(self, device, value, former): - robot.assert_cleared() - -hexiposi_listener = HexiposiListener() -hexiposi.addListener(hexiposi_listener) - -################################################################################################### -# Global variables & application state -################################################################################################### - - -context = get_context() - -cover_detection_debug = False - -in_mount_position = False - - -def assert_mount_position(): - print "Source: ", get_exec_pars().source - if not in_mount_position and get_exec_pars().source == CommandSource.server : - raise Exception("Not in mount position") - - -def is_puck_loading(): - return robot.state == State.Ready and robot.take()["pos"] == 'pPark' and \ - feedback_psys_safety.take() == False and \ - not guiding_tool_park.read() - -def set_pin_offset(val): - if abs(val) >5: - raise Exception("Invalid pin offset: " + str(val)) - try: - set_setting("pin_offset",float(val)) - except: - log("Error setting pin offset: " + str(sys.exc_info()[1]), False) - -def get_pin_offset(): - try: - ret = float(get_setting("pin_offset")) - if abs(ret) >5: - raise Exception("Invalid configured pin offset: " + str(ret)) - return ret - except: - log("Error getting pin offset: " + str(sys.exc_info()[1]), False) - return 0.0 - - -def set_pin_angle_offset(val): - if (abs(val) > 180.0) or (abs(val) < -180.0): - raise Exception("Invalid pin angle offset: " + str(val)) - try: - set_setting("pin_angle_offset",float(val)) - except: - log("Error setting pin angle offset: " + str(sys.exc_info()[1]), False) - -def get_pin_angle_offset(): - try: - ret = float(get_setting("pin_angle_offset")) - if (abs(ret) > 180.0) or (abs(ret) < -180.0): - raise Exception("Invalid configured pin angle offset: " + str(ret)) - return ret - except: - log("Error getting pin angle offset: " + str(sys.exc_info()[1]), False) - return 0.0 - -def is_force_dry(): - try: - dry_mount_counter = int(get_setting("dry_mount_counter")) - except: - dry_mount_counter = 0 - - try: - dry_timespan = time.time() - float( get_setting("dry_timestamp")) - except: - dry_timespan = 3600 - - try: - force_dry_mount_count = int(get_setting("force_dry_mount_count")) - if force_dry_mount_count>0 and dry_mount_counter>=force_dry_mount_count: - return True - except: - pass - - try: - force_dry_timeout = float(get_setting("force_dry_timeout")) - if force_dry_timeout>0 and dry_timespan>=force_dry_timeout: - return True - except: - pass - return False - - -update() -add_device(Controller.getInstance().basePlate, True) -restore_samples_info() - - -print "Initialization complete" +import traceback +from ch.psi.pshell.serial import TcpDevice +from ch.psi.pshell.modbus import ModbusTCP +import ch.psi.mxsc.Controller as Controller +import ch.psi.pshell.core.Nameable as Nameable +import ch.psi.utils.Chrono as Chrono +import ch.psi.mxsc.Controller as Controller + + + +run("setup/Layout") + + + +################################################################################################### +# Configuration +################################################################################################### + +IMAGING_ENABLED_PREFERENCE = "imaging_enabled" +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) + return not (str(setting).lower() == 'false') + +def set_imaging_enabled(value): + set_setting(IMAGING_ENABLED_PREFERENCE, (True if value else False) ) + +def assert_imaging_enabled(): + if is_imaging_enabled() == False: + raise Exception ("Imaging is disabled") + +#"unipuck", "minispine" or "mixed" +def set_puck_types(value): + set_setting(PUCK_TYPES_PREFERENCE, True if value else False ) + +def get_puck_types(): + setting = get_setting(PUCK_TYPES_PREFERENCE) + if setting == "unipuck" or setting == "minispine": + return setting + return "mixed" + + +def is_barcode_reader_scan_pucks(): + setting = get_setting(BARCODE_READER_SCAN_PUCKS) + return False if setting is None else setting.lower() == "true" + +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) + + +def get_puck_barcode_reader(): + if is_barcode_reader_scan_pucks(): + return barcode_reader + else: + return barcode_reader_puck + +#In order to apply current config +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") +if force_dry_mount_count is None: + set_setting("force_dry_mount_count", 0) + +force_dry_timeout = get_setting("force_dry_timeout") +if force_dry_timeout is None: + set_setting("force_dry_timeout", 0) + + + +def is_room_temperature_enabled(): + setting = get_setting(ROOM_TEMPERATURE_ENABLED_PREFERENCE) + return str(setting).lower() == 'true' + +set_setting(ROOM_TEMPERATURE_ENABLED_PREFERENCE, is_room_temperature_enabled()) + + +def is_beamline_status_enabled(): + setting = get_setting(BEAMLINE_STATUS_ENABLED_PREFERENCE) + return str(setting).lower() == 'true' + +set_setting(BEAMLINE_STATUS_ENABLED_PREFERENCE, is_beamline_status_enabled()) + +################################################################################################### +# Scripted devices and pseudo-devices +################################################################################################### + +for script in ["devices/RobotSC", "devices/Wago", "devices/BarcodeReader", "devices/LaserDistance", \ + "devices/LedCtrl", "devices/SmartMagnet", "devices/HexiPosi", "devices/Gonio"]: + try: + run(script) + except: + print >> sys.stderr, traceback.format_exc() + +#if is_imaging_enabled(): +if get_device("img") is not None: + add_device(img.getContrast(), force = True) + add_device(img.getCamera(), force = True) + + +################################################################################################### +# Utility modules +################################################################################################### + +run("data/samples") +run("data/pucks") +run("motion/tools") +run("motion/mount") +run("motion/unmount") +run("motion/get_dewar") +run("motion/put_dewar") +run("motion/get_gonio") +run("motion/put_gonio") +run("motion/move_dewar") +run("motion/move_gonio") +run("motion/move_heater") +run("motion/move_home") +run("motion/move_park") +run("motion/move_cold") +run("motion/move_scanner") +run("motion/move_aux") +run("motion/get_aux") +run("motion/put_aux") +run("motion/dry") +run("motion/trash") +run("motion/homing_hexiposi") +run("motion/calibrate_tool") +run("motion/scan_pin") +run("motion/robot_recover") +run("motion/recover") +run("tools/Math") +if is_imaging_enabled(): + run("imgproc/Utils") + +def system_check(robot_move=True): + if not air_pressure_ok.read(): + 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") + auto = not is_manual_mode() + if auto: + if not feedback_psys_safety.read(): + raise Exception("Psys safety not released") + if not guiding_tool_park.read(): + raise Exception("Guiding tool not parked") + +def system_check_msg(): + try: + system_check(True) + 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(get_puck_dev(segment, puck).detection) + +def get_puck_img_detection(segment, puck): + return str(Controller.getInstance().getPuck(str(segment).upper() + str(puck)).imageDetection) + +def assert_puck_detected(segment, puck): + if (segment == AUX_SEGMENT) and (puck == 1): + return + if get_puck_elect_detection(segment, puck) != "Present": + raise Exception ("Puck " + str(segment).upper() + str(puck) + " not present") + + +def start_puck_detection(): + run("tools/RestartPuckDetection") + +def check_puck_detection(): + return run("tools/CheckPuckDetection") + +def stop_puck_detection(): + run("tools/StopPuckDetection") + + + +def get_detected_pucks(): + ret = [] + for i in range(30): + p = BasePlate.getPucks()[i] + if (str(p.getDetection()) == "Present"): + 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 +################################################################################################### + +try: + set_heater(False) + set_air_stream(False) +except: + print >> sys.stderr, traceback.format_exc() + + +try: + release_local_safety.write(False) + release_psys_safety.write(False) +except: + print >> sys.stderr, traceback.format_exc() + +try: + hexiposi.polling=500 +except: + print >> sys.stderr, traceback.format_exc() + +try: + robot.setPolling(DEFAULT_ROBOT_POLLING) + robot.set_tool(TOOL_DEFAULT) + robot.set_frame(FRAME_DEFAULT) + robot.set_motors_enabled(True) + robot.set_joint_motors_enabled(True) +except: + print >> sys.stderr, traceback.format_exc() + +if is_imaging_enabled(): + try: + import ch.psi.pshell.device.Camera as Camera + #img.camera.setColorMode(Camera.ColorMode.Mono) + #img.camera.setDataType(Camera.DataType.UInt8) + img.camera.setGrabMode(Camera.GrabMode.Continuous) + img.camera.setTriggerMode(Camera.TriggerMode.Fixed_Rate) + img.camera.setExposure(25.00) + img.camera.setAcquirePeriod(200.00) + img.camera.setGain(0.0) + #img.camera.setROI(200, 0,1200,1200) + """ + img.camera.setROI(300, 200,1000,1000) + img.config.rotation=17 + img.config.rotationCrop=True + img.config.roiX,img.config.roiY, img.config.roiWidth,img.config.roiHeight = 50,50,900,900 + """ + img.camera.setROI(int(get_setting("roi_x")), int(get_setting("roi_y")), int(get_setting("roi_w")), int(get_setting("roi_h"))) + + img.camera.stop() + img.camera.start() + 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 +################################################################################################### +# Device monitoring +################################################################################################### + +DEWAR_LEVEL_RT = 5.0 +is_room_temperature = False + +def is_room_temp(): + return is_room_temperature + + +class DewarLevelListener (DeviceListener): + def onValueChanged(self, device, value, former): + global is_room_temperature + if value is not None: + is_room_temperature = value <= DEWAR_LEVEL_RT +dewar_level_listener = DewarLevelListener() + +for l in dewar_level.listeners: + #if isinstance(l, DewarLevelListener): #Class changes... + if Nameable.getShortClassName(l.getClass()) == "DewarLevelListener": + dewar_level.removeListener(l) + +dewar_level.addListener(dewar_level_listener) +dewar_level_listener.onValueChanged(dewar_level, dewar_level.take(), None) + + + + +class HexiposiListener (DeviceListener): + def onValueChanging(self, device, value, former): + robot.assert_cleared() + +hexiposi_listener = HexiposiListener() +hexiposi.addListener(hexiposi_listener) + +################################################################################################### +# Global variables & application state +################################################################################################### + + +context = get_context() + +cover_detection_debug = False + +in_mount_position = False + + +def assert_mount_position(): + print "Source: ", get_exec_pars().source + if not in_mount_position and get_exec_pars().source == CommandSource.server : + raise Exception("Not in mount position") + + +def is_puck_loading(): + return robot.state == State.Ready and robot.take()["pos"] == 'pPark' and \ + feedback_psys_safety.take() == False and \ + not guiding_tool_park.read() + +def set_pin_offset(val): + if abs(val) >5: + raise Exception("Invalid pin offset: " + str(val)) + try: + set_setting("pin_offset",float(val)) + except: + log("Error setting pin offset: " + str(sys.exc_info()[1]), False) + +def get_pin_offset(): + try: + ret = float(get_setting("pin_offset")) + if abs(ret) >5: + raise Exception("Invalid configured pin offset: " + str(ret)) + return ret + except: + log("Error getting pin offset: " + str(sys.exc_info()[1]), False) + return 0.0 + + +def set_pin_angle_offset(val): + if (abs(val) > 180.0) or (abs(val) < -180.0): + raise Exception("Invalid pin angle offset: " + str(val)) + try: + set_setting("pin_angle_offset",float(val)) + except: + log("Error setting pin angle offset: " + str(sys.exc_info()[1]), False) + +def get_pin_angle_offset(): + try: + ret = float(get_setting("pin_angle_offset")) + if (abs(ret) > 180.0) or (abs(ret) < -180.0): + raise Exception("Invalid configured pin angle offset: " + str(ret)) + return ret + except: + log("Error getting pin angle offset: " + str(sys.exc_info()[1]), False) + return 0.0 + +def is_force_dry(): + try: + dry_mount_counter = int(get_setting("dry_mount_counter")) + except: + dry_mount_counter = 0 + + try: + dry_timespan = time.time() - float( get_setting("dry_timestamp")) + except: + dry_timespan = 3600 + + try: + force_dry_mount_count = int(get_setting("force_dry_mount_count")) + if force_dry_mount_count>0 and dry_mount_counter>=force_dry_mount_count: + return True + except: + pass + + try: + force_dry_timeout = float(get_setting("force_dry_timeout")) + if force_dry_timeout>0 and dry_timespan>=force_dry_timeout: + return True + except: + pass + return False + + +update() +add_device(Controller.getInstance().basePlate, True) +restore_samples_info() + + +print "Initialization complete" \ No newline at end of file diff --git a/script/motion/tools.py b/script/motion/tools.py index 3cb76ef..027f46f 100644 --- a/script/motion/tools.py +++ b/script/motion/tools.py @@ -134,18 +134,18 @@ def assert_valid_address(segment, puck, sample): return if is_string(segment): segment = ord(segment.upper()) - ord('A') +1 - if segment<=0 or segment >6: - raise Exception ("Invalid segment") - if puck<=0 or puck >5: - raise Exception ("Invalid puck") - if sample<=0 or sample >16: - raise Exception ("Invalid sample") + if (segment<=0) or (segment >6): + raise Exception ("Invalid segment: " + str(segment)) + if (puck<=0) or (puck >5): + raise Exception ("Invalid puck: " + str(puck)) + if (sample<=0) or (sample >16): + raise Exception ("Invalid sample: " + str(sample)) if get_puck_dev(segment, puck).isDisabled(): raise Exception ("Puck is disabled") def assert_valid_sample(sample): - if sample<=0 or sample >16: - raise Exception ("Invalid sample") + if (sample<=0) or (sample >16): + raise Exception ("Invalid sample: " + str(sample)) def get_puck_name(segment, puck): try: