SomnoTrace v1.4.0 Release Notes
SomnoTrace v1.4.0 brings major stability, oximetry, display, and power management improvements. This release resolves key regressions, expands hardware display orientations, completely overhauls battery and charger detection, and fixes overnight display stability.
🫀 Oximetry & BLE Enhancements
- Fixed Gen1 O2 Ring Discovery & Pairing Regression:
- Fixes a regression introduced in v1.3.0 where Gen1 Wellue / Viatom O2 Ring devices (and older Checkme O2 / Pulsebit monitors) failed to discover, pair, or maintain connections.
- Implemented a clean dual-driver architecture featuring dedicated Gen1 (Legacy 128-bit UUID protocol) and Gen2 (OxyII protocol) drivers with automatic probe and fallback dispatching.
- Switched BLE discovery to Active Scanning to reliably capture
SCAN_RSPadvertisement packets containing 128-bit service UUIDs. - Added non-destructive speculative probing to ensure paired MAC addresses stored in NVS are preserved across reboots and reconnections.
🖥️ Display & UI Improvements
- Added 180° and 270° Display Rotation:
- Added support for inverted (180°) and counter-clockwise (270°) orientations, allowing flexible mounting and cable routing.
- Uses seamless software DMA strip reversal to prevent panel split-frame tearing.
- Resolved ST7789 LCD Graph Freezes:
- Adjusted SPI pixel clock to a safe 26.66 MHz (exceeding ST7789 datasheet setup/hold timing limits) while maintaining a buttery-smooth 25 Hz full-frame flush rate.
- Fixed FreeRTOS SPI DMA queue recovery to prevent kernel deadlocks during recovery routines.
- Instant Live Therapy Mode Switching:
- Changing the LCD mode in the Web UI (Live Graph ↔ Info Panel ↔ Screen Off) while therapy is actively running now applies immediately without needing to restart therapy or reboot the device.
⚡ Battery & Power Management
-
Hardware-Accurate "No Battery" Detection:
- Added dynamic burst voltage-spread ($\Delta V$) detection. Units operated purely on USB power without a physical battery installed now cleanly hide the battery icon on both the LCD and Web UI.
-
100% Full-Charge Display:
- Replaced the static IR offset with dynamic Constant Voltage (CV) taper compensation, allowing batteries to accurately display 100% when fully charged instead of capping at ~90–95%.
-
Debounced Charger State Machine & Flash Protection:
- Implemented a 15-second debounce window on the charger status pin, eliminating
charger connected/disconnectedlog flapping during BLE and SD write bursts. - Protected SPI flash memory by throttling full-charge anchor NVS writes.
- Implemented a 15-second debounce window on the charger status pin, eliminating
💾 Storage & System Stability
- SD Format Progress Mutex Initialization: Fixed a race condition during SD card format progress polling by ensuring mutex initialization at startup.
- Post-Format VFS Recovery Probe: Replaced invalid directory file probing with
opendir()to properly detect volume mount status following formatting errors.
👏 Contributors & Special Thanks
A huge thank you to everyone in the community who contributed code, bug reports, and hardware testing for this release:
- @chrisawad (Chris Awad) — for contributing full 180° and 270° display rotation support (PR #169).
- @cwm12345 (Chris Moore) — for diagnosing and fixing the SD format progress mutex race and mount probe recovery (PR #178, PR #179).
- @zzzdrkarlzzz — for accurately identifying and diagnosing the live therapy display mode switching issue (Issue #176).
- @irfanguder, @vvkovmDdjhrd, @yesezra, and @cdbrow — for providing extensive logs, testing, and feedback that enabled the root-cause diagnosis and overhaul of the battery/charger monitoring subsystem (Issue #67, Issue #72).