From c52d1bb2ae9916da7ee21d29e0d7706ae8415abd Mon Sep 17 00:00:00 2001 From: Tore Niermann Date: Fri, 24 Jun 2022 16:52:23 +0200 Subject: [PATCH] Added column valves state to Microscope classes. --- docs/changelog.rst | 1 + scripts/test_microscope.py | 1 + temscript/base_microscope.py | 23 +++++++++++++++++++++++ temscript/microscope.py | 8 +++++++- temscript/null_microscope.py | 6 ++++++ temscript/remote_microscope.py | 6 ++++++ temscript/server.py | 13 +++++++++++-- 7 files changed, 55 insertions(+), 3 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index bbfb427..cc390d2 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -6,6 +6,7 @@ Version 2.0.1 * Added Talos as ProductFamily * Added more graceful behavior for unsupported ProductFamily query and unknown future families. +* Added column valves state to Microscope classes. Version 2.0.0 ^^^^^^^^^^^^^ diff --git a/scripts/test_microscope.py b/scripts/test_microscope.py index 1748ecb..b840438 100644 --- a/scripts/test_microscope.py +++ b/scripts/test_microscope.py @@ -34,6 +34,7 @@ print("Microscope.get_version():", microscope.get_version()) print("Microscope.get_voltage():", microscope.get_voltage()) print("Microscope.get_vacuum():", microscope.get_vacuum()) +print("Microscope.get_column_valves_open():", microscope.get_column_valves_open()) print("Microscope.get_stage_holder():", microscope.get_stage_holder()) print("Microscope.get_stage_status():", microscope.get_stage_status()) print("Microscope.get_stage_limits():", microscope.get_stage_limits()) diff --git a/temscript/base_microscope.py b/temscript/base_microscope.py index 0a63753..b3ec810 100644 --- a/temscript/base_microscope.py +++ b/temscript/base_microscope.py @@ -128,6 +128,29 @@ def get_vacuum(self): """ raise NotImplementedError + @abstractmethod + def get_column_valves_open(self): + """ + Returns state of the column valves. + + :return: `True`, if column valves are open. `False`, otherwise. + + .. versionadded: 2.1.0 + """ + raise NotImplementedError + + @abstractmethod + def set_column_valves_open(self, state): + """ + Set state of the column valves. The column valves are opened, if `True` is passes as *state* + + :param state: `True`, if column valves should be opened. `False`, if they should be closed. + :type state: bool + + .. versionadded: 2.0.1 + """ + raise NotImplementedError + @abstractmethod def get_stage_holder(self): """Return holder currently in stage (see :class:`StageHolderType`)""" diff --git a/temscript/microscope.py b/temscript/microscope.py index ff064a1..83fb169 100644 --- a/temscript/microscope.py +++ b/temscript/microscope.py @@ -67,11 +67,17 @@ def get_vacuum(self): gauges[name] = g.Pressure return { "status": VacuumStatus(self._tem_vacuum.Status).name, - "column_valves_open": self._tem_vacuum.ColumnValvesOpen, + "column_valves_open": self.get_column_valves_open(), "pvp_running": self._tem_vacuum.PVPRunning, "gauges(Pa)": gauges, } + def get_column_valves_open(self): + return self._tem_vacuum.ColumnValvesOpen + + def set_column_valves_open(self, state): + self._tem_vacuum.ColumnValvesOpen = state + def get_stage_holder(self): return self._tem_stage.Holder.name diff --git a/temscript/null_microscope.py b/temscript/null_microscope.py index 745c539..beb228a 100644 --- a/temscript/null_microscope.py +++ b/temscript/null_microscope.py @@ -141,6 +141,12 @@ def get_vacuum(self): "gauges(Pa)": {}, } + def get_column_valves_open(self): + return self._column_valves + + def set_column_valves_open(self, state): + self._column_valves = bool(state) + def get_stage_holder(self): return StageHolderType.SINGLE_TILT.name diff --git a/temscript/remote_microscope.py b/temscript/remote_microscope.py index 7fcf657..b795a29 100644 --- a/temscript/remote_microscope.py +++ b/temscript/remote_microscope.py @@ -142,6 +142,12 @@ def get_voltage(self): def get_vacuum(self): return self._request("GET", "/v1/vacuum")[1] + def get_column_valves_open(self): + return self._request("GET", "/v1/column_valves_open")[1] + + def set_column_valves_open(self, state): + self._request_with_json_body("PUT", "/v1/column_valves_open", state) + def get_stage_holder(self): return self._request("GET", "/v1/stage_holder")[1] diff --git a/temscript/server.py b/temscript/server.py index dc0441d..43f512d 100644 --- a/temscript/server.py +++ b/temscript/server.py @@ -16,7 +16,7 @@ class MicroscopeHandler(BaseHTTPRequestHandler): "condenser_stigmator", "diffraction_shift", "screen_current", "screen_position", "illumination_mode", "condenser_mode", "illuminated_area", "probe_defocus", "convergence_angle", "stem_magnification", "stem_rotation", "spot_size_index", "dark_field_mode", "beam_blanked", - "instrument_mode", 'optics_state', 'state') + "instrument_mode", 'optics_state', 'state', 'column_valves_open') PUT_V1_FORWARD = ("image_shift", "beam_shift", "beam_tilt", "projection_mode", "magnification_index", "defocus", "intensity", "diffraction_shift", "objective_stigmator", "condenser_stigmator", @@ -126,6 +126,13 @@ def do_PUT_V1(self, endpoint, query): response = self.get_microscope().set_detector_param(name, decoded_content) elif endpoint == "normalize": self.get_microscope().normalize(decoded_content) + elif endpoint == "column_valves_open": + state = bool(decoded_content) + assert isinstance(self.server, MicroscopeServer) + if self.server.allow_column_valves_open or not state: + self.get_microscope().set_column_valves_open(state) + else: + raise ValueError("Opening of column valves is prohibited.") else: raise KeyError("Unknown endpoint: '%s'" % endpoint) return response @@ -166,17 +173,19 @@ def do_PUT(self): class MicroscopeServer(HTTPServer, object): - def __init__(self, server_address=('', 8080), microscope_factory=None): + def __init__(self, server_address=('', 8080), microscope_factory=None, allow_column_valves_open=True): """ Run a microscope server. :param server_address: (address, port) tuple :param microscope_factory: callable creating the BaseMicroscope instance to use + :param allow_column_valves_open: Allow remote client to open column valves """ if microscope_factory is None: from .microscope import Microscope microscope_factory = Microscope self.microscope = microscope_factory() + self.allow_column_valves_open = allow_column_valves_open super(MicroscopeServer, self).__init__(server_address, MicroscopeHandler)