From 64dff2dc0521e5a4bbb6c57fbdc7e511814f3f2c Mon Sep 17 00:00:00 2001 From: duffy Date: Thu, 29 Jan 2026 22:10:10 +0100 Subject: [PATCH] fix bt_hfp to idf 5 --- main/bluetooth/bt_hfp.c | 65 +++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/main/bluetooth/bt_hfp.c b/main/bluetooth/bt_hfp.c index 35d1040..5f1781f 100644 --- a/main/bluetooth/bt_hfp.c +++ b/main/bluetooth/bt_hfp.c @@ -3,6 +3,8 @@ * * ESP32 agiert als Audio Gateway (AG) - die Rolle einer Telefonanlage * Headset ist das HF (Hands-Free) Device + * + * Angepasst für ESP-IDF 5.x */ #include @@ -62,15 +64,9 @@ static void hf_ag_callback(esp_hf_cb_event_t event, esp_hf_cb_param_t *param) } break; - case ESP_HF_BVRA_EVT: - // Voice Recognition aktiviert/deaktiviert - ESP_LOGI(TAG, "Voice Recognition: %s", - param->vra_rep.value ? "aktiviert" : "deaktiviert"); - break; - case ESP_HF_VOLUME_CONTROL_EVT: ESP_LOGI(TAG, "Volume %s: %d", - param->volume_control.type == ESP_HF_VOLUME_CONTROL_TARGET_SPK ? + param->volume_control.type == ESP_HF_VOLUME_TYPE_SPK ? "Speaker" : "Mic", param->volume_control.volume); break; @@ -97,7 +93,13 @@ static void hf_ag_callback(esp_hf_cb_event_t event, esp_hf_cb_param_t *param) case ESP_HF_CLCC_RESPONSE_EVT: // Call List Request - keine aktiven Anrufe melden ESP_LOGD(TAG, "CLCC Request"); - esp_hf_ag_clcc_response(s_connected_peer, 0, 0, 0, 0, 0, NULL); + // ESP-IDF 5: esp_hf_ag_clcc_response hat mehr Parameter + esp_hf_ag_clcc_response(s_connected_peer, 0, + ESP_HF_CURRENT_CALL_DIRECTION_INCOMING, + ESP_HF_CURRENT_CALL_STATUS_ACTIVE, + ESP_HF_CURRENT_CALL_MODE_VOICE, + ESP_HF_CURRENT_CALL_MPTY_TYPE_SINGLE, + NULL, ESP_HF_CALL_ADDR_TYPE_UNKNOWN); break; case ESP_HF_COPS_RESPONSE_EVT: @@ -109,7 +111,10 @@ static void hf_ag_callback(esp_hf_cb_event_t event, esp_hf_cb_param_t *param) case ESP_HF_CNUM_RESPONSE_EVT: // Subscriber Number Request ESP_LOGD(TAG, "CNUM Request"); - esp_hf_ag_cnum_response(s_connected_peer, NULL, 0); + // ESP-IDF 5: esp_hf_ag_cnum_response hat mehr Parameter + esp_hf_ag_cnum_response(s_connected_peer, NULL, + ESP_HF_CALL_ADDR_TYPE_UNKNOWN, + ESP_HF_SUBSCRIBER_SERVICE_TYPE_VOICE); break; case ESP_HF_VTS_RESPONSE_EVT: @@ -137,8 +142,8 @@ static void hf_ag_callback(esp_hf_cb_event_t event, esp_hf_cb_param_t *param) case ESP_HF_DIAL_EVT: // Dial (ATD, ATD>, ATD>mem) if (param->out_call.type == ESP_HF_DIAL_MEM) { - ESP_LOGI(TAG, "Headset: Wähle Speicher %d", param->out_call.num_or_loc); - } else if (param->out_call.type == ESP_HF_DIAL_VOIP) { + ESP_LOGI(TAG, "Headset: Wähle Speicher %s", param->out_call.num_or_loc); + } else if (param->out_call.type == ESP_HF_DIAL_NUM) { ESP_LOGI(TAG, "Headset: Wähle %s", param->out_call.num_or_loc); } else { ESP_LOGI(TAG, "Headset: Wahlwiederholung"); @@ -149,7 +154,7 @@ static void hf_ag_callback(esp_hf_cb_event_t event, esp_hf_cb_param_t *param) case ESP_HF_WBS_RESPONSE_EVT: // Wide Band Speech (mSBC Codec) ESP_LOGI(TAG, "WBS Codec: %s", - param->wbs_rep.codec == ESP_HF_WBS_PLCM ? "mSBC" : "CVSD"); + param->wbs_rep.codec == ESP_HF_WBS_YES ? "mSBC" : "CVSD"); break; case ESP_HF_BCS_RESPONSE_EVT: @@ -164,15 +169,16 @@ static void hf_ag_callback(esp_hf_cb_event_t event, esp_hf_cb_param_t *param) } // Audio Data Callback (eingehend vom Headset - Mikrofon) -static uint32_t hf_ag_incoming_data_callback(uint8_t *buf, uint32_t len) +// ESP-IDF 5: Signatur geändert zu void +static void hf_ag_incoming_data_callback(const uint8_t *buf, uint32_t len) { // Audio-Daten vom Headset-Mikrofon weiterleiten bt_manager_notify_audio_data(buf, len); - return len; } // Audio Data Request (ausgehend zum Headset - Speaker) -static void hf_ag_outgoing_data_callback(uint8_t *buf, uint32_t len) +// ESP-IDF 5: Signatur geändert zu uint32_t return +static uint32_t hf_ag_outgoing_data_callback(uint8_t *buf, uint32_t len) { if (s_audio_out_ringbuf) { size_t item_size; @@ -185,13 +191,12 @@ static void hf_ag_outgoing_data_callback(uint8_t *buf, uint32_t len) if (item_size < len) { memset(buf + item_size, 0, len - item_size); } - } else { - // Keine Daten - Stille senden - memset(buf, 0, len); + return len; } - } else { - memset(buf, 0, len); } + // Keine Daten - Stille senden + memset(buf, 0, len); + return len; } esp_err_t bt_hfp_init(void) @@ -267,7 +272,10 @@ esp_err_t bt_hfp_connect(const esp_bd_addr_t address) bt_addr_to_str(address, addr_str, sizeof(addr_str)); ESP_LOGI(TAG, "HFP Connect: %s", addr_str); - return esp_hf_ag_slc_connect(address); + // Cast um const zu entfernen (ESP-IDF API erwartet non-const) + esp_bd_addr_t addr_copy; + memcpy(addr_copy, address, ESP_BD_ADDR_LEN); + return esp_hf_ag_slc_connect(addr_copy); } esp_err_t bt_hfp_disconnect(const esp_bd_addr_t address) @@ -280,7 +288,10 @@ esp_err_t bt_hfp_disconnect(const esp_bd_addr_t address) bt_hfp_audio_disconnect(); } - return esp_hf_ag_slc_disconnect(address); + // Cast um const zu entfernen + esp_bd_addr_t addr_copy; + memcpy(addr_copy, address, ESP_BD_ADDR_LEN); + return esp_hf_ag_slc_disconnect(addr_copy); } esp_err_t bt_hfp_audio_connect(void) @@ -322,3 +333,13 @@ esp_err_t bt_hfp_send_audio(const uint8_t* data, size_t len) return ESP_OK; } + +bool bt_hfp_is_connected(void) +{ + return s_service_connected; +} + +bool bt_hfp_is_audio_connected(void) +{ + return s_audio_connected; +}