biosignal-device-interface 0.2.1a1__py3-none-any.whl → 0.2.1a2__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.
- biosignal_device_interface/constants/devices/__init__.py +3 -3
- biosignal_device_interface/constants/devices/core/base_device_constants.py +61 -61
- biosignal_device_interface/constants/devices/otb/otb_muovi_constants.py +129 -129
- biosignal_device_interface/constants/devices/otb/otb_quattrocento_constants.py +313 -313
- biosignal_device_interface/constants/devices/otb/otb_quattrocento_light_constants.py +59 -59
- biosignal_device_interface/constants/devices/otb/otb_syncstation_constants.py +233 -233
- biosignal_device_interface/constants/plots/color_palette.py +59 -59
- biosignal_device_interface/devices/__init__.py +17 -17
- biosignal_device_interface/devices/core/base_device.py +424 -412
- biosignal_device_interface/devices/otb/__init__.py +29 -29
- biosignal_device_interface/devices/otb/otb_muovi.py +290 -290
- biosignal_device_interface/devices/otb/otb_quattrocento.py +332 -332
- biosignal_device_interface/devices/otb/otb_quattrocento_light.py +210 -210
- biosignal_device_interface/devices/otb/otb_syncstation.py +407 -407
- biosignal_device_interface/gui/device_template_widgets/all_devices_widget.py +51 -51
- biosignal_device_interface/gui/device_template_widgets/core/base_device_widget.py +130 -130
- biosignal_device_interface/gui/device_template_widgets/core/base_multiple_devices_widget.py +108 -108
- biosignal_device_interface/gui/device_template_widgets/otb/otb_devices_widget.py +44 -44
- biosignal_device_interface/gui/device_template_widgets/otb/otb_muovi_plus_widget.py +158 -158
- biosignal_device_interface/gui/device_template_widgets/otb/otb_muovi_widget.py +158 -158
- biosignal_device_interface/gui/device_template_widgets/otb/otb_quattrocento_light_widget.py +174 -174
- biosignal_device_interface/gui/device_template_widgets/otb/otb_quattrocento_widget.py +260 -260
- biosignal_device_interface/gui/device_template_widgets/otb/otb_syncstation_widget.py +262 -262
- biosignal_device_interface/gui/plot_widgets/biosignal_plot_widget.py +501 -501
- biosignal_device_interface/gui/ui/devices_template_widget.ui +38 -38
- biosignal_device_interface/gui/ui/otb_muovi_plus_template_widget.ui +171 -171
- biosignal_device_interface/gui/ui/otb_muovi_template_widget.ui +171 -171
- biosignal_device_interface/gui/ui/otb_quattrocento_light_template_widget.ui +266 -266
- biosignal_device_interface/gui/ui/otb_quattrocento_template_widget.ui +415 -415
- biosignal_device_interface/gui/ui/otb_syncstation_template_widget.ui +732 -732
- biosignal_device_interface/gui/ui_compiled/devices_template_widget.py +56 -56
- biosignal_device_interface/gui/ui_compiled/otb_muovi_plus_template_widget.py +153 -153
- biosignal_device_interface/gui/ui_compiled/otb_muovi_template_widget.py +153 -153
- biosignal_device_interface/gui/ui_compiled/otb_quattrocento_light_template_widget.py +217 -217
- biosignal_device_interface/gui/ui_compiled/otb_quattrocento_template_widget.py +318 -318
- biosignal_device_interface/gui/ui_compiled/otb_syncstation_template_widget.py +495 -495
- {biosignal_device_interface-0.2.1a1.dist-info → biosignal_device_interface-0.2.1a2.dist-info}/LICENSE +675 -675
- {biosignal_device_interface-0.2.1a1.dist-info → biosignal_device_interface-0.2.1a2.dist-info}/METADATA +2 -2
- biosignal_device_interface-0.2.1a2.dist-info/RECORD +46 -0
- {biosignal_device_interface-0.2.1a1.dist-info → biosignal_device_interface-0.2.1a2.dist-info}/WHEEL +1 -1
- biosignal_device_interface-0.2.1a1.dist-info/RECORD +0 -46
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Template for the QWidget that enables the user to interact with all available devices.
|
|
3
|
-
Developer: Dominik I. Braun
|
|
4
|
-
Contact: dome.braun@fau.de
|
|
5
|
-
Last Update: 2024-06-05
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from __future__ import annotations
|
|
9
|
-
from typing import TYPE_CHECKING, Dict
|
|
10
|
-
|
|
11
|
-
from biosignal_device_interface.gui.device_template_widgets.core.base_multiple_devices_widget import (
|
|
12
|
-
BaseMultipleDevicesWidget,
|
|
13
|
-
)
|
|
14
|
-
from biosignal_device_interface.constants.devices.core.base_device_constants import (
|
|
15
|
-
DeviceType,
|
|
16
|
-
)
|
|
17
|
-
from biosignal_device_interface.gui.device_template_widgets.otb.otb_muovi_plus_widget import (
|
|
18
|
-
OTBMuoviPlusWidget,
|
|
19
|
-
)
|
|
20
|
-
from biosignal_device_interface.gui.device_template_widgets.otb.otb_muovi_widget import (
|
|
21
|
-
OTBMuoviWidget,
|
|
22
|
-
)
|
|
23
|
-
from biosignal_device_interface.gui.device_template_widgets.otb.otb_quattrocento_light_widget import (
|
|
24
|
-
OTBQuattrocentoLightWidget,
|
|
25
|
-
)
|
|
26
|
-
from biosignal_device_interface.gui.device_template_widgets.otb.otb_quattrocento_widget import (
|
|
27
|
-
OTBQuattrocentoWidget,
|
|
28
|
-
)
|
|
29
|
-
from biosignal_device_interface.gui.device_template_widgets.otb.otb_syncstation_widget import (
|
|
30
|
-
OTBSyncStationWidget,
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
if TYPE_CHECKING:
|
|
34
|
-
from PySide6.QtWidgets import QWidget, QMainWindow
|
|
35
|
-
from biosignal_device_interface.gui.device_template_widgets.core.base_device_widget import (
|
|
36
|
-
BaseDeviceWidget,
|
|
37
|
-
)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
class AllDevicesWidget(BaseMultipleDevicesWidget):
|
|
41
|
-
def __init__(self, parent: QWidget | QMainWindow | None = None):
|
|
42
|
-
super().__init__(parent)
|
|
43
|
-
|
|
44
|
-
self._device_selection: Dict[DeviceType, BaseDeviceWidget] = {
|
|
45
|
-
DeviceType.OTB_QUATTROCENTO: OTBQuattrocentoWidget(self),
|
|
46
|
-
DeviceType.OTB_QUATTROCENTO_LIGHT: OTBQuattrocentoLightWidget(self),
|
|
47
|
-
DeviceType.OTB_MUOVI: OTBMuoviWidget(self),
|
|
48
|
-
DeviceType.OTB_MUOVI_PLUS: OTBMuoviPlusWidget(self),
|
|
49
|
-
DeviceType.OTB_SYNCSTATION: OTBSyncStationWidget(self),
|
|
50
|
-
}
|
|
51
|
-
self._set_devices(self._device_selection)
|
|
1
|
+
"""
|
|
2
|
+
Template for the QWidget that enables the user to interact with all available devices.
|
|
3
|
+
Developer: Dominik I. Braun
|
|
4
|
+
Contact: dome.braun@fau.de
|
|
5
|
+
Last Update: 2024-06-05
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
from typing import TYPE_CHECKING, Dict
|
|
10
|
+
|
|
11
|
+
from biosignal_device_interface.gui.device_template_widgets.core.base_multiple_devices_widget import (
|
|
12
|
+
BaseMultipleDevicesWidget,
|
|
13
|
+
)
|
|
14
|
+
from biosignal_device_interface.constants.devices.core.base_device_constants import (
|
|
15
|
+
DeviceType,
|
|
16
|
+
)
|
|
17
|
+
from biosignal_device_interface.gui.device_template_widgets.otb.otb_muovi_plus_widget import (
|
|
18
|
+
OTBMuoviPlusWidget,
|
|
19
|
+
)
|
|
20
|
+
from biosignal_device_interface.gui.device_template_widgets.otb.otb_muovi_widget import (
|
|
21
|
+
OTBMuoviWidget,
|
|
22
|
+
)
|
|
23
|
+
from biosignal_device_interface.gui.device_template_widgets.otb.otb_quattrocento_light_widget import (
|
|
24
|
+
OTBQuattrocentoLightWidget,
|
|
25
|
+
)
|
|
26
|
+
from biosignal_device_interface.gui.device_template_widgets.otb.otb_quattrocento_widget import (
|
|
27
|
+
OTBQuattrocentoWidget,
|
|
28
|
+
)
|
|
29
|
+
from biosignal_device_interface.gui.device_template_widgets.otb.otb_syncstation_widget import (
|
|
30
|
+
OTBSyncStationWidget,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
if TYPE_CHECKING:
|
|
34
|
+
from PySide6.QtWidgets import QWidget, QMainWindow
|
|
35
|
+
from biosignal_device_interface.gui.device_template_widgets.core.base_device_widget import (
|
|
36
|
+
BaseDeviceWidget,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class AllDevicesWidget(BaseMultipleDevicesWidget):
|
|
41
|
+
def __init__(self, parent: QWidget | QMainWindow | None = None):
|
|
42
|
+
super().__init__(parent)
|
|
43
|
+
|
|
44
|
+
self._device_selection: Dict[DeviceType, BaseDeviceWidget] = {
|
|
45
|
+
DeviceType.OTB_QUATTROCENTO: OTBQuattrocentoWidget(self),
|
|
46
|
+
DeviceType.OTB_QUATTROCENTO_LIGHT: OTBQuattrocentoLightWidget(self),
|
|
47
|
+
DeviceType.OTB_MUOVI: OTBMuoviWidget(self),
|
|
48
|
+
DeviceType.OTB_MUOVI_PLUS: OTBMuoviPlusWidget(self),
|
|
49
|
+
DeviceType.OTB_SYNCSTATION: OTBSyncStationWidget(self),
|
|
50
|
+
}
|
|
51
|
+
self._set_devices(self._device_selection)
|
|
@@ -1,130 +1,130 @@
|
|
|
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 abc import abstractmethod
|
|
12
|
-
from PySide6.QtWidgets import QWidget, QMainWindow
|
|
13
|
-
from PySide6.QtGui import QCloseEvent
|
|
14
|
-
from PySide6.QtCore import Signal
|
|
15
|
-
import numpy as np
|
|
16
|
-
|
|
17
|
-
# Import Devices
|
|
18
|
-
from biosignal_device_interface.devices.core.base_device import BaseDevice
|
|
19
|
-
|
|
20
|
-
if TYPE_CHECKING:
|
|
21
|
-
from enum import Enum
|
|
22
|
-
from PySide6.QtWidgets import QLineEdit
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class BaseDeviceWidget(QWidget):
|
|
26
|
-
# Signals
|
|
27
|
-
data_arrived: Signal = Signal(np.ndarray)
|
|
28
|
-
biosignal_data_arrived: Signal = Signal(np.ndarray)
|
|
29
|
-
auxiliary_data_arrived: Signal = Signal(np.ndarray)
|
|
30
|
-
connect_toggled: Signal = Signal(bool)
|
|
31
|
-
configure_toggled: Signal = Signal(bool)
|
|
32
|
-
stream_toggled: Signal = Signal(bool)
|
|
33
|
-
|
|
34
|
-
def __init__(self, parent: QWidget | QMainWindow | None = None):
|
|
35
|
-
super().__init__(parent)
|
|
36
|
-
|
|
37
|
-
self.parent_widget: QWidget | QMainWindow | None = parent
|
|
38
|
-
|
|
39
|
-
# Device Setup
|
|
40
|
-
self._device: BaseDevice | None = None
|
|
41
|
-
self._device_params: Dict[str, Union[str, int, float]] = {}
|
|
42
|
-
|
|
43
|
-
# GUI setup
|
|
44
|
-
self.ui: object = None
|
|
45
|
-
|
|
46
|
-
@abstractmethod
|
|
47
|
-
def _toggle_connection(self) -> None:
|
|
48
|
-
""" """
|
|
49
|
-
pass
|
|
50
|
-
|
|
51
|
-
@abstractmethod
|
|
52
|
-
def _connection_toggled(self, is_connected: bool) -> None:
|
|
53
|
-
""" """
|
|
54
|
-
pass
|
|
55
|
-
|
|
56
|
-
@abstractmethod
|
|
57
|
-
def _toggle_configuration(self) -> None:
|
|
58
|
-
""" """
|
|
59
|
-
pass
|
|
60
|
-
|
|
61
|
-
@abstractmethod
|
|
62
|
-
def _configuration_toggled(self, is_configured: bool) -> None:
|
|
63
|
-
""" """
|
|
64
|
-
pass
|
|
65
|
-
|
|
66
|
-
@abstractmethod
|
|
67
|
-
def _toggle_configuration_group_boxes(self) -> None:
|
|
68
|
-
""" """
|
|
69
|
-
pass
|
|
70
|
-
|
|
71
|
-
@abstractmethod
|
|
72
|
-
def _toggle_stream(self) -> None:
|
|
73
|
-
""" """
|
|
74
|
-
pass
|
|
75
|
-
|
|
76
|
-
@abstractmethod
|
|
77
|
-
def _stream_toggled(self, is_streaming: bool) -> None:
|
|
78
|
-
""" """
|
|
79
|
-
self.stream_toggled.emit(is_streaming)
|
|
80
|
-
|
|
81
|
-
@abstractmethod
|
|
82
|
-
def _initialize_device_params(self) -> None:
|
|
83
|
-
""" """
|
|
84
|
-
pass
|
|
85
|
-
|
|
86
|
-
@abstractmethod
|
|
87
|
-
def _initialize_ui(self) -> None:
|
|
88
|
-
""" """
|
|
89
|
-
pass
|
|
90
|
-
|
|
91
|
-
def _set_device(self, device: BaseDevice) -> None:
|
|
92
|
-
""" """
|
|
93
|
-
# Device Setup
|
|
94
|
-
self._device: BaseDevice = device
|
|
95
|
-
self._initialize_device_params()
|
|
96
|
-
self._set_signals()
|
|
97
|
-
self._initialize_ui()
|
|
98
|
-
|
|
99
|
-
def _set_signals(self) -> None:
|
|
100
|
-
""" """
|
|
101
|
-
self._device.data_available.connect(self.data_arrived.emit)
|
|
102
|
-
self._device.biosignal_data_available.connect(self.biosignal_data_arrived.emit)
|
|
103
|
-
self._device.auxiliary_data_available.connect(self.auxiliary_data_arrived.emit)
|
|
104
|
-
|
|
105
|
-
def get_device_information(self) -> Dict[str, Enum | int | float | str]:
|
|
106
|
-
"""
|
|
107
|
-
Gets the current configuration of the device.
|
|
108
|
-
|
|
109
|
-
Returns:
|
|
110
|
-
Dict[str, Enum | int | float | str]:
|
|
111
|
-
Dictionary that holds information about the
|
|
112
|
-
current device configuration and status.
|
|
113
|
-
"""
|
|
114
|
-
return self._device.get_device_information()
|
|
115
|
-
|
|
116
|
-
def disconnect_device(self) -> None:
|
|
117
|
-
""" """
|
|
118
|
-
if self._device.is_connected or self._device._is_streaming:
|
|
119
|
-
self._device.toggle_connection()
|
|
120
|
-
|
|
121
|
-
def _check_ip_input(self, line_edit: QLineEdit, default: str) -> None:
|
|
122
|
-
if not self._device.check_valid_ip(line_edit.text()):
|
|
123
|
-
line_edit.setText(default)
|
|
124
|
-
|
|
125
|
-
def _check_port_input(self, line_edit: QLineEdit, default: str) -> None:
|
|
126
|
-
if not self._device.check_valid_port(line_edit.text()):
|
|
127
|
-
line_edit.setText(default)
|
|
128
|
-
|
|
129
|
-
def closeEvent(self, event: QCloseEvent) -> None:
|
|
130
|
-
self.disconnect_device()
|
|
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 abc import abstractmethod
|
|
12
|
+
from PySide6.QtWidgets import QWidget, QMainWindow
|
|
13
|
+
from PySide6.QtGui import QCloseEvent
|
|
14
|
+
from PySide6.QtCore import Signal
|
|
15
|
+
import numpy as np
|
|
16
|
+
|
|
17
|
+
# Import Devices
|
|
18
|
+
from biosignal_device_interface.devices.core.base_device import BaseDevice
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from enum import Enum
|
|
22
|
+
from PySide6.QtWidgets import QLineEdit
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class BaseDeviceWidget(QWidget):
|
|
26
|
+
# Signals
|
|
27
|
+
data_arrived: Signal = Signal(np.ndarray)
|
|
28
|
+
biosignal_data_arrived: Signal = Signal(np.ndarray)
|
|
29
|
+
auxiliary_data_arrived: Signal = Signal(np.ndarray)
|
|
30
|
+
connect_toggled: Signal = Signal(bool)
|
|
31
|
+
configure_toggled: Signal = Signal(bool)
|
|
32
|
+
stream_toggled: Signal = Signal(bool)
|
|
33
|
+
|
|
34
|
+
def __init__(self, parent: QWidget | QMainWindow | None = None):
|
|
35
|
+
super().__init__(parent)
|
|
36
|
+
|
|
37
|
+
self.parent_widget: QWidget | QMainWindow | None = parent
|
|
38
|
+
|
|
39
|
+
# Device Setup
|
|
40
|
+
self._device: BaseDevice | None = None
|
|
41
|
+
self._device_params: Dict[str, Union[str, int, float]] = {}
|
|
42
|
+
|
|
43
|
+
# GUI setup
|
|
44
|
+
self.ui: object = None
|
|
45
|
+
|
|
46
|
+
@abstractmethod
|
|
47
|
+
def _toggle_connection(self) -> None:
|
|
48
|
+
""" """
|
|
49
|
+
pass
|
|
50
|
+
|
|
51
|
+
@abstractmethod
|
|
52
|
+
def _connection_toggled(self, is_connected: bool) -> None:
|
|
53
|
+
""" """
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
@abstractmethod
|
|
57
|
+
def _toggle_configuration(self) -> None:
|
|
58
|
+
""" """
|
|
59
|
+
pass
|
|
60
|
+
|
|
61
|
+
@abstractmethod
|
|
62
|
+
def _configuration_toggled(self, is_configured: bool) -> None:
|
|
63
|
+
""" """
|
|
64
|
+
pass
|
|
65
|
+
|
|
66
|
+
@abstractmethod
|
|
67
|
+
def _toggle_configuration_group_boxes(self) -> None:
|
|
68
|
+
""" """
|
|
69
|
+
pass
|
|
70
|
+
|
|
71
|
+
@abstractmethod
|
|
72
|
+
def _toggle_stream(self) -> None:
|
|
73
|
+
""" """
|
|
74
|
+
pass
|
|
75
|
+
|
|
76
|
+
@abstractmethod
|
|
77
|
+
def _stream_toggled(self, is_streaming: bool) -> None:
|
|
78
|
+
""" """
|
|
79
|
+
self.stream_toggled.emit(is_streaming)
|
|
80
|
+
|
|
81
|
+
@abstractmethod
|
|
82
|
+
def _initialize_device_params(self) -> None:
|
|
83
|
+
""" """
|
|
84
|
+
pass
|
|
85
|
+
|
|
86
|
+
@abstractmethod
|
|
87
|
+
def _initialize_ui(self) -> None:
|
|
88
|
+
""" """
|
|
89
|
+
pass
|
|
90
|
+
|
|
91
|
+
def _set_device(self, device: BaseDevice) -> None:
|
|
92
|
+
""" """
|
|
93
|
+
# Device Setup
|
|
94
|
+
self._device: BaseDevice = device
|
|
95
|
+
self._initialize_device_params()
|
|
96
|
+
self._set_signals()
|
|
97
|
+
self._initialize_ui()
|
|
98
|
+
|
|
99
|
+
def _set_signals(self) -> None:
|
|
100
|
+
""" """
|
|
101
|
+
self._device.data_available.connect(self.data_arrived.emit)
|
|
102
|
+
self._device.biosignal_data_available.connect(self.biosignal_data_arrived.emit)
|
|
103
|
+
self._device.auxiliary_data_available.connect(self.auxiliary_data_arrived.emit)
|
|
104
|
+
|
|
105
|
+
def get_device_information(self) -> Dict[str, Enum | int | float | str]:
|
|
106
|
+
"""
|
|
107
|
+
Gets the current configuration of the device.
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
Dict[str, Enum | int | float | str]:
|
|
111
|
+
Dictionary that holds information about the
|
|
112
|
+
current device configuration and status.
|
|
113
|
+
"""
|
|
114
|
+
return self._device.get_device_information()
|
|
115
|
+
|
|
116
|
+
def disconnect_device(self) -> None:
|
|
117
|
+
""" """
|
|
118
|
+
if self._device.is_connected or self._device._is_streaming:
|
|
119
|
+
self._device.toggle_connection()
|
|
120
|
+
|
|
121
|
+
def _check_ip_input(self, line_edit: QLineEdit, default: str) -> None:
|
|
122
|
+
if not self._device.check_valid_ip(line_edit.text()):
|
|
123
|
+
line_edit.setText(default)
|
|
124
|
+
|
|
125
|
+
def _check_port_input(self, line_edit: QLineEdit, default: str) -> None:
|
|
126
|
+
if not self._device.check_valid_port(line_edit.text()):
|
|
127
|
+
line_edit.setText(default)
|
|
128
|
+
|
|
129
|
+
def closeEvent(self, event: QCloseEvent) -> None:
|
|
130
|
+
self.disconnect_device()
|
|
@@ -1,108 +1,108 @@
|
|
|
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
|
-
|
|
53
|
-
def get_device_information(self) -> Dict[str, Union[str, int]]:
|
|
54
|
-
return self._get_current_widget().get_device_information()
|
|
55
|
-
|
|
56
|
-
def _update_stacked_widget(self, index: int):
|
|
57
|
-
current_widget = self._get_current_widget()
|
|
58
|
-
current_widget.disconnect_device()
|
|
59
|
-
|
|
60
|
-
with warnings.catch_warnings():
|
|
61
|
-
warnings.filterwarnings("ignore")
|
|
62
|
-
try:
|
|
63
|
-
current_widget.data_arrived.disconnect(self.data_arrived.emit)
|
|
64
|
-
current_widget.biosignal_data_arrived.disconnect(
|
|
65
|
-
self.biosignal_data_arrived.emit
|
|
66
|
-
)
|
|
67
|
-
current_widget.auxiliary_data_arrived.disconnect(
|
|
68
|
-
self.auxiliary_data_arrived.emit
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
current_widget.connect_toggled.disconnect(self.connect_toggled)
|
|
72
|
-
current_widget.configure_toggled.disconnect(self.configure_toggled)
|
|
73
|
-
current_widget.stream_toggled.disconnect(self.stream_toggled)
|
|
74
|
-
|
|
75
|
-
except (TypeError, RuntimeError):
|
|
76
|
-
...
|
|
77
|
-
|
|
78
|
-
self.device_stacked_widget.setCurrentIndex(index)
|
|
79
|
-
current_widget = self._get_current_widget()
|
|
80
|
-
|
|
81
|
-
# Data arrived
|
|
82
|
-
current_widget.data_arrived.connect(self.data_arrived.emit)
|
|
83
|
-
# Biosignal data arrived
|
|
84
|
-
current_widget.biosignal_data_arrived.connect(self.biosignal_data_arrived.emit)
|
|
85
|
-
# Auxiliary data arrived
|
|
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
|
-
self.device_selection_combo_box.currentIndexChanged.connect(
|
|
101
|
-
self._update_stacked_widget
|
|
102
|
-
)
|
|
103
|
-
|
|
104
|
-
def _get_current_widget(self) -> BaseDeviceWidget:
|
|
105
|
-
return self.device_stacked_widget.currentWidget()
|
|
106
|
-
|
|
107
|
-
def closeEvent(self, event: QCloseEvent) -> None:
|
|
108
|
-
self._get_current_widget().closeEvent(event)
|
|
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
|
+
|
|
53
|
+
def get_device_information(self) -> Dict[str, Union[str, int]]:
|
|
54
|
+
return self._get_current_widget().get_device_information()
|
|
55
|
+
|
|
56
|
+
def _update_stacked_widget(self, index: int):
|
|
57
|
+
current_widget = self._get_current_widget()
|
|
58
|
+
current_widget.disconnect_device()
|
|
59
|
+
|
|
60
|
+
with warnings.catch_warnings():
|
|
61
|
+
warnings.filterwarnings("ignore")
|
|
62
|
+
try:
|
|
63
|
+
current_widget.data_arrived.disconnect(self.data_arrived.emit)
|
|
64
|
+
current_widget.biosignal_data_arrived.disconnect(
|
|
65
|
+
self.biosignal_data_arrived.emit
|
|
66
|
+
)
|
|
67
|
+
current_widget.auxiliary_data_arrived.disconnect(
|
|
68
|
+
self.auxiliary_data_arrived.emit
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
current_widget.connect_toggled.disconnect(self.connect_toggled)
|
|
72
|
+
current_widget.configure_toggled.disconnect(self.configure_toggled)
|
|
73
|
+
current_widget.stream_toggled.disconnect(self.stream_toggled)
|
|
74
|
+
|
|
75
|
+
except (TypeError, RuntimeError):
|
|
76
|
+
...
|
|
77
|
+
|
|
78
|
+
self.device_stacked_widget.setCurrentIndex(index)
|
|
79
|
+
current_widget = self._get_current_widget()
|
|
80
|
+
|
|
81
|
+
# Data arrived
|
|
82
|
+
current_widget.data_arrived.connect(self.data_arrived.emit)
|
|
83
|
+
# Biosignal data arrived
|
|
84
|
+
current_widget.biosignal_data_arrived.connect(self.biosignal_data_arrived.emit)
|
|
85
|
+
# Auxiliary data arrived
|
|
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
|
+
self.device_selection_combo_box.currentIndexChanged.connect(
|
|
101
|
+
self._update_stacked_widget
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
def _get_current_widget(self) -> BaseDeviceWidget:
|
|
105
|
+
return self.device_stacked_widget.currentWidget()
|
|
106
|
+
|
|
107
|
+
def closeEvent(self, event: QCloseEvent) -> None:
|
|
108
|
+
self._get_current_widget().closeEvent(event)
|
|
@@ -1,44 +1,44 @@
|
|
|
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.otb_muovi_plus_widget import (
|
|
11
|
-
OTBMuoviPlusWidget,
|
|
12
|
-
)
|
|
13
|
-
from biosignal_device_interface.gui.device_template_widgets.otb.otb_muovi_widget import (
|
|
14
|
-
OTBMuoviWidget,
|
|
15
|
-
)
|
|
16
|
-
from biosignal_device_interface.gui.device_template_widgets.otb.otb_quattrocento_light_widget import (
|
|
17
|
-
OTBQuattrocentoLightWidget,
|
|
18
|
-
)
|
|
19
|
-
from biosignal_device_interface.gui.device_template_widgets.otb.otb_quattrocento_widget import (
|
|
20
|
-
OTBQuattrocentoWidget,
|
|
21
|
-
)
|
|
22
|
-
from biosignal_device_interface.gui.device_template_widgets.otb.otb_syncstation_widget import (
|
|
23
|
-
OTBSyncStationWidget,
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
if TYPE_CHECKING:
|
|
27
|
-
from PySide6.QtWidgets import QWidget, QMainWindow
|
|
28
|
-
from biosignal_device_interface.gui.device_template_widgets.core.base_device_widget import (
|
|
29
|
-
BaseDeviceWidget,
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class OTBDevicesWidget(BaseMultipleDevicesWidget):
|
|
34
|
-
def __init__(self, parent: QWidget | QMainWindow | None = None):
|
|
35
|
-
super().__init__(parent)
|
|
36
|
-
|
|
37
|
-
self._device_selection: Dict[DeviceType, BaseDeviceWidget] = {
|
|
38
|
-
DeviceType.OTB_QUATTROCENTO: OTBQuattrocentoWidget(self),
|
|
39
|
-
DeviceType.OTB_QUATTROCENTO_LIGHT: OTBQuattrocentoLightWidget(self),
|
|
40
|
-
DeviceType.OTB_MUOVI: OTBMuoviWidget(self),
|
|
41
|
-
DeviceType.OTB_MUOVI_PLUS: OTBMuoviPlusWidget(self),
|
|
42
|
-
DeviceType.OTB_SYNCSTATION: OTBSyncStationWidget(self),
|
|
43
|
-
}
|
|
44
|
-
self._set_devices(self._device_selection)
|
|
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.otb_muovi_plus_widget import (
|
|
11
|
+
OTBMuoviPlusWidget,
|
|
12
|
+
)
|
|
13
|
+
from biosignal_device_interface.gui.device_template_widgets.otb.otb_muovi_widget import (
|
|
14
|
+
OTBMuoviWidget,
|
|
15
|
+
)
|
|
16
|
+
from biosignal_device_interface.gui.device_template_widgets.otb.otb_quattrocento_light_widget import (
|
|
17
|
+
OTBQuattrocentoLightWidget,
|
|
18
|
+
)
|
|
19
|
+
from biosignal_device_interface.gui.device_template_widgets.otb.otb_quattrocento_widget import (
|
|
20
|
+
OTBQuattrocentoWidget,
|
|
21
|
+
)
|
|
22
|
+
from biosignal_device_interface.gui.device_template_widgets.otb.otb_syncstation_widget import (
|
|
23
|
+
OTBSyncStationWidget,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from PySide6.QtWidgets import QWidget, QMainWindow
|
|
28
|
+
from biosignal_device_interface.gui.device_template_widgets.core.base_device_widget import (
|
|
29
|
+
BaseDeviceWidget,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class OTBDevicesWidget(BaseMultipleDevicesWidget):
|
|
34
|
+
def __init__(self, parent: QWidget | QMainWindow | None = None):
|
|
35
|
+
super().__init__(parent)
|
|
36
|
+
|
|
37
|
+
self._device_selection: Dict[DeviceType, BaseDeviceWidget] = {
|
|
38
|
+
DeviceType.OTB_QUATTROCENTO: OTBQuattrocentoWidget(self),
|
|
39
|
+
DeviceType.OTB_QUATTROCENTO_LIGHT: OTBQuattrocentoLightWidget(self),
|
|
40
|
+
DeviceType.OTB_MUOVI: OTBMuoviWidget(self),
|
|
41
|
+
DeviceType.OTB_MUOVI_PLUS: OTBMuoviPlusWidget(self),
|
|
42
|
+
DeviceType.OTB_SYNCSTATION: OTBSyncStationWidget(self),
|
|
43
|
+
}
|
|
44
|
+
self._set_devices(self._device_selection)
|