Skip to content

v2.0.0 New radio, new memo, plus XDF

Choose a tag to compare

@YuyiChang YuyiChang released this 06 Sep 02:43
· 60 commits to main since this release

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.py still does. On Linux/BlueZ the driver now
    negotiates the ATT MTU explicitly — without it mtu_size stays 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.
    Set PLASMA_HOME before launching to override.
  • Devices are now plugins. Integrations load through plasma/plugins.py;
    all MSense code lives under plasma/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 .bin files.
  • 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) by plasma/tests/test_packaging.py.
  • Package discovery moved to setuptools; PyInstaller hook dirs registered through
    the pyinstaller40 entry-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
    concurrent pytest run or another lab tool can leak into a recording; see
    docs/lsl-lifecycle-and-scoping.md.