from openflexure_microscope.api.utilities import gen, JsonPayload from openflexure_microscope.api.v1.views import MicroscopeView from flask import Response, Blueprint, jsonify, request import logging class StreamAPI(MicroscopeView): def get(self): """ Real-time MJPEG stream from the microscope camera .. :quickref: State; Camera stream :>header Accept: image/jpeg :>header Content-Type: image/jpeg :status 200: stream active """ # Restart stream worker thread self.microscope.camera.start_worker() return Response( gen(self.microscope.camera), mimetype='multipart/x-mixed-replace; boundary=frame') class StateAPI(MicroscopeView): def get(self): """ JSON representation of the microscope object. .. :quickref: State; Microscope state **Example request**: .. sourcecode:: http GET /state/ HTTP/1.1 Accept: application/json **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Vary: Accept Content-Type: application/json { "camera": { "preview_active": false, "record_active": false, "stream_active": true }, "plugin": {}, "stage": { "backlash": { "x": 128, "y": 128, "z": 128 }, "position": { "x": -8080, "y": 5665, "z": -12600 } } } :>header Accept: application/json :>header Content-Type: application/json :status 200: state available """ return jsonify(self.microscope.state) class ConfigAPI(MicroscopeView): def get(self): """ JSON representation of the microscope config. .. :quickref: Config; Get microscope config **Example request**: .. sourcecode:: http GET /config/ HTTP/1.1 Accept: application/json **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Vary: Accept Content-Type: application/json { "id": "0e2c6fac5421429aac67c7903107bdd8", "name": "docuscope-2000", "fov": [4100, 3146], "camera_settings": { "image_resolution": [2592, 1944], "numpy_resolution": [1312, 976], "video_resolution": [832, 624], "jpeg_quality": 75, "picamera_settings": { "analog_gain": 1.0, "digital_gain": 1.0, "awb_gains": [0.92578125, 2.94921875], "awb_mode": "off", "exposure_mode": "off", "framerate": 24.0, "saturation": 0, "shutter_speed": 5378 }, }, "stage_settings": { "backlash": { "x": 256, "y": 256, "z": 0 } } "plugins": [ "openflexure_microscope.plugins.default.autofocus:AutofocusPlugin", "openflexure_microscope.plugins.default.scan:ScanPlugin", "openflexure_microscope.plugins.default.camera_calibration:Plugin" ] } :>header Accept: application/json :>header Content-Type: application/json :status 200: state available """ return jsonify(self.microscope.read_config(json_safe=True)) def post(self): """ Modify microscope configuration .. :quickref: Config; Set microscope config **Example request**: .. sourcecode:: http POST /config HTTP/1.1 Accept: application/json { "id": "0e2c6fac5421429aac67c7903107bdd8", "name": "docuscope-2000", "fov": [4100, 3146], "camera_settings": { "image_resolution": [2592, 1944], "numpy_resolution": [1312, 976], "video_resolution": [832, 624], "jpeg_quality": 75, "picamera_settings": { "analog_gain": 1.0, "digital_gain": 1.0, "awb_gains": [0.92578125, 2.94921875], "awb_mode": "off", "exposure_mode": "off", "framerate": 24.0, "saturation": 0, "shutter_speed": 5378 }, }, "stage_settings": { "backlash": { "x": 256, "y": 256, "z": 0 } } "plugins": [ "openflexure_microscope.plugins.default.autofocus:AutofocusPlugin", "openflexure_microscope.plugins.default.scan:ScanPlugin", "openflexure_microscope.plugins.default.camera_calibration:Plugin" ] } :>header Accept: application/json :