From 0f71cf24b27d08ecc5d3dd7d53f6ddab6a9dd1d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20SAILLANT?=
<108685187+electron-rare@users.noreply.github.com>
Date: Fri, 20 Feb 2026 23:49:49 +0100
Subject: [PATCH 1/4] add web controls for wifi reconnect espnow on off and
mqtt publish
---
data/webui/index.html | 6 +++++
data/webui/script.js | 48 ++++++++++++++++++++++++++++++++++--
src/web/WebServerManager.cpp | 6 +++++
3 files changed, 58 insertions(+), 2 deletions(-)
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..d718899 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,33 @@ function bindEvents() {
}
});
+ document.getElementById("mqttPublishForm").addEventListener("submit", async (event) => {
+ event.preventDefault();
+ const topic = document.getElementById("mqttTopic").value.trim();
+ const payloadRaw = document.getElementById("mqttPayload").value;
+ const payload = parsePayloadValue(payloadRaw);
+ 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 +259,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/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) {
From 4f857b4dd4a7b12387a4e334f1513646841e9b59 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20SAILLANT?=
<108685187+electron-rare@users.noreply.github.com>
Date: Fri, 20 Feb 2026 23:57:24 +0100
Subject: [PATCH 2/4] fix mqtt web publish payload serialization for firmware
api
---
data/webui/script.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/data/webui/script.js b/data/webui/script.js
index d718899..f664b66 100644
--- a/data/webui/script.js
+++ b/data/webui/script.js
@@ -228,8 +228,7 @@ function bindEvents() {
document.getElementById("mqttPublishForm").addEventListener("submit", async (event) => {
event.preventDefault();
const topic = document.getElementById("mqttTopic").value.trim();
- const payloadRaw = document.getElementById("mqttPayload").value;
- const payload = parsePayloadValue(payloadRaw);
+ const payload = document.getElementById("mqttPayload").value;
try {
const result = await requestJson("/api/network/mqtt/publish", {
method: "POST",
From f25bc30fca5ba8b6dacf4ea4daeff6588d1d22eb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20SAILLANT?=
<108685187+electron-rare@users.noreply.github.com>
Date: Sat, 21 Feb 2026 00:00:13 +0100
Subject: [PATCH 3/4] harden bt scan mode and refresh hardware validation
reports
---
docs/rapport_ble_mac.json | 48 +++
docs/rapport_hfp_mac.json | 123 ++++++
docs/rapport_hfp_pairing_assiste.json | 512 +++++++++++++++++++++++
docs/rapport_hfp_pairing_assiste_v2.json | 512 +++++++++++++++++++++++
docs/rapport_hw.json | 86 ++--
docs/rapport_tests_fonctionnels.md | 18 +-
src/bluetooth/BluetoothManager.cpp | 3 +-
7 files changed, 1262 insertions(+), 40 deletions(-)
create mode 100644 docs/rapport_ble_mac.json
create mode 100644 docs/rapport_hfp_mac.json
create mode 100644 docs/rapport_hfp_pairing_assiste.json
create mode 100644 docs/rapport_hfp_pairing_assiste_v2.json
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/docs/rapport_hw.json b/docs/rapport_hw.json
index fb9668f..85a71cf 100644
--- a/docs/rapport_hw.json
+++ b/docs/rapport_hw.json
@@ -1,6 +1,6 @@
{
- "timestamp_utc": "2026-02-20T20:33:53.045753+00:00",
- "overall_passed": false,
+ "timestamp_utc": "2026-02-20T20:49:57.303991+00:00",
+ "overall_passed": true,
"results": [
{
"name": "serial_smoke",
@@ -34,7 +34,7 @@
"has_credentials": true,
"ssid": "Les cils",
"ip": "192.168.0.103",
- "rssi": -79,
+ "rssi": -71,
"state": "connected",
"ap_active": false,
"ap_ssid": "",
@@ -59,11 +59,19 @@
"peers": []
},
"bluetooth": {
+ "stack_ready": true,
"connected": false,
"hfp_active": false,
+ "hfp_requested": false,
"ble_active": false,
+ "ble_client_connected": false,
"security_enabled": false,
- "peer": ""
+ "peer": "",
+ "last_hfp_event": "initialized",
+ "last_ble_event": "initialized",
+ "last_error": "",
+ "ble_last_command": "",
+ "ble_last_response": ""
},
"config": {
"pins": {
@@ -131,7 +139,7 @@
"has_credentials": true,
"ssid": "Les cils",
"ip": "192.168.0.103",
- "rssi": -79,
+ "rssi": -72,
"state": "connected",
"ap_active": false,
"ap_ssid": "",
@@ -143,37 +151,31 @@
"networks": [
{
"ssid": "Les cils",
- "rssi": -57,
+ "rssi": -52,
"chan": 11,
"enc": 4
},
- {
- "ssid": "CILS House",
- "rssi": -69,
- "chan": 9,
- "enc": 7
- },
{
"ssid": "Les cils",
- "rssi": -72,
+ "rssi": -71,
"chan": 6,
"enc": 3
},
{
"ssid": "Les cils",
- "rssi": -78,
+ "rssi": -71,
"chan": 1,
"enc": 4
},
{
"ssid": "La-clic",
- "rssi": -85,
+ "rssi": -90,
"chan": 1,
"enc": 3
},
{
"ssid": "venus-HQ203587TYP-031",
- "rssi": -87,
+ "rssi": -90,
"chan": 1,
"enc": 3
}
@@ -188,7 +190,7 @@
"has_credentials": true,
"ssid": "Les cils",
"ip": "192.168.0.103",
- "rssi": -79,
+ "rssi": -72,
"state": "connected",
"ap_active": false,
"ap_ssid": "",
@@ -220,11 +222,19 @@
"peers": []
},
"bt_status": {
+ "stack_ready": true,
"connected": false,
"hfp_active": false,
+ "hfp_requested": false,
"ble_active": false,
+ "ble_client_connected": false,
"security_enabled": false,
- "peer": ""
+ "peer": "",
+ "last_hfp_event": "initialized",
+ "last_ble_event": "initialized",
+ "last_error": "",
+ "ble_last_command": "",
+ "ble_last_response": ""
}
}
},
@@ -257,7 +267,7 @@
"has_credentials": true,
"ssid": "Les cils",
"ip": "192.168.0.103",
- "rssi": -82,
+ "rssi": -77,
"state": "connected",
"ap_active": false,
"ap_ssid": "",
@@ -282,11 +292,19 @@
"peers": []
},
"bluetooth": {
+ "stack_ready": true,
"connected": false,
"hfp_active": false,
+ "hfp_requested": false,
"ble_active": false,
+ "ble_client_connected": false,
"security_enabled": false,
- "peer": ""
+ "peer": "",
+ "last_hfp_event": "initialized",
+ "last_ble_event": "initialized",
+ "last_error": "",
+ "ble_last_command": "",
+ "ble_last_response": ""
},
"config": {
"pins": {
@@ -332,7 +350,7 @@
"has_credentials": true,
"ssid": "Les cils",
"ip": "192.168.0.103",
- "rssi": -73,
+ "rssi": -70,
"state": "connected",
"ap_active": false,
"ap_ssid": "",
@@ -364,11 +382,19 @@
"peers": []
},
"bluetooth": {
+ "stack_ready": true,
"connected": false,
"hfp_active": false,
+ "hfp_requested": false,
"ble_active": false,
+ "ble_client_connected": false,
"security_enabled": false,
- "peer": ""
+ "peer": "",
+ "last_hfp_event": "initialized",
+ "last_ble_event": "initialized",
+ "last_error": "",
+ "ble_last_command": "",
+ "ble_last_response": ""
},
"control_call": {
"ok": true,
@@ -378,30 +404,30 @@
},
{
"name": "manual_hook_transition",
- "state": "MANUAL_FAIL",
+ "state": "MANUAL_SKIP",
"details": {
- "note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"
+ "note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"
}
},
{
"name": "manual_ring_behavior",
- "state": "MANUAL_PASS",
+ "state": "MANUAL_SKIP",
"details": {
- "note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"
+ "note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"
}
},
{
"name": "manual_audio_path",
- "state": "MANUAL_FAIL",
+ "state": "MANUAL_SKIP",
"details": {
- "note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"
+ "note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"
}
},
{
"name": "manual_hfp_pairing",
- "state": "MANUAL_FAIL",
+ "state": "MANUAL_SKIP",
"details": {
- "note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"
+ "note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"
}
}
]
diff --git a/docs/rapport_tests_fonctionnels.md b/docs/rapport_tests_fonctionnels.md
index 34fc126..f22e105 100644
--- a/docs/rapport_tests_fonctionnels.md
+++ b/docs/rapport_tests_fonctionnels.md
@@ -1,14 +1,14 @@
# Rapport validation HW (A252)
-- Date UTC: 2026-02-20T20:33:53.045753+00:00
-- Verdict global: FAIL
+- Date UTC: 2026-02-20T20:49:57.303991+00:00
+- Verdict global: PASS
| Scénario | État | Détails |
|---|---|---|
-| serial_smoke | PASS | `{"ping": {"ok": true, "result": "PONG"}, "status": {"board_profile": "ESP32_A252", "telephony": {"state": "IDLE", "hook": "ON_HOOK"}, "audio_frames_requested": 0, "audio_frames_read": 0, "audio_drop_frames": 0, "audio_underrun_count": 0, "audio_last_latency_ms": 0, "audio_max_latency_ms": 0, "audio": {"full_duplex": true, "frames": 0, "underrun": 0, "drop": 0, "latence_ms": 0}, "wifi": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -79, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0}, "espnow": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bluetooth": {"connected": false, "hfp_active": false, "ble_active": false, "security_enabled": false, "peer": ""}, "config": {"pins": {"i2s": {"bck": 27, "ws": 25, "dout": 26, "din": 35}, "codec_i2c": {"sda": 33, "scl": 32}, "slic": {"rm": 22, "fr": 19, "shk": 36, "line": 23, "pd": 18, "hook_active_high": false}}, "audio": {"sample_rate": 16000, "bits_per_sample": 16, "enable_capture": true, "volume": 80, "mute": false, "route": "rtc"}, "mqtt": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}, "espnow_peers": []}}, "call": {"ok": true, "line": "OK CALL"}, "capture_start": {"ok": true, "line": "OK CAPTURE_START"}, "capture_stop": {"ok": true, "line": "OK CAPTURE_STOP"}, "reset_metrics": {"ok": true, "line": "OK RESET_METRICS"}}` |
-| serial_network_stack | PASS | `{"wifi_status_before": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -79, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "wifi_scan": {"ok": true, "networks": [{"ssid": "Les cils", "rssi": -57, "chan": 11, "enc": 4}, {"ssid": "CILS House", "rssi": -69, "chan": 9, "enc": 7}, {"ssid": "Les cils", "rssi": -72, "chan": 6, "enc": 3}, {"ssid": "Les cils", "rssi": -78, "chan": 1, "enc": 4}, {"ssid": "La-clic", "rssi": -85, "chan": 1, "enc": 3}, {"ssid": "venus-HQ203587TYP-031", "rssi": -87, "chan": 1, "enc": 3}]}, "wifi_connect": {"ok": true, "line": "SKIP WIFI_CONNECT already_connected"}, "wifi_status_after": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -79, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt_status": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0, "config": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}}, "espnow_status": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bt_status": {"connected": false, "hfp_active": false, "ble_active": false, "security_enabled": false, "peer": ""}}` |
-| http_endpoints | PASS | `{"base_url": "http://192.168.0.103", "status": {"board_profile": "ESP32_A252", "telephony": {"state": "RINGING", "hook": "ON_HOOK"}, "audio_frames_requested": 0, "audio_frames_read": 0, "audio_drop_frames": 0, "audio_underrun_count": 0, "audio_last_latency_ms": 0, "audio_max_latency_ms": 0, "audio": {"full_duplex": true, "frames": 0, "underrun": 0, "drop": 0, "latence_ms": 0}, "wifi": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -82, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0}, "espnow": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bluetooth": {"connected": false, "hfp_active": false, "ble_active": false, "security_enabled": false, "peer": ""}, "config": {"pins": {"i2s": {"bck": 27, "ws": 25, "dout": 26, "din": 35}, "codec_i2c": {"sda": 33, "scl": 32}, "slic": {"rm": 22, "fr": 19, "shk": 36, "line": 23, "pd": 18, "hook_active_high": false}}, "audio": {"sample_rate": 16000, "bits_per_sample": 16, "enable_capture": true, "volume": 80, "mute": false, "route": "rtc"}, "mqtt": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}, "espnow_peers": []}}, "wifi": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -73, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0, "config": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}}, "espnow": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bluetooth": {"connected": false, "hfp_active": false, "ble_active": false, "security_enabled": false, "peer": ""}, "control_call": {"ok": true, "code": "CALL"}}` |
-| manual_hook_transition | MANUAL_FAIL | `{"note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"}` |
-| manual_ring_behavior | MANUAL_PASS | `{"note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"}` |
-| manual_audio_path | MANUAL_FAIL | `{"note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"}` |
-| manual_hfp_pairing | MANUAL_FAIL | `{"note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"}` |
+| serial_smoke | PASS | `{"ping": {"ok": true, "result": "PONG"}, "status": {"board_profile": "ESP32_A252", "telephony": {"state": "IDLE", "hook": "ON_HOOK"}, "audio_frames_requested": 0, "audio_frames_read": 0, "audio_drop_frames": 0, "audio_underrun_count": 0, "audio_last_latency_ms": 0, "audio_max_latency_ms": 0, "audio": {"full_duplex": true, "frames": 0, "underrun": 0, "drop": 0, "latence_ms": 0}, "wifi": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -71, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0}, "espnow": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bluetooth": {"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": ""}, "config": {"pins": {"i2s": {"bck": 27, "ws": 25, "dout": 26, "din": 35}, "codec_i2c": {"sda": 33, "scl": 32}, "slic": {"rm": 22, "fr": 19, "shk": 36, "line": 23, "pd": 18, "hook_active_high": false}}, "audio": {"sample_rate": 16000, "bits_per_sample": 16, "enable_capture": true, "volume": 80, "mute": false, "route": "rtc"}, "mqtt": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}, "espnow_peers": []}}, "call": {"ok": true, "line": "OK CALL"}, "capture_start": {"ok": true, "line": "OK CAPTURE_START"}, "capture_stop": {"ok": true, "line": "OK CAPTURE_STOP"}, "reset_metrics": {"ok": true, "line": "OK RESET_METRICS"}}` |
+| serial_network_stack | PASS | `{"wifi_status_before": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -72, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "wifi_scan": {"ok": true, "networks": [{"ssid": "Les cils", "rssi": -52, "chan": 11, "enc": 4}, {"ssid": "Les cils", "rssi": -71, "chan": 6, "enc": 3}, {"ssid": "Les cils", "rssi": -71, "chan": 1, "enc": 4}, {"ssid": "La-clic", "rssi": -90, "chan": 1, "enc": 3}, {"ssid": "venus-HQ203587TYP-031", "rssi": -90, "chan": 1, "enc": 3}]}, "wifi_connect": {"ok": true, "line": "SKIP WIFI_CONNECT already_connected"}, "wifi_status_after": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -72, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt_status": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0, "config": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}}, "espnow_status": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bt_status": {"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": ""}}` |
+| http_endpoints | PASS | `{"base_url": "http://192.168.0.103", "status": {"board_profile": "ESP32_A252", "telephony": {"state": "RINGING", "hook": "ON_HOOK"}, "audio_frames_requested": 0, "audio_frames_read": 0, "audio_drop_frames": 0, "audio_underrun_count": 0, "audio_last_latency_ms": 0, "audio_max_latency_ms": 0, "audio": {"full_duplex": true, "frames": 0, "underrun": 0, "drop": 0, "latence_ms": 0}, "wifi": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -77, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0}, "espnow": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bluetooth": {"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": ""}, "config": {"pins": {"i2s": {"bck": 27, "ws": 25, "dout": 26, "din": 35}, "codec_i2c": {"sda": 33, "scl": 32}, "slic": {"rm": 22, "fr": 19, "shk": 36, "line": 23, "pd": 18, "hook_active_high": false}}, "audio": {"sample_rate": 16000, "bits_per_sample": 16, "enable_capture": true, "volume": 80, "mute": false, "route": "rtc"}, "mqtt": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}, "espnow_peers": []}}, "wifi": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -70, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0, "config": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}}, "espnow": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bluetooth": {"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": ""}, "control_call": {"ok": true, "code": "CALL"}}` |
+| manual_hook_transition | MANUAL_SKIP | `{"note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"}` |
+| manual_ring_behavior | MANUAL_SKIP | `{"note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"}` |
+| manual_audio_path | MANUAL_SKIP | `{"note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"}` |
+| manual_hfp_pairing | MANUAL_SKIP | `{"note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"}` |
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");
From 3aa5ee27951bd46020c8a541b912ab4559bc4f1f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20SAILLANT?=
<108685187+electron-rare@users.noreply.github.com>
Date: Sat, 21 Feb 2026 00:17:33 +0100
Subject: [PATCH 4/4] add web route parity gate for webui/backend
---
.github/workflows/ci.yml | 7 +-
scripts/check_web_route_parity.py | 121 ++++++++++++++++++++++++++++++
scripts/test_terminal.sh | 3 +
3 files changed, 129 insertions(+), 2 deletions(-)
create mode 100755 scripts/check_web_route_parity.py
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/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"