@@ -47,6 +47,9 @@ def __init__(self, binding: BaseBinding, console: Console) -> None:
4747 # Store the console.
4848 self ._console = console
4949
50+ # Emergency stop flag for closed-loop jackhammering.
51+ self ._abort_closed_loop = False
52+
5053 # Define bindings based on platform type.
5154 self ._bindings = binding
5255
@@ -230,6 +233,11 @@ async def set_inside_brain(self, request: SetInsideBrainRequest) -> BooleanState
230233 self ._inside_brain .discard (request .manipulator_id )
231234 return BooleanStateResponse (state = request .inside )
232235
236+ # Stop closed loop jackhammer if abort flag is set(emergency button pressed)
237+ async def abort_jackhammer (self ) -> None :
238+ """Abort closed loop jackhammer."""
239+ self ._abort_closed_loop = True
240+
233241 async def jackhammer (
234242 self ,
235243 manipulator_id : str ,
@@ -274,6 +282,20 @@ async def jackhammer(
274282 last_depth = start_depth
275283
276284 for i in range (max_iterations ):
285+ # Check for abort
286+ if self ._abort_closed_loop :
287+ self ._abort_closed_loop = False
288+ final_pos = await self ._bindings .get_position (manipulator_id )
289+ final_position = self ._bindings .platform_space_to_unified_space (final_pos )
290+ total_delta_um = (final_pos .w - start_depth ) * 1000
291+ return {
292+ "position" : final_position ,
293+ "error" : "" ,
294+ "iterations_used" : iterations_used ,
295+ "stop_reason" : "aborted" ,
296+ "advancement_um" : total_delta_um ,
297+ }
298+
277299 # Run single iteration
278300 await self ._bindings .jackhammer (
279301 manipulator_id , axis , 1 , phase1_steps , phase1_pulses , phase2_steps , phase2_pulses
0 commit comments