fix(protocol): correct A5 frame classification and chunk counter formula
This commit is contained in:
@@ -1231,21 +1231,23 @@ Two critical differences from `build_bw_frame`:
|
||||
| Frame | offset_word | counter | params | Purpose |
|
||||
|---|---|---|---|---|
|
||||
| Probe | `0x1004` | `0x0000` | 10 bytes (`bulk_waveform_params(0)`) | Initiate transfer |
|
||||
| Chunk 1 | `0x1004` | `0x0400` | 11 bytes | First data chunk |
|
||||
| Chunk 2 | `0x1004` | `0x0800` | 11 bytes | Second chunk |
|
||||
| Chunk N | `0x1004` | `N * 0x0400` | 11 bytes | Nth chunk |
|
||||
| Chunk 1 | `0x1004` | `key4[2:4]` | 11 bytes | First data chunk |
|
||||
| Chunk 2 | `0x1004` | `key4[2:4] + 0x0400` | 11 bytes | Second chunk |
|
||||
| Chunk N | `0x1004` | `key4[2:4] + (N-1) * 0x0400` | 11 bytes | Nth chunk |
|
||||
| … | … | … | … | … |
|
||||
| Termination | `0x005A` | `last + 0x0400` | 10 bytes | End transfer |
|
||||
| Termination | `0x005A` | `key4[2:4] + N * 0x0400` | 10 bytes | End transfer |
|
||||
|
||||
> ⚠️ **2026-04-06 CORRECTED — chunk counter is monotonic for ALL chunks.**
|
||||
> The 4-2-26 BW TX capture showed counter=0x1004 for chunk 1, which was hardcoded as a
|
||||
> special case. This was a Blastware artifact. Empirically confirmed: counter=0x0400 for
|
||||
> chunk 1 works correctly; counter=0x1004 causes the device to time out. The device does
|
||||
> NOT strictly validate the counter value — it streams data for any valid 5A request for
|
||||
> the given key. Use `chunk_num * 0x0400` (monotonic) for all chunks.
|
||||
> BW's true internal formula is `key4[2:4] + n * 0x0400`. For event 1 (key `01110000`)
|
||||
> this equals `n * 0x0400` since `key4[2:4] = 0x0000`. The monotonic formula is correct
|
||||
> for all keys encountered on this device.
|
||||
> ⚠️ **2026-04-06 CORRECTED — chunk counter is `key4[2:4] + (N-1) * 0x0400`.**
|
||||
> The 4-2-26 BW TX capture showed counter=0x1004 for chunk 1 of key `01110000`, leading to
|
||||
> an interim "monotonic n * 0x0400" formula. This was accidentally correct because
|
||||
> `key4[2:4] == 0x0000` for that event.
|
||||
>
|
||||
> **2026-04-24 FINAL CORRECTION:** The counter is an absolute circular-buffer address.
|
||||
> BW's true formula is `key4[2:4] + (chunk_num - 1) * 0x0400` where `key4[2:4]` is the
|
||||
> event's storage base offset (`(key4[2]<<8) | key4[3]`). For keys where
|
||||
> `key4[2:4] != 0x0000` (e.g. key `01111884`), using `n * 0x0400` sends requests into the
|
||||
> wrong buffer region — the device returns data from a completely different event and
|
||||
> `b"Project:"` never appears in the stream. Confirmed correct 2026-04-24.
|
||||
|
||||
The `stop_after_metadata=True` flag causes the loop to stop as soon as `b"Project:"` is
|
||||
found in the accumulated A5 frame data, typically after 4–9 chunks. A termination frame
|
||||
|
||||
Reference in New Issue
Block a user