@@ -44,11 +44,17 @@ def __init__(self, parent=None):
4444 # register a callback function for the motor status on the serial loop
4545 if hasattr (self ._parent , "serial" ):
4646 self ._parent .serial .register_callback (self ._callback_motor_status , pattern = "steppers" )
47+ # Register callback for stagescan completion signal: {"stagescan":{},"qid":0,"success":1}
48+ self ._parent .serial .register_callback (self ._callback_stagescan_complete , pattern = "stagescan" )
4749 # announce a function that is called when we receive a position update through the callback
4850 self ._callbackPerKey = {}
4951 self .nCallbacks = 10
5052 self ._callbackPerKey = self .init_callback_functions (nCallbacks = self .nCallbacks ) # only one is used for now
5153 print (self ._callbackPerKey )
54+
55+ # Stage scan completion state
56+ self ._stagescan_complete = False
57+ self ._stagescan_callbacks = [] # List of callbacks to call when stagescan completes
5258 # move motor to wake them up #FIXME: Should not be necessary!
5359 #self.move_stepper(steps=(1,1,1,1), speed=(1000,1000,1000,1000), is_absolute=(False,False,False,False))
5460 #self.move_stepper(steps=(-1,-1,-1,-1), speed=(1000,1000,1000,1000), is_absolute=(False,False,False,False))
@@ -84,6 +90,83 @@ def _callback_motor_status(self, data):
8490 except Exception as e :
8591 print ("Error in _callback_motor_status: " , e )
8692
93+ def _callback_stagescan_complete (self , data ):
94+ """
95+ Callback for stagescan completion signal from firmware.
96+
97+ Expected JSON format:
98+ {
99+ "stagescan": {},
100+ "qid": 0,
101+ "success": 1
102+ }
103+
104+ Args:
105+ data: JSON data dictionary from firmware
106+ """
107+ try :
108+ # Check if this is a completion signal (success key present)
109+ if "success" in data :
110+ self ._stagescan_complete = True
111+ success = data .get ("success" , 0 )
112+ self ._parent .logger .debug (f"Stage scan complete signal received: success={ success } " )
113+
114+ # Call all registered completion callbacks
115+ for callback in self ._stagescan_callbacks :
116+ try :
117+ callback (data )
118+ except Exception as e :
119+ self ._parent .logger .error (f"Error in stagescan completion callback: { e } " )
120+ else :
121+ self ._parent .logger .debug ("Received stagescan data without completion signal." )
122+ except Exception as e :
123+ print (f"Error in _callback_stagescan_complete: { e } " )
124+
125+ def register_stagescan_callback (self , callback ):
126+ """
127+ Register a callback function to be called when stagescan completes.
128+
129+ Args:
130+ callback: Function to call with completion data
131+ """
132+ if callback not in self ._stagescan_callbacks :
133+ self ._stagescan_callbacks .append (callback )
134+
135+ def unregister_stagescan_callback (self , callback ):
136+ """
137+ Unregister a stagescan completion callback.
138+
139+ Args:
140+ callback: Function to unregister
141+ """
142+ if callback in self ._stagescan_callbacks :
143+ self ._stagescan_callbacks .remove (callback )
144+
145+ def reset_stagescan_complete (self ):
146+ """Reset the stagescan completion flag."""
147+ self ._stagescan_complete = False
148+
149+ def is_stagescan_complete (self ):
150+ """Check if stagescan has completed."""
151+ return self ._stagescan_complete
152+
153+ def wait_for_stagescan_complete (self , timeout = 300 ):
154+ """
155+ Wait for stagescan to complete with timeout.
156+
157+ Args:
158+ timeout: Maximum time to wait in seconds
159+
160+ Returns:
161+ True if completed, False if timeout
162+ """
163+ start_time = time .time ()
164+ while not self ._stagescan_complete :
165+ if time .time () - start_time > timeout :
166+ return False
167+ time .sleep (0.1 )
168+ return True
169+
87170 def register_callback (self , key , callbackfct ):
88171 ''' register a callback function for a specific key '''
89172 self ._callbackPerKey [key ] = callbackfct
0 commit comments