Skip to content

Commit b0a3ae0

Browse files
salman2135SonjaStrednayancaurnhammer
authored
Release 4.5.1 (#451)
* APIS-1444 ASR processor module (no auto-calib) * APIS-1443 Split calib step from process step, introduced larger buffer for ASR cleaning * Add CSV client support for data streaming Introduced CsvClient and CsvServer classes to enable reading data from CSV sources. Updated parser to support 'csv' as a new bt_interface option and route streaming logic accordingly. This allows the system to simulate device data input from CSV for testing or offline analysis. * Refactor CsvClient for channel count and packet size CsvClient and CsvServer now support configurable channel counts (8 or 32), with packet size tracking via a new PacketSize enum. Parser updated to instantiate CsvClient with channel count and to use packet_size for CSV packet length. Orientation packet handling and device info logic improved for mock streaming. * read samples from csv file in data server * Update CSV file paths and firmware versions Changed CSV file path construction in CsvClient to use a test-specific file based on channel count. Updated firmware versions in device info dictionaries. Added setting of BT interface to 'csv' and a debug print of current working directory in Parser. * Changed csv_client path to artifact file, added calib setting to ASR processor * Added WIP file to clean from file and compare cleaned, matched by timestamp data * Rewrote code for matrix testing * Cleaned up plotting / matrix test for ASR * Added setting file to csv_client, extended example script with corrupting channel * Updated asr example, update asr processor - ASR example now saves channels that are corrupted so they (and the channels around them) are passed to plotting - ASR processor updated with bigger time window range (0.01 to 30.0 seconds) * Added skipping already recorded files in clean example * Added plotting from folder to ASR example, made filenames less hard-coded * lower order for 1000 Hz filter * add bumpversion configs to toml * separate notch filter from general workflow * check if notch filter exists * get power line frequency value * disable impedance state change from recorder, remove debug print * fallback to default notch on failure, set cutoff freq for imp * raw exg topic for asr subscriber * remove setting bt interface to csv, remove debug print * Linted code, sorted imports * Use getter for cutoff frequency * Prevent ASR while impedance mode is active Add ImpedanceModeActiveError and guard ASR availability when impedance is running. StreamProcessor gains is_asr_processor_available() which raises ImpedanceModeActiveError if impedance mode is active and otherwise checks the ASR processor initialization. Explore.is_asr_processor_available() now delegates to the stream processor. Also add the new exception import. * use non-causal filter * add eegprep to toml * rename is_asr_processor_available method * Added exg_fs argument to get_data for CleanEEG * hotfix for missing cutoff-freq variable in filt class * Set binary time (#432) * set time as bin file name * Shorten device-info wait and set binary time Reduce the polling sleep interval from 1s to 0.5s while waiting for the device info packet to speed up startup. After receiving device info, call self.set_binary_time() to initialize device time immediately. Also remove the redundant self._check_connection() call from set_binary_time to avoid an unnecessary connection verification. * Revert "Shorten device-info wait and set binary time" This reverts commit 7fb6792. * Reapply "Shorten device-info wait and set binary time" This reverts commit d0de9e7. * set time on connect with fw version check * add new dev info and adjust time cmd * fix flake8 errors * add packet id to header length check * refactor class name to 64b command, fix docs * return bool in is_asr_processor_available * Sorted imports * add new binary time set packet ID in binary converter (#437) * Rc 4.5.0 (#435) * bumpversion minor * pip deps on toml * remove sps from args in imp recorder (#436) * Handle invalid time value set (#439) * bumpversion minor * pip deps on toml * remove sps from args in imp recorder * handle invalid binary time value set only sends the time command when the time is gregorian calendar, else raise an exception * Set imp_calculator to None on disable_imp * Create LICENSE_eegprep.txt (#441) * change padding bytes length (#440) * change depricated function (#443) * Hotfix bdf recording (#444) * change depricated function * Flush EDF buffer at quarter-second intervals Reduce the threshold for writing EDF samples from _fs to _fs // 4 so buffered data is flushed more frequently. Previously the FileRecorder only wrote when the buffer exceeded one second of samples; this change triggers writes at roughly quarter-second increments to lower memory usage and latency while retaining the existing behavior of writing full _fs-sized chunks and updating annotations/timestamps under the same lock. * Hotfix bdf recording (#445) * change depricated function * Flush EDF buffer at quarter-second intervals Reduce the threshold for writing EDF samples from _fs to _fs // 4 so buffered data is flushed more frequently. Previously the FileRecorder only wrote when the buffer exceeded one second of samples; this change triggers writes at roughly quarter-second increments to lower memory usage and latency while retaining the existing behavior of writing full _fs-sized chunks and updating annotations/timestamps under the same lock. * Write full-second sample blocks to file Replace the previous arbitrary threshold write logic with computation of whole-second sample blocks: compute num_samples_to_write as (n_samples // fs) * fs and only write when > 0. This ensures written chunks are multiples of the sampling frequency, avoids partial-frame writes and potential timestamp/data misalignment, and then drops the written samples from the buffer. * remove unused functions * Rc 4.5.0 (#446) * Bump pyEDFlib and update changelog Add 4.5.0 changelog entry (Live impedance, LSL push for preprocessed data, support for new FW version). Bump pyEDFlib from 0.1.38 to 0.1.42 and remove the eegprep==0.2.23 dependency from pyproject.toml * fix pypi rendering * remove unused file (#447) * Fix release date for version 4.5.0 Updated the release date for version 4.5.0 in the changelog. * Update tools.py (#449) * Rc 4.5.1 (#450) * feat: sleep activity example * Release 4.5.0 (#448) * APIS-1444 ASR processor module (no auto-calib) * APIS-1443 Split calib step from process step, introduced larger buffer for ASR cleaning * Add CSV client support for data streaming Introduced CsvClient and CsvServer classes to enable reading data from CSV sources. Updated parser to support 'csv' as a new bt_interface option and route streaming logic accordingly. This allows the system to simulate device data input from CSV for testing or offline analysis. * Refactor CsvClient for channel count and packet size CsvClient and CsvServer now support configurable channel counts (8 or 32), with packet size tracking via a new PacketSize enum. Parser updated to instantiate CsvClient with channel count and to use packet_size for CSV packet length. Orientation packet handling and device info logic improved for mock streaming. * read samples from csv file in data server * Update CSV file paths and firmware versions Changed CSV file path construction in CsvClient to use a test-specific file based on channel count. Updated firmware versions in device info dictionaries. Added setting of BT interface to 'csv' and a debug print of current working directory in Parser. * Changed csv_client path to artifact file, added calib setting to ASR processor * Added WIP file to clean from file and compare cleaned, matched by timestamp data * Rewrote code for matrix testing * Cleaned up plotting / matrix test for ASR * Added setting file to csv_client, extended example script with corrupting channel * Updated asr example, update asr processor - ASR example now saves channels that are corrupted so they (and the channels around them) are passed to plotting - ASR processor updated with bigger time window range (0.01 to 30.0 seconds) * Added skipping already recorded files in clean example * Added plotting from folder to ASR example, made filenames less hard-coded * lower order for 1000 Hz filter * add bumpversion configs to toml * separate notch filter from general workflow * check if notch filter exists * get power line frequency value * disable impedance state change from recorder, remove debug print * fallback to default notch on failure, set cutoff freq for imp * raw exg topic for asr subscriber * remove setting bt interface to csv, remove debug print * Linted code, sorted imports * Use getter for cutoff frequency * Prevent ASR while impedance mode is active Add ImpedanceModeActiveError and guard ASR availability when impedance is running. StreamProcessor gains is_asr_processor_available() which raises ImpedanceModeActiveError if impedance mode is active and otherwise checks the ASR processor initialization. Explore.is_asr_processor_available() now delegates to the stream processor. Also add the new exception import. * use non-causal filter * add eegprep to toml * rename is_asr_processor_available method * Added exg_fs argument to get_data for CleanEEG * hotfix for missing cutoff-freq variable in filt class * Set binary time (#432) * set time as bin file name * Shorten device-info wait and set binary time Reduce the polling sleep interval from 1s to 0.5s while waiting for the device info packet to speed up startup. After receiving device info, call self.set_binary_time() to initialize device time immediately. Also remove the redundant self._check_connection() call from set_binary_time to avoid an unnecessary connection verification. * Revert "Shorten device-info wait and set binary time" This reverts commit 7fb6792. * Reapply "Shorten device-info wait and set binary time" This reverts commit d0de9e7. * set time on connect with fw version check * add new dev info and adjust time cmd * fix flake8 errors * add packet id to header length check * refactor class name to 64b command, fix docs * return bool in is_asr_processor_available * Sorted imports * add new binary time set packet ID in binary converter (#437) * Rc 4.5.0 (#435) * bumpversion minor * pip deps on toml * remove sps from args in imp recorder (#436) * Handle invalid time value set (#439) * bumpversion minor * pip deps on toml * remove sps from args in imp recorder * handle invalid binary time value set only sends the time command when the time is gregorian calendar, else raise an exception * Set imp_calculator to None on disable_imp * Create LICENSE_eegprep.txt (#441) * change padding bytes length (#440) * change depricated function (#443) * Hotfix bdf recording (#444) * change depricated function * Flush EDF buffer at quarter-second intervals Reduce the threshold for writing EDF samples from _fs to _fs // 4 so buffered data is flushed more frequently. Previously the FileRecorder only wrote when the buffer exceeded one second of samples; this change triggers writes at roughly quarter-second increments to lower memory usage and latency while retaining the existing behavior of writing full _fs-sized chunks and updating annotations/timestamps under the same lock. * Hotfix bdf recording (#445) * change depricated function * Flush EDF buffer at quarter-second intervals Reduce the threshold for writing EDF samples from _fs to _fs // 4 so buffered data is flushed more frequently. Previously the FileRecorder only wrote when the buffer exceeded one second of samples; this change triggers writes at roughly quarter-second increments to lower memory usage and latency while retaining the existing behavior of writing full _fs-sized chunks and updating annotations/timestamps under the same lock. * Write full-second sample blocks to file Replace the previous arbitrary threshold write logic with computation of whole-second sample blocks: compute num_samples_to_write as (n_samples // fs) * fs and only write when > 0. This ensures written chunks are multiples of the sampling frequency, avoids partial-frame writes and potential timestamp/data misalignment, and then drops the written samples from the buffer. * remove unused functions * Rc 4.5.0 (#446) * Bump pyEDFlib and update changelog Add 4.5.0 changelog entry (Live impedance, LSL push for preprocessed data, support for new FW version). Bump pyEDFlib from 0.1.38 to 0.1.42 and remove the eegprep==0.2.23 dependency from pyproject.toml * fix pypi rendering * remove unused file (#447) * Fix release date for version 4.5.0 Updated the release date for version 4.5.0 in the changelog. --------- Co-authored-by: Sonja Stefani <sonja.stefani@tum.de> Co-authored-by: Sonja Stefani <35492857+SonjaSt@users.noreply.github.com> * bumpversion patch * update changelog * update author list --------- Co-authored-by: nayan <nayansharma1010@gmail.com> Co-authored-by: Christoph Aurnhammer <33545884+caurnhammer@users.noreply.github.com> Co-authored-by: Sonja Stefani <sonja.stefani@tum.de> Co-authored-by: Sonja Stefani <35492857+SonjaSt@users.noreply.github.com> --------- Co-authored-by: Sonja Stefani <sonja.stefani@tum.de> Co-authored-by: Sonja Stefani <35492857+SonjaSt@users.noreply.github.com> Co-authored-by: nayan <nayansharma1010@gmail.com> Co-authored-by: Christoph Aurnhammer <33545884+caurnhammer@users.noreply.github.com>
1 parent 9adaf4a commit b0a3ae0

7 files changed

Lines changed: 21 additions & 13 deletions

File tree

CHANGELOG.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11

22
Changelog
33
=========
4+
4.5.1 (11.6.2025)
5+
------------------
6+
* Hotfix LSL metadata
7+
48
4.5.0 (5.6.2025)
59
------------------
610
* Live impedance

README.rst

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
:target: https://pypi.org/project/explorepy
1717

1818

19-
.. |commits-since| image:: https://img.shields.io/github/commits-since/Mentalab-hub/explorepy/v4.5.0.svg
19+
.. |commits-since| image:: https://img.shields.io/github/commits-since/Mentalab-hub/explorepy/v4.5.1.svg
2020
:alt: Commits since latest release
21-
:target: https://github.com/Mentalab-hub/explorepy/compare/v4.5.0...master
21+
:target: https://github.com/Mentalab-hub/explorepy/compare/v4.5.1...master
2222

2323

2424
.. |wheel| image:: https://img.shields.io/pypi/wheel/explorepy.svg
@@ -121,10 +121,12 @@ You can also create a new issue in the GitHub repository.
121121

122122
Authors
123123
=======
124-
- `Mohamad Atayi`_
125124
- `Salman Rahman`_
126-
- `Andrea Escartin`_
127125
- `Sonja Stefani`_
126+
- `Nayan Sharma`_
127+
- `Deniz Toprak`_
128+
- `Mohamad Atayi`_
129+
- `Andrea Escartin`_
128130
- `Alex Platt`_
129131
- `Andreas Gutsche`_
130132
- `Masoome Fazelian`_
@@ -133,10 +135,12 @@ Authors
133135
- `Sebastian Herberger`_
134136

135137

136-
.. _Mohamad Atayi: https://github.com/bmeatayi
137138
.. _Salman Rahman: https://github.com/salman2135
138-
.. _Andrea Escartin: https://github.com/andrea-escartin
139139
.. _Sonja Stefani: https://github.com/SonjaSt
140+
.. _Nayan Sharma: https://github.com/rednayan
141+
.. _Deniz Toprak: https://github.com/detoprak13
142+
.. _Mohamad Atayi: https://github.com/bmeatayi
143+
.. _Andrea Escartin: https://github.com/andrea-escartin
140144
.. _Alex Platt: https://github.com/Nujanauss
141145
.. _Andreas Gutsche: https://github.com/andyman410
142146
.. _Masoome Fazelian: https://github.com/fazelian

docs/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
year = '2018-2025'
2929
author = 'Mentalab GmbH.'
3030
copyright = '{0}, {1}'.format(year, author)
31-
version = release = '4.5.0'
31+
version = release = '4.5.1'
3232
pygments_style = 'trac'
3333
templates_path = ['.']
3434
extlinks = {

installer/windows/installer.cfg

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[Application]
22
name=MentaLab ExplorePy
3-
version=4.5.0
3+
version=4.5.1
44
entry_point=explorepy.cli:cli
55
console=true
66
icon=mentalab.ico
@@ -26,7 +26,7 @@ pypi_wheels =
2626
decorator==5.1.1
2727
distlib==0.3.7
2828
eeglabio==0.0.2.post4
29-
explorepy==4.5.0
29+
explorepy==4.5.1
3030
fonttools==4.42.1
3131
idna==3.4
3232
importlib-resources==6.0.1

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = 'setuptools.build_meta'
44

55
[project]
66
name = 'explorepy'
7-
version = "4.5.0"
7+
version = "4.5.1"
88
license = { text = "MIT" }
99
readme = { file = "README.rst", content-type = "text/x-rst"}
1010
authors = [
@@ -63,7 +63,7 @@ explorepy = "explorepy.cli:cli"
6363

6464
# bumpoversion config
6565
[tool.bumpversion]
66-
current_version = "4.5.0"
66+
current_version = "4.5.1"
6767
commit = false
6868
tag = false
6969

src/explorepy/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121

2222
__all__ = ["Explore", "command", "tools", "log_config"]
23-
__version__ = '4.5.0'
23+
__version__ = '4.5.1'
2424

2525
this = sys.modules[__name__]
2626
# TODO appropriate library

src/explorepy/tools.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ def initialize_outlets(self):
459459
source_id=self.device_name + "_ExG")
460460
info_exg.desc().append_child_value("manufacturer", "Mentalab")
461461
channels = info_exg.desc().append_child("channels")
462-
for i, mask in enumerate(self.adc_mask):
462+
for i, mask in enumerate(reversed(self.adc_mask)):
463463
if mask == 1:
464464
channels.append_child("channel") \
465465
.append_child_value("name", self.channel_names[i]) \

0 commit comments

Comments
 (0)