Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ Key is always 16 bytes. PKCS7 padding. ECB mode (no IV).
| `0x00` | GET_CONFIG | empty | 40 bytes plaintext | Ring settings struct (brightness, alarms, motor, etc). See section below. The reply is stable across sessions on a given device only because settings don't change unless you flip them in the vendor app. |
| `0x01` | SET_CONFIG | 8 bytes plaintext | ack | Writes one field of the settings struct. See section below. |
| `0x03` | LIVE_SAMPLES_A | empty | 6-byte header + N bytes | Real-time PPG waveform, ~100 samples/sec. Header is `00 00 00 00 <count_lo> <count_hi>`. No parsed SpO₂/HR. |
| `0x04` | LIVE_SAMPLES_B | empty | 24-byte header + 2-byte count + N bytes | 24-byte header carries the parsed live SpO₂ / HR / motion / battery (see section below). Body is the same ~100 Hz PPG waveform as `0x03`. Do not call before `cmd=0xF2` in a file-transfer flow — puts the ring in a state that gates out file commands until disconnect. |
| `0x04` | LIVE_SAMPLES_B | empty | 24-byte header + 2-byte count + N bytes | 24-byte header carries the parsed live SpO₂ / HR / motion / battery (see section below). Body is the same ~100 Hz PPG waveform as `0x03`. Can be interleaved with file-transfer commands on the same connection — see the live-vs-files section below. |
| `0x05` | (history?) | empty | 922 bytes | u8 count + 102 × 9-byte records, each starting `03 00 ...`. Live (changes per call). Purpose unknown. |
| `0x10` | (setup) | 1 byte `0x00` | 0-byte ack | Required in the post-auth handshake. Purpose unknown. |
| `0xC0` | SET_UTC_TIME | 8 bytes (see below) | ack | Sets the ring's RTC. |
Expand Down Expand Up @@ -584,10 +584,12 @@ end-to-end against a T8520 with firmware `2D010002`:
cmd=0xF4 READ_FILE_END (empty, seq=M) ack
```

Calling `cmd=0x04` (live samples) before `cmd=0xF2` puts the ring into a
live-streaming state that gates out file commands until disconnect.
Either do live sampling **or** file transfer in a given session, not
both.
On firmware `2D010001`, live sampling (`cmd=0x04`) and file transfer
share a session freely as long as the implementation serialises BLE I/O.
Verified by polling `cmd=0x04` at 1 Hz for ~80 s and then running the
full file-transfer sequence
`cmd=0xF4 → cmd=0xF1 → cmd=0xF2 → cmd=0xF3 (chunked) → cmd=0xF4`
on the same link, with the live poll interleaved between file commands.

`cmd=0xE1` GET_INFO can be issued at any point in the flow without
disrupting state.
Expand Down