biosignal-device-interface 0.1.11b0__py3-none-any.whl → 0.1.32a1__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 (36) hide show
  1. biosignal_device_interface/__init__.py +0 -4
  2. biosignal_device_interface/constants/devices/__init__.py +3 -0
  3. biosignal_device_interface/constants/devices/core/base_device_constants.py +10 -0
  4. biosignal_device_interface/constants/devices/otb/otb_constants.py +0 -0
  5. biosignal_device_interface/constants/devices/otb/otb_quattrocento_constants.py +289 -35
  6. biosignal_device_interface/constants/devices/otb/otb_quattrocento_light_constants.py +59 -0
  7. biosignal_device_interface/constants/devices/otb/otb_syncstation_constants.py +233 -0
  8. biosignal_device_interface/devices/__init__.py +11 -3
  9. biosignal_device_interface/devices/core/base_device.py +8 -9
  10. biosignal_device_interface/devices/otb/__init__.py +27 -7
  11. biosignal_device_interface/devices/otb/otb_muovi.py +9 -10
  12. biosignal_device_interface/devices/otb/otb_quattrocento.py +215 -118
  13. biosignal_device_interface/devices/otb/otb_quattrocento_light.py +210 -0
  14. biosignal_device_interface/devices/otb/otb_syncstation.py +407 -0
  15. biosignal_device_interface/gui/device_template_widgets/__init__.py +0 -6
  16. biosignal_device_interface/gui/device_template_widgets/all_devices_widget.py +19 -7
  17. biosignal_device_interface/gui/device_template_widgets/core/base_device_widget.py +17 -8
  18. biosignal_device_interface/gui/device_template_widgets/core/base_multiple_devices_widget.py +7 -4
  19. biosignal_device_interface/gui/device_template_widgets/otb/__init__.py +0 -10
  20. biosignal_device_interface/gui/device_template_widgets/otb/otb_devices_widget.py +19 -7
  21. biosignal_device_interface/gui/device_template_widgets/otb/otb_muovi_plus_widget.py +11 -11
  22. biosignal_device_interface/gui/device_template_widgets/otb/otb_muovi_widget.py +11 -11
  23. biosignal_device_interface/gui/device_template_widgets/otb/otb_quattrocento_light_widget.py +61 -57
  24. biosignal_device_interface/gui/device_template_widgets/otb/otb_quattrocento_widget.py +260 -0
  25. biosignal_device_interface/gui/device_template_widgets/otb/otb_syncstation_widget.py +262 -0
  26. biosignal_device_interface/gui/plot_widgets/biosignal_plot_widget.py +9 -4
  27. biosignal_device_interface/gui/ui/otb_quattrocento_template_widget.ui +415 -0
  28. biosignal_device_interface/gui/ui/otb_syncstation_template_widget.ui +732 -0
  29. biosignal_device_interface/gui/ui_compiled/otb_quattrocento_template_widget.py +318 -0
  30. biosignal_device_interface/gui/ui_compiled/otb_syncstation_template_widget.py +495 -0
  31. biosignal_device_interface-0.1.32a1.dist-info/LICENSE +675 -0
  32. {biosignal_device_interface-0.1.11b0.dist-info → biosignal_device_interface-0.1.32a1.dist-info}/METADATA +7 -17
  33. biosignal_device_interface-0.1.32a1.dist-info/RECORD +46 -0
  34. biosignal_device_interface-0.1.11b0.dist-info/LICENSE +0 -395
  35. biosignal_device_interface-0.1.11b0.dist-info/RECORD +0 -35
  36. {biosignal_device_interface-0.1.11b0.dist-info → biosignal_device_interface-0.1.32a1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,260 @@
1
+ """
2
+ Quattrocento Widget class for GUI configuration
3
+ of the Quattrocento from OT Bioelettronica.
4
+
5
+ Developer: Dominik I. Braun
6
+ Contact: dome.braun@fau.de
7
+ Last Update: 2025-01-15
8
+ """
9
+
10
+ from __future__ import annotations
11
+ from functools import partial
12
+ from typing import TYPE_CHECKING
13
+
14
+ from biosignal_device_interface.gui.device_template_widgets.core.base_device_widget import (
15
+ BaseDeviceWidget,
16
+ )
17
+ from biosignal_device_interface.gui.ui_compiled.otb_quattrocento_template_widget import (
18
+ Ui_QuattrocentoForm,
19
+ )
20
+ from biosignal_device_interface.devices.otb.otb_quattrocento import (
21
+ OTBQuattrocento,
22
+ )
23
+
24
+ # Constants
25
+ from biosignal_device_interface.constants.devices.otb.otb_quattrocento_constants import (
26
+ QuattrocentoAcqSettByte,
27
+ QuattrocentoAcquisitionMode,
28
+ QuattrocentoDecimMode,
29
+ QuattrocentoINXConf2Byte,
30
+ QuattrocentoRecordingMode,
31
+ QuattrocentoSamplingFrequencyMode,
32
+ QuattrocentoNumberOfChannelsMode,
33
+ QuattrocentoLowPassFilterMode,
34
+ QuattrocentoHighPassFilterMode,
35
+ QuattrocentoDetectionMode,
36
+ )
37
+
38
+ if TYPE_CHECKING:
39
+ from PySide6.QtWidgets import (
40
+ QMainWindow,
41
+ QWidget,
42
+ QGroupBox,
43
+ QPushButton,
44
+ QCheckBox,
45
+ QComboBox,
46
+ QLabel,
47
+ QLineEdit,
48
+ )
49
+
50
+
51
+ class OTBQuattrocentoWidget(BaseDeviceWidget):
52
+ def __init__(self, parent: QWidget | QMainWindow | None = None):
53
+ super().__init__(parent)
54
+ self._set_device(OTBQuattrocento(self))
55
+
56
+ def _toggle_connection(self):
57
+ if not self._device.is_connected:
58
+ self._connect_push_button.setEnabled(False)
59
+
60
+ self._device.toggle_connection(
61
+ (
62
+ self._connection_ip_line_edit.text(),
63
+ int(self._connection_port_line_edit.text()),
64
+ ),
65
+ )
66
+
67
+ def _connection_toggled(self, is_connected: bool) -> None:
68
+ self._connect_push_button.setEnabled(True)
69
+ if is_connected:
70
+ self._connect_push_button.setText("Disconnect")
71
+ self._connect_push_button.setChecked(True)
72
+ self._configure_push_button.setEnabled(True)
73
+ self._connection_group_box.setEnabled(False)
74
+ else:
75
+ self._connect_push_button.setText("Connect")
76
+ self._connect_push_button.setChecked(False)
77
+ self._configure_push_button.setEnabled(False)
78
+ self._stream_push_button.setEnabled(False)
79
+ self._connection_group_box.setEnabled(True)
80
+
81
+ self.connect_toggled.emit(is_connected)
82
+
83
+ def _toggle_configuration(self):
84
+ self._device_params["grids"] = [
85
+ i
86
+ for i, check_box in enumerate(self._grid_selection_check_box_list)
87
+ if check_box.isChecked()
88
+ ]
89
+
90
+ # Acquisition settings
91
+ acq_sett_configuration = QuattrocentoAcqSettByte()
92
+ acq_sett_configuration.update(
93
+ decimation_mode=QuattrocentoDecimMode(
94
+ int(self._acquisition_decimator_check_box.isChecked()) + 1
95
+ ),
96
+ recording_mode=QuattrocentoRecordingMode(
97
+ int(self._acquisition_recording_check_box.isChecked()) + 1
98
+ ),
99
+ sampling_frequency_mode=QuattrocentoSamplingFrequencyMode(
100
+ self._acquisition_sampling_frequency_combo_box.currentIndex() + 1
101
+ ),
102
+ number_of_channels_mode=QuattrocentoNumberOfChannelsMode(
103
+ self._acquisition_number_of_channels_combo_box.currentIndex() + 1
104
+ ),
105
+ )
106
+ self._device_params["acq_sett_configuration"] = acq_sett_configuration
107
+
108
+ # Input settings
109
+ inx_configuration = QuattrocentoINXConf2Byte()
110
+ inx_configuration.update(
111
+ high_pass_filter=QuattrocentoHighPassFilterMode(
112
+ self._input_high_pass_filter_combo_box.currentIndex() + 1
113
+ ),
114
+ low_pass_filter=QuattrocentoLowPassFilterMode(
115
+ self._input_low_pass_filter_combo_box.currentIndex() + 1
116
+ ),
117
+ detection_mode=QuattrocentoDetectionMode(
118
+ self._input_detection_mode_combo_box.currentIndex() + 1
119
+ ),
120
+ )
121
+
122
+ self._device_params["input_top_left_configuration"] = inx_configuration
123
+ self._device_params["input_top_right_configuration"] = inx_configuration
124
+ self._device_params["multiple_input_one_configuration"] = inx_configuration
125
+ self._device_params["multiple_input_two_configuration"] = inx_configuration
126
+ self._device_params["multiple_input_three_configuration"] = inx_configuration
127
+ self._device_params["multiple_input_four_configuration"] = inx_configuration
128
+
129
+ self._device.configure_device(self._device_params)
130
+
131
+ def _configuration_toggled(self, is_configured: bool) -> None:
132
+ if is_configured:
133
+ self._stream_push_button.setEnabled(True)
134
+
135
+ self.configure_toggled.emit(is_configured)
136
+
137
+ def _toggle_stream(self) -> None:
138
+ self._stream_push_button.setEnabled(False)
139
+ self._device.toggle_streaming()
140
+
141
+ def _toggle_configuration_group_boxes(self, state: bool) -> None:
142
+ for group_box in self._configuration_group_boxes:
143
+ group_box.setEnabled(state)
144
+
145
+ def _stream_toggled(self, is_streaming):
146
+ self._stream_push_button.setEnabled(True)
147
+ if is_streaming:
148
+ self._stream_push_button.setText("Stop Streaming")
149
+ self._stream_push_button.setChecked(True)
150
+ self._configure_push_button.setEnabled(False)
151
+ self._toggle_configuration_group_boxes(False)
152
+ else:
153
+ self._stream_push_button.setText("Start Streaming")
154
+ self._stream_push_button.setChecked(False)
155
+ self._configure_push_button.setEnabled(True)
156
+ self._toggle_configuration_group_boxes(True)
157
+
158
+ def _initialize_device_params(self):
159
+ self._device_params: dict = {
160
+ "grids": [],
161
+ "acq_sett_configuration": QuattrocentoAcqSettByte(),
162
+ "input_top_left_configuration": QuattrocentoINXConf2Byte(),
163
+ "input_top_right_configuration": QuattrocentoINXConf2Byte(),
164
+ "multiple_input_one_configuration": QuattrocentoINXConf2Byte(),
165
+ "multiple_input_two_configuration": QuattrocentoINXConf2Byte(),
166
+ "multiple_input_three_configuration": QuattrocentoINXConf2Byte(),
167
+ "multiple_input_four_configuration": QuattrocentoINXConf2Byte(),
168
+ }
169
+
170
+ def _initialize_ui(self):
171
+ self.ui = Ui_QuattrocentoForm()
172
+ self.ui.setupUi(self)
173
+
174
+ # Command Push Buttons
175
+ self._connect_push_button: QPushButton = self.ui.commandConnectionPushButton
176
+ self._connect_push_button.clicked.connect(self._toggle_connection)
177
+ self._device.connect_toggled.connect(self._connection_toggled)
178
+
179
+ self._configure_push_button: QPushButton = (
180
+ self.ui.commandConfigurationPushButton
181
+ )
182
+ self._configure_push_button.clicked.connect(self._toggle_configuration)
183
+ self._configure_push_button.setEnabled(False)
184
+ self._device.configure_toggled.connect(self._configuration_toggled)
185
+
186
+ self._stream_push_button: QPushButton = self.ui.commandStreamPushButton
187
+ self._stream_push_button.clicked.connect(self._toggle_stream)
188
+ self._stream_push_button.setEnabled(False)
189
+ self._device.stream_toggled.connect(self._stream_toggled)
190
+
191
+ # Connection parameters
192
+ self._connection_group_box: QGroupBox = self.ui.connectionGroupBox
193
+ self._connection_ip_line_edit: QLineEdit = self.ui.connectionIPLineEdit
194
+ self._default_connection_ip: str = self._connection_ip_line_edit.text()
195
+ self._connection_ip_line_edit.editingFinished.connect(
196
+ partial(
197
+ self._check_ip_input,
198
+ self._connection_ip_line_edit,
199
+ self._default_connection_ip,
200
+ )
201
+ )
202
+ self._connection_port_line_edit: QLineEdit = self.ui.connectionPortLineEdit
203
+ self._default_connection_port: str = self._connection_port_line_edit.text()
204
+ self._connection_port_line_edit.editingFinished.connect(
205
+ partial(
206
+ self._check_port_input,
207
+ self._connection_port_line_edit,
208
+ self._default_connection_port,
209
+ )
210
+ )
211
+
212
+ # Acquisition parameters
213
+ self._acquisition_group_box: QGroupBox = self.ui.acquisitionGroupBox
214
+ self._acquisition_sampling_frequency_combo_box: QComboBox = (
215
+ self.ui.acquisitionSamplingFrequencyComboBox
216
+ )
217
+ self._acquisition_number_of_channels_combo_box: QComboBox = (
218
+ self.ui.acquisitionNumberOfChannelsComboBox
219
+ )
220
+ self._acquisition_decimator_check_box: QCheckBox = (
221
+ self.ui.acquisitionDecimatorCheckBox
222
+ )
223
+ self._acquisition_recording_check_box: QCheckBox = (
224
+ self.ui.acquisitionRecordingCheckBox
225
+ )
226
+
227
+ # Grid selection
228
+ self._grid_selection_group_box: QGroupBox = self.ui.gridSelectionGroupBox
229
+ self._grid_selection_check_box_list: list[QCheckBox] = [
230
+ self.ui.gridOneCheckBox,
231
+ self.ui.gridTwoCheckBox,
232
+ self.ui.gridThreeCheckBox,
233
+ self.ui.gridFourCheckBox,
234
+ self.ui.gridFiveCheckBox,
235
+ self.ui.gridSixCheckBox,
236
+ ]
237
+
238
+ [
239
+ check_box.setChecked(False)
240
+ for check_box in self._grid_selection_check_box_list
241
+ ]
242
+
243
+ # Input parameters
244
+ self._input_group_box: QGroupBox = self.ui.inputGroupBox
245
+ self._input_channel_combo_box: QComboBox = self.ui.inputChannelComboBox
246
+ self._input_low_pass_filter_combo_box: QComboBox = self.ui.inputLowPassComboBox
247
+ self._input_low_pass_default = self.ui.inputLowPassComboBox.currentIndex()
248
+ self._input_high_pass_filter_combo_box: QComboBox = (
249
+ self.ui.inputHighPassComboBox
250
+ )
251
+ self._input_high_pass_default = self.ui.inputHighPassComboBox.currentIndex()
252
+ self._input_detection_mode_combo_box: QComboBox = (
253
+ self.ui.inputDetectionModeComboBox
254
+ )
255
+
256
+ self._configuration_group_boxes: list[QGroupBox] = [
257
+ self._acquisition_group_box,
258
+ self._grid_selection_group_box,
259
+ self._input_group_box,
260
+ ]
@@ -0,0 +1,262 @@
1
+ """
2
+ Device class for real-time interfacing the OTB Syncstation device.
3
+ Developer: Dominik I. Braun
4
+ Contact: dome.braun@fau.de
5
+ Last Update: 2025-01-09
6
+ """
7
+
8
+ from __future__ import annotations
9
+ from functools import partial
10
+ from typing import TYPE_CHECKING, Dict
11
+
12
+ from biosignal_device_interface.gui.device_template_widgets.core.base_device_widget import (
13
+ BaseDeviceWidget,
14
+ )
15
+
16
+ # Local Libraries
17
+ from biosignal_device_interface.gui.ui_compiled.otb_syncstation_template_widget import (
18
+ Ui_SyncStationForm,
19
+ )
20
+ from biosignal_device_interface.devices.otb.otb_syncstation import OTBSyncStation
21
+
22
+ # Constants
23
+ from biosignal_device_interface.constants.devices.otb.otb_syncstation_constants import (
24
+ SyncStationDetectionMode,
25
+ SyncStationProbeConfigMode,
26
+ SyncStationRecOnMode,
27
+ SyncStationWorkingMode,
28
+ )
29
+
30
+ if TYPE_CHECKING:
31
+ from PySide6.QtWidgets import (
32
+ QMainWindow,
33
+ QWidget,
34
+ QGroupBox,
35
+ QPushButton,
36
+ QCheckBox,
37
+ QComboBox,
38
+ QLabel,
39
+ QTabWidget,
40
+ )
41
+
42
+
43
+ class OTBSyncStationWidget(BaseDeviceWidget):
44
+ def __init__(self, parent: QWidget | QMainWindow | None = None):
45
+ super().__init__(parent)
46
+ self._set_device(OTBSyncStation(self))
47
+
48
+ def _toggle_connection(self):
49
+ if not self._device.is_connected:
50
+ self._command_connect_push_button.setEnabled(False)
51
+
52
+ self._device.toggle_connection(
53
+ (self._connection_ip_label.text(), int(self._connection_port_label.text())),
54
+ )
55
+
56
+ def _connection_toggled(self, is_connected: bool) -> None:
57
+ self._command_connect_push_button.setEnabled(True)
58
+ if is_connected:
59
+ self._command_connect_push_button.setText("Disconnect")
60
+ self._command_connect_push_button.setChecked(True)
61
+ self._command_configure_push_button.setEnabled(True)
62
+ self._connection_group_box.setEnabled(False)
63
+ else:
64
+ self._command_connect_push_button.setText("Connect")
65
+ self._command_connect_push_button.setChecked(False)
66
+ self._command_configure_push_button.setEnabled(False)
67
+ self._command_stream_push_button.setEnabled(False)
68
+ self._connection_group_box.setEnabled(True)
69
+
70
+ self.connect_toggled.emit(is_connected)
71
+
72
+ def _toggle_configuration(self) -> None:
73
+ self._device_params["working_mode"] = SyncStationWorkingMode(
74
+ self._input_working_mode_combo_box.currentIndex() + 1
75
+ )
76
+
77
+ count_enabled = 0
78
+ for key, value in self._probes_dict.items():
79
+ is_enabled = value["probe_status"].isChecked()
80
+ self._device_params["bytes_configuration_A"][key][
81
+ "probe_status"
82
+ ] = is_enabled
83
+ self._device_params["bytes_configuration_A"][key]["detection_mode"] = (
84
+ SyncStationDetectionMode(value["detection_mode"].currentIndex() + 1)
85
+ )
86
+
87
+ if is_enabled:
88
+ count_enabled += 1
89
+
90
+ self._device_params["number_of_probes"] = count_enabled
91
+
92
+ self._device.configure_device(self._device_params)
93
+
94
+ def _configuration_toggled(self, is_configured: bool) -> None:
95
+ if is_configured:
96
+ self._command_stream_push_button.setEnabled(True)
97
+
98
+ self.configure_toggled.emit(is_configured)
99
+
100
+ def _toggle_stream(self) -> None:
101
+ self._command_stream_push_button.setEnabled(False)
102
+ self._device.toggle_streaming()
103
+
104
+ def _stream_toggled(self, is_streaming: bool) -> None:
105
+ self._command_stream_push_button.setEnabled(True)
106
+ if is_streaming:
107
+ self._command_stream_push_button.setText("Stop Streaming")
108
+ self._command_stream_push_button.setChecked(True)
109
+ self._command_configure_push_button.setEnabled(False)
110
+ self._input_group_box.setEnabled(False)
111
+ else:
112
+ self._command_stream_push_button.setText("Start Streaming")
113
+ self._command_stream_push_button.setChecked(False)
114
+ self._command_configure_push_button.setEnabled(True)
115
+ self._input_group_box.setEnabled(True)
116
+
117
+ self.stream_toggled.emit(is_streaming)
118
+
119
+ def _update_probe_params(self, probe: SyncStationProbeConfigMode, state) -> None:
120
+ self._probes_dict[probe]["detection_mode"].setEnabled(state == 2)
121
+
122
+ def _initialize_device_params(self) -> None:
123
+ self._device_params = {
124
+ "rec_on_mode": SyncStationRecOnMode.OFF,
125
+ "working_mode": SyncStationWorkingMode.EMG,
126
+ "number_of_probes": 0,
127
+ "bytes_configuration_A": {
128
+ SyncStationProbeConfigMode(i): {
129
+ "probe_status": False,
130
+ "detection_mode": SyncStationDetectionMode.MONOPOLAR_GAIN_LOW,
131
+ }
132
+ for i in range(1, len(SyncStationProbeConfigMode))
133
+ },
134
+ }
135
+
136
+ def _set_default_probe_params(self) -> None:
137
+ for values in self._probes_dict.values():
138
+ values["detection_mode"].setCurrentIndex(1)
139
+ values["probe_status"].setChecked(True)
140
+ values["probe_status"].setChecked(False)
141
+
142
+ self._probes_dict[SyncStationProbeConfigMode.MUOVI_PROBE_ONE][
143
+ "probe_status"
144
+ ].setChecked(True)
145
+
146
+ self._probes_dict[SyncStationProbeConfigMode.MUOVI_PROBE_TWO][
147
+ "probe_status"
148
+ ].setChecked(True)
149
+
150
+ def _initialize_ui(self):
151
+ self.ui = Ui_SyncStationForm()
152
+ self.ui.setupUi(self)
153
+
154
+ # Command Push Buttons
155
+ self._command_connect_push_button: QPushButton = (
156
+ self.ui.commandConnectionPushButton
157
+ )
158
+ self._command_connect_push_button.clicked.connect(self._toggle_connection)
159
+ self._device.connect_toggled.connect(self._connection_toggled)
160
+
161
+ self._command_configure_push_button: QPushButton = (
162
+ self.ui.commandConfigurationPushButton
163
+ )
164
+ self._command_configure_push_button.clicked.connect(self._toggle_configuration)
165
+ self._command_configure_push_button.setEnabled(False)
166
+ self._device.configure_toggled.connect(self._configuration_toggled)
167
+
168
+ self._command_stream_push_button: QPushButton = self.ui.commandStreamPushButton
169
+ self._command_stream_push_button.clicked.connect(self._toggle_stream)
170
+ self._command_stream_push_button.setEnabled(False)
171
+ self._device.stream_toggled.connect(self._stream_toggled)
172
+
173
+ # Connection Paramters
174
+ self._connection_group_box: QGroupBox = self.ui.connectionGroupBox
175
+ self._connection_ip_label: QLabel = self.ui.connectionIPAddressLabel
176
+ self._connection_port_label: QLabel = self.ui.connectionPortLabel
177
+
178
+ # Input Parameters
179
+ self._input_group_box: QGroupBox = self.ui.inputGroupBox
180
+ self._input_working_mode_combo_box: QComboBox = self.ui.inputWorkingModeComboBox
181
+ self._input_working_mode_combo_box.setCurrentIndex(1)
182
+
183
+ self._probes_tab_widget: QTabWidget = self.ui.probesTabWidget
184
+ self._probes_tab_widget.setCurrentIndex(0)
185
+ self._probes_dict: Dict[
186
+ SyncStationProbeConfigMode, dict[str, QComboBox | QCheckBox]
187
+ ] = self._configure_probes_dict()
188
+
189
+ for key, value in self._probes_dict.items():
190
+ value["probe_status"].stateChanged.connect(
191
+ partial(self._update_probe_params, key)
192
+ )
193
+
194
+ self._set_default_probe_params()
195
+
196
+ def _configure_probes_dict(self) -> None:
197
+ return {
198
+ SyncStationProbeConfigMode.MUOVI_PROBE_ONE: {
199
+ "probe_status": self.ui.muoviProbeOneEnableCheckBox,
200
+ "detection_mode": self.ui.muoviProbeOneDetectionModeComboBox,
201
+ },
202
+ SyncStationProbeConfigMode.MUOVI_PROBE_TWO: {
203
+ "probe_status": self.ui.muoviProbeTwoEnableCheckBox,
204
+ "detection_mode": self.ui.muoviProbeTwoDetectionModeComboBox,
205
+ },
206
+ SyncStationProbeConfigMode.MUOVI_PROBE_THREE: {
207
+ "probe_status": self.ui.muoviProbeThreeEnableCheckBox,
208
+ "detection_mode": self.ui.muoviProbeThreeDetectionModeComboBox,
209
+ },
210
+ SyncStationProbeConfigMode.MUOVI_PROBE_FOUR: {
211
+ "probe_status": self.ui.muoviProbeFourEnableCheckBox,
212
+ "detection_mode": self.ui.muoviProbeFourDetectionModeComboBox,
213
+ },
214
+ SyncStationProbeConfigMode.MUOVI_PLUS_PROBE_ONE: {
215
+ "probe_status": self.ui.muoviPlusProbeOneEnableCheckBox,
216
+ "detection_mode": self.ui.muoviPlusProbeOneDetectionModeComboBox,
217
+ },
218
+ SyncStationProbeConfigMode.MUOVI_PLUS_PROBE_TWO: {
219
+ "probe_status": self.ui.muoviPlusProbeTwoEnableCheckBox,
220
+ "detection_mode": self.ui.muoviPlusProbeTwoDetectionModeComboBox,
221
+ },
222
+ SyncStationProbeConfigMode.DUE_PLUS_PROBE_ONE: {
223
+ "probe_status": self.ui.duePlusProbeOneEnableCheckBox,
224
+ "detection_mode": self.ui.duePlusProbeOneDetectionModeComboBox,
225
+ },
226
+ SyncStationProbeConfigMode.DUE_PLUS_PROBE_TWO: {
227
+ "probe_status": self.ui.duePlusProbeTwoEnableCheckBox,
228
+ "detection_mode": self.ui.duePlusProbeTwoDetectionModeComboBox,
229
+ },
230
+ SyncStationProbeConfigMode.DUE_PLUS_PROBE_THREE: {
231
+ "probe_status": self.ui.duePlusProbeThreeEnableCheckBox,
232
+ "detection_mode": self.ui.duePlusProbeThreeDetectionModeComboBox,
233
+ },
234
+ SyncStationProbeConfigMode.DUE_PLUS_PROBE_FOUR: {
235
+ "probe_status": self.ui.duePlusProbeFourEnableCheckBox,
236
+ "detection_mode": self.ui.duePlusProbeFourDetectionModeComboBox,
237
+ },
238
+ SyncStationProbeConfigMode.DUE_PLUS_PROBE_FIVE: {
239
+ "probe_status": self.ui.duePlusProbeFiveEnableCheckBox,
240
+ "detection_mode": self.ui.duePlusProbeFiveDetectionModeComboBox,
241
+ },
242
+ SyncStationProbeConfigMode.DUE_PLUS_PROBE_SIX: {
243
+ "probe_status": self.ui.duePlusProbeSixEnableCheckBox,
244
+ "detection_mode": self.ui.duePlusProbeSixDetectionModeComboBox,
245
+ },
246
+ SyncStationProbeConfigMode.DUE_PLUS_PROBE_SEVEN: {
247
+ "probe_status": self.ui.duePlusProbeSevenEnableCheckBox,
248
+ "detection_mode": self.ui.duePlusProbeSevenDetectionModeComboBox,
249
+ },
250
+ SyncStationProbeConfigMode.DUE_PLUS_PROBE_EIGHT: {
251
+ "probe_status": self.ui.duePlusProbeEightEnableCheckBox,
252
+ "detection_mode": self.ui.duePlusProbeEightDetectionModeComboBox,
253
+ },
254
+ SyncStationProbeConfigMode.DUE_PLUS_PROBE_NINE: {
255
+ "probe_status": self.ui.duePlusProbeNineEnableCheckBox,
256
+ "detection_mode": self.ui.duePlusProbeNineDetectionModeComboBox,
257
+ },
258
+ SyncStationProbeConfigMode.DUE_PLUS_PROBE_TEN: {
259
+ "probe_status": self.ui.duePlusProbeTenEnableCheckBox,
260
+ "detection_mode": self.ui.duePlusProbeTenDetectionModeComboBox,
261
+ },
262
+ }
@@ -95,12 +95,16 @@ class BiosignalPlotWidget(QWidget):
95
95
  def configure(
96
96
  self,
97
97
  lines: int,
98
- sampling_freuqency: int = 2000,
98
+ sampling_frequency: int = 2000,
99
+ plot_sampling_frequency: int | None = None,
99
100
  display_time: int = 10,
101
+ line_height: int = 50,
100
102
  background_color: np.ndarray = np.array([18.0, 18.0, 18.0, 1]),
101
103
  ):
102
104
  self.number_of_lines = lines
103
- self.external_sampling_frequency = sampling_freuqency
105
+ self.external_sampling_frequency = sampling_frequency
106
+ if plot_sampling_frequency is not None:
107
+ self.internal_sampling_frequency_threshold = plot_sampling_frequency
104
108
 
105
109
  if (
106
110
  self.external_sampling_frequency
@@ -129,7 +133,7 @@ class BiosignalPlotWidget(QWidget):
129
133
  )
130
134
 
131
135
  self.space_for_each_line = min(
132
- int(self.max_texture_size // self.number_of_lines // 1.5), 50
136
+ int(self.max_texture_size // self.number_of_lines // 1.5), line_height
133
137
  )
134
138
 
135
139
  self.canvas.configure(
@@ -343,7 +347,8 @@ class VispyFastPlotCanvas(app.Canvas):
343
347
  self.line_data[:, :-input_vertices] = self.line_data[:, input_vertices:]
344
348
  self.line_data[:, -input_vertices:] = input_data
345
349
 
346
- self.program["a_position"].set_data(self.line_data.ravel().astype(np.float32))
350
+ plot_data = self.line_data.ravel().astype(np.float32)
351
+ self.program["a_position"].set_data(plot_data)
347
352
  self.update()
348
353
  self.context.flush()
349
354