Merge branch 'change-stage-geometry' into 'master'
Change stage geometry See merge request openflexure/openflexure-microscope-server!73
This commit is contained in:
commit
0234b20ce3
7 changed files with 197 additions and 19 deletions
|
|
@ -129,6 +129,9 @@ labthing.add_view(
|
||||||
)
|
)
|
||||||
labthing.add_root_link(views.ConfigurationProperty, "instrumentConfiguration")
|
labthing.add_root_link(views.ConfigurationProperty, "instrumentConfiguration")
|
||||||
|
|
||||||
|
# Attach stage resources
|
||||||
|
labthing.add_view(views.StageTypeProperty, "/instrument/stage/type")
|
||||||
|
|
||||||
|
|
||||||
# Attach streams resources
|
# Attach streams resources
|
||||||
labthing.add_view(views.MjpegStream, f"/streams/mjpeg")
|
labthing.add_view(views.MjpegStream, f"/streams/mjpeg")
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,88 @@
|
||||||
|
<template>
|
||||||
|
<div id="stageSettings">
|
||||||
|
<div>
|
||||||
|
<h3>Stage settings</h3>
|
||||||
|
<p>
|
||||||
|
<label>
|
||||||
|
Stage Type
|
||||||
|
<div v-if="this.stageType != 'MissingStage'">
|
||||||
|
<form @submit.prevent="setStageType">
|
||||||
|
<div>
|
||||||
|
<select v-model="stageType" class="uk-select">
|
||||||
|
<option value="SangaStage">SangaStage (Standard)</option>
|
||||||
|
<option value= "SangaDeltaStage"> SangaStage (Delta)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="submit" class="uk-button uk-button-primary uk-form-small uk-float-right uk-margin-small uk-width-1-1">
|
||||||
|
Change stage type
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div v-else class="uk-text-danger"><b>No stage connected</b></div>
|
||||||
|
</label>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
import axios from "axios";
|
||||||
|
import taskSubmitter from "../../genericComponents/taskSubmitter";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "StageSettings",
|
||||||
|
|
||||||
|
components:{
|
||||||
|
taskSubmitter
|
||||||
|
},
|
||||||
|
|
||||||
|
data: function(){
|
||||||
|
return {
|
||||||
|
stageType: "MissingStage",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
stageTypeUri: function() {
|
||||||
|
return `${this.$store.getters.baseUri}/api/v2/properties/stage/type`;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted(){
|
||||||
|
this.getStageType();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getStageType: function(){
|
||||||
|
console.log("Getting stage type")
|
||||||
|
axios
|
||||||
|
.get(this.stageTypeUri)
|
||||||
|
.then(response => {
|
||||||
|
console.log("Stage type is "+ response.data);
|
||||||
|
this.stageType = response.data;
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
this.modalError(error);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
setStageType: function(){
|
||||||
|
console.log("Setting stage type")
|
||||||
|
axios
|
||||||
|
.put(this.stageTypeUri,this.stageType)
|
||||||
|
.then(response => {
|
||||||
|
this.stageType = response.data;
|
||||||
|
console.log("Stage type set to " + this.stageType);
|
||||||
|
this.modalNotify("Stage type changed.");
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
this.modalError(error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less"></style>
|
||||||
|
|
@ -44,6 +44,19 @@
|
||||||
Camera
|
Camera
|
||||||
</tabIcon>
|
</tabIcon>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<tabIcon
|
||||||
|
id="settings-stage-icon"
|
||||||
|
tab-i-d="stage"
|
||||||
|
:show-title="false"
|
||||||
|
:show-tooltip="false"
|
||||||
|
:require-connection="true"
|
||||||
|
:current-tab="currentTab"
|
||||||
|
@set-tab="setTab"
|
||||||
|
>
|
||||||
|
Stage
|
||||||
|
</tabIcon>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<tabIcon
|
<tabIcon
|
||||||
id="settings-mapping-icon"
|
id="settings-mapping-icon"
|
||||||
|
|
@ -104,6 +117,16 @@
|
||||||
</div>
|
</div>
|
||||||
</tabContent>
|
</tabContent>
|
||||||
|
|
||||||
|
<tabContent
|
||||||
|
tab-i-d="stage"
|
||||||
|
:require-connection="true"
|
||||||
|
:current-tab="currentTab"
|
||||||
|
>
|
||||||
|
<div class="settings-pane uk-padding-small">
|
||||||
|
<stageSettings />
|
||||||
|
</div>
|
||||||
|
</tabContent>
|
||||||
|
|
||||||
<tabContent
|
<tabContent
|
||||||
tab-i-d="mapping"
|
tab-i-d="mapping"
|
||||||
:require-connection="true"
|
:require-connection="true"
|
||||||
|
|
@ -141,7 +164,7 @@ import cameraSettings from "./settingsComponents/cameraSettings.vue";
|
||||||
import appSettings from "./settingsComponents/appSettings.vue";
|
import appSettings from "./settingsComponents/appSettings.vue";
|
||||||
import featuresSettings from "./settingsComponents/featuresSettings.vue";
|
import featuresSettings from "./settingsComponents/featuresSettings.vue";
|
||||||
import cameraStageMappingSettings from "./settingsComponents/cameraStageMappingSettings.vue";
|
import cameraStageMappingSettings from "./settingsComponents/cameraStageMappingSettings.vue";
|
||||||
|
import stageSettings from "./settingsComponents/stageSettings.vue";
|
||||||
// Import generic components
|
// Import generic components
|
||||||
import tabIcon from "../genericComponents/tabIcon";
|
import tabIcon from "../genericComponents/tabIcon";
|
||||||
import tabContent from "../genericComponents/tabContent";
|
import tabContent from "../genericComponents/tabContent";
|
||||||
|
|
@ -153,6 +176,7 @@ export default {
|
||||||
components: {
|
components: {
|
||||||
streamSettings,
|
streamSettings,
|
||||||
cameraSettings,
|
cameraSettings,
|
||||||
|
stageSettings,
|
||||||
microscopeSettings,
|
microscopeSettings,
|
||||||
cameraStageMappingSettings,
|
cameraStageMappingSettings,
|
||||||
appSettings,
|
appSettings,
|
||||||
|
|
|
||||||
|
|
@ -2,3 +2,4 @@ from .actions import enabled_root_actions
|
||||||
from .captures import *
|
from .captures import *
|
||||||
from .instrument import *
|
from .instrument import *
|
||||||
from .streams import *
|
from .streams import *
|
||||||
|
from .stage import *
|
||||||
|
|
|
||||||
|
|
@ -65,3 +65,5 @@ class ZeroStageAPI(ActionView):
|
||||||
|
|
||||||
# TODO: Make schema for microscope state
|
# TODO: Make schema for microscope state
|
||||||
return microscope.state["stage"]
|
return microscope.state["stage"]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
30
openflexure_microscope/api/v2/views/stage.py
Normal file
30
openflexure_microscope/api/v2/views/stage.py
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
from labthings import find_component, fields, schema
|
||||||
|
from labthings.views import PropertyView
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
|
||||||
|
class StageTypeProperty(PropertyView):
|
||||||
|
"""The type of the stage"""
|
||||||
|
|
||||||
|
schema = fields.String(
|
||||||
|
missing=None,
|
||||||
|
example="SangaStage",
|
||||||
|
OneOf=["SangaStage", "SangaDeltaStage"],
|
||||||
|
description="The translation stage geometry",
|
||||||
|
)
|
||||||
|
|
||||||
|
def get(self):
|
||||||
|
"""
|
||||||
|
Get the stage geometry.
|
||||||
|
"""
|
||||||
|
microscope = find_component("org.openflexure.microscope")
|
||||||
|
return microscope.configuration["stage"]["type"]
|
||||||
|
|
||||||
|
def put(self, stage_type):
|
||||||
|
"""
|
||||||
|
Set the stage geometry.
|
||||||
|
"""
|
||||||
|
microscope = find_component("org.openflexure.microscope")
|
||||||
|
microscope.set_stage(stage_type=stage_type)
|
||||||
|
return microscope.configuration["stage"]["type"]
|
||||||
|
|
@ -105,24 +105,8 @@ class Microscope:
|
||||||
logging.warning("No compatible camera hardware found.")
|
logging.warning("No compatible camera hardware found.")
|
||||||
|
|
||||||
### Stage
|
### Stage
|
||||||
logging.info("Creating stage")
|
self.set_stage(configuration=configuration)
|
||||||
if configuration.get("stage"):
|
|
||||||
stage_type = configuration["stage"].get("type")
|
|
||||||
stage_port = configuration["stage"].get("port")
|
|
||||||
if stage_type in ("SangaBoard", "SangaStage"):
|
|
||||||
try:
|
|
||||||
logging.info("Trying SangaStage")
|
|
||||||
self.stage = SangaStage(port=stage_port)
|
|
||||||
except Exception as e:
|
|
||||||
logging.error(e)
|
|
||||||
logging.warning("No compatible Sangaboard hardware found.")
|
|
||||||
elif stage_type in ("SangaDeltaStage"):
|
|
||||||
try:
|
|
||||||
logging.info("Trying SangaDeltaStage")
|
|
||||||
self.stage = SangaDeltaStage(port=stage_port)
|
|
||||||
except Exception as e:
|
|
||||||
logging.error(e)
|
|
||||||
logging.warning("No compatible Sangaboard hardware found.")
|
|
||||||
|
|
||||||
logging.info("Handling fallbacks")
|
logging.info("Handling fallbacks")
|
||||||
### Fallbacks
|
### Fallbacks
|
||||||
|
|
@ -138,6 +122,51 @@ class Microscope:
|
||||||
if hasattr(self.stage, "lock"):
|
if hasattr(self.stage, "lock"):
|
||||||
self.lock.locks.append(self.stage.lock)
|
self.lock.locks.append(self.stage.lock)
|
||||||
|
|
||||||
|
def set_stage(self, configuration=None, stage_type=None):
|
||||||
|
"""
|
||||||
|
Set or change the stage geometry
|
||||||
|
"""
|
||||||
|
if not configuration:
|
||||||
|
configuration = self.configuration
|
||||||
|
|
||||||
|
if stage_type:
|
||||||
|
if stage_type == configuration["stage"].get("type"):
|
||||||
|
logging.info("Stage already set to that stage type")
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
stage_type = configuration["stage"].get("type")
|
||||||
|
|
||||||
|
### Close any existing stages
|
||||||
|
if self.stage:
|
||||||
|
stage_port = self.stage.port
|
||||||
|
self.stage.close()
|
||||||
|
|
||||||
|
|
||||||
|
logging.info("Setting stage")
|
||||||
|
stage_port = configuration["stage"].get("port")
|
||||||
|
|
||||||
|
if stage_type in ("SangaBoard", "SangaStage"):
|
||||||
|
try:
|
||||||
|
logging.info("Trying SangaStage")
|
||||||
|
self.stage = SangaStage(port=stage_port)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(e)
|
||||||
|
logging.warning("No compatible Sangaboard hardware found.")
|
||||||
|
elif stage_type in ("SangaDeltaStage"):
|
||||||
|
try:
|
||||||
|
logging.info("Trying SangaDeltaStage")
|
||||||
|
self.stage = SangaDeltaStage(port=stage_port)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(e)
|
||||||
|
logging.warning("No compatible Sangaboard hardware found.")
|
||||||
|
else:
|
||||||
|
logging.warning("The stage type is incorrectly defined.")
|
||||||
|
|
||||||
|
logging.info("Saving new stage type configuration")
|
||||||
|
configuration["stage"]["type"] = stage_type
|
||||||
|
self.configuration_file.save(configuration)
|
||||||
|
|
||||||
def has_real_stage(self) -> bool:
|
def has_real_stage(self) -> bool:
|
||||||
"""
|
"""
|
||||||
Check if a real (non-mock) stage is currently attached.
|
Check if a real (non-mock) stage is currently attached.
|
||||||
|
|
@ -363,6 +392,7 @@ class Microscope:
|
||||||
|
|
||||||
# Capture to output object
|
# Capture to output object
|
||||||
logging.info(f"Starting microscope capture {output.file}")
|
logging.info(f"Starting microscope capture {output.file}")
|
||||||
|
print(output)
|
||||||
self.camera.capture(
|
self.camera.capture(
|
||||||
output,
|
output,
|
||||||
use_video_port=use_video_port,
|
use_video_port=use_video_port,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue