Select one of the symbols to view example projects that use it.
 
Outline
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include "esp_log.h"
#include "bt_app_core.h"
#include "bt_app_hf.h"
#include "esp_bt_main.h"
#include "esp_bt_device.h"
#include "esp_gap_bt_api.h"
#include "esp_hf_client_api.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "freertos/semphr.h"
#include "freertos/ringbuf.h"
#include "time.h"
#include "sys/time.h"
#include "sdkconfig.h"
c_hf_evt_str
c_connection_state_str
c_audio_state_str
c_vr_state_str
c_service_availability_status_str
c_roaming_status_str
c_call_str
c_call_setup_str
c_call_held_str
c_resp_and_hold_str
c_call_dir_str
c_call_state_str
c_call_mpty_type_str
c_volume_control_target_str
c_at_response_code_str
c_subscriber_service_type_str
c_inband_ring_state_str
#define ESP_HFP_RINGBUF_SIZE
bt_app_hf_client_cb(esp_hf_client_cb_event_t, esp_hf_client_cb_param_t *)
Files
loading...
SourceVuESP-IDF Framework and Exampleshfp_hf samplemain/bt_app_hf.c
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/* * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 *//* ... */ #include <stdint.h> #include <stdbool.h> #include <stdlib.h> #include <string.h> #include <inttypes.h> #include "esp_log.h" #include "bt_app_core.h" #include "bt_app_hf.h" #include "esp_bt_main.h" #include "esp_bt_device.h" #include "esp_gap_bt_api.h" #include "esp_hf_client_api.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "freertos/semphr.h" #include "freertos/ringbuf.h" #include "time.h" #include "sys/time.h" #include "sdkconfig.h"20 includes const char *c_hf_evt_str[] = { "CONNECTION_STATE_EVT", /*!< connection state changed event */ "AUDIO_STATE_EVT", /*!< audio connection state change event */ "VR_STATE_CHANGE_EVT", /*!< voice recognition state changed */ "CALL_IND_EVT", /*!< call indication event */ "CALL_SETUP_IND_EVT", /*!< call setup indication event */ "CALL_HELD_IND_EVT", /*!< call held indicator event */ "NETWORK_STATE_EVT", /*!< network state change event */ "SIGNAL_STRENGTH_IND_EVT", /*!< signal strength indication event */ "ROAMING_STATUS_IND_EVT", /*!< roaming status indication event */ "BATTERY_LEVEL_IND_EVT", /*!< battery level indication event */ "CURRENT_OPERATOR_EVT", /*!< current operator name event */ "RESP_AND_HOLD_EVT", /*!< response and hold event */ "CLIP_EVT", /*!< Calling Line Identification notification event */ "CALL_WAITING_EVT", /*!< call waiting notification */ "CLCC_EVT", /*!< listing current calls event */ "VOLUME_CONTROL_EVT", /*!< audio volume control event */ "AT_RESPONSE", /*!< audio volume control event */ "SUBSCRIBER_INFO_EVT", /*!< subscriber information event */ "INBAND_RING_TONE_EVT", /*!< in-band ring tone settings */ "LAST_VOICE_TAG_NUMBER_EVT", /*!< requested number from AG event */ "RING_IND_EVT", /*!< ring indication event */ "PKT_STAT_EVT", /*!< requested number of packet status event */ "PROF_STATE_EVT", /*!< Indicate HF CLIENT init or deinit complete */ }{...}; // esp_hf_client_connection_state_t const char *c_connection_state_str[] = { "disconnected", "connecting", "connected", "slc_connected", "disconnecting", }{...}; // esp_hf_client_audio_state_t const char *c_audio_state_str[] = { "disconnected", "connecting", "connected", "connected_msbc", }{...}; /// esp_hf_vr_state_t const char *c_vr_state_str[] = { "disabled", "enabled", }{...}; // esp_hf_service_availability_status_t const char *c_service_availability_status_str[] = { "unavailable", "available", }{...}; // esp_hf_roaming_status_t const char *c_roaming_status_str[] = { "inactive", "active", }{...}; // esp_hf_client_call_state_t const char *c_call_str[] = { "NO call in progress", "call in progress", }{...}; // esp_hf_client_callsetup_t const char *c_call_setup_str[] = { "NONE", "INCOMING", "OUTGOING_DIALING", "OUTGOING_ALERTING" }{...}; // esp_hf_client_callheld_t const char *c_call_held_str[] = { "NONE held", "Held and Active", "Held", }{...}; // esp_hf_response_and_hold_status_t const char *c_resp_and_hold_str[] = { "HELD", "HELD ACCEPTED", "HELD REJECTED", }{...}; // esp_hf_client_call_direction_t const char *c_call_dir_str[] = { "outgoing", "incoming", }{...}; // esp_hf_client_call_state_t const char *c_call_state_str[] = { "active", "held", "dialing", "alerting", "incoming", "waiting", "held_by_resp_hold", }{...}; // esp_hf_current_call_mpty_type_t const char *c_call_mpty_type_str[] = { "single", "multi", }{...}; // esp_hf_volume_control_target_t const char *c_volume_control_target_str[] = { "SPEAKER", "MICROPHONE" }{...}; // esp_hf_at_response_code_t const char *c_at_response_code_str[] = { "OK", "ERROR" "ERR_NO_CARRIER", "ERR_BUSY", "ERR_NO_ANSWER", "ERR_DELAYED", "ERR_BLACKLILSTED", "ERR_CME", }{...}; // esp_hf_subscriber_service_type_t const char *c_subscriber_service_type_str[] = { "unknown", "voice", "fax", }{...}; // esp_hf_client_in_band_ring_state_t const char *c_inband_ring_state_str[] = { "NOT provided", "Provided", }{...}; extern esp_bd_addr_t peer_addr; // If you want to connect a specific device, add it's address here // esp_bd_addr_t peer_addr = {0xac, 0x67, 0xb2, 0x53, 0x77, 0xbe}; #if CONFIG_BT_HFP_AUDIO_DATA_PATH_HCI #define ESP_HFP_RINGBUF_SIZE 3600 static RingbufHandle_t m_rb = NULL; static void bt_app_hf_client_audio_open(void) { m_rb = xRingbufferCreate(ESP_HFP_RINGBUF_SIZE, RINGBUF_TYPE_BYTEBUF); }{...} static void bt_app_hf_client_audio_close(void) { if (!m_rb) { return ; }{...} vRingbufferDelete(m_rb); }{...} static uint32_t bt_app_hf_client_outgoing_cb(uint8_t *p_buf, uint32_t sz) { if (!m_rb) { return 0; }{...} size_t item_size = 0; uint8_t *data = xRingbufferReceiveUpTo(m_rb, &item_size, 0, sz); if (item_size == sz) { memcpy(p_buf, data, item_size); vRingbufferReturnItem(m_rb, data); return sz; }{...} else if (0 < item_size) { vRingbufferReturnItem(m_rb, data); return 0; }{...} else { // data not enough, do not read return 0; }{...} }{...} static void bt_app_hf_client_incoming_cb(const uint8_t *buf, uint32_t sz) { if (! m_rb) { return; }{...} BaseType_t done = xRingbufferSend(m_rb, (uint8_t *)buf, sz, 0); if (! done) { ESP_LOGE(BT_HF_TAG, "rb send fail"); }{...} esp_hf_client_outgoing_data_ready(); }{...} /* ... */#endif /* #if CONFIG_BT_HFP_AUDIO_DATA_PATH_HCI */ /* callback for HF_CLIENT */ void bt_app_hf_client_cb(esp_hf_client_cb_event_t event, esp_hf_client_cb_param_t *param) { if (event <= ESP_HF_CLIENT_PROF_STATE_EVT) { ESP_LOGI(BT_HF_TAG, "APP HFP event: %s", c_hf_evt_str[event]); }{...} else { ESP_LOGE(BT_HF_TAG, "APP HFP invalid event %d", event); }{...} switch (event) { case ESP_HF_CLIENT_CONNECTION_STATE_EVT: { ESP_LOGI(BT_HF_TAG, "--connection state %s, peer feats 0x%"PRIx32", chld_feats 0x%"PRIx32, c_connection_state_str[param->conn_stat.state], param->conn_stat.peer_feat, param->conn_stat.chld_feat); memcpy(peer_addr,param->conn_stat.remote_bda,ESP_BD_ADDR_LEN); break; }{...} ... case ESP_HF_CLIENT_AUDIO_STATE_EVT: { ESP_LOGI(BT_HF_TAG, "--audio state %s", c_audio_state_str[param->audio_stat.state]); #if CONFIG_BT_HFP_AUDIO_DATA_PATH_HCI if (param->audio_stat.state == ESP_HF_CLIENT_AUDIO_STATE_CONNECTED || param->audio_stat.state == ESP_HF_CLIENT_AUDIO_STATE_CONNECTED_MSBC) { esp_hf_client_register_data_callback(bt_app_hf_client_incoming_cb, bt_app_hf_client_outgoing_cb); bt_app_hf_client_audio_open(); }{...} else if (param->audio_stat.state == ESP_HF_CLIENT_AUDIO_STATE_DISCONNECTED) { bt_app_hf_client_audio_close(); }{...} /* ... */#endif /* #if CONFIG_BT_HFP_AUDIO_DATA_PATH_HCI */ break; }{...} ... case ESP_HF_CLIENT_BVRA_EVT: { ESP_LOGI(BT_HF_TAG, "--VR state %s", c_vr_state_str[param->bvra.value]); break; }{...} ... case ESP_HF_CLIENT_CIND_SERVICE_AVAILABILITY_EVT: { ESP_LOGI(BT_HF_TAG, "--NETWORK STATE %s", c_service_availability_status_str[param->service_availability.status]); break; }{...} ... case ESP_HF_CLIENT_CIND_ROAMING_STATUS_EVT: { ESP_LOGI(BT_HF_TAG, "--ROAMING: %s", c_roaming_status_str[param->roaming.status]); break; }{...} ... case ESP_HF_CLIENT_CIND_SIGNAL_STRENGTH_EVT: { ESP_LOGI(BT_HF_TAG, "-- signal strength: %d", param->signal_strength.value); break; }{...} ... case ESP_HF_CLIENT_CIND_BATTERY_LEVEL_EVT: { ESP_LOGI(BT_HF_TAG, "--battery level %d", param->battery_level.value); break; }{...} ... case ESP_HF_CLIENT_COPS_CURRENT_OPERATOR_EVT: { ESP_LOGI(BT_HF_TAG, "--operator name: %s", param->cops.name); break; }{...} ... case ESP_HF_CLIENT_CIND_CALL_EVT: { ESP_LOGI(BT_HF_TAG, "--Call indicator %s", c_call_str[param->call.status]); break; }{...} ... case ESP_HF_CLIENT_CIND_CALL_SETUP_EVT: { ESP_LOGI(BT_HF_TAG, "--Call setup indicator %s", c_call_setup_str[param->call_setup.status]); break; }{...} ... case ESP_HF_CLIENT_CIND_CALL_HELD_EVT: { ESP_LOGI(BT_HF_TAG, "--Call held indicator %s", c_call_held_str[param->call_held.status]); break; }{...} ... case ESP_HF_CLIENT_BTRH_EVT: { ESP_LOGI(BT_HF_TAG, "--response and hold %s", c_resp_and_hold_str[param->btrh.status]); break; }{...} ... case ESP_HF_CLIENT_CLIP_EVT: { ESP_LOGI(BT_HF_TAG, "--clip number %s", (param->clip.number == NULL) ? "NULL" : (param->clip.number)); break; }{...} ... case ESP_HF_CLIENT_CCWA_EVT: { ESP_LOGI(BT_HF_TAG, "--call_waiting %s", (param->ccwa.number == NULL) ? "NULL" : (param->ccwa.number)); break; }{...} ... case ESP_HF_CLIENT_CLCC_EVT: { ESP_LOGI(BT_HF_TAG, "--Current call: idx %d, dir %s, state %s, mpty %s, number %s", param->clcc.idx, c_call_dir_str[param->clcc.dir], c_call_state_str[param->clcc.status], c_call_mpty_type_str[param->clcc.mpty], (param->clcc.number == NULL) ? "NULL" : (param->clcc.number)); break; }{...} ... case ESP_HF_CLIENT_VOLUME_CONTROL_EVT: { ESP_LOGI(BT_HF_TAG, "--volume_target: %s, volume %d", c_volume_control_target_str[param->volume_control.type], param->volume_control.volume); break; }{...} ... case ESP_HF_CLIENT_AT_RESPONSE_EVT: { ESP_LOGI(BT_HF_TAG, "--AT response event, code %d, cme %d", param->at_response.code, param->at_response.cme); break; }{...} ... case ESP_HF_CLIENT_CNUM_EVT: { ESP_LOGI(BT_HF_TAG, "--subscriber type %s, number %s", c_subscriber_service_type_str[param->cnum.type], (param->cnum.number == NULL) ? "NULL" : param->cnum.number); break; }{...} ... case ESP_HF_CLIENT_BSIR_EVT: { ESP_LOGI(BT_HF_TAG, "--inband ring state %s", c_inband_ring_state_str[param->bsir.state]); break; }{...} ... case ESP_HF_CLIENT_BINP_EVT: { ESP_LOGI(BT_HF_TAG, "--last voice tag number: %s", (param->binp.number == NULL) ? "NULL" : param->binp.number); break; }{...} case ESP_HF_CLIENT_PKT_STAT_NUMS_GET_EVT: { ESP_LOGE(BT_HF_TAG, "ESP_HF_CLIENT_PKT_STAT_NUMS_GET_EVT: %d", event); break; }{...} case ESP_HF_CLIENT_PROF_STATE_EVT: { if (ESP_HF_INIT_SUCCESS == param->prof_stat.state) { ESP_LOGI(BT_HF_TAG, "HF PROF STATE: Init Complete"); }{...} else if (ESP_HF_DEINIT_SUCCESS == param->prof_stat.state) { ESP_LOGI(BT_HF_TAG, "HF PROF STATE: Deinit Complete"); }{...} else { ESP_LOGE(BT_HF_TAG, "HF PROF STATE error: %d", param->prof_stat.state); }{...} break; }{...} default: ESP_LOGE(BT_HF_TAG, "HF_CLIENT EVT: %d", event); break;... }{...} }{ ... }
Details
Show:
from
Types: Columns:
This file uses the notable symbols shown below. Click anywhere in the file to view more details.