diff --git a/common/src/aaredaqlib/models.py b/common/src/aaredaqlib/models.py index d3f42a25..8e4f2e23 100644 --- a/common/src/aaredaqlib/models.py +++ b/common/src/aaredaqlib/models.py @@ -169,17 +169,20 @@ class DAQStatusModel(BaseModel): class BeamlineSettingsModel(BaseModel): # Float properties - cryojet_park_position: float = 12.0 - cryojet_measurement_position: float = 5.0 - dtz_collection: float = 130 - dtz_park: float = 150.0 - dtz_wash_sample_distance: float = 150.0 - dtz_bsz_safety_margin: float = 50.0 - bsz: float = 25.0 + cryojet_park_position: float | None = 12.0 + cryojet_measurement_position: float | None = 5.0 - camera_max_magnification: float = 1.0 - camera_min_magnification: float = 500.0 - camera_translation_factor_a: float = 0.00253 - camera_translation_factor_b: float = 255.0 + dtz_max: float | None = 1600.0 + dtz_min: float | None = 120.0 + dtz_collection: float | None = 130.0 + dtz_park: float | None = 150.0 + dtz_wash_sample_distance: float | None = 150.0 + dtz_bsz_safety_margin: float | None = 50.0 + bsz: float | None = 25.0 - cryojet_in_use: bool = True + camera_max_magnification: float | None = 1.0 + camera_min_magnification: float | None = 500.0 + camera_translation_factor_a: float | None = 0.00253 + camera_translation_factor_b: float | None = 255.0 + + cryojet_in_use: bool | None = True \ No newline at end of file diff --git a/daq/src/aaredaq/config.py b/daq/src/aaredaq/config.py index c4d3a66e..f0925796 100644 --- a/daq/src/aaredaq/config.py +++ b/daq/src/aaredaq/config.py @@ -147,19 +147,27 @@ class BeamlineConfig: * np.exp(cfg.camera_translation_factor_a * zoom) ) - @property - def settings(self) -> BeamlineSettingsModel: + + def __get_settings(self) -> BeamlineSettingsModel: tmp = self.__client.get(f"{self.__bl}:settings") if tmp is None: - raise Exception("Beamline key not found") + return BeamlineSettingsModel() data_dict = json.loads(tmp) model = BeamlineSettingsModel(**data_dict) return model + @property + def settings(self) -> BeamlineSettingsModel: + with redis_lock.Lock(self.__client, f"{self.__bl}:settings_lock", expire=10): + return self.__get_settings() + @settings.setter def settings(self, data: BeamlineSettingsModel): - self.__client.set(f"{self.__bl}:settings", data.model_dump_json()) + with redis_lock.Lock(self.__client, f"{self.__bl}:settings_lock", expire=10): + current = self.__get_settings() + updated_data = current.model_copy(update=data.model_dump(exclude_unset=True)) + self.__client.set(f"{self.__bl}:settings", updated_data.model_dump_json()) def get_alc_bkg(self, zoom: float) -> np.ndarray | None: return base64_to_numpy(self.__client.get(f"{self.__bl}:bkg{zoom:.1f}"))