pyobs-gui 2.0.0.dev11__tar.gz → 2.0.0.dev13__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/PKG-INFO +2 -2
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/datadisplaywidget.py +4 -2
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/focuswidget.py +13 -8
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/spectrographwidget.ui +22 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/spectrographwidget_ui.py +22 -2
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/spectrographwidget.py +18 -1
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/weatherwidget.py +4 -4
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyproject.toml +1 -1
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/tests/test_camerawidget.py +1 -1
- pyobs_gui-2.0.0.dev13/uv.lock +3829 -0
- pyobs_gui-2.0.0.dev11/uv.lock +0 -3601
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/.claude/skills/verify/SKILL.md +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/.github/dependabot.yml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/.github/workflows/pypi.yml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/.github/workflows/pyrefly.yml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/.github/workflows/ruff.yml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/.gitignore +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/.pre-commit-config.yaml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/.readthedocs.yml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/CHANGELOG.rst +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/LICENSE +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/README.md +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/bin/mypyuic5 +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/docs/Makefile +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/docs/make.bat +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/docs/requirements.txt +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/docs/source/_static/pyobs.gif +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/docs/source/conf.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/docs/source/index.rst +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/mypy.ini +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/__init__.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/__main__.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/_nuitka_astropy_patch.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/accounts.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/acquisitionwidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/autofocuswidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/autoguidingwidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/base.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/camerawidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/commandinputwidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/compassmovewidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/coolingwidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/eventswidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/filterwidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/fitsheaderswidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/gui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/login.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/loginwindow.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/logmodel.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/mainwindow.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/modewidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/modifiedmixin.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/modulegui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/__init__.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/acquisitionwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/acquisitionwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/autofocuswidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/autofocuswidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/autoguidingwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/autoguidingwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/camerawidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/camerawidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/compassmoveplugin.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/compassmovewidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/compassmovewidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/compassmovewidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/compile.sh +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/coolingwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/coolingwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/datadisplayplugin.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/datadisplaywidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/datadisplaywidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/designer.sh +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/eventswidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/eventswidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/filterwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/filterwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/fitsheaderswidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/fitsheaderswidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/focuswidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/focuswidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/mainwindow.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/mainwindow_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/modewidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/modewidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/resources/arrow-alt-circle-down-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/resources/arrow-alt-circle-left-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/resources/arrow-alt-circle-right-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/resources/arrow-alt-circle-up-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/resources/arrow-up-right-from-square-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/resources/arrows-to-eye-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/resources/chart-line-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/resources/circle-question-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/resources/cloud-sun-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/resources/edit-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/resources/search-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/resources/undo-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/resources.qrc +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/resources_rc.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/roofwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/roofwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/shellwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/shellwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/telescopewidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/telescopewidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/temperaturesplotwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/temperaturesplotwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/temperatureswidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/temperatureswidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/videowidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/videowidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/weatherwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/qt/weatherwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/roofwidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/shellwidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/statuswidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/telescopewidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/temperaturesplotwidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/temperatureswidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/utils.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/videowidget.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pyobs_gui/watchedlabel.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/pysidedeploy.spec +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/specs/README.md +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/spike_standalone/main.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/spike_standalone/pysidedeploy.spec +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/test/acquisition.yaml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/test/autofocus.yaml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/test/camera.yaml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/test/full.yaml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/test/guiding.yaml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/test/mode.yaml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/test/roof.yaml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/test/spectrograph.yaml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/test/telescope.yaml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/test/telescope_acl.yaml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/test/telescope_acl_denied.yaml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/test/video.yaml +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/tests/__init__.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/tests/conftest.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/tests/test_accounts.py +0 -0
- {pyobs_gui-2.0.0.dev11 → pyobs_gui-2.0.0.dev13}/tests/test_loginwindow.py +0 -0
|
@@ -44,6 +44,7 @@ class DataDisplayWidget(BaseWidget, Ui_DataDisplayWidget):
|
|
|
44
44
|
self.ax: Axes | None = None
|
|
45
45
|
self.canvas: FigureCanvas | None = None
|
|
46
46
|
self.plotTools: NavigationToolbar2QT | None = None
|
|
47
|
+
self.is_spectrograph = False
|
|
47
48
|
|
|
48
49
|
# before first update, disable mys
|
|
49
50
|
self.setEnabled(False)
|
|
@@ -65,6 +66,7 @@ class DataDisplayWidget(BaseWidget, Ui_DataDisplayWidget):
|
|
|
65
66
|
# add image panel
|
|
66
67
|
self.imageLayout = QtWidgets.QVBoxLayout(self.tabImage)
|
|
67
68
|
if await self.comm.has_proxy(self.module, ISpectrograph):
|
|
69
|
+
self.is_spectrograph = True
|
|
68
70
|
self.figure, self.ax = plt.subplots()
|
|
69
71
|
self.canvas = FigureCanvas(self.figure)
|
|
70
72
|
self.plotTools = NavigationToolbar2QT(self.canvas, self.tabImage)
|
|
@@ -103,9 +105,9 @@ class DataDisplayWidget(BaseWidget, Ui_DataDisplayWidget):
|
|
|
103
105
|
if self.data is None:
|
|
104
106
|
return
|
|
105
107
|
|
|
106
|
-
if
|
|
108
|
+
if self.is_spectrograph:
|
|
107
109
|
self._plot_spectrum()
|
|
108
|
-
elif
|
|
110
|
+
elif self.imageView is not None:
|
|
109
111
|
self.imageView.display(self.data[0])
|
|
110
112
|
|
|
111
113
|
def _plot_spectrum(self) -> None:
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import asyncio
|
|
1
2
|
import logging
|
|
2
3
|
from typing import Any
|
|
3
4
|
|
|
@@ -66,21 +67,25 @@ class FocusWidget(BaseWidget, Ui_FocusWidget):
|
|
|
66
67
|
self.butSetFocusOffset.setEnabled(initialized)
|
|
67
68
|
self.butSetFocusBase.setEnabled(initialized)
|
|
68
69
|
|
|
69
|
-
|
|
70
|
-
async def _set_focus_base(self) -> None:
|
|
70
|
+
def _set_focus_base(self) -> None:
|
|
71
71
|
value = self._focus or 0.0
|
|
72
72
|
new_value, ok = QtWidgets.QInputDialog.getDouble(self, "Focus", "New value", value, 0, 100, 2)
|
|
73
73
|
if ok:
|
|
74
|
-
|
|
75
|
-
await proxy.set_focus(new_value)
|
|
74
|
+
asyncio.ensure_future(self._set_focus_base_async(new_value))
|
|
76
75
|
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
async def _set_focus_base_async(self, new_value: float) -> None:
|
|
77
|
+
async with self.comm.proxy(self.module, IFocuser) as proxy:
|
|
78
|
+
await proxy.set_focus(new_value)
|
|
79
|
+
|
|
80
|
+
def _set_focus_offset(self) -> None:
|
|
79
81
|
value = self._focus_offset or 0.0
|
|
80
82
|
new_value, ok = QtWidgets.QInputDialog.getDouble(self, "Focus offset", "New value", value, -5, 5, 2)
|
|
81
83
|
if ok:
|
|
82
|
-
|
|
83
|
-
|
|
84
|
+
asyncio.ensure_future(self._set_focus_offset_async(new_value))
|
|
85
|
+
|
|
86
|
+
async def _set_focus_offset_async(self, new_value: float) -> None:
|
|
87
|
+
async with self.comm.proxy(self.module, IFocuser) as proxy:
|
|
88
|
+
await proxy.set_focus_offset(new_value)
|
|
84
89
|
|
|
85
90
|
@qasync.asyncSlot() # type: ignore
|
|
86
91
|
async def _reset_focus_offset(self) -> None:
|
|
@@ -66,6 +66,27 @@
|
|
|
66
66
|
</property>
|
|
67
67
|
</widget>
|
|
68
68
|
</item>
|
|
69
|
+
<item>
|
|
70
|
+
<layout class="QHBoxLayout" name="horizontalLayoutCount">
|
|
71
|
+
<item>
|
|
72
|
+
<widget class="QLabel" name="labelCount">
|
|
73
|
+
<property name="text">
|
|
74
|
+
<string>Count:</string>
|
|
75
|
+
</property>
|
|
76
|
+
</widget>
|
|
77
|
+
</item>
|
|
78
|
+
<item>
|
|
79
|
+
<widget class="QSpinBox" name="spinCount">
|
|
80
|
+
<property name="minimum">
|
|
81
|
+
<number>1</number>
|
|
82
|
+
</property>
|
|
83
|
+
<property name="maximum">
|
|
84
|
+
<number>9999</number>
|
|
85
|
+
</property>
|
|
86
|
+
</widget>
|
|
87
|
+
</item>
|
|
88
|
+
</layout>
|
|
89
|
+
</item>
|
|
69
90
|
<item>
|
|
70
91
|
<widget class="QPushButton" name="butExpose">
|
|
71
92
|
<property name="palette">
|
|
@@ -1035,6 +1056,7 @@
|
|
|
1035
1056
|
<tabstops>
|
|
1036
1057
|
<tabstop>scrollArea</tabstop>
|
|
1037
1058
|
<tabstop>checkBroadcast</tabstop>
|
|
1059
|
+
<tabstop>spinCount</tabstop>
|
|
1038
1060
|
<tabstop>butExpose</tabstop>
|
|
1039
1061
|
<tabstop>butAbort</tabstop>
|
|
1040
1062
|
</tabstops>
|
|
@@ -17,7 +17,8 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
|
|
|
17
17
|
QPalette, QPixmap, QRadialGradient, QTransform)
|
|
18
18
|
from PySide6.QtWidgets import (QApplication, QCheckBox, QGroupBox, QHBoxLayout,
|
|
19
19
|
QLabel, QProgressBar, QPushButton, QScrollArea,
|
|
20
|
-
QSizePolicy, QSpacerItem, QVBoxLayout,
|
|
20
|
+
QSizePolicy, QSpacerItem, QSpinBox, QVBoxLayout,
|
|
21
|
+
QWidget)
|
|
21
22
|
|
|
22
23
|
from ..datadisplaywidget import DataDisplayWidget
|
|
23
24
|
from . import resources_rc
|
|
@@ -60,6 +61,23 @@ class Ui_SpectrographWidget(object):
|
|
|
60
61
|
|
|
61
62
|
self.verticalLayout_3.addWidget(self.checkBroadcast)
|
|
62
63
|
|
|
64
|
+
self.horizontalLayoutCount = QHBoxLayout()
|
|
65
|
+
self.horizontalLayoutCount.setObjectName(u"horizontalLayoutCount")
|
|
66
|
+
self.labelCount = QLabel(self.groupExposure)
|
|
67
|
+
self.labelCount.setObjectName(u"labelCount")
|
|
68
|
+
|
|
69
|
+
self.horizontalLayoutCount.addWidget(self.labelCount)
|
|
70
|
+
|
|
71
|
+
self.spinCount = QSpinBox(self.groupExposure)
|
|
72
|
+
self.spinCount.setObjectName(u"spinCount")
|
|
73
|
+
self.spinCount.setMinimum(1)
|
|
74
|
+
self.spinCount.setMaximum(9999)
|
|
75
|
+
|
|
76
|
+
self.horizontalLayoutCount.addWidget(self.spinCount)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
self.verticalLayout_3.addLayout(self.horizontalLayoutCount)
|
|
80
|
+
|
|
63
81
|
self.butExpose = QPushButton(self.groupExposure)
|
|
64
82
|
self.butExpose.setObjectName(u"butExpose")
|
|
65
83
|
palette = QPalette()
|
|
@@ -265,7 +283,8 @@ class Ui_SpectrographWidget(object):
|
|
|
265
283
|
|
|
266
284
|
self.horizontalLayout_2.setStretch(1, 1)
|
|
267
285
|
QWidget.setTabOrder(self.scrollArea, self.checkBroadcast)
|
|
268
|
-
QWidget.setTabOrder(self.checkBroadcast, self.
|
|
286
|
+
QWidget.setTabOrder(self.checkBroadcast, self.spinCount)
|
|
287
|
+
QWidget.setTabOrder(self.spinCount, self.butExpose)
|
|
269
288
|
QWidget.setTabOrder(self.butExpose, self.butAbort)
|
|
270
289
|
|
|
271
290
|
self.retranslateUi(SpectrographWidget)
|
|
@@ -277,6 +296,7 @@ class Ui_SpectrographWidget(object):
|
|
|
277
296
|
SpectrographWidget.setWindowTitle(QCoreApplication.translate("SpectrographWidget", u"Form", None))
|
|
278
297
|
self.groupExposure.setTitle(QCoreApplication.translate("SpectrographWidget", u"Exposure", None))
|
|
279
298
|
self.checkBroadcast.setText(QCoreApplication.translate("SpectrographWidget", u"Broadcast", None))
|
|
299
|
+
self.labelCount.setText(QCoreApplication.translate("SpectrographWidget", u"Count:", None))
|
|
280
300
|
self.butExpose.setText(QCoreApplication.translate("SpectrographWidget", u"Expose", None))
|
|
281
301
|
self.butAbort.setText(QCoreApplication.translate("SpectrographWidget", u"Abort", None))
|
|
282
302
|
self.labelStatus.setText(QCoreApplication.translate("SpectrographWidget", u"IDLE", None))
|
|
@@ -29,6 +29,7 @@ class SpectrographWidget(BaseWidget, Ui_SpectrographWidget):
|
|
|
29
29
|
|
|
30
30
|
# cached state
|
|
31
31
|
self.exposure_status = ExposureStatus.IDLE
|
|
32
|
+
self.exposures_left = 0
|
|
32
33
|
|
|
33
34
|
# before first update, disable myself
|
|
34
35
|
self.setEnabled(False)
|
|
@@ -61,11 +62,20 @@ class SpectrographWidget(BaseWidget, Ui_SpectrographWidget):
|
|
|
61
62
|
@qasync.asyncSlot() # type: ignore
|
|
62
63
|
async def grab_spectrum(self) -> None:
|
|
63
64
|
broadcast = self.checkBroadcast.isChecked()
|
|
64
|
-
|
|
65
|
+
|
|
66
|
+
# take the requested number of spectra; an exception (e.g. from a failed exposure,
|
|
67
|
+
# or abort() zeroing exposures_left mid-loop) stops the sequence
|
|
68
|
+
self.exposures_left = self.spinCount.value()
|
|
65
69
|
self.signal_update_gui.emit()
|
|
70
|
+
while self.exposures_left > 0:
|
|
71
|
+
await self.datadisplay.grab_data(broadcast)
|
|
72
|
+
self.exposures_left -= 1
|
|
73
|
+
self.signal_update_gui.emit()
|
|
66
74
|
|
|
67
75
|
@qasync.asyncSlot() # type: ignore
|
|
68
76
|
async def abort(self) -> None:
|
|
77
|
+
# stop the sequence after the current spectrum finishes aborting
|
|
78
|
+
self.exposures_left = 0
|
|
69
79
|
async with self.comm.proxy(self.module, IAbortable) as proxy:
|
|
70
80
|
await proxy.abort()
|
|
71
81
|
|
|
@@ -75,6 +85,13 @@ class SpectrographWidget(BaseWidget, Ui_SpectrographWidget):
|
|
|
75
85
|
self.butExpose.setEnabled(self.exposure_status == ExposureStatus.IDLE)
|
|
76
86
|
self.butAbort.setEnabled(self.exposure_status != ExposureStatus.IDLE)
|
|
77
87
|
|
|
88
|
+
self.butAbort.setText("Abort sequence" if self.exposures_left > 1 else "Abort")
|
|
89
|
+
|
|
90
|
+
if self.exposures_left > 0:
|
|
91
|
+
self.labelExposuresLeft.setText(f"{self.exposures_left} spectrum/spectra left")
|
|
92
|
+
else:
|
|
93
|
+
self.labelExposuresLeft.setText("")
|
|
94
|
+
|
|
78
95
|
msg = ""
|
|
79
96
|
if self.exposure_status == ExposureStatus.IDLE:
|
|
80
97
|
self.progressExposure.setValue(0)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import os
|
|
2
2
|
from collections import deque
|
|
3
|
-
from typing import Any, Deque, Dict, Tuple, TYPE_CHECKING
|
|
3
|
+
from typing import Any, cast, Deque, Dict, Tuple, TYPE_CHECKING
|
|
4
4
|
from PySide6 import QtWidgets, QtGui, QtCore # type: ignore
|
|
5
5
|
import logging
|
|
6
6
|
|
|
@@ -16,6 +16,7 @@ from .base import BaseWidget
|
|
|
16
16
|
|
|
17
17
|
if TYPE_CHECKING:
|
|
18
18
|
from pyobs.utils.time import Time
|
|
19
|
+
from matplotlib.axes import Axes
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
log = logging.getLogger(__name__)
|
|
@@ -186,9 +187,8 @@ class WeatherWidget(BaseWidget, Ui_WeatherWidget):
|
|
|
186
187
|
self.canvas.draw()
|
|
187
188
|
return
|
|
188
189
|
|
|
189
|
-
|
|
190
|
-
if len(sensors) == 1
|
|
191
|
-
axes = [axes]
|
|
190
|
+
subplots = self.figure.subplots(len(sensors), 1, sharex=True)
|
|
191
|
+
axes = cast("list[Axes]", [subplots] if len(sensors) == 1 else list(subplots))
|
|
192
192
|
for ax, sensor in zip(axes, sensors, strict=True):
|
|
193
193
|
times, values = zip(*self._history[sensor], strict=True)
|
|
194
194
|
ax.plot([t.to_datetime() for t in times], values, color="tab:blue")
|
|
@@ -35,7 +35,7 @@ class FakeComm:
|
|
|
35
35
|
def make_widget(data_sequence_proxy) -> CameraWidget:
|
|
36
36
|
widget = CameraWidget()
|
|
37
37
|
widget.modules = ["camera"]
|
|
38
|
-
widget._comm = FakeComm(data_sequence_proxy=data_sequence_proxy)
|
|
38
|
+
widget._comm = FakeComm(data_sequence_proxy=data_sequence_proxy) # pyrefly: ignore [bad-assignment]
|
|
39
39
|
widget.datadisplay.grab_data = AsyncMock()
|
|
40
40
|
return widget
|
|
41
41
|
|