Repository navigation
v2.0.0 New radio, new memo, plus XDF
A major release focused on a rebuilt MSense BLE stack, a built-in LSL→XDF
recorder, an HTML session memo, and a hardened packaging / distribution setup.
⚠️ Bleaking changes
- MSense BLE backend swapped to bleak. The
live-device driver (plasma/devices/msense/device.py) no longer uses
simplepyble;ble_scan.pystill does. On Linux/BlueZ the driver now
negotiates the ATT MTU explicitly — without itmtu_sizestays pinned at 23. - Writable-state location is now resolved once at import. Order:
$PLASMA_HOME→ a per-OS user-data dir when running as a packaged app
(~/Library/Application Support/PLASMA,%LOCALAPPDATA%\PLASMA,
~/.local/share/plasma) → the working directory when running from source.
SetPLASMA_HOMEbefore launching to override. - Devices are now plugins. Integrations load through
plasma/plugins.py;
all MSense code lives underplasma/devices/msense/.
📡 MSense wristbands
- BLE core overhauled onto bleak with automatic reconnection after link loss.
- BlueZ MTU negotiation so large NUS payloads are not fragmented to 23-byte
writes on Linux. - Signal-quality check (SQC) stream stabilized: fixed a BLE freeze, added a
no-progress watchdog with telemetry, made the notification callback
non-blocking, and added an adaptive ACK cadence with revised SQC options. - LSL journaler during SQC — SQC sessions now emit a timestamped LSL journal
stream alongside the raw data. - Data downloader: custom paths accept multiple directories, and extraction
recovers cleanly from truncated / broken.binfiles. - Reworked MSense tab layout.
🎬 Recording & session memo
- Built-in LSL→XDF recorder (
plasma/lsl_recorder.py,plasma/xdf_writer.py)
with a recording-capacity indicator. Every PLASMA-created outlet is tagged via
mark_plasma_origin(info)so the recorder can identify its own streams. - New HTML session memo panel (
gr.HTML) with themed device-status colours. - LSL lifecycle & scoping documented in
docs/lsl-lifecycle-and-scoping.md.
📦 Packaging & CI
- Version is single-sourced from
plasma.__version__and validated
(PEP 440) byplasma/tests/test_packaging.py. - Package discovery moved to setuptools; PyInstaller hook dirs registered through
thepyinstaller40entry-point group so device plugins survive the frozen
build. - Linux build added to
.github/workflows/build.yml, plus a post-build
smoke test (.github/smoke_test.sh) on all three platforms.
🐛 Bug fixes
- Fixed duplicate notifications when an MSense device restarts.
- Fixed build import errors in the frozen app.
- Fixed device-name mismatch in the memo status display.
Known issues
- LiDAR IP address must still be set manually.
- The LSL→XDF recorder captures every stream on the default liblsl session, so a
concurrentpytestrun or another lab tool can leak into a recording; see
docs/lsl-lifecycle-and-scoping.md.