You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit e825f90
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: ROADMAP.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -164,6 +164,7 @@ Phase 3 software progress has begun:
164
164
-[x] MQTT PASTE BYTES prepares a separate 0-128-byte publish draft from Byte Lab, including empty payloads. Explicit Text/Bytes selection preserves the current text field; queued requests retain captured bytes/topic/QoS/retain through later edits and Home. Paste/mode changes never send or log, cleanup rejects stale taps, and profiles/metadata exclude the body. Ten native scenarios cover every length, pending/active ownership, errors and 25 stable cycles. Four actual Byte Lab/SDK/broker round trips cover QoS 0/1/2 and empty data; three private mutations are rejected. The built firmware remains unflashed; physical validation is open.
165
165
-[ ] Validate authenticated TLS and WSS brokers, saved-profile reboot/overwrite/delete/corruption recovery, cleartext confirmation/expiry, QoS 0/2, wildcard subscriptions, fragmentation and receive-ring overflow, failed auth/DNS/TLS/timeout paths, SD full/removal, and the second panel family. NVS encryption remains part of the opt-in hardened-device profile.
166
166
-[x] BLE GATT Explorer reuses the shared NimBLE scanner but never starts it or connects automatically. It caps results at eight devices, 16 services, and 32 characteristics; requires product-specific BLE profiles to be off; exposes UUIDs, handles, and properties; supports explicit reads and one notification/indication subscription; gates 1-64-byte raw writes behind an unchanged five-second confirmation; and atomically exports the bounded evidence snapshot to SD only after an explicit tap.
167
+
-[x] BLE evidence never publishes after a rejected header/row write, retains the named TMP and preserves the first cause through close/error reporting. Creation stops on noncollision directory/probe/open/stream errors and reports `EEXIST` after all ten names are occupied. All 50 native callback/formatter/storage cases pass; the previous callback fails 28 controls, including eight rejected writes incorrectly published. Exact bytes, cache isolation/capacity, admission gates and 25 failure/restart pairs are checked with closed streams/descriptors and balanced modeled locks. Linux CI retains source hashes and logs; physical SD, live BLE, panel and power cuts remain open.
167
168
-[x] BLE COPY LATEST VALUE copies a complete 0-64-byte received payload and disarms write confirmation without BLE traffic. It uses the original value handle, rejects truncated or failed buffer copies, and preserves the shared clipboard through disconnect. A read returns one ATT response, not an assembled long attribute. On-device startup tests cover all lengths 0-64, a 65-byte rejection, chained/short buffers, read errors, notify/indicate, stale connections and disconnect. Live GATT copy and evidence-export checks remain open.
168
169
-[x] On ST7121 hardware, an explicit scan filled the eight-device cap and found the owned `KICKR CORE 4816`. Read-only discovery reported 12 services and the disclosed 32-characteristic cap; Manufacturer Name returned `WahooFitness`; Indoor Bike Data `0x2AD2` subscribed, delivered an 8-byte notification, and unsubscribed. The published CSV contained eight advertisements, 32 characteristic rows, and the correctly labeled notification row. Home released the live connection, immediate re-entry was idle, System reported `Reset: USB`, and internal heap remained 62 KB free/60 KB minimum.
169
170
-[ ] Validate no-target and overflowing scans, connection cancel/failure, pairing/authentication errors, indications and fragmented/over-64-byte values, the raw-write confirmation/expiry path on a disposable target, SD full/removal and retained-temp behavior, interaction with each optional product profile, and the second panel family.
Copy file name to clipboardExpand all lines: docs/architecture.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -91,6 +91,8 @@ Ride history shows totals only after recovery, reading and closing the summary s
91
91
92
92
Ride recording checks both directories and advances through its 100 same-second names only on CSV/TMP collisions. Other creation errors stop Start; a failed stream conversion closes its descriptor and attempts to remove the newly created empty TMP. Rejected headers/rows and periodic sync failures use one abort path that closes recording ownership, retains the TMP and reports the captured first cause. Tick and Stop also abort on known SD loss before another row or publication. Healthy Stop commits the CSV before rebuilding history, so an index failure leaves the published ride authoritative. Native tests compile the actual lifecycle and history helpers together with storage; UI, BLE data, time and SD boundaries are controlled.
93
93
94
+
BLE evidence copies its bounded shared cache under the existing lock, then writes that snapshot synchronously. Each directory, final-name probe and file-creation boundary uses a fresh error; only actual CSV/TMP collisions advance the ten-name search. Header and row failures capture the first cause and close the stream without invoking publication. The named TMP remains available for inspection, and cleanup/error reporting cannot replace that cause. Healthy saves use the unchanged storage helper and CSV schema. Native checks compile the callback, its format/status helpers and cache typedefs with modeled BLE/UUID/lock boundaries and real files; no worker or LVGL pool change is introduced.
95
+
94
96
Ring's saved heart-rate timestamp becomes loaded only after incomplete-tail repair, seek/size checks, the expected bounded tail read and close succeed. Read or close errors leave the checkpoint unchanged and retryable. Its existing health timer retains queued samples and defers history requests until that load succeeds, then filters timestamps against the recovered checkpoint. Known SD unavailability blocks queue processing even when a checkpoint is cached; timeout state still advances before the storage gate. Appends preserve the first error through close and tail repair. Native files and controlled queue/timer/SD boundaries verify this behavior; physical SD, BLE and scheduling remain open.
95
97
96
98
Ebooks reads up to 8 KiB into its existing cached PSRAM buffer. Page text, current/next byte positions, navigation state and scroll position change only after successful seek, read and close. Failure preserves the confirmed page and positions, reports the first error and allows retry when storage is available. Reader initialization clears both offsets and disables navigation until loading succeeds. Callbacks recheck disabled state and screen pointers; negative positions and additions beyond the platform's `long` range are rejected. Native files and controlled UI/heap/SD boundaries verify the transitions; physical SD and panel behavior remain open.
`event` is `advertisement`, `characteristic`, `read`, `notification`, or `indication`. Properties use `R` for read, `W` for write with response, `w` for write without response, `N` for notify, and `I` for indicate. The snapshot is deliberately bounded to eight advertisers, 16 services, 32 characteristics, and 64 displayed value bytes. A trailing ` ...` marks a truncated value; `[unavailable]` means receive-buffer copying failed and no bytes are exported. These markers are not hex bytes. Earlier firmware labeled indications as `notification`. It includes nearby device names and addresses, so saving is explicit and the UI discloses this privacy tradeoff.
153
153
154
+
BLE evidence creation stops on directory/probe/open/stream errors and retries only occupied CSV/TMP names; exhausting the ten same-second names reports `EEXIST`. A failed stream conversion attempts to remove its newly created empty TMP. Each CSV write must succeed before the publication helper runs. A rejected header or row closes the stream, retains the named TMP and reports its first cause without retrying publication; missing errno falls back to `EIO`. Healthy publication still requires flush, sync and close. Native byte/fault checks cover retained generations and same-second restart; physical SD and power-loss recovery remain hardware checks.
155
+
154
156
These formats are still pre-1.0. Add fields at the end when possible, never silently change a unit, and document any incompatible migration in release notes.
Copy file name to clipboardExpand all lines: docs/testing.md
+15Lines changed: 15 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -24,6 +24,7 @@ Python 3 and Node.js are needed for the quick checks. The configuration checks a
24
24
| Offline apps, SPI or I2C editor/result flows |[Offline and peripheral UI](#offline-and-peripheral-ui). |
25
25
| Serial, saved serial logs or RTU Frames |[Serial and RTU UI](#serial-and-rtu-ui). |
26
26
| UART or RS-485 SD log writes |[Serial log writers](#serial-log-writers) and a firmware build. |
27
+
| BLE evidence export |[BLE evidence storage](#ble-evidence-storage) and a firmware build. |
27
28
| Modbus TCP, NTP, Wake-on-LAN, UDP or HTTP fixtures |[Network fixtures and UI](#network-fixtures-and-ui). |
28
29
| MQTT app, packet codec or client protocol |[Lifecycle/storage](#mqtt-lifecycle-and-storage) and [client/broker fixture](#mqtt-client-and-broker-fixture). |
29
30
| OTA manifest parsing and update eligibility |[OTA manifests](#ota-manifests) plus a firmware build. |
@@ -211,6 +212,20 @@ UI status/control callbacks, clocks/ticks, SD admission and I/O failures are con
211
212
212
213
Full serial/function/storage/header/test hashes, generated function/config/storage source and compile/result logs stay under `build/serial-log-write/`. Linux CI retains `serial-log-write-logs`, including available failure diagnostics. These 82 cases are separate from the Windows native total.
This portable fixture compiles the actual BLE save callback, its status/address/property/name helpers, its three cache typedefs and the complete `storage_io.c`. Its 50 cases check exact native CSV/TMP bytes, header and each row failure, directory/probe/open/stream errors, flush/sync/close/publication failures, mixed collisions, all ten occupied names and 25 rejected-header/restart pairs. Every case checks closed streams/descriptors and balanced modeled locks. The previous callback fails 28 controls, including eight rejected writes incorrectly published as CSVs; other controls concern creation/error handling and the retained-file notice.
222
+
223
+
Healthy cases cover read/notification/indication labels, empty/truncated/unavailable values, CSV name sanitization, missing peers, invalid service indexes and all eight device/16 service/32 characteristic/64 value-byte cache limits. Mutating the shared cache after the snapshot lock exits preserves the originally captured output. Maximum-cache entries repeat controlled identities to exercise capacity; this fixture does not validate live discovery identities.
224
+
225
+
Cache contents, NimBLE type boundaries and 16-bit UUID conversion, locks, SD admission/error reporting, clocks and I/O faults are controlled. The snapshot is taken through the actual callback; no NimBLE, BLE traffic, real LVGL, SDK mount/error filtering, 32/128-bit UUID conversion or physical FAT/SD/panel/power behavior is executed. UTC fixes filenames, Windows descriptors use binary mode for SDK LF bytes, and cleanup removes only owned files and directories. Failed writes close without a publication retry and retain a named TMP; those bytes can be partial or complete-looking without confirmed physical durability.
226
+
227
+
Full BLE/function/cache-type/storage/header/test hashes, generated function/type/config/storage source and compile/result logs stay under `build/ble-evidence/`. Linux CI retains `ble-evidence-logs`, including available failure diagnostics. These 50 cases are separate from the Windows native total and live GATT tests.
0 commit comments