diff --git a/openflexure_microscope/camera/base.py b/openflexure_microscope/camera/base.py index 4f5bbbaf..84b060e9 100644 --- a/openflexure_microscope/camera/base.py +++ b/openflexure_microscope/camera/base.py @@ -23,7 +23,7 @@ class BaseCamera(metaclass=ABCMeta): self.thread = None self.camera = None - self.lock = StrictLock(name="Camera", timeout=None) + self.lock = StrictLock(name="Camera", timeout=1) self.frame = None self.last_access = 0 @@ -55,7 +55,7 @@ class BaseCamera(metaclass=ABCMeta): @abstractmethod def update_settings(self, config: dict): """Update settings from a config dictionary""" - with self.lock: + with self.lock(timeout=None): # Apply valid config params to camera object for key, value in config.items(): # For each provided setting if hasattr(self, key): # If the instance has a matching property diff --git a/openflexure_microscope/camera/pi.py b/openflexure_microscope/camera/pi.py index 1ed7f5e2..d24ac186 100644 --- a/openflexure_microscope/camera/pi.py +++ b/openflexure_microscope/camera/pi.py @@ -195,7 +195,7 @@ class PiCameraStreamer(BaseCamera): logging.debug("PiCameraStreamer: Applying config:") logging.debug(config) - with self.lock: + with self.lock(timeout=None): # Apply valid config params to Picamera object if not self.record_active: # If not recording a video @@ -301,7 +301,7 @@ class PiCameraStreamer(BaseCamera): """ Change the camera zoom, handling re-centering and scaling. """ - with self.lock: + with self.lock(timeout=None): self.zoom_value = float(zoom_value) if self.zoom_value < 1: self.zoom_value = 1 @@ -448,7 +448,7 @@ class PiCameraStreamer(BaseCamera): resolution ((int, int)): Resolution to set the camera to, before starting recording. Defaults to `self.stream_resolution`. """ - with self.lock: + with self.lock(timeout=None): # If stream object was destroyed if not hasattr(self, "stream"): self.stream = io.BytesIO() # Create a stream object diff --git a/openflexure_microscope/microscope.py b/openflexure_microscope/microscope.py index a22b634e..07f9f8d4 100644 --- a/openflexure_microscope/microscope.py +++ b/openflexure_microscope/microscope.py @@ -153,7 +153,7 @@ class Microscope: Return: dict: Dictionary containing complete microscope state """ - with self.lock: + with self.lock(timeout=None): state = {"camera": self.camera.state, "stage": self.stage.state} return state @@ -161,7 +161,7 @@ class Microscope: """ Applies a settings dictionary to the microscope. Missing parameters will be left untouched. """ - with self.lock: + with self.lock(timeout=None): logging.debug("Microscope: Applying settings: {}".format(settings)) # If attached to a camera @@ -199,39 +199,38 @@ class Microscope: This is to ensure that settings for currently disconnected hardware don't get removed from the settings file. """ - with self.lock: - - settings_current = { - "id": self.id, - "name": self.name, - "fov": self.fov, - "extensions": self.extension_settings, - } + settings_current = { + "id": self.id, + "name": self.name, + "fov": self.fov, + "extensions": self.extension_settings, + } + with self.lock(timeout=None): # If attached to a camera if self.camera: - settings_current_camera = self.camera.read_settings() - settings_current["camera"] = settings_current_camera + settings_current_camera = self.camera.read_settings() + settings_current["camera"] = settings_current_camera - # Store an encoded copy of the PiCamera lens shading table, if it exists - if hasattr(self.camera, "read_lens_shading_table"): - # Read LST. Returns None if no LST is active - lst_arr = self.camera.read_lens_shading_table() + # Store an encoded copy of the PiCamera lens shading table, if it exists + if hasattr(self.camera, "read_lens_shading_table"): + # Read LST. Returns None if no LST is active + lst_arr = self.camera.read_lens_shading_table() - if lst_arr is not None: - b64_string, dtype, shape = serialise_array_b64(lst_arr) + if lst_arr is not None: + b64_string, dtype, shape = serialise_array_b64(lst_arr) - settings_current["camera"]["lens_shading_table"] = { - "@type": "ndarray", - "b64_string": b64_string, - "dtype": dtype, - "shape": shape, - } + settings_current["camera"]["lens_shading_table"] = { + "@type": "ndarray", + "b64_string": b64_string, + "dtype": dtype, + "shape": shape, + } # If attached to a stage if self.stage: - settings_current_stage = self.stage.read_settings() - settings_current["stage"] = settings_current_stage + settings_current_stage = self.stage.read_settings() + settings_current["stage"] = settings_current_stage # Capture manager settings_current_captures = self.captures.read_settings() @@ -255,27 +254,28 @@ class Microscope: @property def configuration(self): - initial_configuration = self.configuration_file.load() + with self.lock(timeout=None): + initial_configuration = self.configuration_file.load() - current_configuration = { - "application": { - "name": "openflexure-microscope-server", - "version": pkg_resources.get_distribution( - "openflexure-microscope-server" - ).version, - }, - "stage": { - "type": self.stage.__class__.__name__, - **self.stage.configuration, - }, - "camera": { - "type": self.camera.__class__.__name__, - **self.camera.configuration, - }, - } + current_configuration = { + "application": { + "name": "openflexure-microscope-server", + "version": pkg_resources.get_distribution( + "openflexure-microscope-server" + ).version, + }, + "stage": { + "type": self.stage.__class__.__name__, + **self.stage.configuration, + }, + "camera": { + "type": self.camera.__class__.__name__, + **self.camera.configuration, + }, + } - initial_configuration.update(current_configuration) - return initial_configuration + initial_configuration.update(current_configuration) + return initial_configuration @property def metadata(self): diff --git a/openflexure_microscope/stage/base.py b/openflexure_microscope/stage/base.py index d7510a6a..3121c1bc 100644 --- a/openflexure_microscope/stage/base.py +++ b/openflexure_microscope/stage/base.py @@ -11,7 +11,7 @@ class BaseStage(metaclass=ABCMeta): """ def __init__(self): - self.lock = StrictLock(name="Stage", timeout=5) + self.lock = StrictLock(name="Stage", timeout=1) @abstractmethod def update_settings(self, config: dict): diff --git a/openflexure_microscope/stage/sanga.py b/openflexure_microscope/stage/sanga.py index c3fdf35d..7e88db21 100644 --- a/openflexure_microscope/stage/sanga.py +++ b/openflexure_microscope/stage/sanga.py @@ -51,7 +51,7 @@ class SangaStage(BaseStage): @property def position(self): - with self.lock: + with self.lock(timeout=None): return self.board.position @property