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.
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/PKG-INFO +46 -38
- biosignal_device_interface-0.2.4/README.md +112 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/plot_widgets/biosignal_plot_widget.py +53 -4
- biosignal_device_interface-0.2.4/biosignal_device_interface/gui/ui/devices_template_widget.ui +133 -0
- {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
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/ui/otb_muovi_template_widget.ui +7 -1
- {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
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/ui/otb_quattrocento_template_widget.ui +13 -1
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/ui/otb_syncstation_template_widget.ui +24 -18
- biosignal_device_interface-0.2.4/biosignal_device_interface/gui/ui_compiled/devices_template_widget.py +104 -0
- {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
- {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
- {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
- {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
- {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
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/pyproject.toml +3 -3
- biosignal_device_interface-0.2.2/README.md +0 -104
- biosignal_device_interface-0.2.2/biosignal_device_interface/gui/ui/devices_template_widget.ui +0 -38
- biosignal_device_interface-0.2.2/biosignal_device_interface/gui/ui_compiled/devices_template_widget.py +0 -56
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/LICENSE +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/__init__.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/__init__.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/devices/__init__.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/devices/core/base_device_constants.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/devices/otb/otb_constants.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/devices/otb/otb_muovi_constants.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/devices/otb/otb_quattrocento_constants.py +0 -0
- {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
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/devices/otb/otb_syncstation_constants.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/constants/plots/color_palette.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/__init__.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/core/__init__.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/core/base_device.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/otb/__init__.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/otb/otb_muovi.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/otb/otb_quattrocento.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/otb/otb_quattrocento_light.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/devices/otb/otb_syncstation.py +0 -0
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/device_template_widgets/__init__.py +0 -0
- {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
- {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
- {biosignal_device_interface-0.2.2 → biosignal_device_interface-0.2.4}/biosignal_device_interface/gui/device_template_widgets/otb/__init__.py +0 -0
- {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.
|
|
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:
|
|
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 ::
|
|
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
|
|
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
|
+
[](https://pypi.org/project/biosignal-device-interface/)
|
|
43
|
+
[](https://pypi.org/project/biosignal-device-interface/)
|
|
44
|
+
[](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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
83
|
-
Note: It is recommeded to install it globally.
|
|
84
|
-
```bash
|
|
85
|
-
pip install poetry
|
|
86
|
-
```
|
|
90
|
+
### Installation
|
|
87
91
|
|
|
88
|
-
|
|
92
|
+
Install from PyPI:
|
|
89
93
|
```bash
|
|
90
|
-
|
|
94
|
+
pip install biosignal-device-interface
|
|
91
95
|
```
|
|
92
96
|
|
|
93
|
-
|
|
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
|
|
99
|
+
poetry add biosignal-device-interface
|
|
97
100
|
```
|
|
98
101
|
|
|
99
|
-
###
|
|
100
|
-
Poetry
|
|
101
|
-
```Bash
|
|
102
|
-
poetry add git+https://github.com/NsquaredLab/Biosignal-Device-Interface.git
|
|
103
|
-
```
|
|
102
|
+
### Development Installation
|
|
104
103
|
|
|
105
|
-
|
|
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
|
|
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
|
|
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
|
+
[](https://pypi.org/project/biosignal-device-interface/)
|
|
19
|
+
[](https://pypi.org/project/biosignal-device-interface/)
|
|
20
|
+
[](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
|