fix(mo1_bragg): omit ACS scan settings from the device configuration

This commit is contained in:
2026-08-06 10:42:43 +02:00
parent 5db31fb322
commit d92ebcfc18
2 changed files with 20 additions and 18 deletions
@@ -151,16 +151,18 @@ class Mo1BraggScanSettings(Device):
# EpicsSignalWithRBV, suffix="s_scan_scantime", kind="config", auto_monitor=True
# )
# cache_ttl: baseline/config reads are served from cache; every put() drops the
# cache, so a fresh hardware read follows each real configuration change
# kind="omitted": these live on the ACS controller and are written by the scan at
# stage time, which also records them in scan_info — so nothing is lost by keeping
# them out of read_configuration(), and no passive device-server read path ever
# touches the socket. cache_ttl still guards explicit reads; put() drops the cache.
s_scan_energy_lo = Cpt(
AcsSignal, tag=53003, prec=6, kind="config", auto_monitor=False, cache_ttl=30.0
AcsSignal, tag=53003, prec=6, kind="omitted", auto_monitor=False, cache_ttl=30.0
)
s_scan_energy_hi = Cpt(
AcsSignal, tag=53004, prec=6, kind="config", auto_monitor=False, cache_ttl=30.0
AcsSignal, tag=53004, prec=6, kind="omitted", auto_monitor=False, cache_ttl=30.0
)
s_scan_scantime = Cpt(
AcsSignal, tag=53002, prec=3, kind="config", auto_monitor=False, cache_ttl=30.0
AcsSignal, tag=53002, prec=3, kind="omitted", auto_monitor=False, cache_ttl=30.0
)
# XAS advanced scan settings
+13 -13
View File
@@ -136,15 +136,17 @@ def test_set_xtal(mock_bragg):
assert dev.crystal.xtal_enum.get() == 1
def test_read_configuration_uses_acs_cache_and_omits_status_pvs(mock_bragg):
def test_read_configuration_never_touches_acs_and_omits_status_pvs(mock_bragg):
"""The device server re-reads the full configuration whenever any auto-monitored
signal updates; the ticking status PVs must not be part of it, and repeated
config reads must not hit the ACS controller again while the cache is fresh."""
signal updates; neither the ticking status PVs nor the ACS socket signals may be
part of it, so no passive read path ever produces a GETVAR."""
dev = mock_bragg
config = dev.read_configuration()
assert "bragg_scan_settings_s_scan_energy_lo" in config
assert "bragg_scan_settings_s_scan_energy_hi" in config
assert "bragg_scan_settings_s_scan_scantime" in config
# ACS scan settings are omitted: config reads must not touch the socket at all
assert "bragg_scan_settings_s_scan_energy_lo" not in config
assert "bragg_scan_settings_s_scan_energy_hi" not in config
assert "bragg_scan_settings_s_scan_scantime" not in config
assert dev.controller.get_var.call_count == 0
# live status/progress PVs are omitted from the configuration
assert "bragg_status_heartbeat" not in config
assert "bragg_scan_control_scan_msg" not in config
@@ -153,15 +155,13 @@ def test_read_configuration_uses_acs_cache_and_omits_status_pvs(mock_bragg):
assert "bragg_scan_control_scan_time_left" not in config
assert "bragg_scan_control_scan_done" not in config
acs_reads = dev.controller.get_var.call_count
dev.read_configuration()
assert dev.controller.get_var.call_count == acs_reads # served from cache
# a config change drops the cache for exactly that signal
# explicit reads still work, are cached, and refresh after a put
assert dev.scan_settings.s_scan_energy_lo.get() == 0.0
dev.scan_settings.s_scan_energy_lo.get()
assert dev.controller.get_var.call_count == 1 # second read served from cache
dev.scan_settings.s_scan_energy_lo.put(7000.0)
dev.read_configuration()
assert dev.controller.get_var.call_count == acs_reads + 1
assert dev.scan_settings.s_scan_energy_lo.get() == 7000.0
assert dev.controller.get_var.call_count == 2 # put dropped the cache
def test_set_xas_settings(mock_bragg):