diff --git a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py index 3f175ba5..c19e1af3 100644 --- a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py +++ b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py @@ -1852,7 +1852,7 @@ class Flomni( try: self.align.align(keep_shutter_open) except KeyboardInterrupt as exc: - fsamx_in = self._get_user_param_safe(dev.fsamx, "in") + fsamx_in = self._get_user_param_safe("fsamx", "in") # name: dev[...] lookup (a device raised) if np.isclose(fsamx_in, dev.fsamx.readback.get(), rtol=0, atol=0.5): print("Stopping alignment. Returning to fsamx in position.") self.feedback_disable() diff --git a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni_optics_mixin.py b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni_optics_mixin.py index f31dd04f..162eab37 100644 --- a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni_optics_mixin.py +++ b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni_optics_mixin.py @@ -420,7 +420,8 @@ class FlomniOpticsMixin: print("\nOSA Information:") print(f" Current fosaz {fosaz_val:.1f}") - print(f" The OSA will collide with a normal OMNY pin at fosaz \033[1m{(33-fosaz_val):.1f}\033[0m") + # collision where compute_osa_remaining_space() = 33 - foptz - fosaz reaches 0 (was 33 - fosaz) + print(f" The OSA will collide with a normal OMNY pin at fosaz \033[1m{(33-foptz_val):.1f}\033[0m") print(f" Remaining space (right now): \033[1m{remaining_current:.1f}\033[0m") diff = fosaz_val - fosaz_in # >0: OSA is currently more "in" than nominal -> worse diff --git a/tests/tests_bec_ipython_client/test_flomni_review_fixes.py b/tests/tests_bec_ipython_client/test_flomni_review_fixes.py index cb3bd58c..c842b0b5 100644 --- a/tests/tests_bec_ipython_client/test_flomni_review_fixes.py +++ b/tests/tests_bec_ipython_client/test_flomni_review_fixes.py @@ -139,3 +139,41 @@ def test_heater_down_needs_fsamx_in_within_0_2_mm(monkeypatch, readback, ok): with pytest.raises(FlomniError): flomni.move_fheater_down() assert not moved + + +class _DevContainer(dict): + """dict keyed by device name, like bec_lib's DeviceContainer (attribute access too).""" + + def __getattr__(self, name): + return self[name] + + +def test_xray_eye_ctrl_c_returns_fsamx_in(monkeypatch): + """The KeyboardInterrupt handler passed the device instead of its name: dev[device] raised.""" + import csaxs_bec.bec_ipython_client.plugins.flomni.flomni_optics_mixin as optics_module + + flomni = _make_flomni() + fsamx = types.SimpleNamespace( + user_parameter={"in": -1.14}, readback=types.SimpleNamespace(get=lambda: -1.3) + ) + fake_dev = _DevContainer(fsamx=fsamx) + monkeypatch.setitem(builtins.__dict__, "dev", fake_dev) + monkeypatch.setattr(flomni_module, "dev", fake_dev, raising=False) + monkeypatch.setattr(optics_module, "dev", fake_dev, raising=False) + moved = [] + monkeypatch.setattr(flomni_module, "umv", lambda *a: moved.append(a), raising=False) + flomni.OMNYTools = types.SimpleNamespace(yesno=lambda *a, **k: True) + flomni.feedback_disable = lambda: None + + class _Align: + def __init__(self, *a): + pass + + def align(self, keep_shutter_open): + raise KeyboardInterrupt + + monkeypatch.setattr(flomni_module, "XrayEyeAlign", _Align) + + with pytest.raises(KeyboardInterrupt): + flomni.start_x_ray_eye_alignment() + assert moved == [(fsamx, -1.14)]