What's new since v1.2.1
O2 Ring (Gen1 / Legacy) support
This is the headline change. First-generation O2 Ring devices were
syncing files but their recordings never appeared on the dashboard,
and uploads to SleepHQ silently failed. The root cause was a
misinterpreted binary file format — the firmware was reading the
vendor's VLD3 header at the wrong byte offsets, so every recording
looked like it had an invalid timestamp and was discarded.
- Recordings now show up. The VLD3 file parser was rewritten from
scratch against the vendor's documented byte layout. SpO₂, pulse,
and acceleration samples are decoded correctly, and the recording's
start time is extracted from the header (with the filename as a
fallback when the header clock was never set on the ring). - One bad file no longer blocks the whole sync. If a single
recording fails to transfer or convert, the sync continues with the
remaining files instead of aborting. Failed files are retried on the
next sync automatically. - The ring's clock is now synchronized and verified. When you pair
or pull from a Gen1 ring, the firmware checks the ring's current
time against the real clock, corrects it if it's off by more than a
couple of seconds, and then reads it back to confirm it took. This
prevents future recordings from being stamped with wrong dates. - You can see what's happening. The dashboard now reports how many
recordings loaded, how many have time-quality warnings, how many
failed to parse, and how many were downloaded but are still awaiting
conversion — so you're not left guessing why a graph is missing. - Bad data is held back from SleepHQ. Recordings with missing or
unreliable timestamps, or whose file size doesn't match what the
header claims, are marked as not uploadable. They still appear on
the local dashboard (with a warning) but won't be pushed upstream
until they're trustworthy. - Power-loss recovery. If the device loses power mid-conversion,
the next boot picks up where it left off instead of leaving a
half-written recording stuck in limbo.
Device scanning
- Both ring generations are found in a single scan. Previously the
scanner only looked for whichever ring type was currently paired.
Now it scans for Gen1 and Gen2 rings at the same time and merges the
results, so switching devices no longer requires forgetting and
re-pairing.
SD card reliability
- Factory exFAT cards now work out of the box. New 64 GB SDXC
cards ship formatted as exFAT, which the firmware's FATFS doesn't
support. Pressing "Format SD" used to silently do nothing on these
cards. Now it reformats them to FAT32 and mounts cleanly. - Automatic reboot after formatting. After a successful SD format
the device reboots itself so the card is remounted in a clean state,
instead of requiring a manual power cycle. - 1-bit fallback. If the SD card can't be initialised in 4-bit
mode, the formatter retries in 1-bit mode before giving up — useful
for cards or slots with marginal wiring.
Display
- No more screen glitches when rotating. Panel rotation was
previously applied from the HTTP handler thread, which could race
with the display task's SPI transactions and corrupt the screen.
Rotation is now deferred to the display task. - Info panel no longer pauses therapy tracking. Switching to the
info panel view used to make the firmware think therapy had stopped;
now both the graph and info views are treated as "therapy active."