tell_client.py: added more explicit logging and a catch all error for wait_events, May remove this,
Build and Publish / test (push) Failing after 1m10s
Build and Publish / build (push) Skipped
Build and Publish / Build and Deploy Docs (push) Skipped

This commit is contained in:
2026-05-29 10:10:27 +02:00
parent 2715f4694e
commit c971f70814
+67 -63
View File
@@ -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():