Skip to content

Commit 6e5c476

Browse files
committed
Integrate StageScan Callback into Firmware
1 parent 858836d commit 6e5c476

1 file changed

Lines changed: 83 additions & 0 deletions

File tree

uc2rest/motor.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)