fix bt_hfp to idf 5

This commit is contained in:
duffy 2026-01-29 22:10:10 +01:00
parent 0f3f04054c
commit 64dff2dc05
1 changed files with 43 additions and 22 deletions

View File

@ -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 <string.h>
@ -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;
}