Experimental release - for testing purposes only
Changes since v1.0.7
Oximetry
- Persistent-mode polling: Added an experimental persistent BLE connection mode for the O2 Ring that uses sparse unauthenticated
cmd=0x04queries at 30-second intervals, eliminating repeated connect/discovery/auth/setup cycles and reducing heart-rate artifacts caused by reconnection bursts. - Upload support: Added full oximetry upload pipeline with separate transport scope, canonical format generation (VLD3 export for SleepHQ, full directory tree for SMB), and per-unit state tracking with fingerprinting.
- Canonical conversion reliability: Simplified error handling and added FATFS rename-over workaround in the canonical conversion pipeline. Added comprehensive logging to help diagnose migration failures.
- Deferred migration: Moved canonical oximetry migration to a background task so it no longer blocks
app_mainstartup.
Dashboard / Web UI
- Unified oximetry charts: Integrated oximetry panels (SpO₂, pulse) directly into the main dashboard alongside CPAP charts, with an optional "clamp to CPAP times" toggle that filters oximetry data to the therapy window.
- Zoom scroll fix: Fixed a bug where clicking reset-zoom or zooming out to full range caused the page to jump to the top on desktop. Reset now updates existing charts in-place via updateDashView() instead of destroying and rebuilding the entire chart DOM.
- Terminology: Replaced "session" with "part" in upload UI and status messages for clarity.
- Screenshots: Updated web dashboard screenshot with corrected aspect ratio.
System / Stability
- NVS safety: Serialized all NVS reads through
nvs_writer_runand eliminated unsafe PSRAM pointer access by copying arguments to internal-stack locals. Doublednvs_writerstack to 8 KB with a low-watermark warning to catch potential overflows. - WebSocket reliability: Refactored WebSocket send operations to use
httpd_queue_workand increased thews_fwdstack to 12 KB. - FATFS compatibility: Added
unlink()beforerename()inupload_ox_saveto work around FATFS's inability to rename over an existing file, fixing a bug where oximetry upload state was not persisted across reboots, causing repeated re-uploads. - SPIRAM: Large buffers now allocated in SPIRAM when available.