diff --git a/software/control/_def.py b/software/control/_def.py index 112db250..7497e96c 100644 --- a/software/control/_def.py +++ b/software/control/_def.py @@ -857,3 +857,4 @@ def load_formats(): XERYON_SPEED = 80 XERYON_OBJECTIVE_SWITCHER_POS_1 = ['4x', '10x'] XERYON_OBJECTIVE_SWITCHER_POS_2 = ['20x', '40x', '60x'] +XERYON_OBJECTIVE_SWITCHER_POS_2_OFFSET_MM = 2 diff --git a/software/control/gui_hcs.py b/software/control/gui_hcs.py index 1f4bcbc5..dc71ab62 100644 --- a/software/control/gui_hcs.py +++ b/software/control/gui_hcs.py @@ -434,7 +434,7 @@ def loadHardwareObjects(self): if USE_XERYON: try: - self.objective_changer = ObjectiveChanger2PosController(sn=XERYON_SERIAL_NUMBER) + self.objective_changer = ObjectiveChanger2PosController(sn=XERYON_SERIAL_NUMBER,stage=self.stage) except Exception: self.log.error("Error initializing Xeryon objective switcher") raise diff --git a/software/control/objective_changer_2_pos_controller.py b/software/control/objective_changer_2_pos_controller.py index 57a00dd9..5a83d1af 100644 --- a/software/control/objective_changer_2_pos_controller.py +++ b/software/control/objective_changer_2_pos_controller.py @@ -3,10 +3,12 @@ import time import serial -from control.Xeryon import * +from control.Xeryon import Xeryon +from control._def import * # to remove once we create ObjectiveChangerConfig +import squid.abc class ObjectiveChanger2PosController: - def __init__(self, sn: str): + def __init__(self, sn: str, stage: Optional[squid.abc.AbstractStage] = None): super().__init__() port = [p.device for p in serial.tools.list_ports.comports() if sn == p.serial_number] self.controller = Xeryon(port[0], 115200) @@ -14,20 +16,33 @@ def __init__(self, sn: str): self.controller.start() self.controller.reset() + self.stage = stage + self.position1 = -19 self.position2 = 19 self.current_position = None + self.retracted = False # moved down by self.position2_offset for position 2 + + self.position2_offset = XERYON_OBJECTIVE_SWITCHER_POS_2_OFFSET_MM def home(self): self.axisX.findIndex() def moveToPosition1(self): self.axisX.setDPOS(self.position1) + if self.stage is not None and self.current_position == 2 and self.retracted: + # revert retracting z by self.position2_offset + self.stage.move_z(self.position2_offset) + self.retracted = False self.current_position = 1 def moveToPosition2(self): self.axisX.setDPOS(self.position2) + if self.stage is not None and self.current_position == 1: + # retract z by self.position2_offset + self.stage.move_z(-self.position2_offset) + self.retracted = True self.current_position = 2 def currentPosition(self) -> int: