budctl05f4013
Verification log: A1 and A2 pass on the phone
The Android app on a Nothing Phone (3a), Android 17, over USB debugging: the same session start as HW1 byte for byte over Android's RFCOMM socket, noise control written and read back, the idle close, the not-connected paths with the lid closed, and the laptop getting the channel back once the app was left. The busy path is untested: no other control app is left on the phone. docs/android.md: the phone joins over USB debugging.
+3 −1
2 files changed
- M docs/android.md +1 −1
- M docs/protocol/realme_t310.md +2 −0
| @@ -109,7 +109,7 @@ Written from Android's API reference. No other app's code is read for it (rule 2 | |||
| 109 | 109 | for Gradle (`/opt/android-studio/jbr`). The NDK, from Studio's SDK Manager. | |
| 110 | 110 | `rustup target add aarch64-linux-android x86_64-linux-android` and `cargo install cargo-ndk`. | |
| 111 | 111 | *Done when* the NDK is in `~/Android/Sdk/ndk` and `adb devices` lists the emulator. The phone | |
| 112 | − | joins before A1: wireless debugging, paired with `adb pair`. | |
| 112 | + | joins before A1, over USB debugging (`android-udev` gives adb access to it without root). | |
| 113 | 113 | 1. **The core builds for Android.** `bluez`, `transport::{rfcomm, sdp, socket}`, `scan` and | |
| 114 | 114 | `connect` go behind `cfg(target_os = "linux")`, and `libc` and `zbus` become Linux-only | |
| 115 | 115 | dependencies. `PairedDevice` moves to the crate root, since Android fills it too. CI checks the | |
| @@ -618,6 +618,8 @@ The owner will not install realme Link (2026-10-27), so there is no app capture. | |||
| 618 | 618 | ||
| 619 | 619 | | Date | Checkpoint | Result | Notes | | |
| 620 | 620 | |---|---|---|---| | |
| 621 | + | | 2026-11-01 | A2 Android app (`docs/android.md#checkpoints`): noise control off → anc → off, the idle close, then `budctl status` on the laptop | pass | Each write was acked and read back within 0.3-0.4 s, all on one session. Every session closed 10 s after its last command. `budctl status` on the laptop worked once the app was left. Transparency was not tried on the phone; W1 covers its bytes | | |
| 622 | + | | 2026-11-01 | A1 Android app on the phone (Nothing Phone (3a), Android 17), read-only, debug on | pass | The same session start as HW1, byte for byte, over Android's RFCOMM socket: the same bitmap (`BF 1F 5A 20 45 04 40 00`), id `063C12`, events offered `01 02 03 04 05 06 0D F1 F4`, and the `0x8205` ack about 70 ms after the subscribe, skipped as [§6](#subscribe) says. Replies came 30-110 ms after each request. A session opened 1.1-1.6 s after the connect began, and a full reading took 2.3 s more. Lid closed: the first Read connected but the buds closed the link at once ("case lid closed?"), and the next said "paired but not connected"; with the lid open, Read worked again. The busy path is untested, since no other control app is left on the phone | | |
| 621 | 623 | | 2026-10-28 | HW2 `budctl --debug dual`, with the phone and the laptop connected | pass, with a fix | The T310 answered `0x0112` in 160 ms with four entries: the owner's phone (connected, flags `00`), the laptop (connected, flags `01`) and two phones that had connected before (state `00`). Every `len` was 3 more than the name length. The addresses came first byte first, so budctl printed them backwards; fixed the same day ([§9.10](#dual-address)). The addresses and other people's device names are left out of this log on purpose | | |
| 622 | 624 | | 2026-10-28 | W11e `eq delete custom-5` | pass | The delete matched the derived frame byte for byte, and was acked with `00 05`. The list read back at once is empty. Deleting the preset in use is still untested. See [§10.9](#custom-eq-delete) | | |
| 623 | 625 | | 2026-10-28 | W11d `eq rename custom-5 Gym` | pass | The save with the new name matched the derived frame byte for byte, and was acked with `00 05`. The list read back at once has id `05` named Gym, bands unchanged, in use. See [§10.9](#custom-eq-rename) | | |