diff --git a/config/config.properties b/config/config.properties index 9d03b6d..553aaa5 100644 --- a/config/config.properties +++ b/config/config.properties @@ -1,4 +1,4 @@ -#Thu Aug 15 14:00:07 CEST 2024 +#Tue Nov 05 14:52:58 CET 2024 autoSaveScanData=true commandExecutionEvents=false createSessionFiles=true @@ -41,7 +41,7 @@ saveCommandStatistics=true saveConsoleSessionFiles=false scanStreamerPort=-1 serverEnabled=true -serverPort=8080 +serverPort=22222 sessionHandling=Off simulation=false terminalEnabled=false diff --git a/config/preferences.json b/config/preferences.json index 9c4eed9..2e2ca90 100644 --- a/config/preferences.json +++ b/config/preferences.json @@ -144,6 +144,9 @@ }, { "deviceClassName" : "LaserUE", "panelClassName" : "LaserUEPanel" + }, { + "deviceClassName" : "SmartMagnet", + "panelClassName" : "SmartMagnetPanel" } ], "scriptPopupDialog" : "None" } \ No newline at end of file diff --git a/config/settings.properties b/config/settings.properties index b98fdb1..586ce7f 100644 --- a/config/settings.properties +++ b/config/settings.properties @@ -1,4 +1,4 @@ -#Wed Oct 30 11:17:33 CET 2024 +#Tue Nov 05 14:53:35 CET 2024 barcode_reader_scan_pucks=false beamline_status_enabled=false cold_position_timeout=3600 @@ -9,11 +9,12 @@ force_dry_timeout=27000 imaging_enabled=true led_level=0.0 pin_cleaner_timer=60 -pin_offset=-0.0 +pin_offset=0 puck_types=true roi_h=400 roi_w=600 roi_x=289 roi_y=123 room_temperature_enabled=false +service_mode=false valve_control=true diff --git a/devices/cover_detection.properties b/devices/cover_detection.properties index c7af9e5..b33f44d 100644 --- a/devices/cover_detection.properties +++ b/devices/cover_detection.properties @@ -1,14 +1,14 @@ -#Wed Oct 30 11:17:34 CET 2024 +#Tue Nov 05 14:53:21 CET 2024 border_dewar=0.56 center_x=1022.0 -center_y=1044.0 +center_y=1048.0 continuous=false correlation_threshold=0.0 dewar_wall=0.56 diam_dewar=null diam_disk=null diam_target=null -diameter_cover=1798 +diameter_cover=1787 diameter_dewar=1798 diameter_disk=670 diameter_target=100 @@ -23,8 +23,8 @@ number_images=1 offset_threshold=null open_strategy=both rotation_degrees=0.0 -scale_x=0.39299610894941633 -scale_y=0.39343350027824153 +scale_x=0.3969679955081415 +scale_y=0.3943112102621305 size_mask_dewar=0.98 size_mask_disk=0.8 threshold_method=IsoData diff --git a/plugins/MXSC-1.21.0.jar b/plugins/MXSC-1.21.0.jar index 8ec29ea..955ec01 100644 Binary files a/plugins/MXSC-1.21.0.jar and b/plugins/MXSC-1.21.0.jar differ diff --git a/script/data/samples.py b/script/data/samples.py index ce3d213..cbb0756 100644 --- a/script/data/samples.py +++ b/script/data/samples.py @@ -10,7 +10,10 @@ samples_info = [] def set_samples_info(info): global samples_info if (is_string(info)): - info = json.loads(info) + if info: + info = json.loads(info) + else: + info=[] if not is_list(info): raise Exception("Sample info must be a list (given object type is " + str(type(info)) + ")") #Sanitize list diff --git a/script/devices/CoverDetection.py b/script/devices/CoverDetection.py index 1676c54..391abbb 100644 --- a/script/devices/CoverDetection.py +++ b/script/devices/CoverDetection.py @@ -108,18 +108,28 @@ class CoverDetection(ReadonlyAsyncRegisterBase, ReadonlyRegisterArray): ip = self.images[0] else: ip = integrate(self.images) + + self.error = None + center = (self.config.center_x, self.config.center_y) try: - self.error = None - center = (self.config.center_x, self.config.center_y) x,y = detect_covert_position(ip, center, \ diam_target=self.config.diameter_target, diam_disk= self.config.diameter_disk, diam_dewar=self.config.diameter_dewar, \ mask_disk=self.config.size_mask_disk, mask_dewar=self.config.size_mask_dewar, border_dewar = self.config.border_dewar, \ offset_threshold=self.config.max_detect_offset ,open_strategy= self.config.open_strategy, threshold_method=self.config.threshold_method, \ debug=self.debug) - except Exception as e: + except Exception as e: self.error = e - x,y = -1, -1 + x,y = -1, -1 + try: + no_cover = detect_no_cover( ip, center, diam_dewar=self.config.diameter_dewar, border_dewar=self.config.border_dewar, \ + threshold_method=self.config.threshold_method, debug=self.debug) + if no_cover: + self.error = "No cover not detected" + except Exception as e2: + print e2 + + self.processing_time = time.time()-start self.proc_counter += 1 @@ -130,7 +140,7 @@ class CoverDetection(ReadonlyAsyncRegisterBase, ReadonlyRegisterArray): except Exception as e: #traceback.print_exc() if self.error is None: - self.error = e + self.error = e self.set(x, y, self.processing_time * 1000, self.error) #traceback.print_exc() @@ -165,12 +175,12 @@ class CoverDetection(ReadonlyAsyncRegisterBase, ReadonlyRegisterArray): if self.enabled: if error: self.offset_px = self.offset_um = None - value = None + value = str(error) else: offx, offy = x-self.config.center_x, y-self.config.center_y self.offset_px = opx, opy = round(offx), round(offy) self.offset_um = omx, omy = self.pixel_to_millis(x,y) - value = to_array([x, y, opx, opy, omx, -omy, tm], 'i') + value = to_array([x, y, opx, opy, omx, -omy, tm], 'i') self.onReadout(value) if self.renderer is not None: if error is None: diff --git a/script/devices/VmbCamera.py b/script/devices/VmbCamera.py index 6696069..2dae6d6 100644 --- a/script/devices/VmbCamera.py +++ b/script/devices/VmbCamera.py @@ -54,6 +54,14 @@ class VmbCamera (CameraBase): log(str(e)) fork(init_img) self.setState(State.Disabled) + + def doClose(self): + try: + self.stream.close() + except Exception as e: + print e + log(str(e)) + def add_initialized_callback(self, callback): def wait_init(): @@ -294,3 +302,7 @@ def initialized_callback(): run( "devices/CoverDetection") c.add_initialized_callback(initialized_callback) +cam.setGrabMode(Camera.GrabMode.Continuous) +cam.setTriggerMode(Camera.TriggerMode.Fixed_Rate) +cam.setAcquirePeriod(330.00) +cam.setGain(0.0) diff --git a/script/imgproc/CoverDetection.py b/script/imgproc/CoverDetection.py index e677737..caabd1d 100644 --- a/script/imgproc/CoverDetection.py +++ b/script/imgproc/CoverDetection.py @@ -114,3 +114,41 @@ def detect_covert_position( ip, center=None, diam_target=95, diam_disk=670, diam + +def detect_no_cover( ip, center=None, diam_dewar=1800, border_dewar=0.7, open_strategy = "none", print_table=False, output_image=False, threshold_method="IsoData", debug=False): + if output_image==True: + output_image= "outlines" + if ip.getProcessor().isGrayscale(): + ig = ip + else: + ig = grayscale(ip, in_place=False) + w, h = ip.getWidth(), ip.getHeight() + if center is None: + center = (int(w/2), int(h/2)) + + radius =diam_dewar*(border_dewar/2.0) * 1.2 + set_circle_mask(ip.getProcessor(), center_x=center[0], center_y=center[1], radius=radius*1.05, bitwise=False) + + if debug: + ImageBuffer.saveImage(ip.getProcessor().getBufferedImage(), os.path.abspath(expand_path("{images}/NoCoverMasked.png")), "png") + + #it = auto_threshold(ig, dark_background=True, method=threshold_method, in_place=False) + it = threshold(ig, 15, 255, in_place=True) + ip = it.getProcessor() + + if open_strategy in ("black", "both"): #Refine inner (target) + binary_open(it, dark_background=True, iterations=1, count=1); + if open_strategy in ("white", "both"): #Refine outer (disk) + binary_open(it, dark_background=False, iterations=1, count=1); + + if debug: + ImageBuffer.saveImage(ip.getBufferedImage(), os.path.abspath(expand_path("{images}/NoCoverBinary.png")), "png") + + px = int(pow(radius,2) * math.pi) + (res2,out2)=analyse_particles(it, px*0.8, px*1.3, \ + fill_holes = True, exclude_edges = True, print_table=print_table, \ + output_image = output_image, minCirc = 0.7, maxCirc = 1.0) + if res2.size() == 1: + return True + return False + \ No newline at end of file diff --git a/script/local.py b/script/local.py index 2d5d80b..7fcd073 100644 --- a/script/local.py +++ b/script/local.py @@ -27,6 +27,8 @@ 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" +SERVICE_MODE_PREFERENCE = "service_mode" + def is_imaging_enabled(): setting = get_setting(IMAGING_ENABLED_PREFERENCE) @@ -66,7 +68,17 @@ def set_valve_controlled(value): def reset_mounted_sample_position(): set_setting("mounted_sample_position", None) - + +def is_service_mode(): + setting = get_setting(SERVICE_MODE_PREFERENCE) + return False if setting is None else setting.lower() == "true" + +def set_service_mode(value): + set_setting(SERVICE_MODE_PREFERENCE, True if value else False ) + + + + def get_puck_barcode_reader(): if is_barcode_reader_scan_pucks(): @@ -79,6 +91,11 @@ 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()) + +if get_context().getRunCount() == 0: + set_service_mode(False) #Always start in normal mode +else: + set_service_mode(is_service_mode()) force_dry_mount_count = get_setting("force_dry_mount_count") @@ -136,8 +153,12 @@ def set_laser_pos(pos=None): def get_cover_location_mm(raise_ex=True): + if is_service_mode(): + return 0.0, 0.0 v = cover_detection.take() - if v: + if v == "No cover not detected": + return 0.0, 0.0 + if v and not is_string(v): return v[4], v[5] if raise_ex: raise Exception("Cannot detect cover location") @@ -278,28 +299,14 @@ try: 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() + cam.setGrabMode(Camera.GrabMode.Continuous) + cam.setTriggerMode(Camera.TriggerMode.Fixed_Rate) + cam.setAcquirePeriod(330.00) + cam.setGain(0.0) + #cam.setROI(int(get_setting("roi_x")), int(get_setting("roi_y")), int(get_setting("roi_w")), int(get_setting("roi_h"))) except: print >> sys.stderr, traceback.format_exc() diff --git a/script/test/ne3w_mec_switch_6d.txt b/script/test/ne3w_mec_switch_6d.txt new file mode 100644 index 0000000..21fa952 --- /dev/null +++ b/script/test/ne3w_mec_switch_6d.txt @@ -0,0 +1,41 @@ +A +1 +2 +3 +4 +5 + +B +1 +2 +3 +4 +5 + +C +1 21 +2 22 +3 23 +4 24 +5 25 + +D +1 26 +2 27 +3 28 +4 29 +5 30 + +E +1 11 +2 12 +3 13 +4 14 +5 15 + +F +1 16 +2 17 +3 18 +4 19 +5 20