biosignal-device-interface 0.2.2__tar.gz → 0.2.4__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.
Files changed (49) hide show
  1. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/PKG-INFO +46 -38
  2. biosignal_device_interface-0.2.4/README.md +112 -0
  3. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/device_template_widgets/core/base_multiple_devices_widget.py +17 -0
  4. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/device_template_widgets/otb/otb_muovi_plus_widget.py +16 -0
  5. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/device_template_widgets/otb/otb_muovi_widget.py +16 -0
  6. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/device_template_widgets/otb/otb_quattrocento_light_widget.py +7 -0
  7. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/device_template_widgets/otb/otb_quattrocento_widget.py +31 -0
  8. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/device_template_widgets/otb/otb_syncstation_widget.py +7 -0
  9. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/plot_widgets/biosignal_plot_widget.py +53 -4
  10. biosignal_device_interface-0.2.4/biosignal_device_interface/gui/ui/devices_template_widget.ui +133 -0
  11. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/ui/otb_muovi_plus_template_widget.ui +7 -1
  12. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/ui/otb_muovi_template_widget.ui +7 -1
  13. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/ui/otb_quattrocento_light_template_widget.ui +7 -1
  14. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/ui/otb_quattrocento_template_widget.ui +13 -1
  15. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/ui/otb_syncstation_template_widget.ui +24 -18
  16. biosignal_device_interface-0.2.4/biosignal_device_interface/gui/ui_compiled/devices_template_widget.py +104 -0
  17. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/ui_compiled/otb_muovi_plus_template_widget.py +5 -4
  18. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/ui_compiled/otb_muovi_template_widget.py +5 -4
  19. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/ui_compiled/otb_quattrocento_light_template_widget.py +6 -5
  20. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/ui_compiled/otb_quattrocento_template_widget.py +4 -2
  21. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/ui_compiled/otb_syncstation_template_widget.py +20 -19
  22. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/pyproject.toml +3 -3
  23. biosignal_device_interface-0.2.2/README.md +0 -104
  24. biosignal_device_interface-0.2.2/biosignal_device_interface/gui/ui/devices_template_widget.ui +0 -38
  25. biosignal_device_interface-0.2.2/biosignal_device_interface/gui/ui_compiled/devices_template_widget.py +0 -56
  26. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/LICENSE +0 -0
  27. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/__init__.py +0 -0
  28. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/__init__.py +0 -0
  29. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/devices/__init__.py +0 -0
  30. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/devices/core/base_device_constants.py +0 -0
  31. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/devices/otb/otb_constants.py +0 -0
  32. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/devices/otb/otb_muovi_constants.py +0 -0
  33. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/devices/otb/otb_quattrocento_constants.py +0 -0
  34. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/devices/otb/otb_quattrocento_light_constants.py +0 -0
  35. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/devices/otb/otb_syncstation_constants.py +0 -0
  36. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/plots/color_palette.py +0 -0
  37. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/__init__.py +0 -0
  38. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/core/__init__.py +0 -0
  39. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/core/base_device.py +0 -0
  40. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/otb/__init__.py +0 -0
  41. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/otb/otb_muovi.py +0 -0
  42. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/otb/otb_quattrocento.py +0 -0
  43. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/otb/otb_quattrocento_light.py +0 -0
  44. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/otb/otb_syncstation.py +0 -0
  45. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/device_template_widgets/__init__.py +0 -0
  46. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/device_template_widgets/all_devices_widget.py +0 -0
  47. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/device_template_widgets/core/base_device_widget.py +0 -0
  48. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/device_template_widgets/otb/__init__.py +0 -0
  49. {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/device_template_widgets/otb/otb_devices_widget.py +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: biosignal-device-interface
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: Python communication interface to many biosignal devices manufactured by several companies to easy integration in custom PySide6 applications.
5
- License: CC BY-SA 4.0
5
+ License: GPL-3.0
6
6
  License-File: LICENSE
7
7
  Author: Dominik I. Braun
8
8
  Author-email: dome.braun@fau.de
9
9
  Requires-Python: >=3.10,<3.13
10
- Classifier: License :: Other/Proprietary License
10
+ Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
11
11
  Classifier: Programming Language :: Python :: 3
12
12
  Classifier: Programming Language :: Python :: 3.10
13
13
  Classifier: Programming Language :: Python :: 3.11
@@ -34,10 +34,15 @@ Description-Content-Type: text/markdown
34
34
  <h3 align="center">Biosignal Device Interface</h3>
35
35
 
36
36
  <p align="center">
37
- Python communication interface to many biosignal devices manufactured by several companies to easy integration in custom PySide6 applications.
37
+ Python communication interface to many biosignal devices manufactured by several companies for easy integration in custom PySide6 applications.
38
38
  <br />
39
39
  <a href="https://nsquaredlab.github.io/Biosignal-Device-Interface/"><strong>Explore the docs »</strong></a>
40
40
  </p>
41
+
42
+ [![PyPI version](https://img.shields.io/pypi/v/biosignal-device-interface.svg)](https://pypi.org/project/biosignal-device-interface/)
43
+ [![Python versions](https://img.shields.io/pypi/pyversions/biosignal-device-interface.svg)](https://pypi.org/project/biosignal-device-interface/)
44
+ [![License](https://img.shields.io/badge/license-GPL--3.0-blue.svg)](LICENSE)
45
+
41
46
  </div>
42
47
 
43
48
 
@@ -46,19 +51,18 @@ Description-Content-Type: text/markdown
46
51
  <details>
47
52
  <summary>Table of Contents</summary>
48
53
  <ol>
49
- <li>
50
- <a href="#about-the-project">About The Project</a>
51
- </li>
52
- <li><a href="#contact">Contact</a></li>
54
+ <li><a href="#about-the-project">About The Project</a></li>
55
+ <li><a href="#supported-devices">Supported Devices</a></li>
53
56
  <li>
54
57
  <a href="#getting-started">Getting Started</a>
55
58
  <ul>
59
+ <li><a href="#installation">Installation</a></li>
56
60
  <li><a href="#development-installation">Development Installation</a></li>
57
- <li><a href="#package-installation">Package Installation</a></li>
58
61
  </ul>
59
62
  </li>
60
63
  <li><a href="#usage">Usage</a></li>
61
64
  <li><a href="#license">License</a></li>
65
+ <li><a href="#contact">Contact</a></li>
62
66
  <li><a href="#acknowledgments">Acknowledgments</a></li>
63
67
  </ol>
64
68
  </details>
@@ -66,64 +70,68 @@ Description-Content-Type: text/markdown
66
70
 
67
71
  ## About The Project
68
72
 
69
- Give a brief introduction into the project.
73
+ Biosignal Device Interface provides a unified Python API for communicating with biosignal acquisition devices from multiple manufacturers. It includes ready-to-use PySide6 widgets for device configuration and data streaming, making it easy to integrate biosignal acquisition into custom applications.
70
74
 
71
- <!-- CONTACT -->
72
- ### Contact
73
-
74
- [Dominik I. Braun](https://www.nsquared.tf.fau.de/person/dominik-braun/) - dome.braun@fau.de
75
+ ## Supported Devices
75
76
 
76
- Project Link: [https://github.com/NsquaredLab/Biosignal-Device-Interface](https://github.com/NsquaredLab/Biosignal-Device-Interface)
77
+ ### OT Bioelettronica
78
+ - **Quattrocento** - 400+ channel EMG/EEG amplifier
79
+ - **Quattrocento Light** - Compact version of Quattrocento
80
+ - **Muovi** - Wearable EMG sensor
81
+ - **Muovi+** - Enhanced wearable EMG sensor
82
+ - **SyncStation** - Multi-device synchronization hub (Muovi, Muovi+, Due+)
77
83
 
84
+ ### Other Devices
85
+ - More devices coming soon...
78
86
 
79
87
  <!-- GETTING STARTED -->
80
88
  ## Getting Started
81
89
 
82
- The local set up is made using [Poetry](https://python-poetry.org/). You can install Poetry using the following command.
83
- Note: It is recommeded to install it globally.
84
- ```bash
85
- pip install poetry
86
- ```
90
+ ### Installation
87
91
 
88
- Then, you can install the dependencies in your work area using the following command:
92
+ Install from PyPI:
89
93
  ```bash
90
- poetry install
94
+ pip install biosignal-device-interface
91
95
  ```
92
96
 
93
- ### Development installation
94
- If you want to contribute to the project, you can install the development dependencies using the following command:
97
+ Or with Poetry:
95
98
  ```bash
96
- poetry install --with dev,docs
99
+ poetry add biosignal-device-interface
97
100
  ```
98
101
 
99
- ### Package Installation
100
- Poetry
101
- ```Bash
102
- poetry add git+https://github.com/NsquaredLab/Biosignal-Device-Interface.git
103
- ```
102
+ ### Development Installation
104
103
 
105
- PIP
106
- ```sh
107
- pip install git+https://github.com/NsquaredLab/Biosignal-Device-Interface.git
108
- ```
104
+ Clone the repository and install with development dependencies:
109
105
 
106
+ ```bash
107
+ git clone https://github.com/NsquaredLab/Biosignal-Device-Interface.git
108
+ cd Biosignal-Device-Interface
109
+ poetry install --with dev,docs
110
+ ```
110
111
 
111
112
  <!-- USAGE EXAMPLES -->
112
113
  ## Usage
113
114
 
114
115
  Examples of how you can use this package can be found in our [examples gallery](https://nsquaredlab.github.io/Biosignal-Device-Interface/auto_examples/index.html).
115
116
 
116
-
117
117
  <!-- LICENSE -->
118
118
  ## License
119
119
 
120
- Distributed under the GPL-3.0 license License. See `LICENSE.txt` for more information.
120
+ Distributed under the GPL-3.0 License. See `LICENSE` for more information.
121
+
122
+ <!-- CONTACT -->
123
+ ## Contact
124
+
125
+ - [Dominik I. Braun](https://www.nsquared.tf.fau.de/person/dominik-braun/) - dome.braun@fau.de
126
+ - [Raul C. Sîmpetru](https://www.nsquared.tf.fau.de/person/raul-simpetru/) - raul.simpetru@fau.de
127
+
128
+ Project Link: [https://github.com/NsquaredLab/Biosignal-Device-Interface](https://github.com/NsquaredLab/Biosignal-Device-Interface)
121
129
 
122
130
  <!-- ACKNOWLEDGMENTS -->
123
131
  ## Acknowledgments
124
- * Find available Python and Matlab implementations of OT Bioelettronica's devices on their [website](https://otbioelettronica.it/en/download/).
132
+ * Find available Python and Matlab implementations of OT Bioelettronica's devices on their [website](https://otbioelettronica.it/en/download/).
125
133
  <br>
126
- Note: The example scripts does not provide you with the same level of utility for GUI implementations.
134
+ Note: The example scripts do not provide you with the same level of utility for GUI implementations.
127
135
 
128
136
  <p align="right">(<a href="#readme-top">back to top</a>)</p>
129
137
 
@@ -0,0 +1,112 @@
1
+ # Biosignal-Device-Interface
2
+
3
+ <!-- PROJECT LOGO -->
4
+ <br />
5
+ <div align="center">
6
+ <a href="https://github.com/NsquaredLab/Biosignal-Device-Interface">
7
+ <img src="images/logo.png" alt="Logo" width="80" height="80">
8
+ </a>
9
+
10
+ <h3 align="center">Biosignal Device Interface</h3>
11
+
12
+ <p align="center">
13
+ Python communication interface to many biosignal devices manufactured by several companies for easy integration in custom PySide6 applications.
14
+ <br />
15
+ <a href="https://nsquaredlab.github.io/Biosignal-Device-Interface/"><strong>Explore the docs »</strong></a>
16
+ </p>
17
+
18
+ [![PyPI version](https://img.shields.io/pypi/v/biosignal-device-interface.svg)](https://pypi.org/project/biosignal-device-interface/)
19
+ [![Python versions](https://img.shields.io/pypi/pyversions/biosignal-device-interface.svg)](https://pypi.org/project/biosignal-device-interface/)
20
+ [![License](https://img.shields.io/badge/license-GPL--3.0-blue.svg)](LICENSE)
21
+
22
+ </div>
23
+
24
+
25
+
26
+ <!-- TABLE OF CONTENTS -->
27
+ <details>
28
+ <summary>Table of Contents</summary>
29
+ <ol>
30
+ <li><a href="#about-the-project">About The Project</a></li>
31
+ <li><a href="#supported-devices">Supported Devices</a></li>
32
+ <li>
33
+ <a href="#getting-started">Getting Started</a>
34
+ <ul>
35
+ <li><a href="#installation">Installation</a></li>
36
+ <li><a href="#development-installation">Development Installation</a></li>
37
+ </ul>
38
+ </li>
39
+ <li><a href="#usage">Usage</a></li>
40
+ <li><a href="#license">License</a></li>
41
+ <li><a href="#contact">Contact</a></li>
42
+ <li><a href="#acknowledgments">Acknowledgments</a></li>
43
+ </ol>
44
+ </details>
45
+
46
+
47
+ ## About The Project
48
+
49
+ Biosignal Device Interface provides a unified Python API for communicating with biosignal acquisition devices from multiple manufacturers. It includes ready-to-use PySide6 widgets for device configuration and data streaming, making it easy to integrate biosignal acquisition into custom applications.
50
+
51
+ ## Supported Devices
52
+
53
+ ### OT Bioelettronica
54
+ - **Quattrocento** - 400+ channel EMG/EEG amplifier
55
+ - **Quattrocento Light** - Compact version of Quattrocento
56
+ - **Muovi** - Wearable EMG sensor
57
+ - **Muovi+** - Enhanced wearable EMG sensor
58
+ - **SyncStation** - Multi-device synchronization hub (Muovi, Muovi+, Due+)
59
+
60
+ ### Other Devices
61
+ - More devices coming soon...
62
+
63
+ <!-- GETTING STARTED -->
64
+ ## Getting Started
65
+
66
+ ### Installation
67
+
68
+ Install from PyPI:
69
+ ```bash
70
+ pip install biosignal-device-interface
71
+ ```
72
+
73
+ Or with Poetry:
74
+ ```bash
75
+ poetry add biosignal-device-interface
76
+ ```
77
+
78
+ ### Development Installation
79
+
80
+ Clone the repository and install with development dependencies:
81
+
82
+ ```bash
83
+ git clone https://github.com/NsquaredLab/Biosignal-Device-Interface.git
84
+ cd Biosignal-Device-Interface
85
+ poetry install --with dev,docs
86
+ ```
87
+
88
+ <!-- USAGE EXAMPLES -->
89
+ ## Usage
90
+
91
+ Examples of how you can use this package can be found in our [examples gallery](https://nsquaredlab.github.io/Biosignal-Device-Interface/auto_examples/index.html).
92
+
93
+ <!-- LICENSE -->
94
+ ## License
95
+
96
+ Distributed under the GPL-3.0 License. See `LICENSE` for more information.
97
+
98
+ <!-- CONTACT -->
99
+ ## Contact
100
+
101
+ - [Dominik I. Braun](https://www.nsquared.tf.fau.de/person/dominik-braun/) - dome.braun@fau.de
102
+ - [Raul C. Sîmpetru](https://www.nsquared.tf.fau.de/person/raul-simpetru/) - raul.simpetru@fau.de
103
+
104
+ Project Link: [https://github.com/NsquaredLab/Biosignal-Device-Interface](https://github.com/NsquaredLab/Biosignal-Device-Interface)
105
+
106
+ <!-- ACKNOWLEDGMENTS -->
107
+ ## Acknowledgments
108
+ * Find available Python and Matlab implementations of OT Bioelettronica's devices on their [website](https://otbioelettronica.it/en/download/).
109
+ <br>
110
+ Note: The example scripts do not provide you with the same level of utility for GUI implementations.
111
+
112
+ <p align="right">(<a href="#readme-top">back to top</a>)</p>
@@ -50,6 +50,23 @@ class BaseMultipleDevicesWidget(QWidget):
50
50
  self.device_stacked_widget = self.ui.deviceStackedWidget
51
51
  self.device_selection_combo_box = self.ui.deviceSelectionComboBox
52
52
 
53
+ # Sync external scrollbar with scroll area's internal scrollbar
54
+ internal_scrollbar = self.ui.deviceScrollArea.verticalScrollBar()
55
+ external_scrollbar = self.ui.deviceScrollBar
56
+
57
+ # Sync scrollbar values bidirectionally
58
+ internal_scrollbar.valueChanged.connect(external_scrollbar.setValue)
59
+ external_scrollbar.valueChanged.connect(internal_scrollbar.setValue)
60
+
61
+ # Sync scrollbar range and visibility when content changes
62
+ def update_scrollbar_range(min_val: int, max_val: int):
63
+ external_scrollbar.setRange(min_val, max_val)
64
+ external_scrollbar.setVisible(max_val > min_val)
65
+
66
+ internal_scrollbar.rangeChanged.connect(update_scrollbar_range)
67
+ # Initialize visibility
68
+ external_scrollbar.setVisible(internal_scrollbar.maximum() > internal_scrollbar.minimum())
69
+
53
70
  def get_device_information(self) -> Dict[str, Union[str, int]]:
54
71
  return self._get_current_widget().get_device_information()
55
72
 
@@ -50,12 +50,15 @@ class OTBMuoviPlusWidget(BaseDeviceWidget):
50
50
  self.connect_push_button.setText("Disconnect")
51
51
  self.connect_push_button.setChecked(True)
52
52
  self.configure_push_button.setEnabled(True)
53
+ self.configure_push_button.setToolTip("Step 2: Configure device settings")
53
54
  self.connection_group_box.setEnabled(False)
54
55
  else:
55
56
  self.connect_push_button.setText("Connect")
56
57
  self.connect_push_button.setChecked(False)
57
58
  self.configure_push_button.setEnabled(False)
59
+ self.configure_push_button.setToolTip("Step 2: Configure device settings (connect first)")
58
60
  self.stream_push_button.setEnabled(False)
61
+ self.stream_push_button.setToolTip("Step 3: Start data streaming (configure first)")
59
62
  self.connection_group_box.setEnabled(True)
60
63
 
61
64
  self.connect_toggled.emit(is_connected)
@@ -73,6 +76,7 @@ class OTBMuoviPlusWidget(BaseDeviceWidget):
73
76
  def _configuration_toggled(self, is_configured: bool) -> None:
74
77
  if is_configured:
75
78
  self.stream_push_button.setEnabled(True)
79
+ self.stream_push_button.setToolTip("Step 3: Start data streaming")
76
80
 
77
81
  self.configure_toggled.emit(is_configured)
78
82
 
@@ -112,16 +116,19 @@ class OTBMuoviPlusWidget(BaseDeviceWidget):
112
116
  # Command Push Buttons
113
117
  self.connect_push_button: QPushButton = self.ui.commandConnectionPushButton
114
118
  self.connect_push_button.clicked.connect(self._toggle_connection)
119
+ self.connect_push_button.setToolTip("Step 1: Connect to the Muovi+ device")
115
120
  self._device.connect_toggled.connect(self._connection_toggled)
116
121
 
117
122
  self.configure_push_button: QPushButton = self.ui.commandConfigurationPushButton
118
123
  self.configure_push_button.clicked.connect(self._toggle_configuration)
119
124
  self.configure_push_button.setEnabled(False)
125
+ self.configure_push_button.setToolTip("Step 2: Configure device settings (connect first)")
120
126
  self._device.configure_toggled.connect(self._configuration_toggled)
121
127
 
122
128
  self.stream_push_button: QPushButton = self.ui.commandStreamPushButton
123
129
  self.stream_push_button.clicked.connect(self._toggle_stream)
124
130
  self.stream_push_button.setEnabled(False)
131
+ self.stream_push_button.setToolTip("Step 3: Start data streaming (configure first)")
125
132
  self._device.stream_toggled.connect(self._stream_toggled)
126
133
 
127
134
  # Connection parameters
@@ -148,9 +155,18 @@ class OTBMuoviPlusWidget(BaseDeviceWidget):
148
155
  # Input parameters
149
156
  self.input_parameters_group_box: QGroupBox = self.ui.inputGroupBox
150
157
  self.input_working_mode_combo_box: QComboBox = self.ui.inputWorkingModeComboBox
158
+ self.input_working_mode_combo_box.setToolTip(
159
+ "EMG: Electromyography for muscle signals\nEEG: Electroencephalography for brain signals"
160
+ )
151
161
  self.input_detection_mode_combo_box: QComboBox = (
152
162
  self.ui.inputDetectionModeComboBox
153
163
  )
164
+ self.input_detection_mode_combo_box.setToolTip(
165
+ "High Gain: Better for weak signals\nLow Gain: Better for strong signals\nImpedance Check: Verify electrode contact"
166
+ )
167
+
168
+ # Add tooltip for update button
169
+ self.connection_update_push_button.setToolTip("Refresh available device IP addresses")
154
170
 
155
171
  # Configuration parameters
156
172
  self.configuration_group_boxes: list[QGroupBox] = [
@@ -50,12 +50,15 @@ class OTBMuoviWidget(BaseDeviceWidget):
50
50
  self.connect_push_button.setText("Disconnect")
51
51
  self.connect_push_button.setChecked(True)
52
52
  self.configure_push_button.setEnabled(True)
53
+ self.configure_push_button.setToolTip("Step 2: Configure device settings")
53
54
  self.connection_group_box.setEnabled(False)
54
55
  else:
55
56
  self.connect_push_button.setText("Connect")
56
57
  self.connect_push_button.setChecked(False)
57
58
  self.configure_push_button.setEnabled(False)
59
+ self.configure_push_button.setToolTip("Step 2: Configure device settings (connect first)")
58
60
  self.stream_push_button.setEnabled(False)
61
+ self.stream_push_button.setToolTip("Step 3: Start data streaming (configure first)")
59
62
  self.connection_group_box.setEnabled(True)
60
63
 
61
64
  self.connect_toggled.emit(is_connected)
@@ -73,6 +76,7 @@ class OTBMuoviWidget(BaseDeviceWidget):
73
76
  def _configuration_toggled(self, is_configured: bool) -> None:
74
77
  if is_configured:
75
78
  self.stream_push_button.setEnabled(True)
79
+ self.stream_push_button.setToolTip("Step 3: Start data streaming")
76
80
 
77
81
  self.configure_toggled.emit(is_configured)
78
82
 
@@ -112,16 +116,19 @@ class OTBMuoviWidget(BaseDeviceWidget):
112
116
  # Command Push Buttons
113
117
  self.connect_push_button: QPushButton = self.ui.commandConnectionPushButton
114
118
  self.connect_push_button.clicked.connect(self._toggle_connection)
119
+ self.connect_push_button.setToolTip("Step 1: Connect to the Muovi device")
115
120
  self._device.connect_toggled.connect(self._connection_toggled)
116
121
 
117
122
  self.configure_push_button: QPushButton = self.ui.commandConfigurationPushButton
118
123
  self.configure_push_button.clicked.connect(self._toggle_configuration)
119
124
  self.configure_push_button.setEnabled(False)
125
+ self.configure_push_button.setToolTip("Step 2: Configure device settings (connect first)")
120
126
  self._device.configure_toggled.connect(self._configuration_toggled)
121
127
 
122
128
  self.stream_push_button: QPushButton = self.ui.commandStreamPushButton
123
129
  self.stream_push_button.clicked.connect(self._toggle_stream)
124
130
  self.stream_push_button.setEnabled(False)
131
+ self.stream_push_button.setToolTip("Step 3: Start data streaming (configure first)")
125
132
  self._device.stream_toggled.connect(self._stream_toggled)
126
133
 
127
134
  # Connection parameters
@@ -148,9 +155,18 @@ class OTBMuoviWidget(BaseDeviceWidget):
148
155
  # Input parameters
149
156
  self.input_parameters_group_box: QGroupBox = self.ui.inputGroupBox
150
157
  self.input_working_mode_combo_box: QComboBox = self.ui.inputWorkingModeComboBox
158
+ self.input_working_mode_combo_box.setToolTip(
159
+ "EMG: Electromyography for muscle signals\nEEG: Electroencephalography for brain signals"
160
+ )
151
161
  self.input_detection_mode_combo_box: QComboBox = (
152
162
  self.ui.inputDetectionModeComboBox
153
163
  )
164
+ self.input_detection_mode_combo_box.setToolTip(
165
+ "High Gain: Better for weak signals\nLow Gain: Better for strong signals\nImpedance Check: Verify electrode contact"
166
+ )
167
+
168
+ # Add tooltip for update button
169
+ self.connection_update_push_button.setToolTip("Refresh available device IP addresses")
154
170
 
155
171
  # Configuration parameters
156
172
  self.configuration_group_boxes: list[QGroupBox] = [
@@ -48,12 +48,15 @@ class OTBQuattrocentoLightWidget(BaseDeviceWidget):
48
48
  self._connect_push_button.setText("Disconnect")
49
49
  self._connect_push_button.setChecked(True)
50
50
  self._configure_push_button.setEnabled(True)
51
+ self._configure_push_button.setToolTip("Step 2: Configure device settings")
51
52
  self._connection_group_box.setEnabled(False)
52
53
  else:
53
54
  self._connect_push_button.setText("Connect")
54
55
  self._connect_push_button.setChecked(False)
55
56
  self._configure_push_button.setEnabled(False)
57
+ self._configure_push_button.setToolTip("Step 2: Configure device settings (connect first)")
56
58
  self._stream_push_button.setEnabled(False)
59
+ self._stream_push_button.setToolTip("Step 3: Start data streaming (configure first)")
57
60
  self._connection_group_box.setEnabled(True)
58
61
 
59
62
  self.connect_toggled.emit(is_connected)
@@ -81,6 +84,7 @@ class OTBQuattrocentoLightWidget(BaseDeviceWidget):
81
84
  def _configuration_toggled(self, is_configured: bool) -> None:
82
85
  if is_configured:
83
86
  self._stream_push_button.setEnabled(True)
87
+ self._stream_push_button.setToolTip("Step 3: Start data streaming")
84
88
 
85
89
  self.configure_toggled.emit(is_configured)
86
90
 
@@ -121,6 +125,7 @@ class OTBQuattrocentoLightWidget(BaseDeviceWidget):
121
125
  # Command Push Buttons
122
126
  self._connect_push_button: QPushButton = self.ui.commandConnectionPushButton
123
127
  self._connect_push_button.clicked.connect(self._toggle_connection)
128
+ self._connect_push_button.setToolTip("Step 1: Connect to the Quattrocento Light device")
124
129
  self._device.connect_toggled.connect(self._connection_toggled)
125
130
 
126
131
  self._configure_push_button: QPushButton = (
@@ -128,11 +133,13 @@ class OTBQuattrocentoLightWidget(BaseDeviceWidget):
128
133
  )
129
134
  self._configure_push_button.clicked.connect(self._toggle_configuration)
130
135
  self._configure_push_button.setEnabled(False)
136
+ self._configure_push_button.setToolTip("Step 2: Configure device settings (connect first)")
131
137
  self._device.configure_toggled.connect(self._configuration_toggled)
132
138
 
133
139
  self._stream_push_button: QPushButton = self.ui.commandStreamPushButton
134
140
  self._stream_push_button.clicked.connect(self._toggle_stream)
135
141
  self._stream_push_button.setEnabled(False)
142
+ self._stream_push_button.setToolTip("Step 3: Start data streaming (configure first)")
136
143
  self._device.stream_toggled.connect(self._stream_toggled)
137
144
 
138
145
  # Connection parameters
@@ -70,12 +70,15 @@ class OTBQuattrocentoWidget(BaseDeviceWidget):
70
70
  self._connect_push_button.setText("Disconnect")
71
71
  self._connect_push_button.setChecked(True)
72
72
  self._configure_push_button.setEnabled(True)
73
+ self._configure_push_button.setToolTip("Step 2: Configure device settings")
73
74
  self._connection_group_box.setEnabled(False)
74
75
  else:
75
76
  self._connect_push_button.setText("Connect")
76
77
  self._connect_push_button.setChecked(False)
77
78
  self._configure_push_button.setEnabled(False)
79
+ self._configure_push_button.setToolTip("Step 2: Configure device settings (connect first)")
78
80
  self._stream_push_button.setEnabled(False)
81
+ self._stream_push_button.setToolTip("Step 3: Start data streaming (configure first)")
79
82
  self._connection_group_box.setEnabled(True)
80
83
 
81
84
  self.connect_toggled.emit(is_connected)
@@ -131,6 +134,7 @@ class OTBQuattrocentoWidget(BaseDeviceWidget):
131
134
  def _configuration_toggled(self, is_configured: bool) -> None:
132
135
  if is_configured:
133
136
  self._stream_push_button.setEnabled(True)
137
+ self._stream_push_button.setToolTip("Step 3: Start data streaming")
134
138
 
135
139
  self.configure_toggled.emit(is_configured)
136
140
 
@@ -174,6 +178,7 @@ class OTBQuattrocentoWidget(BaseDeviceWidget):
174
178
  # Command Push Buttons
175
179
  self._connect_push_button: QPushButton = self.ui.commandConnectionPushButton
176
180
  self._connect_push_button.clicked.connect(self._toggle_connection)
181
+ self._connect_push_button.setToolTip("Step 1: Connect to the Quattrocento device")
177
182
  self._device.connect_toggled.connect(self._connection_toggled)
178
183
 
179
184
  self._configure_push_button: QPushButton = (
@@ -181,11 +186,13 @@ class OTBQuattrocentoWidget(BaseDeviceWidget):
181
186
  )
182
187
  self._configure_push_button.clicked.connect(self._toggle_configuration)
183
188
  self._configure_push_button.setEnabled(False)
189
+ self._configure_push_button.setToolTip("Step 2: Configure device settings (connect first)")
184
190
  self._device.configure_toggled.connect(self._configuration_toggled)
185
191
 
186
192
  self._stream_push_button: QPushButton = self.ui.commandStreamPushButton
187
193
  self._stream_push_button.clicked.connect(self._toggle_stream)
188
194
  self._stream_push_button.setEnabled(False)
195
+ self._stream_push_button.setToolTip("Step 3: Start data streaming (configure first)")
189
196
  self._device.stream_toggled.connect(self._stream_toggled)
190
197
 
191
198
  # Connection parameters
@@ -214,18 +221,33 @@ class OTBQuattrocentoWidget(BaseDeviceWidget):
214
221
  self._acquisition_sampling_frequency_combo_box: QComboBox = (
215
222
  self.ui.acquisitionSamplingFrequencyComboBox
216
223
  )
224
+ self._acquisition_sampling_frequency_combo_box.setToolTip(
225
+ "Higher frequencies capture more detail but generate more data"
226
+ )
217
227
  self._acquisition_number_of_channels_combo_box: QComboBox = (
218
228
  self.ui.acquisitionNumberOfChannelsComboBox
219
229
  )
230
+ self._acquisition_number_of_channels_combo_box.setToolTip(
231
+ "Number of EMG channels to record from"
232
+ )
220
233
  self._acquisition_decimator_check_box: QCheckBox = (
221
234
  self.ui.acquisitionDecimatorCheckBox
222
235
  )
236
+ self._acquisition_decimator_check_box.setToolTip(
237
+ "Reduce sampling rate by averaging samples (reduces data size)"
238
+ )
223
239
  self._acquisition_recording_check_box: QCheckBox = (
224
240
  self.ui.acquisitionRecordingCheckBox
225
241
  )
242
+ self._acquisition_recording_check_box.setToolTip(
243
+ "Enable on-device recording to SD card"
244
+ )
226
245
 
227
246
  # Grid selection
228
247
  self._grid_selection_group_box: QGroupBox = self.ui.gridSelectionGroupBox
248
+ self._grid_selection_group_box.setToolTip(
249
+ "Select which electrode grids to use for recording"
250
+ )
229
251
  self._grid_selection_check_box_list: list[QCheckBox] = [
230
252
  self.ui.gridOneCheckBox,
231
253
  self.ui.gridTwoCheckBox,
@@ -244,14 +266,23 @@ class OTBQuattrocentoWidget(BaseDeviceWidget):
244
266
  self._input_group_box: QGroupBox = self.ui.inputGroupBox
245
267
  self._input_channel_combo_box: QComboBox = self.ui.inputChannelComboBox
246
268
  self._input_low_pass_filter_combo_box: QComboBox = self.ui.inputLowPassComboBox
269
+ self._input_low_pass_filter_combo_box.setToolTip(
270
+ "Low-pass filter removes high-frequency noise"
271
+ )
247
272
  self._input_low_pass_default = self.ui.inputLowPassComboBox.currentIndex()
248
273
  self._input_high_pass_filter_combo_box: QComboBox = (
249
274
  self.ui.inputHighPassComboBox
250
275
  )
276
+ self._input_high_pass_filter_combo_box.setToolTip(
277
+ "High-pass filter removes low-frequency drift and motion artifacts"
278
+ )
251
279
  self._input_high_pass_default = self.ui.inputHighPassComboBox.currentIndex()
252
280
  self._input_detection_mode_combo_box: QComboBox = (
253
281
  self.ui.inputDetectionModeComboBox
254
282
  )
283
+ self._input_detection_mode_combo_box.setToolTip(
284
+ "Monopolar: Each electrode vs reference\nDifferential: Difference between adjacent electrodes"
285
+ )
255
286
 
256
287
  self._configuration_group_boxes: list[QGroupBox] = [
257
288
  self._acquisition_group_box,
@@ -59,12 +59,15 @@ class OTBSyncStationWidget(BaseDeviceWidget):
59
59
  self._command_connect_push_button.setText("Disconnect")
60
60
  self._command_connect_push_button.setChecked(True)
61
61
  self._command_configure_push_button.setEnabled(True)
62
+ self._command_configure_push_button.setToolTip("Step 2: Configure device settings")
62
63
  self._connection_group_box.setEnabled(False)
63
64
  else:
64
65
  self._command_connect_push_button.setText("Connect")
65
66
  self._command_connect_push_button.setChecked(False)
66
67
  self._command_configure_push_button.setEnabled(False)
68
+ self._command_configure_push_button.setToolTip("Step 2: Configure device settings (connect first)")
67
69
  self._command_stream_push_button.setEnabled(False)
70
+ self._command_stream_push_button.setToolTip("Step 3: Start data streaming (configure first)")
68
71
  self._connection_group_box.setEnabled(True)
69
72
 
70
73
  self.connect_toggled.emit(is_connected)
@@ -94,6 +97,7 @@ class OTBSyncStationWidget(BaseDeviceWidget):
94
97
  def _configuration_toggled(self, is_configured: bool) -> None:
95
98
  if is_configured:
96
99
  self._command_stream_push_button.setEnabled(True)
100
+ self._command_stream_push_button.setToolTip("Step 3: Start data streaming")
97
101
 
98
102
  self.configure_toggled.emit(is_configured)
99
103
 
@@ -156,6 +160,7 @@ class OTBSyncStationWidget(BaseDeviceWidget):
156
160
  self.ui.commandConnectionPushButton
157
161
  )
158
162
  self._command_connect_push_button.clicked.connect(self._toggle_connection)
163
+ self._command_connect_push_button.setToolTip("Step 1: Connect to the SyncStation device")
159
164
  self._device.connect_toggled.connect(self._connection_toggled)
160
165
 
161
166
  self._command_configure_push_button: QPushButton = (
@@ -163,11 +168,13 @@ class OTBSyncStationWidget(BaseDeviceWidget):
163
168
  )
164
169
  self._command_configure_push_button.clicked.connect(self._toggle_configuration)
165
170
  self._command_configure_push_button.setEnabled(False)
171
+ self._command_configure_push_button.setToolTip("Step 2: Configure device settings (connect first)")
166
172
  self._device.configure_toggled.connect(self._configuration_toggled)
167
173
 
168
174
  self._command_stream_push_button: QPushButton = self.ui.commandStreamPushButton
169
175
  self._command_stream_push_button.clicked.connect(self._toggle_stream)
170
176
  self._command_stream_push_button.setEnabled(False)
177
+ self._command_stream_push_button.setToolTip("Step 3: Start data streaming (configure first)")
171
178
  self._device.stream_toggled.connect(self._stream_toggled)
172
179
 
173
180
  # Connection Paramters