biosignal-device-interface 0.1.0__py3-none-any.whl

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.
Files changed (35) hide show
  1. biosignal_device_interface/__init__.py +4 -0
  2. biosignal_device_interface/constants/__init__.py +0 -0
  3. biosignal_device_interface/constants/devices/__init__.py +0 -0
  4. biosignal_device_interface/constants/devices/core/base_device_constants.py +51 -0
  5. biosignal_device_interface/constants/devices/otb/otb_muovi_constants.py +129 -0
  6. biosignal_device_interface/constants/devices/otb/otb_quattrocento_constants.py +59 -0
  7. biosignal_device_interface/constants/plots/color_palette.py +59 -0
  8. biosignal_device_interface/devices/__init__.py +9 -0
  9. biosignal_device_interface/devices/core/__init__.py +0 -0
  10. biosignal_device_interface/devices/core/base_device.py +413 -0
  11. biosignal_device_interface/devices/otb/__init__.py +9 -0
  12. biosignal_device_interface/devices/otb/otb_muovi.py +291 -0
  13. biosignal_device_interface/devices/otb/otb_quattrocento.py +235 -0
  14. biosignal_device_interface/gui/device_template_widgets/__init__.py +6 -0
  15. biosignal_device_interface/gui/device_template_widgets/all_devices_widget.py +39 -0
  16. biosignal_device_interface/gui/device_template_widgets/core/base_device_widget.py +121 -0
  17. biosignal_device_interface/gui/device_template_widgets/core/base_multiple_devices_widget.py +105 -0
  18. biosignal_device_interface/gui/device_template_widgets/otb/__init__.py +10 -0
  19. biosignal_device_interface/gui/device_template_widgets/otb/otb_devices_widget.py +32 -0
  20. biosignal_device_interface/gui/device_template_widgets/otb/otb_muovi_plus_widget.py +158 -0
  21. biosignal_device_interface/gui/device_template_widgets/otb/otb_muovi_widget.py +158 -0
  22. biosignal_device_interface/gui/device_template_widgets/otb/otb_quattrocento_light_widget.py +170 -0
  23. biosignal_device_interface/gui/plot_widgets/biosignal_plot_widget.py +496 -0
  24. biosignal_device_interface/gui/ui/devices_template_widget.ui +38 -0
  25. biosignal_device_interface/gui/ui/otb_muovi_plus_template_widget.ui +171 -0
  26. biosignal_device_interface/gui/ui/otb_muovi_template_widget.ui +171 -0
  27. biosignal_device_interface/gui/ui/otb_quattrocento_light_template_widget.ui +266 -0
  28. biosignal_device_interface/gui/ui_compiled/devices_template_widget.py +56 -0
  29. biosignal_device_interface/gui/ui_compiled/otb_muovi_plus_template_widget.py +153 -0
  30. biosignal_device_interface/gui/ui_compiled/otb_muovi_template_widget.py +153 -0
  31. biosignal_device_interface/gui/ui_compiled/otb_quattrocento_light_template_widget.py +217 -0
  32. biosignal_device_interface-0.1.0.dist-info/LICENSE +395 -0
  33. biosignal_device_interface-0.1.0.dist-info/METADATA +138 -0
  34. biosignal_device_interface-0.1.0.dist-info/RECORD +35 -0
  35. biosignal_device_interface-0.1.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,105 @@
1
+ """
2
+ Base Device class for real-time interfaces to hardware devices.
3
+ Developer: Dominik I. Braun
4
+ Contact: dome.braun@fau.de
5
+ Last Update: 2024-06-05
6
+ """
7
+
8
+ # Python Libraries
9
+ from __future__ import annotations
10
+ from typing import TYPE_CHECKING, Union, Dict
11
+ from PySide6.QtGui import QCloseEvent
12
+ from PySide6.QtWidgets import QWidget, QMainWindow
13
+ from PySide6.QtCore import Signal
14
+ import numpy as np
15
+ import warnings
16
+
17
+ # Import Template
18
+ from biosignal_device_interface.gui.ui_compiled.devices_template_widget import (
19
+ Ui_DeviceWidgetForm,
20
+ )
21
+ from biosignal_device_interface.constants.devices.core.base_device_constants import (
22
+ DeviceType,
23
+ DEVICE_NAME_DICT,
24
+ )
25
+
26
+ if TYPE_CHECKING:
27
+ from biosignal_device_interface.gui.device_template_widgets.core.base_device_widget import (
28
+ BaseDeviceWidget,
29
+ )
30
+
31
+
32
+ class BaseMultipleDevicesWidget(QWidget):
33
+ # Signals
34
+ data_arrived: Signal = Signal(np.ndarray)
35
+ biosignal_data_arrived: Signal = Signal(np.ndarray)
36
+ auxiliary_data_arrived: Signal = Signal(np.ndarray)
37
+ connect_toggled = Signal(bool)
38
+ configure_toggled = Signal(bool)
39
+ stream_toggled = Signal(bool)
40
+ device_changed_signal = Signal(None)
41
+
42
+ def __init__(self, parent: QWidget | QMainWindow | None = None):
43
+ super().__init__(parent)
44
+
45
+ self.parent_widget: QWidget | QMainWindow | None = parent
46
+
47
+ self.ui = Ui_DeviceWidgetForm()
48
+ self.ui.setupUi(self)
49
+
50
+ self.device_stacked_widget = self.ui.deviceStackedWidget
51
+ self.device_selection_combo_box = self.ui.deviceSelectionComboBox
52
+ self.device_selection_combo_box.currentIndexChanged.connect(
53
+ self._update_stacked_widget
54
+ )
55
+
56
+ def get_device_information(self) -> Dict[str, Union[str, int]]:
57
+ return self._get_current_widget().get_device_information()
58
+
59
+ def _update_stacked_widget(self, index: int):
60
+ current_widget = self._get_current_widget()
61
+ current_widget.disconnect_device()
62
+
63
+ with warnings.catch_warnings():
64
+ warnings.filterwarnings("ignore")
65
+ try:
66
+ current_widget.data_arrived.disconnect(self.data_arrived.emit)
67
+ current_widget.biosignal_data_arrived.disconnect(
68
+ self.biosignal_data_arrived.emit
69
+ )
70
+ current_widget.auxiliary_data_arrived.disconnect(
71
+ self.auxiliary_data_arrived.emit
72
+ )
73
+
74
+ current_widget.connect_toggled.disconnect(self.connect_toggled)
75
+ current_widget.configure_toggled.disconnect(self.configure_toggled)
76
+ current_widget.stream_toggled.disconnect(self.stream_toggled)
77
+
78
+ except (TypeError, RuntimeError):
79
+ pass
80
+
81
+ self.device_stacked_widget.setCurrentIndex(index)
82
+ current_widget = self._get_current_widget()
83
+
84
+ current_widget.data_arrived.connect(self.data_arrived.emit)
85
+ current_widget.biosignal_data_arrived.connect(self.biosignal_data_arrived.emit)
86
+ current_widget.auxiliary_data_arrived.connect(self.auxiliary_data_arrived.emit)
87
+
88
+ current_widget.connect_toggled.connect(self.connect_toggled)
89
+ current_widget.configure_toggled.connect(self.configure_toggled)
90
+ current_widget.stream_toggled.connect(self.stream_toggled)
91
+
92
+ self.device_changed_signal.emit()
93
+
94
+ def _set_devices(self, devices: Dict[DeviceType, BaseDeviceWidget]) -> None:
95
+ for device_type, device_widget in devices.items():
96
+ self.device_stacked_widget.addWidget(device_widget)
97
+ self.device_selection_combo_box.addItem(DEVICE_NAME_DICT[device_type])
98
+
99
+ self._update_stacked_widget(0)
100
+
101
+ def _get_current_widget(self) -> BaseDeviceWidget:
102
+ return self.device_stacked_widget.currentWidget()
103
+
104
+ def closeEvent(self, event: QCloseEvent) -> None:
105
+ self._get_current_widget().closeEvent(event)
@@ -0,0 +1,10 @@
1
+ # OTB Devices
2
+ from biosignal_device_interface.gui.device_template_widgets.otb.otb_muovi_widget import (
3
+ MuoviWidget,
4
+ )
5
+ from biosignal_device_interface.gui.device_template_widgets.otb.otb_muovi_plus_widget import (
6
+ OTBMuoviWidget as MuoviPlusWidget,
7
+ )
8
+ from biosignal_device_interface.gui.device_template_widgets.otb.otb_quattrocento_light_widget import (
9
+ QuattrocentoLightWidget,
10
+ )
@@ -0,0 +1,32 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING, Dict
3
+
4
+ from biosignal_device_interface.gui.device_template_widgets.core.base_multiple_devices_widget import (
5
+ BaseMultipleDevicesWidget,
6
+ )
7
+ from biosignal_device_interface.constants.devices.core.base_device_constants import (
8
+ DeviceType,
9
+ )
10
+ from biosignal_device_interface.gui.device_template_widgets.otb import (
11
+ MuoviPlusWidget,
12
+ MuoviWidget,
13
+ QuattrocentoLightWidget,
14
+ )
15
+
16
+ if TYPE_CHECKING:
17
+ from PySide6.QtWidgets import QWidget, QMainWindow
18
+ from biosignal_device_interface.gui.device_template_widgets.core.base_device_widget import (
19
+ BaseDeviceWidget,
20
+ )
21
+
22
+
23
+ class AllDevicesWidget(BaseMultipleDevicesWidget):
24
+ def __init__(self, parent: QWidget | QMainWindow | None = None):
25
+ super().__init__(parent)
26
+
27
+ self._device_selection: Dict[DeviceType, BaseDeviceWidget] = {
28
+ DeviceType.OTB_QUATTROCENTO_LIGHT: QuattrocentoLightWidget(self),
29
+ DeviceType.OTB_MUOVI: MuoviWidget(self),
30
+ DeviceType.OTB_MUOVI_PLUS: MuoviPlusWidget(self),
31
+ }
32
+ self._set_devices(self._device_selection)
@@ -0,0 +1,158 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING
3
+
4
+ from biosignal_device_interface.gui.device_template_widgets.core.base_device_widget import (
5
+ BaseDeviceWidget,
6
+ )
7
+ from biosignal_device_interface.gui.ui_compiled.otb_muovi_template_widget import (
8
+ Ui_MuoviForm,
9
+ )
10
+ from biosignal_device_interface.devices import OTBMuovi
11
+
12
+ # Constants
13
+ from biosignal_device_interface.constants.devices.otb_muovi_constants import (
14
+ MuoviWorkingMode,
15
+ MuoviDetectionMode,
16
+ MUOVI_NETWORK_PORT,
17
+ )
18
+
19
+ if TYPE_CHECKING:
20
+ from PySide6.QtWidgets import (
21
+ QMainWindow,
22
+ QWidget,
23
+ QGroupBox,
24
+ QPushButton,
25
+ QComboBox,
26
+ QLabel,
27
+ )
28
+
29
+
30
+ class OTBMuoviWidget(BaseDeviceWidget):
31
+ def __init__(self, parent: QWidget | QMainWindow | None = None):
32
+ super().__init__(parent)
33
+
34
+ self._set_device(OTBMuovi(parent=self, is_muovi_plus=True))
35
+
36
+ def _toggle_connection(self) -> None:
37
+ if not self.device._is_connected:
38
+ self.connect_push_button.setEnabled(False)
39
+
40
+ self.device.toggle_connection(
41
+ (
42
+ self.connection_ip_combo_box.currentText(),
43
+ int(self.connection_port_label.text()),
44
+ )
45
+ )
46
+
47
+ def _connection_toggled(self, is_connected: bool) -> None:
48
+ self.connect_push_button.setEnabled(True)
49
+ if is_connected:
50
+ self.connect_push_button.setText("Disconnect")
51
+ self.connect_push_button.setChecked(True)
52
+ self.configure_push_button.setEnabled(True)
53
+ self.connection_group_box.setEnabled(False)
54
+ else:
55
+ self.connect_push_button.setText("Connect")
56
+ self.connect_push_button.setChecked(False)
57
+ self.configure_push_button.setEnabled(False)
58
+ self.stream_push_button.setEnabled(False)
59
+ self.connection_group_box.setEnabled(True)
60
+
61
+ self.connect_toggled.emit(is_connected)
62
+
63
+ def _toggle_configuration(self) -> None:
64
+ self._device_params["working_mode"] = MuoviWorkingMode(
65
+ self.input_working_mode_combo_box.currentIndex() + 1
66
+ )
67
+ self._device_params["detection_mode"] = MuoviDetectionMode(
68
+ self.input_detection_mode_combo_box.currentIndex() + 1
69
+ )
70
+
71
+ self.device.configure_device(self._device_params)
72
+
73
+ def _configuration_toggled(self, is_configured: bool) -> None:
74
+ if is_configured:
75
+ self.stream_push_button.setEnabled(True)
76
+
77
+ self.configure_toggled.emit(is_configured)
78
+
79
+ def _toggle_configuration_group_boxes(self) -> None:
80
+ for group_box in self.configuration_group_boxes:
81
+ group_box.setEnabled(not group_box.isEnabled())
82
+
83
+ def _toggle_stream(self) -> None:
84
+ self.stream_push_button.setEnabled(False)
85
+ self.device.toggle_streaming()
86
+
87
+ def _stream_toggled(self, is_streaming: bool) -> None:
88
+ self.stream_push_button.setEnabled(True)
89
+ if is_streaming:
90
+ self.stream_push_button.setText("Stop Streaming")
91
+ self.stream_push_button.setChecked(True)
92
+ self.configure_push_button.setEnabled(False)
93
+ self._toggle_configuration_group_boxes()
94
+ else:
95
+ self.stream_push_button.setText("Stream")
96
+ self.stream_push_button.setChecked(False)
97
+ self.configure_push_button.setEnabled(True)
98
+ self._toggle_configuration_group_boxes()
99
+
100
+ self.stream_toggled.emit(is_streaming)
101
+
102
+ def _initialize_device_params(self) -> None:
103
+ self._device_params = {
104
+ "working_mode": MuoviWorkingMode.EMG,
105
+ "detection_mode": MuoviDetectionMode.MONOPOLAR_GAIN_8,
106
+ }
107
+
108
+ def _initialize_ui(self) -> None:
109
+ self.ui = Ui_MuoviForm()
110
+ self.ui.setupUi(self)
111
+
112
+ # Command Push Buttons
113
+ self.connect_push_button: QPushButton = self.ui.commandConnectionPushButton
114
+ self.connect_push_button.clicked.connect(self._toggle_connection)
115
+ self.device.connect_toggled.connect(self._connection_toggled)
116
+
117
+ self.configure_push_button: QPushButton = self.ui.commandConfigurationPushButton
118
+ self.configure_push_button.clicked.connect(self._toggle_configuration)
119
+ self.configure_push_button.setEnabled(False)
120
+ self.device.configure_toggled.connect(self._configuration_toggled)
121
+
122
+ self.stream_push_button: QPushButton = self.ui.commandStreamPushButton
123
+ self.stream_push_button.clicked.connect(self._toggle_stream)
124
+ self.stream_push_button.setEnabled(False)
125
+ self.device.stream_toggled.connect(self._stream_toggled)
126
+
127
+ # Connection parameters
128
+ self.connection_group_box: QGroupBox = self.ui.connectionGroupBox
129
+ self.connection_ip_combo_box: QComboBox = self.ui.connectionIPComboBox
130
+ self.connection_port_label: QLabel = self.ui.connectionPortLabel
131
+ self.connection_update_push_button: QPushButton = (
132
+ self.ui.connectionUpdatePushButton
133
+ )
134
+ self.connection_update_push_button.clicked.connect(
135
+ lambda: (
136
+ self.connection_ip_combo_box.clear(),
137
+ self.connection_ip_combo_box.addItems(
138
+ self.device.get_server_wifi_ip_address()
139
+ ),
140
+ )
141
+ )
142
+
143
+ self.connection_ip_combo_box.clear()
144
+ self.connection_ip_combo_box.addItems(self.device.get_server_wifi_ip_address())
145
+
146
+ self.connection_port_label.setText(str(MUOVI_NETWORK_PORT))
147
+
148
+ # Input parameters
149
+ self.input_parameters_group_box: QGroupBox = self.ui.inputGroupBox
150
+ self.input_working_mode_combo_box: QComboBox = self.ui.inputWorkingModeComboBox
151
+ self.input_detection_mode_combo_box: QComboBox = (
152
+ self.ui.inputDetectionModeComboBox
153
+ )
154
+
155
+ # Configuration parameters
156
+ self.configuration_group_boxes: list[QGroupBox] = [
157
+ self.input_parameters_group_box,
158
+ ]
@@ -0,0 +1,158 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING
3
+
4
+ from biosignal_device_interface.gui.device_template_widgets.core.base_device_widget import (
5
+ BaseDeviceWidget,
6
+ )
7
+ from biosignal_device_interface.gui.ui_compiled.otb_muovi_template_widget import (
8
+ Ui_MuoviForm,
9
+ )
10
+ from biosignal_device_interface.devices import OTBMuovi
11
+
12
+ # Constants
13
+ from biosignal_device_interface.constants.devices.otb_muovi_constants import (
14
+ MuoviWorkingMode,
15
+ MuoviDetectionMode,
16
+ MUOVI_NETWORK_PORT,
17
+ )
18
+
19
+ if TYPE_CHECKING:
20
+ from PySide6.QtWidgets import (
21
+ QWidget,
22
+ QMainWindow,
23
+ QGroupBox,
24
+ QPushButton,
25
+ QComboBox,
26
+ QLabel,
27
+ )
28
+
29
+
30
+ class MuoviWidget(BaseDeviceWidget):
31
+ def __init__(self, parent: QWidget | QMainWindow | None = None):
32
+ super().__init__(parent)
33
+
34
+ self._set_device(OTBMuovi(parent=self))
35
+
36
+ def _toggle_connection(self) -> None:
37
+ if not self.device._is_connected:
38
+ self.connect_push_button.setEnabled(False)
39
+
40
+ self.device.toggle_connection(
41
+ (
42
+ self.connection_ip_combo_box.currentText(),
43
+ int(self.connection_port_label.text()),
44
+ )
45
+ )
46
+
47
+ def _connection_toggled(self, is_connected: bool) -> None:
48
+ self.connect_push_button.setEnabled(True)
49
+ if is_connected:
50
+ self.connect_push_button.setText("Disconnect")
51
+ self.connect_push_button.setChecked(True)
52
+ self.configure_push_button.setEnabled(True)
53
+ self.connection_group_box.setEnabled(False)
54
+ else:
55
+ self.connect_push_button.setText("Connect")
56
+ self.connect_push_button.setChecked(False)
57
+ self.configure_push_button.setEnabled(False)
58
+ self.stream_push_button.setEnabled(False)
59
+ self.connection_group_box.setEnabled(True)
60
+
61
+ self.connect_toggled.emit(is_connected)
62
+
63
+ def _toggle_configuration(self) -> None:
64
+ self._device_params["working_mode"] = MuoviWorkingMode(
65
+ self.input_working_mode_combo_box.currentIndex() + 1
66
+ )
67
+ self._device_params["detection_mode"] = MuoviDetectionMode(
68
+ self.input_detection_mode_combo_box.currentIndex() + 1
69
+ )
70
+
71
+ self.device.configure_device(self._device_params)
72
+
73
+ def _configuration_toggled(self, is_configured: bool) -> None:
74
+ if is_configured:
75
+ self.stream_push_button.setEnabled(True)
76
+
77
+ self.configure_toggled.emit(is_configured)
78
+
79
+ def _toggle_configuration_group_boxes(self) -> None:
80
+ for group_box in self.configuration_group_boxes:
81
+ group_box.setEnabled(not group_box.isEnabled())
82
+
83
+ def _toggle_stream(self) -> None:
84
+ self.stream_push_button.setEnabled(False)
85
+ self.device.toggle_streaming()
86
+
87
+ def _stream_toggled(self, is_streaming: bool) -> None:
88
+ self.stream_push_button.setEnabled(True)
89
+ if is_streaming:
90
+ self.stream_push_button.setText("Stop Streaming")
91
+ self.stream_push_button.setChecked(True)
92
+ self.configure_push_button.setEnabled(False)
93
+ self._toggle_configuration_group_boxes()
94
+ else:
95
+ self.stream_push_button.setText("Stream")
96
+ self.stream_push_button.setChecked(False)
97
+ self.configure_push_button.setEnabled(True)
98
+ self._toggle_configuration_group_boxes()
99
+
100
+ self.stream_toggled.emit(is_streaming)
101
+
102
+ def _initialize_device_params(self) -> None:
103
+ self._device_params = {
104
+ "working_mode": MuoviWorkingMode.EMG,
105
+ "detection_mode": MuoviDetectionMode.MONOPOLAR_GAIN_8,
106
+ }
107
+
108
+ def _initialize_ui(self) -> None:
109
+ self.ui = Ui_MuoviForm()
110
+ self.ui.setupUi(self)
111
+
112
+ # Command Push Buttons
113
+ self.connect_push_button: QPushButton = self.ui.commandConnectionPushButton
114
+ self.connect_push_button.clicked.connect(self._toggle_connection)
115
+ self.device.connect_toggled.connect(self._connection_toggled)
116
+
117
+ self.configure_push_button: QPushButton = self.ui.commandConfigurationPushButton
118
+ self.configure_push_button.clicked.connect(self._toggle_configuration)
119
+ self.configure_push_button.setEnabled(False)
120
+ self.device.configure_toggled.connect(self._configuration_toggled)
121
+
122
+ self.stream_push_button: QPushButton = self.ui.commandStreamPushButton
123
+ self.stream_push_button.clicked.connect(self._toggle_stream)
124
+ self.stream_push_button.setEnabled(False)
125
+ self.device.stream_toggled.connect(self._stream_toggled)
126
+
127
+ # Connection parameters
128
+ self.connection_group_box: QGroupBox = self.ui.connectionGroupBox
129
+ self.connection_ip_combo_box: QComboBox = self.ui.connectionIPComboBox
130
+ self.connection_port_label: QLabel = self.ui.connectionPortLabel
131
+ self.connection_update_push_button: QPushButton = (
132
+ self.ui.connectionUpdatePushButton
133
+ )
134
+ self.connection_update_push_button.clicked.connect(
135
+ lambda: (
136
+ self.connection_ip_combo_box.clear(),
137
+ self.connection_ip_combo_box.addItems(
138
+ self.device.get_server_wifi_ip_address()
139
+ ),
140
+ )
141
+ )
142
+
143
+ self.connection_ip_combo_box.clear()
144
+ self.connection_ip_combo_box.addItems(self.device.get_server_wifi_ip_address())
145
+
146
+ self.connection_port_label.setText(str(MUOVI_NETWORK_PORT))
147
+
148
+ # Input parameters
149
+ self.input_parameters_group_box: QGroupBox = self.ui.inputGroupBox
150
+ self.input_working_mode_combo_box: QComboBox = self.ui.inputWorkingModeComboBox
151
+ self.input_detection_mode_combo_box: QComboBox = (
152
+ self.ui.inputDetectionModeComboBox
153
+ )
154
+
155
+ # Configuration parameters
156
+ self.configuration_group_boxes: list[QGroupBox] = [
157
+ self.input_parameters_group_box,
158
+ ]
@@ -0,0 +1,170 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING
3
+
4
+ from biosignal_device_interface.gui.device_template_widgets.core.base_device_widget import (
5
+ BaseDeviceWidget,
6
+ )
7
+ from biosignal_device_interface.gui.ui_compiled.otb_quattrocento_light_template_widget import (
8
+ Ui_QuattrocentoLightForm,
9
+ )
10
+ from biosignal_device_interface.devices import OTBQuattrocentoLight
11
+
12
+ # Constants
13
+ from biosignal_device_interface.constants.devices.otb_quattrocento_constants import (
14
+ QuattrocentoLightSamplingFrequency,
15
+ QuattrocentoLightStreamingFrequency,
16
+ )
17
+
18
+ if TYPE_CHECKING:
19
+ from PySide6.QtWidgets import (
20
+ QMainWindow,
21
+ QWidget,
22
+ QGroupBox,
23
+ QPushButton,
24
+ QCheckBox,
25
+ QComboBox,
26
+ QLabel,
27
+ )
28
+
29
+
30
+ class QuattrocentoLightWidget(BaseDeviceWidget):
31
+ def __init__(self, parent: QWidget | QMainWindow | None = None):
32
+ super().__init__(parent)
33
+ self._set_device(OTBQuattrocentoLight(self))
34
+
35
+ def _toggle_connection(self) -> None:
36
+ if not self.device._is_connected:
37
+ self.connect_push_button.setEnabled(False)
38
+
39
+ self.device.toggle_connection(
40
+ (self.connection_ip_label.text(), int(self.connection_port_label.text())),
41
+ )
42
+
43
+ def _connection_toggled(self, is_connected: bool) -> None:
44
+ self.connect_push_button.setEnabled(True)
45
+ if is_connected:
46
+ self.connect_push_button.setText("Disconnect")
47
+ self.connect_push_button.setChecked(True)
48
+ self.configure_push_button.setEnabled(True)
49
+ self.connection_group_box.setEnabled(False)
50
+ else:
51
+ self.connect_push_button.setText("Connect")
52
+ self.connect_push_button.setChecked(False)
53
+ self.configure_push_button.setEnabled(False)
54
+ self.stream_push_button.setEnabled(False)
55
+ self.connection_group_box.setEnabled(True)
56
+
57
+ self.connect_toggled.emit(is_connected)
58
+
59
+ def _toggle_configuration(self) -> None:
60
+ self._device_params["grids"] = [
61
+ i
62
+ for i, check_box in enumerate(self.grid_selection_check_box_list)
63
+ if check_box.isChecked()
64
+ ]
65
+
66
+ self._device_params["streaming_frequency_mode"] = (
67
+ QuattrocentoLightStreamingFrequency(
68
+ self.acquisition_streaming_frequency_combo_box.currentIndex() + 1
69
+ )
70
+ )
71
+ self._device_params["sampling_frequency_mode"] = (
72
+ QuattrocentoLightSamplingFrequency(
73
+ self.acquisition_sampling_frequency_combo_box.currentIndex() + 1
74
+ )
75
+ )
76
+
77
+ self.device.configure_device(self._device_params)
78
+
79
+ def _configuration_toggled(self, is_configured: bool) -> None:
80
+ if is_configured:
81
+ self.stream_push_button.setEnabled(True)
82
+
83
+ self.configure_toggled.emit(is_configured)
84
+
85
+ def _toggle_configuration_group_boxes(self) -> None:
86
+ for group_box in self.configuration_group_boxes:
87
+ group_box.setEnabled(not group_box.isEnabled())
88
+
89
+ def _toggle_stream(self) -> None:
90
+ self.stream_push_button.setEnabled(False)
91
+ self.device.toggle_streaming()
92
+
93
+ def _stream_toggled(self, is_streaming: bool) -> None:
94
+ self.stream_push_button.setEnabled(True)
95
+ if is_streaming:
96
+ self.stream_push_button.setText("Stop Streaming")
97
+ self.stream_push_button.setChecked(True)
98
+ self.configure_push_button.setEnabled(False)
99
+ self._toggle_configuration_group_boxes()
100
+ else:
101
+ self.stream_push_button.setText("Stream")
102
+ self.stream_push_button.setChecked(False)
103
+ self.configure_push_button.setEnabled(True)
104
+ self._toggle_configuration_group_boxes()
105
+
106
+ self.stream_toggled.emit(is_streaming)
107
+
108
+ def _initialize_device_params(self) -> None:
109
+ self._device_params = {
110
+ "grids": [2, 3],
111
+ "streaming_frequency_mode": QuattrocentoLightStreamingFrequency.THIRTYTWO,
112
+ "sampling_frequency_mode": QuattrocentoLightSamplingFrequency.MEDIUM,
113
+ }
114
+
115
+ def _initialize_ui(self) -> None:
116
+ self.ui = Ui_QuattrocentoLightForm()
117
+ self.ui.setupUi(self)
118
+
119
+ # Command Push Buttons
120
+ self.connect_push_button: QPushButton = self.ui.commandConnectionPushButton
121
+ self.connect_push_button.clicked.connect(self._toggle_connection)
122
+ self.device.connect_toggled.connect(self._connection_toggled)
123
+
124
+ self.configure_push_button: QPushButton = self.ui.commandConfigurationPushButton
125
+ self.configure_push_button.clicked.connect(self._toggle_configuration)
126
+ self.configure_push_button.setEnabled(False)
127
+ self.device.configure_toggled.connect(self._configuration_toggled)
128
+
129
+ self.stream_push_button: QPushButton = self.ui.commandStreamPushButton
130
+ self.stream_push_button.clicked.connect(self._toggle_stream)
131
+ self.stream_push_button.setEnabled(False)
132
+ self.device.stream_toggled.connect(self._stream_toggled)
133
+
134
+ # Connection parameters
135
+ self.connection_group_box: QGroupBox = self.ui.connectionGroupBox
136
+ self.connection_ip_label: QLabel = self.ui.connectionIPLabel
137
+ self.connection_port_label: QLabel = self.ui.connectionPortLabel
138
+
139
+ # Acquisition parameters
140
+ self.acquisition_group_box: QGroupBox = self.ui.acquisitionGroupBox
141
+ self.acquisition_sampling_frequency_combo_box: QComboBox = (
142
+ self.ui.acquisitionSamplingFrequencyComboBox
143
+ )
144
+ self.acquisition_streaming_frequency_combo_box: QComboBox = (
145
+ self.ui.acquisitionStreamingFrequencyComboBox
146
+ )
147
+
148
+ # Grid parameters
149
+ self.grid_selection_group_box: QGroupBox = self.ui.gridSelectionGroupBox
150
+ self.grid_selection_check_box_list: list[QCheckBox] = [
151
+ self.ui.gridOneCheckBox,
152
+ self.ui.gridTwoCheckBox,
153
+ self.ui.gridThreeCheckBox,
154
+ self.ui.gridFourCheckBox,
155
+ self.ui.gridFiveCheckBox,
156
+ self.ui.gridSixCheckBox,
157
+ ]
158
+
159
+ [
160
+ check_box.setChecked(False)
161
+ for check_box in self.grid_selection_check_box_list
162
+ ]
163
+ self.grid_selection_check_box_list[2].setChecked(True)
164
+ self.grid_selection_check_box_list[3].setChecked(True)
165
+
166
+ # Configuration parameters
167
+ self.configuration_group_boxes: list[QGroupBox] = [
168
+ self.acquisition_group_box,
169
+ self.grid_selection_group_box,
170
+ ]