diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index aacbbab..145e88e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -2,9 +2,9 @@ name: Firmware CI
on:
push:
- branches: [main, develop, dev]
+ branches: [main, develop, dev, audit/**]
pull_request:
- branches: [main, develop, dev]
+ branches: [main, develop, dev, audit/**]
jobs:
build-and-test:
@@ -19,6 +19,9 @@ jobs:
with:
python-version: "3.11"
+ - name: Check Web Route Parity
+ run: python3 scripts/check_web_route_parity.py
+
- name: Install PlatformIO
run: |
python -m pip install --upgrade pip
diff --git a/data/webui/index.html b/data/webui/index.html
index 2e17a04..27030f8 100644
--- a/data/webui/index.html
+++ b/data/webui/index.html
@@ -46,6 +46,7 @@
+
@@ -57,6 +58,11 @@
+
diff --git a/data/webui/script.js b/data/webui/script.js
index 7584b9a..f664b66 100644
--- a/data/webui/script.js
+++ b/data/webui/script.js
@@ -169,6 +169,20 @@ function bindEvents() {
}
});
+ document.getElementById("wifiReconnectBtn").addEventListener("click", async () => {
+ try {
+ const result = await requestJson("/api/network/wifi/reconnect", {
+ method: "POST",
+ headers: jsonHeaders(),
+ body: "{}",
+ });
+ setJson("actionResult", result);
+ await Promise.all([refreshStatus(), refreshNetwork()]);
+ } catch (error) {
+ setJson("actionResult", { error: error.message });
+ }
+ });
+
document.getElementById("wifiScanBtn").addEventListener("click", async () => {
try {
const result = await requestJson("/api/network/wifi/scan", {
@@ -211,9 +225,32 @@ function bindEvents() {
}
});
+ document.getElementById("mqttPublishForm").addEventListener("submit", async (event) => {
+ event.preventDefault();
+ const topic = document.getElementById("mqttTopic").value.trim();
+ const payload = document.getElementById("mqttPayload").value;
+ try {
+ const result = await requestJson("/api/network/mqtt/publish", {
+ method: "POST",
+ headers: jsonHeaders(),
+ body: JSON.stringify({ topic, payload }),
+ });
+ setJson("actionResult", result);
+ await Promise.all([refreshStatus(), refreshNetwork()]);
+ } catch (error) {
+ setJson("actionResult", { error: error.message });
+ }
+ });
+
document.getElementById("espnowOnBtn").addEventListener("click", async () => {
try {
- await sendControl("ESPNOW_ON");
+ const result = await requestJson("/api/network/espnow/on", {
+ method: "POST",
+ headers: jsonHeaders(),
+ body: "{}",
+ });
+ setJson("actionResult", result);
+ await Promise.all([refreshStatus(), refreshNetwork()]);
} catch (error) {
setJson("actionResult", { error: error.message });
}
@@ -221,7 +258,13 @@ function bindEvents() {
document.getElementById("espnowOffBtn").addEventListener("click", async () => {
try {
- await sendControl("ESPNOW_OFF");
+ const result = await requestJson("/api/network/espnow/off", {
+ method: "POST",
+ headers: jsonHeaders(),
+ body: "{}",
+ });
+ setJson("actionResult", result);
+ await Promise.all([refreshStatus(), refreshNetwork()]);
} catch (error) {
setJson("actionResult", { error: error.message });
}
diff --git a/docs/rapport_ble_mac.json b/docs/rapport_ble_mac.json
new file mode 100644
index 0000000..b25813a
--- /dev/null
+++ b/docs/rapport_ble_mac.json
@@ -0,0 +1,48 @@
+{
+ "timestamp_utc": "2026-02-20T20:47:49.473689+00:00",
+ "serial": {
+ "ping": "PONG",
+ "ble_start": "OK BT_BLE_START",
+ "bt_status_after_start": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":true,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"advertising\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ "ble": {
+ "scan": [
+ {
+ "name": "Withings Aura 5E",
+ "address": "9214040A-F54E-37AC-4B4B-F609F94ECB5E",
+ "rssi": null
+ },
+ {
+ "name": "Bagage de Clément",
+ "address": "8E6D24D4-22CE-C8FC-FC6F-01090C567679",
+ "rssi": null
+ },
+ {
+ "name": "RTC_BL_PHONE_A252",
+ "address": "3DD63766-AF90-14D9-7964-F37AE7FB0704",
+ "rssi": null
+ },
+ {
+ "name": "Uscan 42",
+ "address": "98923C99-1897-8665-7EE6-647A96924DB7",
+ "rssi": null
+ },
+ {
+ "name": "GSM de clemsail",
+ "address": "CFCE5495-5537-1F54-1A77-7CF8CEC57FF3",
+ "rssi": null
+ }
+ ],
+ "target": {
+ "name": "RTC_BL_PHONE_A252",
+ "address": "3DD63766-AF90-14D9-7964-F37AE7FB0704"
+ },
+ "connected": true,
+ "services": [
+ "8fce0001-93ea-4f8f-8bde-4e8f0ea20001"
+ ],
+ "has_service": true,
+ "status_initial_raw": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":true,\"ble_client_connected\":true,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"client_connected\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+ "status_after_ping_raw": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":true,\"ble_client_connected\":true,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"cmd\",\"last_error\":\"\",\"ble_last_command\":\"PING\",\"ble_last_response\":\"PONG\"}"
+ }
+}
diff --git a/docs/rapport_hfp_mac.json b/docs/rapport_hfp_mac.json
new file mode 100644
index 0000000..5bda198
--- /dev/null
+++ b/docs/rapport_hfp_mac.json
@@ -0,0 +1,123 @@
+{
+ "timestamp_utc": "2026-02-20T20:48:25.147633+00:00",
+ "hfp_mac": "B4:1B:B0:84:73:06",
+ "steps": {
+ "ping": {
+ "result": "PONG",
+ "lines": [
+ "[AudioEngine] ready (full_duplex=true)",
+ "[RTC_BL_PHONE] HW init slic=ok codec=ok audio=ok",
+ "[WebServerManager] HTTP server started",
+ "[RTC_BL_PHONE] Boot: profile=ESP32_A252 bt_classic=true full_duplex=true",
+ "[RTC_BL_PHONE] Commands:",
+ "PING",
+ "HELP",
+ "STATUS",
+ "CALL",
+ "CAPTURE_START",
+ "CAPTURE_STOP",
+ "PLAY",
+ "RESET_METRICS",
+ "WIFI_CONNECT",
+ "WIFI_DISCONNECT",
+ "WIFI_STATUS",
+ "WIFI_SCAN",
+ "WIFI_RECONNECT",
+ "MQTT_CONFIG_SET",
+ "MQTT_CONNECT",
+ "MQTT_DISCONNECT",
+ "MQTT_STATUS",
+ "MQTT_PUB",
+ "ESPNOW_PEER_ADD",
+ "ESPNOW_PEER_DEL",
+ "ESPNOW_PEER_LIST",
+ "ESPNOW_STATUS",
+ "ESPNOW_SEND",
+ "BT_HFP_CONNECT",
+ "BT_HFP_DISCONNECT",
+ "BT_BLE_START",
+ "BT_BLE_STOP",
+ "BT_STATUS",
+ "SLIC_CONFIG_GET",
+ "SLIC_CONFIG_SET",
+ "AUDIO_CONFIG_GET",
+ "AUDIO_CONFIG_SET",
+ "PONG"
+ ]
+ },
+ "bt_status_before": {
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+ "lines": [
+ "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ ]
+ },
+ "hfp_connect_cmd": {
+ "result": "OK BT_HFP_CONNECT",
+ "lines": [
+ "OK BT_HFP_CONNECT"
+ ]
+ },
+ "hfp_status_poll": [
+ {
+ "t": 0,
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t": 2,
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t": 4,
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t": 6,
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t": 8,
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t": 10,
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t": 12,
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t": 14,
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t": 16,
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t": 18,
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t": 20,
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t": 22,
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ }
+ ],
+ "hfp_disconnect_cmd": {
+ "result": "OK BT_HFP_DISCONNECT",
+ "lines": [
+ "OK BT_HFP_DISCONNECT"
+ ]
+ },
+ "bt_status_after": {
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+ "lines": [
+ "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ ]
+ }
+ }
+}
diff --git a/docs/rapport_hfp_pairing_assiste.json b/docs/rapport_hfp_pairing_assiste.json
new file mode 100644
index 0000000..d19dbb5
--- /dev/null
+++ b/docs/rapport_hfp_pairing_assiste.json
@@ -0,0 +1,512 @@
+{
+ "timestamp_utc": "2026-02-20T20:51:14.060839+00:00",
+ "target": "B4:1B:B0:84:73:06",
+ "attempts": [
+ {
+ "attempt": 1,
+ "steps": [
+ {
+ "cmd": "BT_STATUS",
+ "resp": {
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+ "lines": [
+ "[AudioEngine] ready (full_duplex=true)",
+ "[RTC_BL_PHONE] HW init slic=ok codec=ok audio=ok",
+ "[WebServerManager] HTTP server started",
+ "[RTC_BL_PHONE] Boot: profile=ESP32_A252 bt_classic=true full_duplex=true",
+ "[RTC_BL_PHONE] Commands:",
+ "PING",
+ "HELP",
+ "STATUS",
+ "CALL",
+ "CAPTURE_START",
+ "CAPTURE_STOP",
+ "PLAY",
+ "RESET_METRICS",
+ "WIFI_CONNECT",
+ "WIFI_DISCONNECT",
+ "WIFI_STATUS",
+ "WIFI_SCAN",
+ "WIFI_RECONNECT",
+ "MQTT_CONFIG_SET",
+ "MQTT_CONNECT",
+ "MQTT_DISCONNECT",
+ "MQTT_STATUS",
+ "MQTT_PUB",
+ "ESPNOW_PEER_ADD",
+ "ESPNOW_PEER_DEL",
+ "ESPNOW_PEER_LIST",
+ "ESPNOW_STATUS",
+ "ESPNOW_SEND",
+ "BT_HFP_CONNECT",
+ "BT_HFP_DISCONNECT",
+ "BT_BLE_START",
+ "BT_BLE_STOP",
+ "BT_STATUS",
+ "SLIC_CONFIG_GET",
+ "SLIC_CONFIG_SET",
+ "AUDIO_CONFIG_GET",
+ "AUDIO_CONFIG_SET",
+ "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ ]
+ }
+ },
+ {
+ "cmd": "BT_HFP_CONNECT",
+ "resp": {
+ "result": "OK BT_HFP_CONNECT",
+ "lines": [
+ "OK BT_HFP_CONNECT"
+ ]
+ }
+ },
+ {
+ "cmd": "BT_HFP_DISCONNECT",
+ "resp": {
+ "result": "OK BT_HFP_DISCONNECT",
+ "lines": [
+ "OK BT_HFP_DISCONNECT"
+ ]
+ }
+ }
+ ],
+ "timeline": [
+ {
+ "t_sec": 0,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 2,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 4,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 6,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 8,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 10,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 12,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 14,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 16,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 18,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 20,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 22,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 24,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 26,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 28,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 30,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 32,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 34,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 36,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 38,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 40,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 42,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 44,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 46,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 48,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 50,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 52,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 54,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 56,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 58,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ }
+ ],
+ "connected": true,
+ "slc_or_audio": false
+ },
+ {
+ "attempt": 2,
+ "steps": [
+ {
+ "cmd": "BT_STATUS",
+ "resp": {
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+ "lines": [
+ "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ ]
+ }
+ },
+ {
+ "cmd": "BT_HFP_CONNECT",
+ "resp": {
+ "result": "OK BT_HFP_CONNECT",
+ "lines": [
+ "OK BT_HFP_CONNECT"
+ ]
+ }
+ },
+ {
+ "cmd": "BT_HFP_DISCONNECT",
+ "resp": {
+ "result": "OK BT_HFP_DISCONNECT",
+ "lines": [
+ "OK BT_HFP_DISCONNECT"
+ ]
+ }
+ }
+ ],
+ "timeline": [
+ {
+ "t_sec": 0,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 2,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 4,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 6,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 8,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 10,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 12,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 14,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 16,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 18,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 20,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 22,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 24,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 26,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 28,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 30,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 32,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 34,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 36,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 38,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 40,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 42,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 44,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 46,
+ "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 48,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 50,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 52,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 54,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 56,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 58,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ }
+ ],
+ "connected": true,
+ "slc_or_audio": false
+ },
+ {
+ "attempt": 3,
+ "steps": [
+ {
+ "cmd": "BT_STATUS",
+ "resp": {
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+ "lines": [
+ "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ ]
+ }
+ },
+ {
+ "cmd": "BT_HFP_CONNECT",
+ "resp": {
+ "result": "OK BT_HFP_CONNECT",
+ "lines": [
+ "OK BT_HFP_CONNECT"
+ ]
+ }
+ },
+ {
+ "cmd": "BT_HFP_DISCONNECT",
+ "resp": {
+ "result": "OK BT_HFP_DISCONNECT",
+ "lines": [
+ "OK BT_HFP_DISCONNECT"
+ ]
+ }
+ }
+ ],
+ "timeline": [
+ {
+ "t_sec": 0,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 2,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 4,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 6,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 8,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 10,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 12,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 14,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 16,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 18,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 20,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 22,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 24,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 26,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 28,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 30,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 32,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 34,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 36,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 38,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 40,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 42,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 44,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 46,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 48,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 50,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 52,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 54,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 56,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 58,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ }
+ ],
+ "connected": false,
+ "slc_or_audio": false
+ }
+ ],
+ "success": false
+}
diff --git a/docs/rapport_hfp_pairing_assiste_v2.json b/docs/rapport_hfp_pairing_assiste_v2.json
new file mode 100644
index 0000000..5adb342
--- /dev/null
+++ b/docs/rapport_hfp_pairing_assiste_v2.json
@@ -0,0 +1,512 @@
+{
+ "timestamp_utc": "2026-02-20T20:57:01.244699+00:00",
+ "target": "B4:1B:B0:84:73:06",
+ "attempts": [
+ {
+ "attempt": 1,
+ "steps": [
+ {
+ "cmd": "BT_STATUS",
+ "resp": {
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+ "lines": [
+ "[AudioEngine] ready (full_duplex=true)",
+ "[RTC_BL_PHONE] HW init slic=ok codec=ok audio=ok",
+ "[WebServerManager] HTTP server started",
+ "[RTC_BL_PHONE] Boot: profile=ESP32_A252 bt_classic=true full_duplex=true",
+ "[RTC_BL_PHONE] Commands:",
+ "PING",
+ "HELP",
+ "STATUS",
+ "CALL",
+ "CAPTURE_START",
+ "CAPTURE_STOP",
+ "PLAY",
+ "RESET_METRICS",
+ "WIFI_CONNECT",
+ "WIFI_DISCONNECT",
+ "WIFI_STATUS",
+ "WIFI_SCAN",
+ "WIFI_RECONNECT",
+ "MQTT_CONFIG_SET",
+ "MQTT_CONNECT",
+ "MQTT_DISCONNECT",
+ "MQTT_STATUS",
+ "MQTT_PUB",
+ "ESPNOW_PEER_ADD",
+ "ESPNOW_PEER_DEL",
+ "ESPNOW_PEER_LIST",
+ "ESPNOW_STATUS",
+ "ESPNOW_SEND",
+ "BT_HFP_CONNECT",
+ "BT_HFP_DISCONNECT",
+ "BT_BLE_START",
+ "BT_BLE_STOP",
+ "BT_STATUS",
+ "SLIC_CONFIG_GET",
+ "SLIC_CONFIG_SET",
+ "AUDIO_CONFIG_GET",
+ "AUDIO_CONFIG_SET",
+ "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ ]
+ }
+ },
+ {
+ "cmd": "BT_HFP_CONNECT",
+ "resp": {
+ "result": "OK BT_HFP_CONNECT",
+ "lines": [
+ "OK BT_HFP_CONNECT"
+ ]
+ }
+ },
+ {
+ "cmd": "BT_HFP_DISCONNECT",
+ "resp": {
+ "result": "OK BT_HFP_DISCONNECT",
+ "lines": [
+ "OK BT_HFP_DISCONNECT"
+ ]
+ }
+ }
+ ],
+ "timeline": [
+ {
+ "t_sec": 0,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 2,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 4,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 6,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 8,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 10,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 12,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 14,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 16,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 18,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 20,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 22,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 24,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 26,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 28,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 30,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 32,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 34,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 36,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 38,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 40,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 42,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 44,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 46,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 48,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 50,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 52,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 54,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 56,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 58,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ }
+ ],
+ "connected": false,
+ "slc_or_audio": false
+ },
+ {
+ "attempt": 2,
+ "steps": [
+ {
+ "cmd": "BT_STATUS",
+ "resp": {
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+ "lines": [
+ "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ ]
+ }
+ },
+ {
+ "cmd": "BT_HFP_CONNECT",
+ "resp": {
+ "result": "OK BT_HFP_CONNECT",
+ "lines": [
+ "OK BT_HFP_CONNECT"
+ ]
+ }
+ },
+ {
+ "cmd": "BT_HFP_DISCONNECT",
+ "resp": {
+ "result": "OK BT_HFP_DISCONNECT",
+ "lines": [
+ "OK BT_HFP_DISCONNECT"
+ ]
+ }
+ }
+ ],
+ "timeline": [
+ {
+ "t_sec": 0,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 2,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 4,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 6,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 8,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 10,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 12,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 14,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 16,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 18,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 20,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 22,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 24,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 26,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 28,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 30,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 32,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 34,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 36,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 38,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 40,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 42,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 44,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 46,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 48,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 50,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 52,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 54,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 56,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 58,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ }
+ ],
+ "connected": false,
+ "slc_or_audio": false
+ },
+ {
+ "attempt": 3,
+ "steps": [
+ {
+ "cmd": "BT_STATUS",
+ "resp": {
+ "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+ "lines": [
+ "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ ]
+ }
+ },
+ {
+ "cmd": "BT_HFP_CONNECT",
+ "resp": {
+ "result": "OK BT_HFP_CONNECT",
+ "lines": [
+ "OK BT_HFP_CONNECT"
+ ]
+ }
+ },
+ {
+ "cmd": "BT_HFP_DISCONNECT",
+ "resp": {
+ "result": "OK BT_HFP_DISCONNECT",
+ "lines": [
+ "OK BT_HFP_DISCONNECT"
+ ]
+ }
+ }
+ ],
+ "timeline": [
+ {
+ "t_sec": 0,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 2,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 4,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 6,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 8,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 10,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 12,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 14,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 16,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 18,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 20,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 22,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 24,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 26,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 28,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 30,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 32,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 34,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 36,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 38,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 40,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 42,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 44,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 46,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 48,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 50,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 52,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 54,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 56,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ },
+ {
+ "t_sec": 58,
+ "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+ }
+ ],
+ "connected": false,
+ "slc_or_audio": false
+ }
+ ],
+ "success": false
+}
diff --git a/scripts/check_web_route_parity.py b/scripts/check_web_route_parity.py
new file mode 100755
index 0000000..05e0764
--- /dev/null
+++ b/scripts/check_web_route_parity.py
@@ -0,0 +1,121 @@
+#!/usr/bin/env python3
+"""Check parity between backend API routes and WebUI API calls."""
+
+from __future__ import annotations
+
+import argparse
+import re
+import sys
+from pathlib import Path
+from typing import Iterable
+
+
+Route = tuple[str, str]
+
+BACKEND_ROUTE_RE = re.compile(
+ r'server_\.on\(\s*"(?P/api/[^"]+)"\s*,\s*HTTP_(?P[A-Z]+)'
+)
+FRONTEND_CALL_RE = re.compile(
+ r'requestJson\(\s*["\'](?P/api/[^"\']+)["\'](?P.*?)\);',
+ re.DOTALL,
+)
+METHOD_RE = re.compile(r'method\s*:\s*["\'](?P[A-Z]+)["\']')
+
+
+def parse_backend_routes(source: str) -> set[Route]:
+ routes: set[Route] = set()
+ for match in BACKEND_ROUTE_RE.finditer(source):
+ method = match.group("method").upper()
+ path = match.group("path")
+ routes.add((method, path))
+ return routes
+
+
+def parse_frontend_routes(source: str) -> set[Route]:
+ routes: set[Route] = set()
+ for match in FRONTEND_CALL_RE.finditer(source):
+ path = match.group("path")
+ args = match.group("args")
+ method_match = METHOD_RE.search(args)
+ method = method_match.group("method").upper() if method_match else "GET"
+ routes.add((method, path))
+ return routes
+
+
+def format_routes(routes: Iterable[Route]) -> str:
+ ordered = sorted(routes, key=lambda route: (route[1], route[0]))
+ return "\n".join(f" - {method} {path}" for method, path in ordered)
+
+
+def load_text(path: Path) -> str:
+ try:
+ return path.read_text(encoding="utf-8")
+ except FileNotFoundError:
+ print(f"[route-parity] missing file: {path}", file=sys.stderr)
+ raise
+
+
+def main() -> int:
+ parser = argparse.ArgumentParser(
+ description="Validate that every WebUI API call is backed by a firmware HTTP route."
+ )
+ parser.add_argument(
+ "--backend",
+ default="src/web/WebServerManager.cpp",
+ help="Path to backend route source file.",
+ )
+ parser.add_argument(
+ "--frontend",
+ default="data/webui/script.js",
+ help="Path to frontend source file.",
+ )
+ parser.add_argument(
+ "--strict-unused-backend",
+ action="store_true",
+ help="Fail if backend API routes are not used by the WebUI.",
+ )
+ args = parser.parse_args()
+
+ backend_path = Path(args.backend)
+ frontend_path = Path(args.frontend)
+ backend_source = load_text(backend_path)
+ frontend_source = load_text(frontend_path)
+
+ backend_routes = parse_backend_routes(backend_source)
+ frontend_routes = parse_frontend_routes(frontend_source)
+
+ if not backend_routes:
+ print("[route-parity] no backend /api routes detected", file=sys.stderr)
+ return 2
+ if not frontend_routes:
+ print("[route-parity] no frontend /api requestJson() calls detected", file=sys.stderr)
+ return 2
+
+ missing_in_backend = frontend_routes - backend_routes
+ unused_backend = backend_routes - frontend_routes
+
+ print(
+ f"[route-parity] backend routes: {len(backend_routes)} | frontend routes: {len(frontend_routes)}"
+ )
+
+ if missing_in_backend:
+ print("[route-parity] missing backend routes for frontend calls:", file=sys.stderr)
+ print(format_routes(missing_in_backend), file=sys.stderr)
+ return 1
+
+ if unused_backend:
+ message = "[route-parity] backend routes currently unused by WebUI:"
+ output = format_routes(unused_backend)
+ if args.strict_unused_backend:
+ print(message, file=sys.stderr)
+ print(output, file=sys.stderr)
+ return 1
+ print(message)
+ print(output)
+
+ print("[route-parity] parity check passed")
+ return 0
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/scripts/test_terminal.sh b/scripts/test_terminal.sh
index f23f2db..881a812 100755
--- a/scripts/test_terminal.sh
+++ b/scripts/test_terminal.sh
@@ -12,4 +12,7 @@ mkdir -p .pio/host
c++ -std=c++17 -Wall -Wextra -pedantic -Isrc test/host/test_dtmf_host.cpp src/telephony/DtmfDecoder.cpp -o .pio/host/test_dtmf_host
.pio/host/test_dtmf_host
+echo "[test_terminal] check web route parity"
+python3 scripts/check_web_route_parity.py
+
echo "[test_terminal] all checks passed"
diff --git a/src/bluetooth/BluetoothManager.cpp b/src/bluetooth/BluetoothManager.cpp
index 503042a..0f0ee85 100644
--- a/src/bluetooth/BluetoothManager.cpp
+++ b/src/bluetooth/BluetoothManager.cpp
@@ -445,7 +445,8 @@ bool BluetoothManager::ensureBtStackReady() {
memset(pin_code, 0, sizeof(pin_code));
memcpy(pin_code, kLegacyPinCode, strlen(kLegacyPinCode));
esp_bt_gap_set_pin(ESP_BT_PIN_TYPE_FIXED, 4, pin_code);
- esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_GENERAL_DISCOVERABLE);
+ // Keep classic BT connectable for outbound HFP while avoiding random inbound ACL grabs.
+ esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_NON_DISCOVERABLE);
stack_ready_ = true;
notifyBluetooth("stack_ready");
diff --git a/src/web/WebServerManager.cpp b/src/web/WebServerManager.cpp
index db0e0eb..191cb99 100644
--- a/src/web/WebServerManager.cpp
+++ b/src/web/WebServerManager.cpp
@@ -148,6 +148,8 @@ void WebServerManager::registerRoutes() {
});
server_.on("/api/network/wifi/disconnect", HTTP_POST,
[this](AsyncWebServerRequest* request) { handleDispatch(request, "WIFI_DISCONNECT"); });
+ server_.on("/api/network/wifi/reconnect", HTTP_POST,
+ [this](AsyncWebServerRequest* request) { handleDispatch(request, "WIFI_RECONNECT"); });
server_.on("/api/network/wifi/scan", HTTP_POST,
[this](AsyncWebServerRequest* request) { handleDispatch(request, "WIFI_SCAN"); });
@@ -176,6 +178,10 @@ void WebServerManager::registerRoutes() {
// ESP-NOW.
server_.on("/api/network/espnow", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleDispatch(request, "ESPNOW_STATUS"); });
+ server_.on("/api/network/espnow/on", HTTP_POST,
+ [this](AsyncWebServerRequest* request) { handleDispatch(request, "ESPNOW_ON"); });
+ server_.on("/api/network/espnow/off", HTTP_POST,
+ [this](AsyncWebServerRequest* request) { handleDispatch(request, "ESPNOW_OFF"); });
server_.on("/api/network/espnow/peer", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleDispatch(request, "ESPNOW_PEER_LIST"); });
server_.on("/api/network/espnow/peer", HTTP_POST, [this](AsyncWebServerRequest* request) {