diff --git a/components/bt_hfp/bt_hfp.c b/components/bt_hfp/bt_hfp.c index f0d9e5a..5779126 100644 --- a/components/bt_hfp/bt_hfp.c +++ b/components/bt_hfp/bt_hfp.c @@ -167,6 +167,33 @@ static void hf_cb(esp_hf_client_cb_event_t event, esp_hf_client_cb_param_t *para } } +/* ---- Reconnexion automatique ---- + * Tant que le SLC n'est pas etabli, on tente periodiquement de se reconnecter + * au dernier appareil appaire. Le mobile (deja bonde) accepte la connexion des + * qu'il est a portee -> reconnexion auto sans action utilisateur. On ne tente + * QUE lorsque deconnecte (evite la collision RFCOMM avec un connect du mobile). */ +static void reconnect_task(void *arg) +{ + (void)arg; + for (;;) { + vTaskDelay(pdMS_TO_TICKS(8000)); /* intervalle de tentative */ + if (s_slc) { + continue; /* deja connecte */ + } + int num = esp_bt_gap_get_bond_device_num(); + if (num <= 0) { + continue; /* aucun appareil appaire */ + } + int n = (num > 4) ? 4 : num; + esp_bd_addr_t list[4]; + if (esp_bt_gap_get_bond_device_list(&n, list) != ESP_OK || n <= 0) { + continue; + } + ESP_LOGI(TAG, "reconnexion HFP auto vers l'appareil appaire..."); + esp_hf_client_connect(list[0]); /* le mobile accepte s'il est a portee */ + } +} + /* ---- API publique ---- */ esp_err_t bt_hfp_init(bt_hfp_event_cb_t cb) @@ -226,6 +253,9 @@ esp_err_t bt_hfp_init(bt_hfp_event_cb_t cb) esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_GENERAL_DISCOVERABLE) ); + /* Tache de reconnexion auto vers le dernier appareil appaire. */ + xTaskCreate(reconnect_task, "bt_reconnect", 3072, NULL, 4, NULL); + ESP_LOGI(TAG, "bt_hfp pret — appairer le mobile sur 'RTC_BL_PHONE'"); return ESP_OK; }