From c971f708145dc6375792a6d996cb4bbd23bb00dd Mon Sep 17 00:00:00 2001 From: appleb_m Date: Fri, 29 May 2026 10:10:27 +0200 Subject: [PATCH] tell_client.py: added more explicit logging and a catch all error for wait_events, May remove this, --- src/aare/devices/tell_client.py | 130 ++++++++++++++++---------------- 1 file changed, 67 insertions(+), 63 deletions(-) diff --git a/src/aare/devices/tell_client.py b/src/aare/devices/tell_client.py index b50c1d8e..7a241b94 100755 --- a/src/aare/devices/tell_client.py +++ b/src/aare/devices/tell_client.py @@ -24,7 +24,7 @@ from aare.common.exception_handler import ( TellConnectionException, TellMountFailedException, TellCommandWhileBusyException, - ManualMountException + ManualMountException, TellCommunicationError ) from aare.common.logger_config import setup_logger @@ -144,7 +144,7 @@ class TellClient: Returns an exception if the command result doesnt return completed or removed""" self.wait_not_busy(timeout) result = self.get_result(self._last_cmd_id) - logger.debug(f"{msg} {result}") + logger.debug(f"getting result for command {self._last_cmd_id}: {result}") status = result["status"] if "completed" != status: if "removed" != status: @@ -195,75 +195,79 @@ class TellClient: raise TellCommandWhileBusyException("mount received while robot is busy") logger.info(f"loading sample {sample} from segment {segment} - {puck}") - + wait_timeout = timeout + self.estimate_mounting_time(segment) self._last_cmd_id = self.start_cmd( "mount", segment, puck, sample, force, read_dm, auto_unmount ) - wait_timeout = timeout + self.estimate_mounting_time(segment) logger.info("waiting for mount to complete") - if wait and segment in "ABCDEF": - event, value = self.backend.wait_events( - { - "state": None, - "Motion Task": "dry", - "Gripper detection": None, - "Motion Sync": "Robot Clear after mount", - }, - timeout=wait_timeout, - ) - logger.info(f"event: {event} occurred with value: {value}") - if event is None or event == "state": - logger.info(f"event: {event} occurred with value: {value}, checking command completed okay") + try: + if wait and segment in "ABCDEF": + event, value = self.backend.wait_events( + { + "state": None, + "Motion Task": "dry", + "Gripper detection": None, + "Motion Sync": "Robot Clear after mount", + }, + timeout=wait_timeout, + ) + logger.info(f"event: {event} occurred with value: {value}") + if event is None or event == "state": + logger.info(f"event: {event} occurred with value: {value}, checking command completed okay") + self.check_command_ok( + timeout=wait_timeout, msg=f"Mount {segment}{puck}-{sample}: " + ) + return value + elif ( + event == TellEventTypeEnum.GIPPER_DETECTION.value + and value == TellEventValueEnum.NO_PIN_IN_GRIPPER.value + ): + logger.info(f"{TellEventValueEnum.NO_PIN_IN_GRIPPER.value}") + return TellEventValueEnum.NO_PIN_IN_GRIPPER + elif event == TellEventTypeEnum.GIPPER_DETECTION.value and value == TellEventValueEnum.PIN_STILL_IN_GRIPPER.value: + logger.info(f"{TellEventValueEnum.PIN_STILL_IN_GRIPPER.value}") + return TellEventValueEnum.PIN_STILL_IN_GRIPPER + elif event == TellEventTypeEnum.GIPPER_DETECTION.value and value == TellEventValueEnum.PIN_IS_LOST_GRIPPER.value: + logger.info(f"{TellEventValueEnum.PIN_IS_LOST_GRIPPER.value}") + return TellEventValueEnum.PIN_IS_LOST_GRIPPER + elif event == TellEventTypeEnum.GIPPER_DETECTION.value: + return TellEventTypeEnum.GIPPER_DETECTION + elif event == TellEventTypeEnum.MOTION_TASK.value and value == TellEventValueEnum.DRY.value: + logger.info(f"{TellEventValueEnum.DRY.value}") + return TellEventValueEnum.DRY + elif event == TellEventTypeEnum.MOTION_TASK.value and value == TellEventValueEnum.COLD.value: + logger.info(f"{TellEventValueEnum.COLD.value}") + logger.info("As cold, likely robot is cooling from previous mount/dry " + "DAQ will block until command is complete") + self.check_command_ok( + timeout=wait_timeout, msg=f"Mount {segment}{puck}-{sample}: " + ) + return TellEventValueEnum.COLD + elif event == TellEventTypeEnum.MOTION_TASK.value and value == TellEventValueEnum.UNKNOWN.value: + logger.info(f"{TellEventValueEnum.UNKNOWN.value}") + return TellEventValueEnum.UNKNOWN + elif event == TellEventTypeEnum.MOTION_SYNC.value and value == TellEventValueEnum.ROBOT_CLEAR_AFTER_MOUNT.value: + logger.info(f"{TellEventValueEnum.ROBOT_CLEAR_AFTER_MOUNT.value}") + return TellEventValueEnum.ROBOT_CLEAR_AFTER_MOUNT + else: + logger.info(f"Unexpected event: {event} occurred with value: {value}") + logger.info("Checking command completed okay anyway") + self.check_command_ok( + timeout=wait_timeout, msg=f"Mount {segment}{puck}-{sample}: " + ) + return TellEventValueEnum.UNKNOWN + elif wait and segment == "X": + logger.info("Loading an auxiliary puck") self.check_command_ok( timeout=wait_timeout, msg=f"Mount {segment}{puck}-{sample}: " ) - return value - elif ( - event == TellEventTypeEnum.GIPPER_DETECTION.value - and value == TellEventValueEnum.NO_PIN_IN_GRIPPER.value - ): - logger.info(f"{TellEventValueEnum.NO_PIN_IN_GRIPPER.value}") - return TellEventValueEnum.NO_PIN_IN_GRIPPER - elif event == TellEventTypeEnum.GIPPER_DETECTION.value and value == TellEventValueEnum.PIN_STILL_IN_GRIPPER.value: - logger.info(f"{TellEventValueEnum.PIN_STILL_IN_GRIPPER.value}") - return TellEventValueEnum.PIN_STILL_IN_GRIPPER - elif event == TellEventTypeEnum.GIPPER_DETECTION.value and value == TellEventValueEnum.PIN_IS_LOST_GRIPPER.value: - logger.info(f"{TellEventValueEnum.PIN_IS_LOST_GRIPPER.value}") - return TellEventValueEnum.PIN_IS_LOST_GRIPPER - elif event == TellEventTypeEnum.GIPPER_DETECTION.value: - return TellEventTypeEnum.GIPPER_DETECTION - elif event == TellEventTypeEnum.MOTION_TASK.value and value == TellEventValueEnum.DRY.value: - logger.info(f"{TellEventValueEnum.DRY.value}") - return TellEventValueEnum.DRY - elif event == TellEventTypeEnum.MOTION_TASK.value and value == TellEventValueEnum.COLD.value: - logger.info(f"{TellEventValueEnum.COLD.value}") - logger.info("As cold, likely robot is cooling from previous mount/dry " - "DAQ will block until command is complete") - self.check_command_ok( - timeout=wait_timeout, msg=f"Mount {segment}{puck}-{sample}: " - ) - return TellEventValueEnum.COLD - elif event == TellEventTypeEnum.MOTION_TASK.value and value == TellEventValueEnum.UNKNOWN.value: - logger.info(f"{TellEventValueEnum.UNKNOWN.value}") - return TellEventValueEnum.UNKNOWN - elif event == TellEventTypeEnum.MOTION_SYNC.value and value == TellEventValueEnum.ROBOT_CLEAR_AFTER_MOUNT.value: - logger.info(f"{TellEventValueEnum.ROBOT_CLEAR_AFTER_MOUNT.value}") - return TellEventValueEnum.ROBOT_CLEAR_AFTER_MOUNT - else: - logger.info(f"Unexpected event: {event} occurred with value: {value}") - logger.info("Checking command completed okay anyway") - self.check_command_ok( - timeout=wait_timeout, msg=f"Mount {segment}{puck}-{sample}: " - ) - return TellEventValueEnum.UNKNOWN - elif wait and segment == "X": - logger.info("Loading an auxiliary puck") - self.check_command_ok( - timeout=wait_timeout, msg=f"Mount {segment}{puck}-{sample}: " - ) - logger.info("post waiting") - return TellEventValueEnum.SUCCESS + logger.info("post waiting") + return TellEventValueEnum.SUCCESS + + except Exception as e: + logger.error(f"Exception occurred: {e}") + raise TellCommunicationError(message=f"Mount {segment}{puck}-{sample}", critical=True) def unmount(self, force=False, wait=False, timeout=360.0): if self.is_busy():