From 1e68c5c6b6d8a020db8b2db1529e4b4e15639a02 Mon Sep 17 00:00:00 2001 From: ykyohei <38639108+ykyohei@users.noreply.github.com> Date: Wed, 7 Jan 2026 17:06:52 +0000 Subject: [PATCH 1/4] power cycle gripper --- socs/agents/hwp_supervisor/agent.py | 66 +++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/socs/agents/hwp_supervisor/agent.py b/socs/agents/hwp_supervisor/agent.py index bc7cca84d..d3ed36e66 100644 --- a/socs/agents/hwp_supervisor/agent.py +++ b/socs/agents/hwp_supervisor/agent.py @@ -915,6 +915,28 @@ def __post_init__(self): "Must be in ['iboot', 'synaccess']" ) + @dataclass + class PowerCycleGripper: + """ + Power Cycle Gripper elesctronics + + Attributes + ----------- + driver_power_agent_type: Literal['iboot, synaccess'] + Type of agent used for controlling the driver power + outlets: List[int] + List of outlets to power cycle in this order + """ + driver_power_agent_type: Literal['iboot, synaccess'] + outlets: List[int] + + def __post_init__(self): + if self.driver_power_agent_type not in ['iboot', 'synaccess']: + raise ValueError( + f"Invalid driver_power_agent_type: {self.driver_power_agent_type}. " + "Must be in ['iboot', 'synaccess']" + ) + completed_states = (Done, Error, Abort, Idle) @@ -1383,9 +1405,24 @@ def set_outlet_state(outlet: int, outlet_state: bool): else: kw = {'outlet': outlet, 'on': outlet_state} self.run_and_validate(clients.driver_iboot.set_outlet, kwargs=kw) + for outlet in state.outlets: + set_outlet_state(outlet, False) + self.action.set_state(ControlState.Done(success=True)) + return + elif isinstance(state, ControlState.PowerCycleGripper): + def set_outlet_state(outlet: int, outlet_state: bool): + if state.gripper_power_agent_type == 'iboot': + kw = {'outlet': outlet, 'state': 'on' if outlet_state else 'off'} + else: + kw = {'outlet': outlet, 'on': outlet_state} + self.run_and_validate(clients.gripper_iboot.set_outlet, kwargs=kw) for outlet in state.outlets: set_outlet_state(outlet, False) + time.sleep(2) + for outlet in state.outlets: + set_outlet_state(outlet, True) + time.sleep(2) self.action.set_state(ControlState.Done(success=True)) return @@ -2004,6 +2041,34 @@ def disable_driver_board(self, session, params): action.sleep_until_complete(session=session) return action.success, f"Completed with state: {action.cur_state_info.state}" + def power_cycle_gripper(self, session, params): + """power_cycle_gripper() + + **Task** - Power cycle gripper electronics + + Notes + -------- + + Example of ``session.data``:: + + >>> session['data'] + {'action': + {'action_id': 3, + 'completed': True, + 'cur_state': {'class': 'Done', 'msg': None, 'success': True}, + 'state_history': List[ConrolState], + 'success': False} + } + """ + kw = { + 'gripper_power_agent_type': self.gripper_power_agent_type, + 'outlets': self.gripper_iboot_outlets, + } + state = ControlState.PowerCylceGripper(**kw) + action = self.control_state_machine.request_new_action(state) + action.sleep_until_complete(session=session) + return action.success, f"Completed with state: {action.cur_state_info.state}" + def cancel_shutdown(self, session, params): """cancel_shutdown() **Task** - Cancels shutdown mode @@ -2145,6 +2210,7 @@ def main(args=None): agent.register_task('ungrip_hwp', hwp.ungrip_hwp) agent.register_task('enable_driver_board', hwp.enable_driver_board) agent.register_task('disable_driver_board', hwp.disable_driver_board) + agent.register_task('power_cycle_gripper', hwp.power_cycle_gripper) agent.register_task('abort_action', hwp.abort_action) agent.register_task('cancel_shutdown', hwp.cancel_shutdown) From 9a99617655fa1484a0a0f16ff802a533cb7d07c7 Mon Sep 17 00:00:00 2001 From: ykyohei <38639108+ykyohei@users.noreply.github.com> Date: Mon, 12 Jan 2026 15:12:47 +0000 Subject: [PATCH 2/4] Debug --- socs/agents/hwp_supervisor/agent.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/socs/agents/hwp_supervisor/agent.py b/socs/agents/hwp_supervisor/agent.py index d3ed36e66..a8988aaf6 100644 --- a/socs/agents/hwp_supervisor/agent.py +++ b/socs/agents/hwp_supervisor/agent.py @@ -927,13 +927,13 @@ class PowerCycleGripper: outlets: List[int] List of outlets to power cycle in this order """ - driver_power_agent_type: Literal['iboot, synaccess'] + gripper_power_agent_type: Literal['iboot, synaccess'] outlets: List[int] def __post_init__(self): - if self.driver_power_agent_type not in ['iboot', 'synaccess']: + if self.gripper_power_agent_type not in ['iboot', 'synaccess']: raise ValueError( - f"Invalid driver_power_agent_type: {self.driver_power_agent_type}. " + f"Invalid driver_power_agent_type: {self.gripper_power_agent_type}. " "Must be in ['iboot', 'synaccess']" ) @@ -1497,6 +1497,8 @@ def __init__(self, agent, args): self.driver_iboot_outlets = args.driver_iboot_outlets self.driver_power_cycle_twice = args.driver_power_cycle_twice self.driver_power_cycle_wait_time = args.driver_power_cycle_wait_time + self.gripper_power_agent_type = args.gripper_power_agent_type + self.gripper_iboot_outlets = args.gripper_iboot_outlets self.shutdown_no_data_timeout = args.shutdown_no_data_timeout self.shutdown_mode = False @@ -2064,7 +2066,7 @@ def power_cycle_gripper(self, session, params): 'gripper_power_agent_type': self.gripper_power_agent_type, 'outlets': self.gripper_iboot_outlets, } - state = ControlState.PowerCylceGripper(**kw) + state = ControlState.PowerCycleGripper(**kw) action = self.control_state_machine.request_new_action(state) action.sleep_until_complete(session=session) return action.success, f"Completed with state: {action.cur_state_info.state}" From 1dc695f09d252b2458d9ce761937874b476c652b Mon Sep 17 00:00:00 2001 From: ykyohei <38639108+ykyohei@users.noreply.github.com> Date: Mon, 12 Jan 2026 15:24:06 +0000 Subject: [PATCH 3/4] fix typos --- socs/agents/hwp_supervisor/agent.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/socs/agents/hwp_supervisor/agent.py b/socs/agents/hwp_supervisor/agent.py index a8988aaf6..e38e11646 100644 --- a/socs/agents/hwp_supervisor/agent.py +++ b/socs/agents/hwp_supervisor/agent.py @@ -923,7 +923,7 @@ class PowerCycleGripper: Attributes ----------- driver_power_agent_type: Literal['iboot, synaccess'] - Type of agent used for controlling the driver power + Type of agent used for controlling the gripper power outlets: List[int] List of outlets to power cycle in this order """ @@ -933,7 +933,7 @@ class PowerCycleGripper: def __post_init__(self): if self.gripper_power_agent_type not in ['iboot', 'synaccess']: raise ValueError( - f"Invalid driver_power_agent_type: {self.gripper_power_agent_type}. " + f"Invalid gripper_power_agent_type: {self.gripper_power_agent_type}. " "Must be in ['iboot', 'synaccess']" ) From 477e2cdb287d9206b7afdaf54cbd19fd7af18b75 Mon Sep 17 00:00:00 2001 From: Brian Koopman Date: Wed, 14 Jan 2026 14:03:23 -0500 Subject: [PATCH 4/4] Fix typo in docstring --- socs/agents/hwp_supervisor/agent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/socs/agents/hwp_supervisor/agent.py b/socs/agents/hwp_supervisor/agent.py index e38e11646..a161cca3f 100644 --- a/socs/agents/hwp_supervisor/agent.py +++ b/socs/agents/hwp_supervisor/agent.py @@ -918,7 +918,7 @@ def __post_init__(self): @dataclass class PowerCycleGripper: """ - Power Cycle Gripper elesctronics + Power Cycle Gripper electronics. Attributes -----------