diff --git a/mxcubeweb/core/adapter/diffractometer_adapter.py b/mxcubeweb/core/adapter/diffractometer_adapter.py index 4735d1fa8..4b71f832d 100644 --- a/mxcubeweb/core/adapter/diffractometer_adapter.py +++ b/mxcubeweb/core/adapter/diffractometer_adapter.py @@ -1,11 +1,14 @@ from typing import ClassVar -from mxcubecore.HardwareObjects import ( - GenericDiffractometer, - MiniDiff, -) +from mxcubecore.HardwareObjects import GenericDiffractometer, MiniDiff from mxcubeweb.core.adapter.adapter_base import AdapterBase +from mxcubeweb.core.models.configmodels import ResourceHandlerConfigModel + +resource_handler_config = ResourceHandlerConfigModel( + commands=["set_chip_layout", "set_phase"], + attributes=["data", "get_value", "head_configuration"], +) class DiffractometerAdapter(AdapterBase): @@ -17,12 +20,12 @@ class DiffractometerAdapter(AdapterBase): GenericDiffractometer.GenericDiffractometer, ] - def __init__(self, ho, *args): + def __init__(self, ho, role, app): """ Args: (object): Hardware object. """ - super().__init__(ho, *args) + super().__init__(ho, role, app, resource_handler_config) ho.connect("stateChanged", self._state_change) ho.connect("valueChanged", self._state_change) ho.connect("phaseChanged", self._diffractometer_phase_changed) @@ -37,6 +40,12 @@ def _diffractometer_phase_changed(self, phase): def _state_change(self, *args, **kwargs): self.state_change(*args, **kwargs) + def get_value(self) -> dict: + return { + "currentPhase": self._ho.get_current_phase(), + "phaseList": self._ho.get_phase_list(), + } + def stop(self): pass @@ -53,3 +62,7 @@ def set_chip_layout( ) -> bool: self._ho.set_chip_layout(layout_name) return True + + def set_phase(self, phase: str) -> bool: + self._ho.set_phase(phase) + return True diff --git a/mxcubeweb/core/components/beamline.py b/mxcubeweb/core/components/beamline.py index 9f6f1dcb0..b86085859 100644 --- a/mxcubeweb/core/components/beamline.py +++ b/mxcubeweb/core/components/beamline.py @@ -95,42 +95,12 @@ def beamline_get_all_attributes(self): {"energyScanElements": ho.get_available_elements().get("elements", [])} ) - data.update(self.diffractometer_get_info()) - return data def prepare_beamline_for_sample(self): if hasattr(HWR.beamline.collect, "prepare_for_new_sample"): HWR.beamline.collect.prepare_for_new_sample() - def diffractometer_set_phase(self, phase): - try: - HWR.beamline.diffractometer.wait_ready(30) - except Exception: - logging.getLogger("MX3.HWR").warning("Diffractometer not ready") - - HWR.beamline.diffractometer.set_phase(phase) - - def diffractometer_get_info(self): - ret = {} - - try: - ret["useSC"] = HWR.beamline.diffractometer.use_sc - except AttributeError: - ret["useSC"] = False - - try: - ret["currentPhase"] = HWR.beamline.diffractometer.get_current_phase() - except AttributeError: - ret["currentPhase"] = "None" - - try: - ret["phaseList"] = HWR.beamline.diffractometer.get_phase_list() - except AttributeError: - ret["phaseList"] = [] - - return ret - def get_detector_info(self): try: filetype = HWR.beamline.detector.get_property("file_suffix") diff --git a/mxcubeweb/routes/diffractometer.py b/mxcubeweb/routes/diffractometer.py deleted file mode 100644 index 8e48a486d..000000000 --- a/mxcubeweb/routes/diffractometer.py +++ /dev/null @@ -1,39 +0,0 @@ -import json - -from flask import ( - Blueprint, - Response, - jsonify, - request, -) - - -def init_route(app, server, url_prefix): - bp = Blueprint("diffractometer", __name__, url_prefix=url_prefix) - - @bp.route("/phase", methods=["PUT"]) - @server.require_control - @server.restrict - def set_phase(): - """ - Set the phase in the diffractometer. - :request Content-type: application/json, an object containing - the new phase as string, e.g. {'phase': 'Centring'}. - [Centring, BeamLocation, DataCollection, Transfer] - :statuscode: 200: no error - :statuscode: 409: error - """ - params = request.data - params = json.loads(params) - phase = params["phase"] - app.beamline.diffractometer_set_phase(phase) - return Response(status=200) - - @bp.route("/info", methods=["GET"]) - @server.restrict - def get_diffractometer_info(): - resp = jsonify(app.beamline.diffractometer_get_info()) - resp.status_code = 200 - return resp - - return bp diff --git a/mxcubeweb/server.py b/mxcubeweb/server.py index 03988cb8c..f917041c3 100644 --- a/mxcubeweb/server.py +++ b/mxcubeweb/server.py @@ -120,9 +120,6 @@ def register_routes(mxcube): from mxcubeweb.routes.beamline import init_route as init_beamline_route from mxcubeweb.routes.csp_report import init_route as init_csp_route from mxcubeweb.routes.detector import init_route as init_detector_route - from mxcubeweb.routes.diffractometer import ( - init_route as init_diffractometer_route, - ) from mxcubeweb.routes.harvester import init_route as init_harvester_route from mxcubeweb.routes.lims import init_route as init_lims_route from mxcubeweb.routes.login import init_route as init_login_route @@ -146,12 +143,6 @@ def register_routes(mxcube): init_detector_route, mxcube, f"{url_root_prefix}/detector" ) - Server._register_route( - init_diffractometer_route, - mxcube, - f"{url_root_prefix}/diffractometer", - ) - Server._register_route(init_lims_route, mxcube, f"{url_root_prefix}/lims") Server._register_route(init_login_route, mxcube, f"{url_root_prefix}/login") diff --git a/test/test_diffractometer_routes.py b/test/test_diffractometer_routes.py index 00785d340..92e1fdac4 100644 --- a/test/test_diffractometer_routes.py +++ b/test/test_diffractometer_routes.py @@ -14,7 +14,7 @@ def test_set_phase(client): current phase after the move is OP """ # Get current phase - resp = client.get("/mxcube/api/v0.1/diffractometer/info") + resp = client.get("/mxcube/api/v0.1/hwobj/diffractometer/diffractometer/get_value") info = json.loads(resp.data) phase_list = info["phaseList"] @@ -23,13 +23,13 @@ def test_set_phase(client): # Set a phase (any in the phase list) resp = client.put( - "/mxcube/api/v0.1/diffractometer/phase", + "/mxcube/api/v0.1/hwobj/diffractometer/diffractometer/set_phase", data=json.dumps({"phase": new_phase}), content_type="application/json", ) # Retrieve current phase - resp = client.get("/mxcube/api/v0.1/diffractometer/info") + resp = client.get("/mxcube/api/v0.1/hwobj/diffractometer/diffractometer/get_value") actual_phase = json.loads(resp.data)["currentPhase"] assert new_phase == actual_phase @@ -88,11 +88,3 @@ def test_set_aperture(client): assert ap == actual_aperture assert actual_original_aperture == original_aperture - - -def test_get_diffractometer_info(client): - """ - Simply checks if the route runs and does not throws any exceptions - """ - resp = client.get("/mxcube/api/v0.1/diffractometer/info") - assert resp.status_code == 200 diff --git a/ui/src/actions/login.js b/ui/src/actions/login.js index 800a72b4a..45f69b581 100644 --- a/ui/src/actions/login.js +++ b/ui/src/actions/login.js @@ -1,7 +1,6 @@ /* eslint-disable promise/prefer-await-to-then */ import { fetchBeamlineSetup } from '../api/beamline'; import { fetchDetectorInfo } from '../api/detector'; -import { fetchDiffractometerInfo } from '../api/diffractometer'; import { fetchValue } from '../api/hardware-object'; import { fetchHarvesterInitialState } from '../api/harvester'; import { sendSelectProposal } from '../api/lims'; @@ -110,7 +109,9 @@ export function getInitialState() { fetchImageData() .then((camera) => ({ camera })) .catch(notify), - fetchDiffractometerInfo().catch(notify), + fetchValue('diffractometer', 'diffractometer') + .then((diffractometer) => ({ diffractometer })) + .catch(notify), fetchDetectorInfo() .then((detector) => ({ detector })) .catch(notify), diff --git a/ui/src/actions/sampleview.js b/ui/src/actions/sampleview.js index b8657ed63..3d59fc851 100644 --- a/ui/src/actions/sampleview.js +++ b/ui/src/actions/sampleview.js @@ -1,5 +1,4 @@ -import { sendUpdateCurrentPhase } from '../api/diffractometer'; -import { sendSetValue } from '../api/hardware-object'; +import { sendExecuteCommand, sendSetValue } from '../api/hardware-object'; import { sendAbortCentring, sendAcceptCentring, @@ -355,7 +354,9 @@ export function changeAperture(size) { export function changeCurrentPhase(phase) { return async (dispatch) => { - await sendUpdateCurrentPhase(phase); + await sendExecuteCommand('diffractometer', 'diffractometer', 'set_phase', { + phase, + }); dispatch(setCurrentPhase(phase)); }; } diff --git a/ui/src/api/diffractometer.js b/ui/src/api/diffractometer.js deleted file mode 100644 index ef0461e35..000000000 --- a/ui/src/api/diffractometer.js +++ /dev/null @@ -1,11 +0,0 @@ -import api from './api'; - -const endpoint = api.url('/diffractometer'); - -export function fetchDiffractometerInfo() { - return endpoint.get('/info').safeJson(); -} - -export function sendUpdateCurrentPhase(phase) { - return endpoint.put({ phase }, '/phase').res(); -} diff --git a/ui/src/reducers/sampleview.js b/ui/src/reducers/sampleview.js index b05ab4b14..9726751eb 100644 --- a/ui/src/reducers/sampleview.js +++ b/ui/src/reducers/sampleview.js @@ -185,8 +185,8 @@ function sampleViewReducer(state = INITIAL_STATE, action = {}) { x: action.data.beamInfo.size_x, y: action.data.beamInfo.size_y, }, - phaseList: action.data.phaseList, - currentPhase: action.data.currentPhase, + phaseList: action.data.diffractometer.phaseList, + currentPhase: action.data.diffractometer.currentPhase, pixelsPerMm: action.data.camera.pixelsPerMm, sourceScale: action.data.camera.scale, };