fix/galil back to original code
Read the Docs Deploy Trigger / trigger-rtd-webhook (push) Successful in 2s
CI for csaxs_bec / test (push) Successful in 1m30s

This commit was merged in pull request #257.
This commit is contained in:
x01dc
2026-07-12 07:52:37 +02:00
committed by holler
co-authored by holler
parent 074294000d
commit afcbbf66cc
4 changed files with 17 additions and 9 deletions
@@ -123,6 +123,8 @@ class FlomniGalilSetpointSignal(GalilSetpointSignal):
self.controller.socket_put_confirmed(f"ntarget={target_val:.3f}")
self.controller.socket_put_confirmed("movereq=1")
self.controller.socket_put_confirmed("XQ#NEWPAR")
while self.controller.is_thread_active(0):
time.sleep(0.005)
else:
raise GalilError("Not all axes are referenced.")
@@ -427,6 +427,8 @@ class GalilSetpointSignal(GalilSignalBase):
self.controller.socket_put_confirmed(f"ntarget={target_val:.3f}")
self.controller.socket_put_confirmed("movereq=1")
self.controller.socket_put_confirmed("XQ#NEWPAR")
while self.controller.is_thread_active(0):
time.sleep(0.005)
else:
raise GalilError("Not all axes are referenced.")
+6 -3
View File
@@ -182,9 +182,11 @@ class SimGalilState:
self.recompute_allaxref()
def thread_active(self, thread_id: int) -> bool:
if thread_id == 0:
if any(ax.is_moving() for ax in self.axes):
return True
# thread 0 only dispatches moves (#NEWPAR) and runs referencing (#FES); on the
# real controller it is active for milliseconds while the motion itself is
# carried by the firmware (MG_BG) - modeled via short deadlines, NOT by axis
# motion. This keeps the trailing thread-0 wait in the real setpoint code
# returning quickly, as on real hardware.
if thread_id == 3:
if self._transfer_thread is not None and self._transfer_thread.is_alive():
return True
@@ -222,6 +224,7 @@ class SimGalilState:
self._tracker_running = False
def start_move_from_newpar(self):
self.set_thread_active(0, 0.05) # dispatch window
with self.lock:
if self.variables.get("movereq", 0.0) != 1.0:
return
+7 -6
View File
@@ -69,10 +69,6 @@ Protocol fidelity is grounded in the actual hardware-side sources: `fgalil.dmc`,
## Real-code fixes made along the way (separate commits)
- `fgalil_ophyd.py` and `galil_ophyd.py` (base class, affects LamNI/OMNY): removed the
trailing thread-0 wait in the setpoint `_socket_set` — it blocked `user_setpoint.put()` (holding the
controller lock) for the whole move, so no intermediate readback/progress was possible.
Applies to the real instrument too.
- `ddg_1.py`: `bec_server.scan_server...ScanInfo` import moved under `TYPE_CHECKING`
(typing-only runtime dependency broke against the redeployed BEC layout).
- `flomni.py`: all four scilog sends wrapped in try/except RuntimeError — accounts
@@ -82,8 +78,7 @@ Protocol fidelity is grounded in the actual hardware-side sources: `fgalil.dmc`,
Tarballs contain ONLY simulation-package files (`devices/sim/*` except
`simulated_beamline_devices.py`, `device_configs/simulated_omny/*`, generator, harnesses,
this doc) plus the two agreed device-layer fixes (`galil_ophyd.py`, `fgalil_ophyd.py`,
`ddg_1.py`). Fixes to user-maintained files (`flomni.py`, ...) are delivered as diffs
this doc) plus the single agreed device-layer fix (`ddg_1.py`). Fixes to user-maintained files (`flomni.py`, ...) are delivered as diffs
only — never as full files, since the working copies evolve during testing.
## BEC integration lessons (important for future sim devices)
@@ -118,6 +113,12 @@ only — never as full files, since the working copies evolve during testing.
scan plugin) — starting a scan with user-disabled feedback therefore works, on the
real system as well as in the sim; it only fails on real hardware when feedback cannot
engage (air on, interferometer error), an error mode deliberately not simulated.
- Thread 0 is dispatch-only, as on the real controller: `#NEWPAR` keeps it active for
~50 ms while the motion itself is reported via the firmware flags (`MG_BG`, motor on).
The trailing thread-0 wait in the (unmodified) setpoint code therefore returns quickly
and move progress is published, matching real hardware. An earlier sim iteration
wrongly modeled thread 0 as busy for the whole move and "fixed" the device code to
match — that change was reverted; the device files are untouched.
- Referencing (`#FES/#FRM/#REFAX`) applies its outcome synchronously (limit switch,
position 0) while only the apparent motion is time-based, so status polls never race
the result.