1 /* 2 * Copyright (C) 2014 BlueKitchen GmbH 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of the copyright holders nor the names of 14 * contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 4. Any redistribution, use, or modification is done solely for 17 * personal benefit and not for any commercial purpose or for 18 * monetary gain. 19 * 20 * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 24 * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * Please inquire about commercial licensing options at 34 * [email protected] 35 * 36 */ 37 38 #define BTSTACK_FILE__ "hfp.c" 39 40 41 #include "btstack_config.h" 42 43 #include <stdint.h> 44 #include <stdio.h> 45 #include <string.h> 46 #include <inttypes.h> 47 48 #include "bluetooth_sdp.h" 49 #include "btstack_debug.h" 50 #include "btstack_event.h" 51 #include "btstack_memory.h" 52 #include "btstack_run_loop.h" 53 #include "classic/sdp_client_rfcomm.h" 54 #include "classic/sdp_server.h" 55 #include "classic/sdp_util.h" 56 #include "classic/sdp_client.h" 57 #include "hci.h" 58 #include "hci_cmd.h" 59 #include "hci_dump.h" 60 61 #if defined(ENABLE_CC256X_ASSISTED_HFP) && !defined(ENABLE_SCO_OVER_PCM) 62 #error "Assisted HFP is only possible over PCM/I2S. Please add define: ENABLE_SCO_OVER_PCM" 63 #endif 64 65 #if defined(ENABLE_BCM_PCM_WBS) && !defined(ENABLE_SCO_OVER_PCM) 66 #error "WBS for PCM is only possible over PCM/I2S. Please add define: ENABLE_SCO_OVER_PCM" 67 #endif 68 69 #define HFP_HF_FEATURES_SIZE 10 70 #define HFP_AG_FEATURES_SIZE 12 71 72 typedef struct { 73 hfp_role_t local_role; 74 bd_addr_t remote_address; 75 } hfp_sdp_query_context_t; 76 77 // globals 78 79 static btstack_linked_list_t hfp_connections ; 80 81 static btstack_packet_handler_t hfp_hf_callback; 82 static btstack_packet_handler_t hfp_ag_callback; 83 84 static btstack_packet_handler_t hfp_hf_rfcomm_packet_handler; 85 static btstack_packet_handler_t hfp_ag_rfcomm_packet_handler; 86 87 static uint16_t hfp_allowed_sco_packet_types; 88 static hfp_connection_t * hfp_sco_establishment_active; 89 90 static hfp_sdp_query_context_t hfp_sdp_query_context; 91 static btstack_context_callback_registration_t hfp_sdp_query_request; 92 93 94 95 96 97 // custom commands 98 static btstack_linked_list_t hfp_custom_commands_ag; 99 static btstack_linked_list_t hfp_custom_commands_hf; 100 101 // prototypes 102 static hfp_link_settings_t hfp_next_link_setting_for_connection(hfp_link_settings_t current_setting, hfp_connection_t * hfp_connection, uint8_t eSCO_S4_supported); 103 static void parse_sequence(hfp_connection_t * context); 104 105 106 #define CODEC_MASK_CVSD (1 << HFP_CODEC_CVSD) 107 #define CODEC_MASK_OTHER ((1 << HFP_CODEC_MSBC) | (1 << HFP_CODEC_LC3_SWB)) 108 109 static const struct { 110 const uint16_t max_latency; 111 const uint8_t retransmission_effort; 112 const uint16_t packet_types; 113 const bool eSCO; 114 const uint8_t codec_mask; 115 } hfp_link_settings [] = { 116 {0x0004, 0xff, SCO_PACKET_TYPES_HV1, false, CODEC_MASK_CVSD }, // HFP_LINK_SETTINGS_D0 117 {0x0005, 0xff, SCO_PACKET_TYPES_HV3, false, CODEC_MASK_CVSD }, // HFP_LINK_SETTINGS_D1 118 {0x0007, 0x01, SCO_PACKET_TYPES_EV3, true, CODEC_MASK_CVSD }, // HFP_LINK_SETTINGS_S1 119 {0x0007, 0x01, SCO_PACKET_TYPES_2EV3, true, CODEC_MASK_CVSD }, // HFP_LINK_SETTINGS_S2 120 {0x000a, 0x01, SCO_PACKET_TYPES_2EV3, true, CODEC_MASK_CVSD }, // HFP_LINK_SETTINGS_S3 121 {0x000c, 0x02, SCO_PACKET_TYPES_2EV3, true, CODEC_MASK_CVSD }, // HFP_LINK_SETTINGS_S4 122 {0x0008, 0x02, SCO_PACKET_TYPES_EV3, true, CODEC_MASK_OTHER}, // HFP_LINK_SETTINGS_T1 123 {0x000d, 0x02, SCO_PACKET_TYPES_2EV3, true, CODEC_MASK_OTHER} // HFP_LINK_SETTINGS_T2 124 }; 125 126 // table 5.8 'mandatory safe settings' for eSCO + similar entries for SCO 127 static const struct hfp_mandatory_safe_setting { 128 const uint8_t codec_mask; 129 const bool secure_connection_in_use; 130 hfp_link_settings_t link_setting; 131 } hfp_mandatory_safe_settings[] = { 132 { CODEC_MASK_CVSD, false, HFP_LINK_SETTINGS_D1}, 133 { CODEC_MASK_CVSD, true, HFP_LINK_SETTINGS_D1}, 134 { CODEC_MASK_CVSD, false, HFP_LINK_SETTINGS_S1}, 135 { CODEC_MASK_CVSD, true, HFP_LINK_SETTINGS_S4}, 136 { CODEC_MASK_OTHER, false, HFP_LINK_SETTINGS_T1}, 137 { CODEC_MASK_OTHER, true, HFP_LINK_SETTINGS_T2}, 138 }; 139 140 static const char * hfp_hf_features[] = { 141 "EC and/or NR function", 142 "Three-way calling", 143 "CLI presentation capability", 144 "Voice recognition activation", 145 "Remote volume control", 146 147 "Enhanced call status", 148 "Enhanced call control", 149 150 "Codec negotiation", 151 152 "HF Indicators", 153 "eSCO S4 (and T2) Settings Supported", 154 "Reserved for future definition" 155 }; 156 157 static const char * hfp_ag_features[] = { 158 "Three-way calling", 159 "EC and/or NR function", 160 "Voice recognition function", 161 "In-band ring tone capability", 162 "Attach a number to a voice tag", 163 "Ability to reject a call", 164 "Enhanced call status", 165 "Enhanced call control", 166 "Extended Error Result Codes", 167 "Codec negotiation", 168 "HF Indicators", 169 "eSCO S4 (and T2) Settings Supported", 170 "Reserved for future definition" 171 }; 172 173 static const char * hfp_enhanced_call_dir[] = { 174 "outgoing", 175 "incoming" 176 }; 177 178 static const char * hfp_enhanced_call_status[] = { 179 "active", 180 "held", 181 "outgoing dialing", 182 "outgoing alerting", 183 "incoming", 184 "incoming waiting", 185 "call held by response and hold" 186 }; 187 188 static const char * hfp_enhanced_call_mode[] = { 189 "voice", 190 "data", 191 "fax" 192 }; 193 194 static const char * hfp_enhanced_call_mpty[] = { 195 "not a conference call", 196 "conference call" 197 }; 198 199 const char * hfp_enhanced_call_dir2str(uint16_t index){ 200 if (index <= HFP_ENHANCED_CALL_DIR_INCOMING) return hfp_enhanced_call_dir[index]; 201 return "not defined"; 202 } 203 204 const char * hfp_enhanced_call_status2str(uint16_t index){ 205 if (index <= HFP_ENHANCED_CALL_STATUS_CALL_HELD_BY_RESPONSE_AND_HOLD) return hfp_enhanced_call_status[index]; 206 return "not defined"; 207 } 208 209 const char * hfp_enhanced_call_mode2str(uint16_t index){ 210 if (index <= HFP_ENHANCED_CALL_MODE_FAX) return hfp_enhanced_call_mode[index]; 211 return "not defined"; 212 } 213 214 const char * hfp_enhanced_call_mpty2str(uint16_t index){ 215 if (index <= HFP_ENHANCED_CALL_MPTY_CONFERENCE_CALL) return hfp_enhanced_call_mpty[index]; 216 return "not defined"; 217 } 218 219 static uint16_t hfp_parse_indicator_index(hfp_connection_t * hfp_connection){ 220 uint16_t index = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 221 222 if (index > HFP_MAX_NUM_INDICATORS){ 223 log_info("ignoring invalid indicator index bigger then HFP_MAX_NUM_INDICATORS"); 224 return HFP_MAX_NUM_INDICATORS - 1; 225 } 226 227 // indicator index enumeration starts with 1, we substract 1 to store in array with starting index 0 228 if (index > 0){ 229 index -= 1; 230 } else { 231 log_info("ignoring invalid indicator index 0"); 232 return 0; 233 } 234 return index; 235 } 236 237 static void hfp_next_indicators_index(hfp_connection_t * hfp_connection){ 238 if (hfp_connection->parser_item_index < HFP_MAX_NUM_INDICATORS - 1){ 239 hfp_connection->parser_item_index++; 240 } else { 241 log_info("Ignoring additional indicator"); 242 } 243 } 244 245 static void hfp_next_codec_index(hfp_connection_t * hfp_connection){ 246 if (hfp_connection->parser_item_index < HFP_MAX_NUM_CODECS - 1){ 247 hfp_connection->parser_item_index++; 248 } else { 249 log_info("Ignoring additional codec index"); 250 } 251 } 252 253 static void hfp_next_remote_call_services_index(hfp_connection_t * hfp_connection){ 254 if (hfp_connection->remote_call_services_index < HFP_MAX_NUM_CALL_SERVICES - 1){ 255 hfp_connection->remote_call_services_index++; 256 } else { 257 log_info("Ignoring additional remote_call_services"); 258 } 259 } 260 261 const char * hfp_hf_feature(int index){ 262 if (index > HFP_HF_FEATURES_SIZE){ 263 return hfp_hf_features[HFP_HF_FEATURES_SIZE]; 264 } 265 return hfp_hf_features[index]; 266 } 267 268 const char * hfp_ag_feature(int index){ 269 if (index > HFP_AG_FEATURES_SIZE){ 270 return hfp_ag_features[HFP_AG_FEATURES_SIZE]; 271 } 272 return hfp_ag_features[index]; 273 } 274 275 int send_str_over_rfcomm(uint16_t cid, const char * command){ 276 if (!rfcomm_can_send_packet_now(cid)) return 1; 277 log_info("HFP_TX %s", command); 278 int err = rfcomm_send(cid, (uint8_t*) command, (uint16_t) strlen(command)); 279 if (err){ 280 log_error("rfcomm_send -> error 0x%02x \n", err); 281 } 282 #ifdef ENABLE_HFP_AT_MESSAGES 283 hfp_connection_t * hfp_connection = get_hfp_connection_context_for_rfcomm_cid(cid); 284 hfp_emit_string_event(hfp_connection, HFP_SUBEVENT_AT_MESSAGE_SENT, command); 285 #endif 286 return 1; 287 } 288 289 int hfp_supports_codec(uint8_t codec, int codecs_nr, uint8_t * codecs){ 290 291 // mSBC requires support for eSCO connections 292 if ((codec == HFP_CODEC_MSBC) && !hci_extended_sco_link_supported()) return 0; 293 294 int i; 295 for (i = 0; i < codecs_nr; i++){ 296 if (codecs[i] != codec) continue; 297 return 1; 298 } 299 return 0; 300 } 301 302 void hfp_hf_drop_mSBC_if_eSCO_not_supported(uint8_t * codecs, uint8_t * codecs_nr){ 303 if (hci_extended_sco_link_supported()) return; 304 uint8_t i; 305 int filtered_codec_count = 0; 306 for (i=0; i < *codecs_nr; i++){ 307 if (codecs[i] != HFP_CODEC_MSBC) { 308 codecs[filtered_codec_count++] = codecs[i]; 309 } 310 } 311 *codecs_nr = filtered_codec_count; 312 } 313 314 // UTILS 315 int get_bit(uint16_t bitmap, int position){ 316 return (bitmap >> position) & 1; 317 } 318 319 int store_bit(uint32_t bitmap, int position, uint8_t value){ 320 if (value){ 321 bitmap |= 1 << position; 322 } else { 323 bitmap &= ~ (1 << position); 324 } 325 return bitmap; 326 } 327 328 int join(char * buffer, int buffer_size, uint8_t * values, int values_nr){ 329 if (buffer_size < (values_nr * 3)) return 0; 330 int i; 331 int offset = 0; 332 for (i = 0; i < (values_nr-1); i++) { 333 offset += snprintf(buffer+offset, buffer_size-offset, "%d,", values[i]); // puts string into buffer 334 } 335 if (i<values_nr){ 336 offset += snprintf(buffer+offset, buffer_size-offset, "%d", values[i]); 337 } 338 return offset; 339 } 340 341 int join_bitmap(char * buffer, int buffer_size, uint32_t values, int values_nr){ 342 if (buffer_size < (values_nr * 3)) return 0; 343 344 int i; 345 int offset = 0; 346 for (i = 0; i < (values_nr-1); i++) { 347 offset += snprintf(buffer+offset, buffer_size-offset, "%d,", get_bit(values,i)); // puts string into buffer 348 } 349 350 if (i<values_nr){ 351 offset += snprintf(buffer+offset, buffer_size-offset, "%d", get_bit(values,i)); 352 } 353 return offset; 354 } 355 static void hfp_emit_event_for_role(hfp_role_t local_role, uint8_t * packet, uint16_t size){ 356 switch (local_role){ 357 case HFP_ROLE_HF: 358 (*hfp_hf_callback)(HCI_EVENT_PACKET, 0, packet, size); 359 break; 360 case HFP_ROLE_AG: 361 (*hfp_ag_callback)(HCI_EVENT_PACKET, 0, packet, size); 362 break; 363 default: 364 btstack_unreachable(); 365 break; 366 } 367 } 368 369 static void hfp_emit_event_for_context(hfp_connection_t * hfp_connection, uint8_t * packet, uint16_t size){ 370 if (!hfp_connection) return; 371 hfp_emit_event_for_role(hfp_connection->local_role, packet, size); 372 } 373 374 void hfp_emit_simple_event(hfp_connection_t * hfp_connection, uint8_t event_subtype){ 375 hci_con_handle_t acl_handle = (hfp_connection != NULL) ? hfp_connection->acl_handle : HCI_CON_HANDLE_INVALID; 376 uint8_t event[5]; 377 event[0] = HCI_EVENT_HFP_META; 378 event[1] = sizeof(event) - 2; 379 event[2] = event_subtype; 380 little_endian_store_16(event, 3, acl_handle); 381 hfp_emit_event_for_context(hfp_connection, event, sizeof(event)); 382 } 383 384 void hfp_emit_event(hfp_connection_t * hfp_connection, uint8_t event_subtype, uint8_t value){ 385 hci_con_handle_t acl_handle = (hfp_connection != NULL) ? hfp_connection->acl_handle : HCI_CON_HANDLE_INVALID; 386 uint8_t event[6]; 387 event[0] = HCI_EVENT_HFP_META; 388 event[1] = sizeof(event) - 2; 389 event[2] = event_subtype; 390 little_endian_store_16(event, 3, acl_handle); 391 event[5] = value; // status 0 == OK 392 hfp_emit_event_for_context(hfp_connection, event, sizeof(event)); 393 } 394 395 void hfp_emit_voice_recognition_enabled(hfp_connection_t * hfp_connection, uint8_t status){ 396 btstack_assert(hfp_connection != NULL); 397 398 uint8_t event[7]; 399 event[0] = HCI_EVENT_HFP_META; 400 event[1] = sizeof(event) - 2; 401 event[2] = HFP_SUBEVENT_VOICE_RECOGNITION_ACTIVATED; 402 403 little_endian_store_16(event, 3, hfp_connection->acl_handle); 404 event[5] = status; // 0:success 405 event[6] = hfp_connection->enhanced_voice_recognition_enabled ? 1 : 0; 406 hfp_emit_event_for_context(hfp_connection, event, sizeof(event)); 407 } 408 409 void hfp_emit_voice_recognition_disabled(hfp_connection_t * hfp_connection, uint8_t status){ 410 btstack_assert(hfp_connection != NULL); 411 412 uint8_t event[6]; 413 event[0] = HCI_EVENT_HFP_META; 414 event[1] = sizeof(event) - 2; 415 event[2] = HFP_SUBEVENT_VOICE_RECOGNITION_DEACTIVATED; 416 417 little_endian_store_16(event, 3, hfp_connection->acl_handle); 418 event[5] = status; // 0:success 419 hfp_emit_event_for_context(hfp_connection, event, sizeof(event)); 420 } 421 422 void hfp_emit_enhanced_voice_recognition_hf_ready_for_audio_event(hfp_connection_t * hfp_connection, uint8_t status){ 423 hci_con_handle_t acl_handle = (hfp_connection != NULL) ? hfp_connection->acl_handle : HCI_CON_HANDLE_INVALID; 424 425 uint8_t event[6]; 426 event[0] = HCI_EVENT_HFP_META; 427 event[1] = sizeof(event) - 2; 428 event[2] = HFP_SUBEVENT_ENHANCED_VOICE_RECOGNITION_HF_READY_FOR_AUDIO; 429 little_endian_store_16(event, 3, acl_handle); 430 event[5] = status; 431 hfp_emit_event_for_context(hfp_connection, event, sizeof(event)); 432 } 433 434 void hfp_emit_enhanced_voice_recognition_state_event(hfp_connection_t * hfp_connection, uint8_t status){ 435 hci_con_handle_t acl_handle = (hfp_connection != NULL) ? hfp_connection->acl_handle : HCI_CON_HANDLE_INVALID; 436 437 uint8_t event[6]; 438 event[0] = HCI_EVENT_HFP_META; 439 event[1] = sizeof(event) - 2; 440 switch (hfp_connection->ag_vra_state){ 441 case HFP_VOICE_RECOGNITION_STATE_AG_READY_TO_ACCEPT_AUDIO_INPUT: 442 event[2] = HFP_SUBEVENT_ENHANCED_VOICE_RECOGNITION_AG_READY_TO_ACCEPT_AUDIO_INPUT; 443 break; 444 case HFP_VOICE_RECOGNITION_STATE_AG_IS_STARTING_SOUND: 445 event[2] = HFP_SUBEVENT_ENHANCED_VOICE_RECOGNITION_AG_IS_STARTING_SOUND; 446 break; 447 case HFP_VOICE_RECOGNITION_STATE_AG_IS_PROCESSING_AUDIO_INPUT: 448 event[2] = HFP_SUBEVENT_ENHANCED_VOICE_RECOGNITION_AG_IS_PROCESSING_AUDIO_INPUT; 449 break; 450 default: 451 btstack_unreachable(); 452 break; 453 } 454 455 little_endian_store_16(event, 3, acl_handle); 456 event[5] = status; 457 hfp_emit_event_for_context(hfp_connection, event, sizeof(event)); 458 } 459 460 void hfp_emit_slc_connection_event(hfp_role_t local_role, uint8_t status, hci_con_handle_t con_handle, bd_addr_t addr){ 461 uint8_t event[12]; 462 int pos = 0; 463 event[pos++] = HCI_EVENT_HFP_META; 464 event[pos++] = sizeof(event) - 2; 465 event[pos++] = HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_ESTABLISHED; 466 little_endian_store_16(event, pos, con_handle); 467 pos += 2; 468 event[pos++] = status; // status 0 == OK 469 reverse_bd_addr(addr,&event[pos]); 470 pos += 6; 471 hfp_emit_event_for_role(local_role, event, sizeof(event)); 472 } 473 474 static void hfp_emit_audio_connection_released(hfp_connection_t * hfp_connection, hci_con_handle_t sco_handle){ 475 btstack_assert(hfp_connection != NULL); 476 uint8_t event[7]; 477 int pos = 0; 478 event[pos++] = HCI_EVENT_HFP_META; 479 event[pos++] = sizeof(event) - 2; 480 event[pos++] = HFP_SUBEVENT_AUDIO_CONNECTION_RELEASED; 481 little_endian_store_16(event, pos, hfp_connection->acl_handle); 482 pos += 2; 483 little_endian_store_16(event, pos, sco_handle); 484 pos += 2; 485 hfp_emit_event_for_context(hfp_connection, event, sizeof(event)); 486 } 487 488 void hfp_emit_sco_connection_established(hfp_connection_t *hfp_connection, uint8_t status, uint8_t negotiated_codec, 489 uint16_t rx_packet_length, uint16_t tx_packet_length) { 490 btstack_assert(hfp_connection != NULL); 491 uint8_t event[17]; 492 int pos = 0; 493 event[pos++] = HCI_EVENT_HFP_META; 494 event[pos++] = sizeof(event) - 2; 495 event[pos++] = HFP_SUBEVENT_AUDIO_CONNECTION_ESTABLISHED; 496 little_endian_store_16(event, pos, hfp_connection->acl_handle); 497 pos += 2; 498 event[pos++] = status; // status 0 == OK 499 little_endian_store_16(event, pos, hfp_connection->sco_handle); 500 pos += 2; 501 reverse_bd_addr(hfp_connection->remote_addr,&event[pos]); 502 pos += 6; 503 event[pos++] = negotiated_codec; 504 little_endian_store_16(event, pos, hfp_connection->packet_types); 505 hfp_emit_event_for_context(hfp_connection, event, sizeof(event)); 506 } 507 508 void hfp_emit_string_event(hfp_connection_t * hfp_connection, uint8_t event_subtype, const char * value){ 509 btstack_assert(hfp_connection != NULL); 510 #ifdef ENABLE_HFP_AT_MESSAGES 511 uint8_t event[256]; 512 #else 513 uint8_t event[40]; 514 #endif 515 uint16_t string_len = btstack_min((uint16_t) strlen(value), sizeof(event) - 6); 516 event[0] = HCI_EVENT_HFP_META; 517 event[1] = 4 + string_len; 518 event[2] = event_subtype; 519 little_endian_store_16(event, 3, hfp_connection->acl_handle); 520 memcpy((char*)&event[5], value, string_len); 521 event[5 + string_len] = 0; 522 hfp_emit_event_for_context(hfp_connection, event, 6 + string_len); 523 } 524 525 btstack_linked_list_t * hfp_get_connections(void){ 526 return (btstack_linked_list_t *) &hfp_connections; 527 } 528 529 hfp_connection_t * get_hfp_connection_context_for_rfcomm_cid(uint16_t cid){ 530 btstack_linked_list_iterator_t it; 531 btstack_linked_list_iterator_init(&it, hfp_get_connections()); 532 while (btstack_linked_list_iterator_has_next(&it)){ 533 hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it); 534 if (hfp_connection->rfcomm_cid == cid){ 535 return hfp_connection; 536 } 537 } 538 return NULL; 539 } 540 541 hfp_connection_t * get_hfp_connection_context_for_bd_addr(bd_addr_t bd_addr, hfp_role_t hfp_role){ 542 btstack_linked_list_iterator_t it; 543 btstack_linked_list_iterator_init(&it, hfp_get_connections()); 544 while (btstack_linked_list_iterator_has_next(&it)){ 545 hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it); 546 if ((memcmp(hfp_connection->remote_addr, bd_addr, 6) == 0) && (hfp_connection->local_role == hfp_role)) { 547 return hfp_connection; 548 } 549 } 550 return NULL; 551 } 552 553 hfp_connection_t * get_hfp_connection_context_for_sco_handle(uint16_t handle, hfp_role_t hfp_role){ 554 btstack_linked_list_iterator_t it; 555 btstack_linked_list_iterator_init(&it, hfp_get_connections()); 556 while (btstack_linked_list_iterator_has_next(&it)){ 557 hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it); 558 if ((hfp_connection->sco_handle == handle) && (hfp_connection->local_role == hfp_role)){ 559 return hfp_connection; 560 } 561 } 562 return NULL; 563 } 564 565 hfp_connection_t * get_hfp_connection_context_for_acl_handle(uint16_t handle, hfp_role_t hfp_role){ 566 btstack_linked_list_iterator_t it; 567 btstack_linked_list_iterator_init(&it, hfp_get_connections()); 568 while (btstack_linked_list_iterator_has_next(&it)){ 569 hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it); 570 if ((hfp_connection->acl_handle == handle) && (hfp_connection->local_role == hfp_role)){ 571 return hfp_connection; 572 } 573 } 574 return NULL; 575 } 576 577 578 static void hfp_reset_voice_recognition(hfp_connection_t * hfp_connection){ 579 btstack_assert(hfp_connection != NULL); 580 hfp_voice_recognition_activation_status_t current_vra_state = hfp_connection->vra_state; 581 hfp_connection->vra_state = HFP_VRA_VOICE_RECOGNITION_OFF; 582 583 if (current_vra_state != HFP_VRA_VOICE_RECOGNITION_OFF){ 584 hfp_emit_voice_recognition_disabled(hfp_connection, ERROR_CODE_SUCCESS); 585 } else if (hfp_connection->vra_state_requested != HFP_VRA_VOICE_RECOGNITION_OFF){ 586 hfp_emit_voice_recognition_disabled(hfp_connection, ERROR_CODE_SUCCESS); 587 } 588 589 hfp_connection->vra_state_requested = HFP_VRA_VOICE_RECOGNITION_OFF; 590 hfp_connection->activate_voice_recognition = false; 591 hfp_connection->deactivate_voice_recognition = false; 592 hfp_connection->enhanced_voice_recognition_enabled = false; 593 hfp_connection->ag_vra_status = 0; 594 hfp_connection->ag_vra_state = HFP_VOICE_RECOGNITION_STATE_AG_READY; 595 } 596 597 void hfp_reset_context_flags(hfp_connection_t * hfp_connection){ 598 if (!hfp_connection) return; 599 hfp_connection->ok_pending = 0; 600 hfp_connection->send_error = 0; 601 602 hfp_connection->found_equal_sign = false; 603 604 hfp_connection->change_status_update_for_individual_ag_indicators = 0; 605 hfp_connection->operator_name_changed = 0; 606 607 hfp_connection->enable_extended_audio_gateway_error_report = 0; 608 hfp_connection->extended_audio_gateway_error = 0; 609 610 // establish codecs hfp_connection 611 hfp_connection->suggested_codec = 0; 612 hfp_connection->negotiated_codec = 0; 613 hfp_connection->codec_confirmed = 0; 614 615 hfp_connection->establish_audio_connection = 0; 616 hfp_connection->call_waiting_notification_enabled = 0; 617 hfp_connection->command = HFP_CMD_NONE; 618 hfp_connection->enable_status_update_for_ag_indicators = 0xFF; 619 hfp_connection->clip_have_alpha = false; 620 hfp_reset_voice_recognition(hfp_connection); 621 } 622 623 static hfp_connection_t * create_hfp_connection_context(void){ 624 hfp_connection_t * hfp_connection = btstack_memory_hfp_connection_get(); 625 if (!hfp_connection) return NULL; 626 627 hfp_connection->state = HFP_IDLE; 628 hfp_connection->call_state = HFP_CALL_IDLE; 629 hfp_connection->codecs_state = HFP_CODECS_IDLE; 630 631 hfp_connection->parser_state = HFP_PARSER_CMD_HEADER; 632 633 hfp_connection->acl_handle = HCI_CON_HANDLE_INVALID; 634 hfp_connection->sco_handle = HCI_CON_HANDLE_INVALID; 635 636 hfp_reset_context_flags(hfp_connection); 637 638 btstack_linked_list_add(&hfp_connections, (btstack_linked_item_t*)hfp_connection); 639 return hfp_connection; 640 } 641 642 void hfp_finalize_connection_context(hfp_connection_t * hfp_connection){ 643 btstack_linked_list_remove(&hfp_connections, (btstack_linked_item_t*) hfp_connection); 644 btstack_memory_hfp_connection_free(hfp_connection); 645 } 646 647 static hfp_connection_t * hfp_create_connection(bd_addr_t bd_addr, hfp_role_t local_role){ 648 hfp_connection_t * hfp_connection = get_hfp_connection_context_for_bd_addr(bd_addr, local_role); 649 if (hfp_connection) return hfp_connection; 650 hfp_connection = create_hfp_connection_context(); 651 if (!hfp_connection) { 652 return NULL; 653 } 654 (void)memcpy(hfp_connection->remote_addr, bd_addr, 6); 655 hfp_connection->local_role = local_role; 656 log_info("Create HFP context %p: role %u, addr %s", hfp_connection, local_role, bd_addr_to_str(bd_addr)); 657 658 return hfp_connection; 659 } 660 661 /* @param network. 662 * 0 == no ability to reject a call. 663 * 1 == ability to reject a call. 664 */ 665 666 /* @param suported_features 667 * HF bit 0: EC and/or NR function (yes/no, 1 = yes, 0 = no) 668 * HF bit 1: Call waiting or three-way calling(yes/no, 1 = yes, 0 = no) 669 * HF bit 2: CLI presentation capability (yes/no, 1 = yes, 0 = no) 670 * HF bit 3: Voice recognition activation (yes/no, 1= yes, 0 = no) 671 * HF bit 4: Remote volume control (yes/no, 1 = yes, 0 = no) 672 * HF bit 5: Wide band speech (yes/no, 1 = yes, 0 = no) 673 */ 674 /* Bit position: 675 * AG bit 0: Three-way calling (yes/no, 1 = yes, 0 = no) 676 * AG bit 1: EC and/or NR function (yes/no, 1 = yes, 0 = no) 677 * AG bit 2: Voice recognition function (yes/no, 1 = yes, 0 = no) 678 * AG bit 3: In-band ring tone capability (yes/no, 1 = yes, 0 = no) 679 * AG bit 4: Attach a phone number to a voice tag (yes/no, 1 = yes, 0 = no) 680 * AG bit 5: Wide band speech (yes/no, 1 = yes, 0 = no) 681 */ 682 683 void hfp_create_sdp_record(uint8_t * service, uint32_t service_record_handle, uint16_t service_uuid, int rfcomm_channel_nr, const char * name){ 684 uint8_t* attribute; 685 de_create_sequence(service); 686 687 // 0x0000 "Service Record Handle" 688 de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_SERVICE_RECORD_HANDLE); 689 de_add_number(service, DE_UINT, DE_SIZE_32, service_record_handle); 690 691 // 0x0001 "Service Class ID List" 692 de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_SERVICE_CLASS_ID_LIST); 693 attribute = de_push_sequence(service); 694 { 695 // "UUID for Service" 696 de_add_number(attribute, DE_UUID, DE_SIZE_16, service_uuid); 697 de_add_number(attribute, DE_UUID, DE_SIZE_16, BLUETOOTH_SERVICE_CLASS_GENERIC_AUDIO); 698 } 699 de_pop_sequence(service, attribute); 700 701 // 0x0004 "Protocol Descriptor List" 702 de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_PROTOCOL_DESCRIPTOR_LIST); 703 attribute = de_push_sequence(service); 704 { 705 uint8_t* l2cpProtocol = de_push_sequence(attribute); 706 { 707 de_add_number(l2cpProtocol, DE_UUID, DE_SIZE_16, BLUETOOTH_PROTOCOL_L2CAP); 708 } 709 de_pop_sequence(attribute, l2cpProtocol); 710 711 uint8_t* rfcomm = de_push_sequence(attribute); 712 { 713 de_add_number(rfcomm, DE_UUID, DE_SIZE_16, BLUETOOTH_PROTOCOL_RFCOMM); // rfcomm_service 714 de_add_number(rfcomm, DE_UINT, DE_SIZE_8, rfcomm_channel_nr); // rfcomm channel 715 } 716 de_pop_sequence(attribute, rfcomm); 717 } 718 de_pop_sequence(service, attribute); 719 720 721 // 0x0005 "Public Browse Group" 722 de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_BROWSE_GROUP_LIST); // public browse group 723 attribute = de_push_sequence(service); 724 { 725 de_add_number(attribute, DE_UUID, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_PUBLIC_BROWSE_ROOT); 726 } 727 de_pop_sequence(service, attribute); 728 729 // 0x0009 "Bluetooth Profile Descriptor List" 730 de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_BLUETOOTH_PROFILE_DESCRIPTOR_LIST); 731 attribute = de_push_sequence(service); 732 { 733 uint8_t *sppProfile = de_push_sequence(attribute); 734 { 735 de_add_number(sppProfile, DE_UUID, DE_SIZE_16, BLUETOOTH_SERVICE_CLASS_HANDSFREE); 736 de_add_number(sppProfile, DE_UINT, DE_SIZE_16, 0x0108); // Verision 1.8 737 } 738 de_pop_sequence(attribute, sppProfile); 739 } 740 de_pop_sequence(service, attribute); 741 742 // 0x0100 "Service Name" 743 de_add_number(service, DE_UINT, DE_SIZE_16, 0x0100); 744 de_add_data(service, DE_STRING, (uint16_t) strlen(name), (uint8_t *) name); 745 } 746 747 static void hfp_handle_slc_setup_error(hfp_connection_t * hfp_connection, uint8_t status){ 748 // cache fields for event 749 hfp_role_t local_role = hfp_connection->local_role; 750 bd_addr_t remote_addr; 751 // cppcheck-suppress uninitvar ; remote_addr is reported as uninitialized although it's the destination of the memcpy 752 (void)memcpy(remote_addr, hfp_connection->remote_addr, 6); 753 // finalize connection struct 754 hfp_finalize_connection_context(hfp_connection); 755 // emit event 756 hfp_emit_slc_connection_event(local_role, status, HCI_CON_HANDLE_INVALID, remote_addr); 757 } 758 759 static void handle_query_rfcomm_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 760 UNUSED(packet_type); // ok: handling own sdp events 761 UNUSED(channel); // ok: no channel 762 UNUSED(size); // ok: handling own sdp events 763 764 hfp_connection_t * hfp_connection = get_hfp_connection_context_for_bd_addr(hfp_sdp_query_context.remote_address, hfp_sdp_query_context.local_role); 765 if (hfp_connection == NULL) { 766 log_info("connection with %s and local role %d not found", hfp_sdp_query_context.remote_address, hfp_sdp_query_context.local_role); 767 return; 768 } 769 770 switch (hci_event_packet_get_type(packet)){ 771 case SDP_EVENT_QUERY_RFCOMM_SERVICE: 772 hfp_connection->rfcomm_channel_nr = sdp_event_query_rfcomm_service_get_rfcomm_channel(packet); 773 break; 774 case SDP_EVENT_QUERY_COMPLETE: 775 if (hfp_connection->rfcomm_channel_nr > 0){ 776 hfp_connection->state = HFP_W4_RFCOMM_CONNECTED; 777 btstack_packet_handler_t packet_handler; 778 switch (hfp_connection->local_role){ 779 case HFP_ROLE_AG: 780 packet_handler = hfp_ag_rfcomm_packet_handler; 781 break; 782 case HFP_ROLE_HF: 783 packet_handler = hfp_hf_rfcomm_packet_handler; 784 break; 785 default: 786 btstack_assert(false); 787 return; 788 } 789 790 rfcomm_create_channel(packet_handler, hfp_connection->remote_addr, hfp_connection->rfcomm_channel_nr, NULL); 791 792 } else { 793 uint8_t status = sdp_event_query_complete_get_status(packet); 794 if (status == ERROR_CODE_SUCCESS){ 795 // report service not found 796 status = SDP_SERVICE_NOT_FOUND; 797 } 798 hfp_handle_slc_setup_error(hfp_connection, status); 799 log_info("rfcomm service not found, status 0x%02x", status); 800 } 801 802 // register the SDP Query request to check if there is another connection waiting for the query 803 // ignore ERROR_CODE_COMMAND_DISALLOWED because in that case, we already have requested an SDP callback 804 (void) sdp_client_register_query_callback(&hfp_sdp_query_request); 805 break; 806 default: 807 break; 808 } 809 } 810 811 // returns 0 if unexpected error or no other link options remained, otherwise 1 812 static int hfp_handle_failed_sco_connection(uint8_t status){ 813 814 if (!hfp_sco_establishment_active){ 815 log_info("(e)SCO Connection failed but not started by us"); 816 return 0; 817 } 818 819 log_info("(e)SCO Connection failed 0x%02x", status); 820 switch (status){ 821 case ERROR_CODE_SCO_AIR_MODE_REJECTED: 822 case ERROR_CODE_SCO_INTERVAL_REJECTED: 823 case ERROR_CODE_SCO_OFFSET_REJECTED: 824 case ERROR_CODE_UNSPECIFIED_ERROR: 825 case ERROR_CODE_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE: 826 case ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE_UNSUPPORTED_LMP_FEATURE: 827 break; 828 default: 829 return 0; 830 } 831 832 // note: eSCO_S4 supported flag not available, but it's only relevant for highest CVSD link setting (and the current failed) 833 hfp_link_settings_t next_setting = hfp_next_link_setting_for_connection(hfp_sco_establishment_active->link_setting, hfp_sco_establishment_active, false); 834 835 // handle no valid setting found 836 if (next_setting == HFP_LINK_SETTINGS_NONE) { 837 if (hfp_sco_establishment_active->negotiated_codec == HFP_CODEC_MSBC){ 838 log_info("T2/T1 failed, fallback to CVSD - D1"); 839 hfp_sco_establishment_active->negotiated_codec = HFP_CODEC_CVSD; 840 hfp_sco_establishment_active->sco_for_msbc_failed = 1; 841 hfp_sco_establishment_active->ag_send_common_codec = true; 842 hfp_sco_establishment_active->link_setting = HFP_LINK_SETTINGS_D1; 843 } else { 844 // no other options 845 return 0; 846 } 847 } 848 849 log_info("e)SCO Connection: try new link_setting %d", next_setting); 850 hfp_sco_establishment_active->establish_audio_connection = 1; 851 hfp_sco_establishment_active->link_setting = next_setting; 852 hfp_sco_establishment_active = NULL; 853 return 1; 854 } 855 856 void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size, hfp_role_t local_role){ 857 UNUSED(packet_type); 858 UNUSED(channel); // ok: no channel 859 UNUSED(size); 860 861 bd_addr_t event_addr; 862 hci_con_handle_t handle; 863 hfp_connection_t * hfp_connection = NULL; 864 uint8_t status; 865 866 log_debug("HFP HCI event handler type %u, event type %x, size %u", packet_type, hci_event_packet_get_type(packet), size); 867 868 switch (hci_event_packet_get_type(packet)) { 869 870 case HCI_EVENT_CONNECTION_REQUEST: 871 switch(hci_event_connection_request_get_link_type(packet)){ 872 case 0: // SCO 873 case 2: // eSCO 874 hci_event_connection_request_get_bd_addr(packet, event_addr); 875 hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr, local_role); 876 if (!hfp_connection) break; 877 if (hci_event_connection_request_get_link_type(packet) == 2){ 878 hfp_connection->accept_sco = 2; 879 } else { 880 hfp_connection->accept_sco = 1; 881 } 882 #ifdef ENABLE_CC256X_ASSISTED_HFP 883 hfp_cc256x_prepare_for_sco(hfp_connection); 884 #endif 885 #ifdef ENABLE_BCM_PCM_WBS 886 hfp_bcm_prepare_for_sco(hfp_connection); 887 #endif 888 #ifdef ENABLE_RTK_PCM_WBS 889 hfp_connection->rtk_send_sco_config = true; 890 #endif 891 log_info("accept sco %u\n", hfp_connection->accept_sco); 892 hfp_sco_establishment_active = hfp_connection; 893 break; 894 default: 895 break; 896 } 897 break; 898 899 case HCI_EVENT_COMMAND_STATUS: 900 if (hci_event_command_status_get_command_opcode(packet) == hci_setup_synchronous_connection.opcode) { 901 if (hfp_sco_establishment_active == NULL) break; 902 status = hci_event_command_status_get_status(packet); 903 if (status == ERROR_CODE_SUCCESS) break; 904 905 hfp_connection = hfp_sco_establishment_active; 906 if (hfp_handle_failed_sco_connection(status)) break; 907 hfp_connection->establish_audio_connection = 0; 908 hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED; 909 hfp_emit_sco_connection_established(hfp_connection, status, 910 hfp_connection->negotiated_codec, 0, 0); 911 } 912 break; 913 914 case HCI_EVENT_SYNCHRONOUS_CONNECTION_COMPLETE:{ 915 if (hfp_sco_establishment_active == NULL) break; 916 hci_event_synchronous_connection_complete_get_bd_addr(packet, event_addr); 917 hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr, local_role); 918 if (!hfp_connection) { 919 log_error("HFP: connection does not exist for remote with addr %s.", bd_addr_to_str(event_addr)); 920 return; 921 } 922 923 status = hci_event_synchronous_connection_complete_get_status(packet); 924 if (status != ERROR_CODE_SUCCESS){ 925 hfp_connection->accept_sco = 0; 926 if (hfp_handle_failed_sco_connection(status)) break; 927 928 hfp_connection->establish_audio_connection = 0; 929 hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED; 930 hfp_emit_sco_connection_established(hfp_connection, status, 931 hfp_connection->negotiated_codec, 0, 0); 932 break; 933 } 934 935 uint16_t sco_handle = hci_event_synchronous_connection_complete_get_handle(packet); 936 uint8_t link_type = hci_event_synchronous_connection_complete_get_link_type(packet); 937 uint8_t transmission_interval = hci_event_synchronous_connection_complete_get_transmission_interval(packet); // measured in slots 938 uint8_t retransmission_interval = hci_event_synchronous_connection_complete_get_retransmission_interval(packet);// measured in slots 939 uint16_t rx_packet_length = hci_event_synchronous_connection_complete_get_rx_packet_length(packet); // measured in bytes 940 uint16_t tx_packet_length = hci_event_synchronous_connection_complete_get_tx_packet_length(packet); // measured in bytes 941 942 switch (link_type){ 943 case 0x00: 944 log_info("SCO Connection established."); 945 if (transmission_interval != 0) log_error("SCO Connection: transmission_interval not zero: %d.", transmission_interval); 946 if (retransmission_interval != 0) log_error("SCO Connection: retransmission_interval not zero: %d.", retransmission_interval); 947 if (rx_packet_length != 0) log_error("SCO Connection: rx_packet_length not zero: %d.", rx_packet_length); 948 if (tx_packet_length != 0) log_error("SCO Connection: tx_packet_length not zero: %d.", tx_packet_length); 949 break; 950 case 0x02: 951 log_info("eSCO Connection established. \n"); 952 break; 953 default: 954 log_error("(e)SCO reserved link_type 0x%2x", link_type); 955 break; 956 } 957 958 log_info("sco_handle 0x%2x, address %s, transmission_interval %u slots, retransmission_interval %u slots, " 959 " rx_packet_length %u bytes, tx_packet_length %u bytes, air_mode 0x%2x (0x02 == CVSD)\n", sco_handle, 960 bd_addr_to_str(event_addr), transmission_interval, retransmission_interval, rx_packet_length, tx_packet_length, 961 hci_event_synchronous_connection_complete_get_air_mode(packet)); 962 963 if (hfp_connection->state == HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN){ 964 log_info("SCO about to disconnect: HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN"); 965 hfp_connection->state = HFP_W2_DISCONNECT_SCO; 966 break; 967 } 968 hfp_connection->sco_handle = sco_handle; 969 hfp_connection->establish_audio_connection = 0; 970 971 hfp_connection->state = HFP_AUDIO_CONNECTION_ESTABLISHED; 972 973 switch (hfp_connection->vra_state){ 974 case HFP_VRA_VOICE_RECOGNITION_ACTIVATED: 975 hfp_connection->ag_audio_connection_opened_before_vra = false; 976 break; 977 default: 978 hfp_connection->ag_audio_connection_opened_before_vra = true; 979 break; 980 } 981 hfp_emit_sco_connection_established(hfp_connection, status, 982 hfp_connection->negotiated_codec, rx_packet_length, tx_packet_length); 983 break; 984 } 985 986 case HCI_EVENT_DISCONNECTION_COMPLETE: 987 handle = little_endian_read_16(packet,3); 988 hfp_connection = get_hfp_connection_context_for_sco_handle(handle, local_role); 989 990 if (!hfp_connection) break; 991 992 #ifdef ENABLE_CC256X_ASSISTED_HFP 993 hfp_connection->cc256x_send_wbs_disassociate = true; 994 #endif 995 #ifdef ENABLE_BCM_PCM_WBS 996 hfp_connection->bcm_send_disable_wbs = true; 997 #endif 998 if (hfp_connection->sco_handle == handle){ 999 hfp_connection->sco_handle = HCI_CON_HANDLE_INVALID; 1000 hfp_connection->release_audio_connection = 0; 1001 hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED; 1002 hfp_emit_audio_connection_released(hfp_connection, handle); 1003 1004 hfp_connection->ag_audio_connection_opened_before_vra = false; 1005 1006 if (hfp_connection->acl_handle == HCI_CON_HANDLE_INVALID){ 1007 hfp_reset_voice_recognition(hfp_connection); 1008 hfp_emit_event(hfp_connection, HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_RELEASED, 0); 1009 hfp_finalize_connection_context(hfp_connection); 1010 break; 1011 } else if (hfp_connection->release_slc_connection == 1){ 1012 hfp_connection->release_slc_connection = 0; 1013 hfp_connection->state = HFP_W2_DISCONNECT_RFCOMM; 1014 rfcomm_disconnect(hfp_connection->acl_handle); 1015 } 1016 } 1017 1018 if (hfp_connection->state == HFP_W4_SCO_DISCONNECTED_TO_SHUTDOWN){ 1019 // RFCOMM already closed -> remote power off 1020 #if defined(ENABLE_CC256X_ASSISTED_HFP) || defined (ENABLE_BCM_PCM_WBS) 1021 hfp_connection->state = HFP_W4_WBS_SHUTDOWN; 1022 #else 1023 hfp_finalize_connection_context(hfp_connection); 1024 #endif 1025 break; 1026 } 1027 break; 1028 1029 default: 1030 break; 1031 } 1032 } 1033 1034 1035 void hfp_handle_rfcomm_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size, hfp_role_t local_role){ 1036 UNUSED(packet_type); 1037 UNUSED(channel); // ok: no channel 1038 UNUSED(size); 1039 1040 bd_addr_t event_addr; 1041 uint16_t rfcomm_cid; 1042 hfp_connection_t * hfp_connection = NULL; 1043 uint8_t status; 1044 1045 log_debug("HFP packet_handler type %u, event type %x, size %u", packet_type, hci_event_packet_get_type(packet), size); 1046 1047 switch (hci_event_packet_get_type(packet)) { 1048 1049 case RFCOMM_EVENT_INCOMING_CONNECTION: 1050 // data: event (8), len(8), address(48), channel (8), rfcomm_cid (16) 1051 rfcomm_event_incoming_connection_get_bd_addr(packet, event_addr); 1052 hfp_connection = hfp_create_connection(event_addr, local_role); 1053 if (!hfp_connection){ 1054 log_info("hfp: no memory to accept incoming connection - decline"); 1055 rfcomm_decline_connection(rfcomm_event_incoming_connection_get_rfcomm_cid(packet)); 1056 return; 1057 } 1058 if (hfp_connection->state != HFP_IDLE) { 1059 log_error("hfp: incoming connection but not idle, reject"); 1060 rfcomm_decline_connection(rfcomm_event_incoming_connection_get_rfcomm_cid(packet)); 1061 return; 1062 } 1063 1064 hfp_connection->rfcomm_cid = rfcomm_event_incoming_connection_get_rfcomm_cid(packet); 1065 hfp_connection->state = HFP_W4_RFCOMM_CONNECTED; 1066 rfcomm_accept_connection(hfp_connection->rfcomm_cid); 1067 break; 1068 1069 case RFCOMM_EVENT_CHANNEL_OPENED: 1070 rfcomm_event_channel_opened_get_bd_addr(packet, event_addr); 1071 1072 hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr, local_role); 1073 btstack_assert(hfp_connection != NULL); 1074 1075 if (hfp_connection->state != HFP_W4_RFCOMM_CONNECTED){ 1076 break; 1077 } 1078 1079 status = rfcomm_event_channel_opened_get_status(packet); 1080 if (status != ERROR_CODE_SUCCESS) { 1081 hfp_handle_slc_setup_error(hfp_connection, status); 1082 break; 1083 } 1084 1085 hfp_connection->acl_handle = rfcomm_event_channel_opened_get_con_handle(packet); 1086 hfp_connection->rfcomm_cid = rfcomm_event_channel_opened_get_rfcomm_cid(packet); 1087 hfp_connection->rfcomm_mtu = rfcomm_event_channel_opened_get_max_frame_size(packet); 1088 bd_addr_copy(hfp_connection->remote_addr, event_addr); 1089 hfp_connection->state = HFP_EXCHANGE_SUPPORTED_FEATURES; 1090 1091 rfcomm_request_can_send_now_event(hfp_connection->rfcomm_cid); 1092 break; 1093 1094 case RFCOMM_EVENT_CHANNEL_CLOSED: 1095 rfcomm_cid = little_endian_read_16(packet,2); 1096 hfp_connection = get_hfp_connection_context_for_rfcomm_cid(rfcomm_cid); 1097 if (!hfp_connection) break; 1098 switch (hfp_connection->state){ 1099 case HFP_W4_RFCOMM_DISCONNECTED_AND_RESTART: 1100 hfp_connection->acl_handle = HCI_CON_HANDLE_INVALID; 1101 hfp_connection->state = HFP_IDLE; 1102 hfp_establish_service_level_connection(hfp_connection->remote_addr, hfp_connection->service_uuid, local_role); 1103 break; 1104 1105 case HFP_AUDIO_CONNECTION_ESTABLISHED: 1106 // service connection was released, this implicitly releases audio connection as well 1107 hfp_connection->release_audio_connection = 0; 1108 hfp_connection->acl_handle = HCI_CON_HANDLE_INVALID; 1109 hfp_connection->state = HFP_W4_SCO_DISCONNECTED_TO_SHUTDOWN; 1110 gap_disconnect(hfp_connection->sco_handle); 1111 break; 1112 1113 default: 1114 // regular case 1115 hfp_reset_voice_recognition(hfp_connection); 1116 hfp_emit_event(hfp_connection, HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_RELEASED, 0); 1117 hfp_finalize_connection_context(hfp_connection); 1118 break; 1119 } 1120 break; 1121 1122 default: 1123 break; 1124 } 1125 } 1126 // translates command string into hfp_command_t CMD 1127 1128 typedef struct { 1129 const char * command; 1130 hfp_command_t command_id; 1131 } hfp_command_entry_t; 1132 1133 static hfp_command_entry_t hfp_ag_command_table[] = { 1134 { "AT+BAC=", HFP_CMD_AVAILABLE_CODECS }, 1135 { "AT+BCC", HFP_CMD_TRIGGER_CODEC_CONNECTION_SETUP }, 1136 { "AT+BCS=", HFP_CMD_HF_CONFIRMED_CODEC }, 1137 { "AT+BIA=", HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, }, // +BIA:<enabled>,,<enabled>,,,<enabled> 1138 { "AT+BIEV=", HFP_CMD_HF_INDICATOR_STATUS }, 1139 { "AT+BIND=", HFP_CMD_LIST_GENERIC_STATUS_INDICATORS }, 1140 { "AT+BIND=?", HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS }, 1141 { "AT+BIND?", HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE }, 1142 { "AT+BINP=", HFP_CMD_HF_REQUEST_PHONE_NUMBER }, 1143 { "AT+BLDN", HFP_CMD_REDIAL_LAST_NUMBER }, 1144 { "AT+BRSF=", HFP_CMD_SUPPORTED_FEATURES }, 1145 { "AT+BTRH=", HFP_CMD_RESPONSE_AND_HOLD_COMMAND }, 1146 { "AT+BTRH?", HFP_CMD_RESPONSE_AND_HOLD_QUERY }, 1147 { "AT+BVRA=", HFP_CMD_HF_ACTIVATE_VOICE_RECOGNITION }, 1148 { "AT+CCWA=", HFP_CMD_ENABLE_CALL_WAITING_NOTIFICATION}, 1149 { "AT+CHLD=", HFP_CMD_CALL_HOLD }, 1150 { "AT+CHLD=?", HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES }, 1151 { "AT+CHUP", HFP_CMD_HANG_UP_CALL }, 1152 { "AT+CIND=?", HFP_CMD_RETRIEVE_AG_INDICATORS }, 1153 { "AT+CIND?", HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS }, 1154 { "AT+CLCC", HFP_CMD_LIST_CURRENT_CALLS }, 1155 { "AT+CLIP=", HFP_CMD_ENABLE_CLIP}, 1156 { "AT+CMEE=", HFP_CMD_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR}, 1157 { "AT+CMER=", HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE }, 1158 { "AT+CNUM", HFP_CMD_GET_SUBSCRIBER_NUMBER_INFORMATION }, 1159 { "AT+COPS=", HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT }, 1160 { "AT+COPS?", HFP_CMD_QUERY_OPERATOR_SELECTION_NAME }, 1161 { "AT+NREC=", HFP_CMD_TURN_OFF_EC_AND_NR, }, 1162 { "AT+VGM=", HFP_CMD_SET_MICROPHONE_GAIN }, 1163 { "AT+VGS=", HFP_CMD_SET_SPEAKER_GAIN }, 1164 { "AT+VTS=", HFP_CMD_TRANSMIT_DTMF_CODES }, 1165 { "ATA", HFP_CMD_CALL_ANSWERED }, 1166 }; 1167 1168 static hfp_command_entry_t hfp_hf_command_table[] = { 1169 { "+BCS:", HFP_CMD_AG_SUGGESTED_CODEC }, 1170 { "+BIND:", HFP_CMD_SET_GENERIC_STATUS_INDICATOR_STATUS }, 1171 { "+BINP:", HFP_CMD_AG_SENT_PHONE_NUMBER }, 1172 { "+BRSF:", HFP_CMD_SUPPORTED_FEATURES }, 1173 { "+BSIR:", HFP_CMD_CHANGE_IN_BAND_RING_TONE_SETTING }, 1174 { "+BTRH:", HFP_CMD_RESPONSE_AND_HOLD_STATUS }, 1175 { "+BVRA:", HFP_CMD_AG_ACTIVATE_VOICE_RECOGNITION }, 1176 { "+CCWA:", HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE, }, 1177 { "+CHLD:", HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES }, 1178 { "+CIEV:", HFP_CMD_TRANSFER_AG_INDICATOR_STATUS}, 1179 { "+CIND:", HFP_CMD_RETRIEVE_AG_INDICATORS_GENERIC }, 1180 { "+CLCC:", HFP_CMD_LIST_CURRENT_CALLS }, 1181 { "+CLIP:", HFP_CMD_AG_SENT_CLIP_INFORMATION }, 1182 { "+CME ERROR:", HFP_CMD_EXTENDED_AUDIO_GATEWAY_ERROR }, 1183 { "+CNUM:", HFP_CMD_GET_SUBSCRIBER_NUMBER_INFORMATION}, 1184 { "+COPS:", HFP_CMD_QUERY_OPERATOR_SELECTION_NAME }, 1185 { "+VGM:", HFP_CMD_SET_MICROPHONE_GAIN }, 1186 { "+VGM=", HFP_CMD_SET_MICROPHONE_GAIN }, 1187 { "+VGS:", HFP_CMD_SET_SPEAKER_GAIN}, 1188 { "+VGS=", HFP_CMD_SET_SPEAKER_GAIN}, 1189 { "ERROR", HFP_CMD_ERROR}, 1190 { "NOP", HFP_CMD_NONE}, // dummy command used by unit tests 1191 { "OK", HFP_CMD_OK }, 1192 { "RING", HFP_CMD_RING }, 1193 }; 1194 1195 static const hfp_custom_at_command_t * 1196 hfp_custom_command_lookup(bool isHandsFree, const char *text) { 1197 btstack_linked_list_t * custom_commands = isHandsFree ? &hfp_custom_commands_hf : &hfp_custom_commands_ag; 1198 btstack_linked_list_iterator_t it; 1199 btstack_linked_list_iterator_init(&it, custom_commands); 1200 while (btstack_linked_list_iterator_has_next(&it)) { 1201 hfp_custom_at_command_t *at_command = (hfp_custom_at_command_t *) btstack_linked_list_iterator_next(&it); 1202 int match = strcmp(text, at_command->command); 1203 if (match == 0) { 1204 return at_command; 1205 } 1206 } 1207 return NULL; 1208 } 1209 1210 static hfp_command_t parse_command(const char * line_buffer, int isHandsFree){ 1211 1212 // check for custom commands, AG only 1213 const hfp_custom_at_command_t * custom_at_command = hfp_custom_command_lookup(isHandsFree, line_buffer); 1214 if (custom_at_command != NULL){ 1215 return HFP_CMD_CUSTOM_MESSAGE; 1216 } 1217 1218 // table lookup based on role 1219 uint16_t num_entries; 1220 hfp_command_entry_t * table; 1221 if (isHandsFree == 0){ 1222 table = hfp_ag_command_table; 1223 num_entries = sizeof(hfp_ag_command_table) / sizeof(hfp_command_entry_t); 1224 } else { 1225 table = hfp_hf_command_table; 1226 num_entries = sizeof(hfp_hf_command_table) / sizeof(hfp_command_entry_t); 1227 } 1228 // binary search 1229 uint16_t left = 0; 1230 uint16_t right = num_entries - 1; 1231 while (left <= right){ 1232 uint16_t middle = left + (right - left) / 2; 1233 hfp_command_entry_t *entry = &table[middle]; 1234 int match = strcmp(line_buffer, entry->command); 1235 if (match < 0){ 1236 // search term is lower than middle element 1237 if (right == 0) break; 1238 right = middle - 1; 1239 } else if (match == 0){ 1240 return entry->command_id; 1241 } else { 1242 // search term is higher than middle element 1243 left = middle + 1; 1244 } 1245 } 1246 1247 // note: if parser in CMD_HEADER state would treats digits and maybe '+' as separator, match on "ATD" would work. 1248 // note: phone number is currently expected in line_buffer[3..] 1249 // prefix match on 'ATD', AG only 1250 if ((isHandsFree == 0) && (strncmp(line_buffer, HFP_CALL_PHONE_NUMBER, strlen(HFP_CALL_PHONE_NUMBER)) == 0)){ 1251 return HFP_CMD_CALL_PHONE_NUMBER; 1252 } 1253 1254 // Valid looking, but unknown commands/responses 1255 if ((isHandsFree == 0) && (strncmp(line_buffer, "AT+", 3) == 0)){ 1256 return HFP_CMD_UNKNOWN; 1257 } 1258 1259 if ((isHandsFree != 0) && (strncmp(line_buffer, "+", 1) == 0)){ 1260 return HFP_CMD_UNKNOWN; 1261 } 1262 1263 return HFP_CMD_NONE; 1264 } 1265 1266 static void hfp_parser_store_byte(hfp_connection_t * hfp_connection, uint8_t byte){ 1267 if ((hfp_connection->line_size + 1) >= HFP_MAX_VR_TEXT_SIZE) return; 1268 hfp_connection->line_buffer[hfp_connection->line_size++] = byte; 1269 hfp_connection->line_buffer[hfp_connection->line_size] = 0; 1270 } 1271 static int hfp_parser_is_buffer_empty(hfp_connection_t * hfp_connection){ 1272 return hfp_connection->line_size == 0; 1273 } 1274 1275 static int hfp_parser_is_end_of_line(uint8_t byte){ 1276 return (byte == '\n') || (byte == '\r'); 1277 } 1278 1279 void hfp_parser_reset_line_buffer(hfp_connection_t *hfp_connection) { 1280 hfp_connection->line_size = 0; 1281 // we don't set the first byte to '\0' to allow access to last argument e.g. in hfp_hf_handle_rfcommand 1282 } 1283 1284 static void hfp_parser_store_if_token(hfp_connection_t * hfp_connection, uint8_t byte){ 1285 switch (byte){ 1286 case ',': 1287 case '-': 1288 case ';': 1289 case '(': 1290 case ')': 1291 case '\n': 1292 case '\r': 1293 break; 1294 default: 1295 hfp_parser_store_byte(hfp_connection, byte); 1296 break; 1297 } 1298 } 1299 1300 static bool hfp_parser_is_separator( uint8_t byte){ 1301 switch (byte){ 1302 case ',': 1303 case '-': 1304 case ';': 1305 case '\n': 1306 case '\r': 1307 return true; 1308 default: 1309 return false; 1310 } 1311 } 1312 1313 static bool hfp_parse_byte(hfp_connection_t * hfp_connection, uint8_t byte, int isHandsFree){ 1314 1315 // handle doubles quotes 1316 if (byte == '"'){ 1317 hfp_connection->parser_quoted = !hfp_connection->parser_quoted; 1318 return true; 1319 } 1320 if (hfp_connection->parser_quoted) { 1321 hfp_parser_store_byte(hfp_connection, byte); 1322 return true; 1323 } 1324 1325 // ignore spaces outside command or double quotes (required e.g. for '+CME ERROR:..") command 1326 if ((byte == ' ') && (hfp_connection->parser_state != HFP_PARSER_CMD_HEADER)) return true; 1327 1328 bool processed = true; 1329 1330 switch (hfp_connection->parser_state) { 1331 case HFP_PARSER_CMD_HEADER: 1332 switch (byte) { 1333 case '\n': 1334 case '\r': 1335 case ';': 1336 // ignore separator 1337 break; 1338 case ':': 1339 case '?': 1340 // store separator 1341 hfp_parser_store_byte(hfp_connection, byte); 1342 break; 1343 case '=': 1344 // equal sign: remember and wait for next char to decided between '=?' and '=\?' 1345 hfp_connection->found_equal_sign = true; 1346 hfp_parser_store_byte(hfp_connection, byte); 1347 return true; 1348 default: 1349 // store if not lookahead 1350 if (!hfp_connection->found_equal_sign) { 1351 hfp_parser_store_byte(hfp_connection, byte); 1352 return true; 1353 } 1354 // mark as lookahead 1355 processed = false; 1356 break; 1357 } 1358 1359 // ignore empty tokens 1360 if (hfp_parser_is_buffer_empty(hfp_connection)) return true; 1361 1362 // parse 1363 hfp_connection->command = parse_command((char *)hfp_connection->line_buffer, isHandsFree); 1364 1365 // pick +CIND version based on connection state: descriptions during SLC vs. states later 1366 if (hfp_connection->command == HFP_CMD_RETRIEVE_AG_INDICATORS_GENERIC){ 1367 switch(hfp_connection->state){ 1368 case HFP_W4_RETRIEVE_INDICATORS_STATUS: 1369 hfp_connection->command = HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS; 1370 break; 1371 case HFP_W4_RETRIEVE_INDICATORS: 1372 hfp_connection->command = HFP_CMD_RETRIEVE_AG_INDICATORS; 1373 break; 1374 default: 1375 hfp_connection->command = HFP_CMD_UNKNOWN; 1376 break; 1377 } 1378 } 1379 1380 log_info("command string '%s', handsfree %u -> cmd id %u", (char *)hfp_connection->line_buffer, isHandsFree, hfp_connection->command); 1381 1382 // store command id for custom command and just store rest of line 1383 if (hfp_connection->command == HFP_CMD_CUSTOM_MESSAGE){ 1384 const hfp_custom_at_command_t * at_command = hfp_custom_command_lookup(isHandsFree, (const char *) hfp_connection->line_buffer); 1385 hfp_connection->custom_at_command_id = at_command->command_id; 1386 hfp_connection->parser_state = HFP_PARSER_CUSTOM_COMMAND; 1387 return true; 1388 } 1389 1390 // next state 1391 hfp_parser_reset_line_buffer(hfp_connection); 1392 hfp_connection->parser_state = HFP_PARSER_CMD_SEQUENCE; 1393 1394 return processed; 1395 1396 case HFP_PARSER_CMD_SEQUENCE: 1397 // handle empty fields 1398 if ((byte == ',' ) && (hfp_connection->line_size == 0)){ 1399 hfp_connection->line_buffer[0] = 0; 1400 hfp_connection->ignore_value = 1; 1401 parse_sequence(hfp_connection); 1402 return true; 1403 } 1404 1405 hfp_parser_store_if_token(hfp_connection, byte); 1406 if (!hfp_parser_is_separator(byte)) return true; 1407 1408 // ignore empty tokens 1409 switch (hfp_connection->command){ 1410 case HFP_CMD_AG_ACTIVATE_VOICE_RECOGNITION: 1411 // don't ignore empty string 1412 break; 1413 default: 1414 if (hfp_parser_is_buffer_empty(hfp_connection) && (hfp_connection->ignore_value == 0)) { 1415 return true; 1416 } 1417 break; 1418 } 1419 1420 parse_sequence(hfp_connection); 1421 1422 hfp_parser_reset_line_buffer(hfp_connection); 1423 1424 switch (hfp_connection->command){ 1425 case HFP_CMD_AG_SENT_PHONE_NUMBER: 1426 case HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE: 1427 case HFP_CMD_AG_SENT_CLIP_INFORMATION: 1428 case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS: 1429 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME: 1430 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT: 1431 case HFP_CMD_RETRIEVE_AG_INDICATORS: 1432 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE: 1433 case HFP_CMD_HF_INDICATOR_STATUS: 1434 hfp_connection->parser_state = HFP_PARSER_SECOND_ITEM; 1435 break; 1436 default: 1437 break; 1438 } 1439 return true; 1440 1441 case HFP_PARSER_SECOND_ITEM: 1442 1443 hfp_parser_store_if_token(hfp_connection, byte); 1444 if (!hfp_parser_is_separator(byte)) return true; 1445 1446 switch (hfp_connection->command){ 1447 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME: 1448 log_info("format %s, ", hfp_connection->line_buffer); 1449 hfp_connection->network_operator.format = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1450 break; 1451 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT: 1452 log_info("format %s \n", hfp_connection->line_buffer); 1453 hfp_connection->network_operator.format = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1454 break; 1455 case HFP_CMD_LIST_GENERIC_STATUS_INDICATORS: 1456 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS: 1457 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE: 1458 hfp_connection->generic_status_indicators[hfp_connection->parser_item_index].state = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1459 break; 1460 case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS: 1461 hfp_connection->ag_indicators[hfp_connection->parser_item_index].status = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1462 log_info("%d \n", hfp_connection->ag_indicators[hfp_connection->parser_item_index].status); 1463 hfp_connection->ag_indicators[hfp_connection->parser_item_index].status_changed = 1; 1464 break; 1465 case HFP_CMD_RETRIEVE_AG_INDICATORS: 1466 hfp_connection->ag_indicators[hfp_connection->parser_item_index].min_range = btstack_atoi((char *)hfp_connection->line_buffer); 1467 log_info("%s, ", hfp_connection->line_buffer); 1468 break; 1469 case HFP_CMD_AG_SENT_PHONE_NUMBER: 1470 case HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE: 1471 case HFP_CMD_AG_SENT_CLIP_INFORMATION: 1472 hfp_connection->bnip_type = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1473 break; 1474 case HFP_CMD_HF_INDICATOR_STATUS: 1475 hfp_connection->parser_indicator_value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1476 break; 1477 default: 1478 break; 1479 } 1480 1481 hfp_parser_reset_line_buffer(hfp_connection); 1482 1483 hfp_connection->parser_state = HFP_PARSER_THIRD_ITEM; 1484 1485 return true; 1486 1487 case HFP_PARSER_THIRD_ITEM: 1488 1489 hfp_parser_store_if_token(hfp_connection, byte); 1490 if (!hfp_parser_is_separator(byte)) return true; 1491 1492 switch (hfp_connection->command){ 1493 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME: 1494 btstack_strcpy(hfp_connection->network_operator.name, HFP_MAX_NETWORK_OPERATOR_NAME_SIZE, (char *)hfp_connection->line_buffer); 1495 break; 1496 case HFP_CMD_RETRIEVE_AG_INDICATORS: 1497 hfp_connection->ag_indicators[hfp_connection->parser_item_index].max_range = btstack_atoi((char *)hfp_connection->line_buffer); 1498 hfp_next_indicators_index(hfp_connection); 1499 hfp_connection->ag_indicators_nr = hfp_connection->parser_item_index; 1500 break; 1501 case HFP_CMD_AG_SENT_CLIP_INFORMATION: 1502 case HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE: 1503 // track if last argument exists 1504 hfp_connection->clip_have_alpha = hfp_connection->line_size != 0; 1505 break; 1506 default: 1507 break; 1508 } 1509 1510 hfp_parser_reset_line_buffer(hfp_connection); 1511 1512 if (hfp_connection->command == HFP_CMD_RETRIEVE_AG_INDICATORS){ 1513 hfp_connection->parser_state = HFP_PARSER_CMD_SEQUENCE; 1514 } 1515 return true; 1516 1517 case HFP_PARSER_CUSTOM_COMMAND: 1518 hfp_parser_store_byte(hfp_connection, byte); 1519 return true; 1520 1521 default: 1522 btstack_assert(false); 1523 return true; 1524 } 1525 } 1526 1527 void hfp_parse(hfp_connection_t * hfp_connection, uint8_t byte, int isHandsFree){ 1528 bool processed = false; 1529 while (!processed){ 1530 processed = hfp_parse_byte(hfp_connection, byte, isHandsFree); 1531 } 1532 // reset parser state on end-of-line 1533 if (hfp_parser_is_end_of_line(byte)){ 1534 hfp_connection->found_equal_sign = false; 1535 hfp_connection->parser_item_index = 0; 1536 hfp_connection->parser_state = HFP_PARSER_CMD_HEADER; 1537 } 1538 } 1539 1540 static void parse_sequence(hfp_connection_t * hfp_connection){ 1541 int value; 1542 switch (hfp_connection->command){ 1543 case HFP_CMD_SET_GENERIC_STATUS_INDICATOR_STATUS: 1544 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1545 int i; 1546 switch (hfp_connection->parser_item_index){ 1547 case 0: 1548 for (i=0;i<hfp_connection->generic_status_indicators_nr;i++){ 1549 if (hfp_connection->generic_status_indicators[i].uuid == value){ 1550 hfp_connection->parser_indicator_index = i; 1551 break; 1552 } 1553 } 1554 break; 1555 case 1: 1556 if (hfp_connection->parser_indicator_index <0) break; 1557 hfp_connection->generic_status_indicators[hfp_connection->parser_indicator_index].state = value; 1558 log_info("HFP_CMD_SET_GENERIC_STATUS_INDICATOR_STATUS set indicator at index %u, to %u\n", 1559 hfp_connection->parser_item_index, value); 1560 break; 1561 default: 1562 break; 1563 } 1564 hfp_next_indicators_index(hfp_connection); 1565 break; 1566 1567 case HFP_CMD_GET_SUBSCRIBER_NUMBER_INFORMATION: 1568 switch(hfp_connection->parser_item_index){ 1569 case 0: 1570 // <alpha>: This optional field is not supported, and shall be left blank. 1571 break; 1572 case 1: 1573 // <number>: Quoted string containing the phone number in the format specified by <type>. 1574 btstack_strcpy(hfp_connection->bnip_number, sizeof(hfp_connection->bnip_number), (char *)hfp_connection->line_buffer); 1575 break; 1576 case 2: 1577 /* 1578 <type> field specifies the format of the phone number provided, and can be one of the following values: 1579 - values 128-143: The phone number format may be a national or international format, and may contain prefix and/or escape digits. No changes on the number presentation are required. 1580 - values 144-159: The phone number format is an international number, including the country code prefix. If the plus sign ("+") is not included as part of the number and shall be added by the AG as needed. 1581 - values 160-175: National number. No prefix nor escape digits included. 1582 */ 1583 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1584 hfp_connection->bnip_type = value; 1585 break; 1586 case 3: 1587 // <speed>: This optional field is not supported, and shall be left blank. 1588 break; 1589 case 4: 1590 // <service>: Indicates which service this phone number relates to. Shall be either 4 (voice) or 5 (fax). 1591 default: 1592 break; 1593 } 1594 // index > 2 are ignored in switch above 1595 hfp_connection->parser_item_index++; 1596 break; 1597 case HFP_CMD_LIST_CURRENT_CALLS: 1598 switch(hfp_connection->parser_item_index){ 1599 case 0: 1600 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1601 hfp_connection->clcc_idx = value; 1602 break; 1603 case 1: 1604 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1605 hfp_connection->clcc_dir = value; 1606 break; 1607 case 2: 1608 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1609 hfp_connection->clcc_status = value; 1610 break; 1611 case 3: 1612 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1613 hfp_connection->clcc_mode = value; 1614 break; 1615 case 4: 1616 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1617 hfp_connection->clcc_mpty = value; 1618 break; 1619 case 5: 1620 btstack_strcpy(hfp_connection->bnip_number, sizeof(hfp_connection->bnip_number), (char *)hfp_connection->line_buffer); 1621 break; 1622 case 6: 1623 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1624 hfp_connection->bnip_type = value; 1625 break; 1626 default: 1627 break; 1628 } 1629 // index > 6 are ignored in switch above 1630 hfp_connection->parser_item_index++; 1631 break; 1632 case HFP_CMD_SET_MICROPHONE_GAIN: 1633 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1634 hfp_connection->microphone_gain = value; 1635 log_info("hfp parse HFP_CMD_SET_MICROPHONE_GAIN %d\n", value); 1636 break; 1637 case HFP_CMD_SET_SPEAKER_GAIN: 1638 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1639 hfp_connection->speaker_gain = value; 1640 log_info("hfp parse HFP_CMD_SET_SPEAKER_GAIN %d\n", value); 1641 break; 1642 case HFP_CMD_TURN_OFF_EC_AND_NR: 1643 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1644 hfp_connection->ag_echo_and_noise_reduction = value; 1645 log_info("hfp parse HFP_CMD_TURN_OFF_EC_AND_NR %d\n", value); 1646 break; 1647 case HFP_CMD_CHANGE_IN_BAND_RING_TONE_SETTING: 1648 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1649 hfp_connection->remote_supported_features = store_bit(hfp_connection->remote_supported_features, HFP_AGSF_IN_BAND_RING_TONE, value); 1650 log_info("hfp parse HFP_CHANGE_IN_BAND_RING_TONE_SETTING %d\n", value); 1651 break; 1652 case HFP_CMD_HF_CONFIRMED_CODEC: 1653 hfp_connection->codec_confirmed = btstack_atoi((char*)hfp_connection->line_buffer); 1654 log_info("hfp parse HFP_CMD_HF_CONFIRMED_CODEC %d\n", hfp_connection->codec_confirmed); 1655 break; 1656 case HFP_CMD_AG_SUGGESTED_CODEC: 1657 hfp_connection->suggested_codec = btstack_atoi((char*)hfp_connection->line_buffer); 1658 log_info("hfp parse HFP_CMD_AG_SUGGESTED_CODEC %d\n", hfp_connection->suggested_codec); 1659 break; 1660 case HFP_CMD_SUPPORTED_FEATURES: 1661 hfp_connection->remote_supported_features = btstack_atoi((char*)hfp_connection->line_buffer); 1662 log_info("Parsed supported feature %d\n", (int) hfp_connection->remote_supported_features); 1663 break; 1664 case HFP_CMD_AVAILABLE_CODECS: 1665 log_info("Parsed codec %s\n", hfp_connection->line_buffer); 1666 hfp_connection->remote_codecs[hfp_connection->parser_item_index] = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1667 hfp_next_codec_index(hfp_connection); 1668 hfp_connection->remote_codecs_nr = hfp_connection->parser_item_index; 1669 break; 1670 case HFP_CMD_RETRIEVE_AG_INDICATORS: 1671 btstack_strcpy((char *)hfp_connection->ag_indicators[hfp_connection->parser_item_index].name, HFP_MAX_INDICATOR_DESC_SIZE, (char *)hfp_connection->line_buffer); 1672 hfp_connection->ag_indicators[hfp_connection->parser_item_index].index = hfp_connection->parser_item_index+1; 1673 log_info("Indicator %d: %s (", hfp_connection->ag_indicators_nr+1, hfp_connection->line_buffer); 1674 break; 1675 case HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS: 1676 log_info("Parsed Indicator %d with status: %s\n", hfp_connection->parser_item_index+1, hfp_connection->line_buffer); 1677 hfp_connection->ag_indicators[hfp_connection->parser_item_index].status = btstack_atoi((char *) hfp_connection->line_buffer); 1678 hfp_next_indicators_index(hfp_connection); 1679 break; 1680 case HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE: 1681 hfp_next_indicators_index(hfp_connection); 1682 if (hfp_connection->parser_item_index != 4) break; 1683 log_info("Parsed Enable indicators: %s\n", hfp_connection->line_buffer); 1684 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1685 hfp_connection->enable_status_update_for_ag_indicators = (uint8_t) value; 1686 break; 1687 case HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES: 1688 log_info("Parsed Support call hold: %s\n", hfp_connection->line_buffer); 1689 if (hfp_connection->line_size > 2 ) break; 1690 memcpy((char *)hfp_connection->remote_call_services[hfp_connection->remote_call_services_index].name, (char *)hfp_connection->line_buffer, HFP_CALL_SERVICE_SIZE-1); 1691 hfp_connection->remote_call_services[hfp_connection->remote_call_services_index].name[HFP_CALL_SERVICE_SIZE - 1] = 0; 1692 hfp_next_remote_call_services_index(hfp_connection); 1693 break; 1694 case HFP_CMD_LIST_GENERIC_STATUS_INDICATORS: 1695 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS: 1696 log_info("Parsed Generic status indicator: %s\n", hfp_connection->line_buffer); 1697 hfp_connection->generic_status_indicators[hfp_connection->parser_item_index].uuid = (uint16_t)btstack_atoi((char*)hfp_connection->line_buffer); 1698 hfp_next_indicators_index(hfp_connection); 1699 hfp_connection->generic_status_indicators_nr = hfp_connection->parser_item_index; 1700 break; 1701 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE: 1702 // HF parses inital AG gen. ind. state 1703 log_info("Parsed List generic status indicator %s state: ", hfp_connection->line_buffer); 1704 hfp_connection->parser_item_index = hfp_parse_indicator_index(hfp_connection); 1705 break; 1706 case HFP_CMD_HF_INDICATOR_STATUS: 1707 hfp_connection->parser_indicator_index = hfp_parse_indicator_index(hfp_connection); 1708 log_info("Parsed HF indicator index %u", hfp_connection->parser_indicator_index); 1709 break; 1710 case HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE: 1711 // AG parses new gen. ind. state 1712 if (hfp_connection->ignore_value){ 1713 hfp_connection->ignore_value = 0; 1714 log_info("Parsed Enable AG indicator pos %u('%s') - unchanged (stays %u)\n", hfp_connection->parser_item_index, 1715 hfp_connection->ag_indicators[hfp_connection->parser_item_index].name, hfp_connection->ag_indicators[hfp_connection->parser_item_index].enabled); 1716 } 1717 else if (hfp_connection->ag_indicators[hfp_connection->parser_item_index].mandatory){ 1718 log_info("Parsed Enable AG indicator pos %u('%s') - ignore (mandatory)\n", 1719 hfp_connection->parser_item_index, hfp_connection->ag_indicators[hfp_connection->parser_item_index].name); 1720 } else { 1721 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1722 hfp_connection->ag_indicators[hfp_connection->parser_item_index].enabled = value; 1723 log_info("Parsed Enable AG indicator pos %u('%s'): %u\n", hfp_connection->parser_item_index, 1724 hfp_connection->ag_indicators[hfp_connection->parser_item_index].name, value); 1725 } 1726 hfp_next_indicators_index(hfp_connection); 1727 break; 1728 case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS: 1729 // indicators are indexed starting with 1 1730 hfp_connection->parser_item_index = hfp_parse_indicator_index(hfp_connection); 1731 log_info("Parsed status of the AG indicator %d, status ", hfp_connection->parser_item_index); 1732 break; 1733 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME: 1734 hfp_connection->network_operator.mode = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1735 log_info("Parsed network operator mode: %d, ", hfp_connection->network_operator.mode); 1736 break; 1737 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT: 1738 if (hfp_connection->line_buffer[0] == '3'){ 1739 log_info("Parsed Set network operator format : %s, ", hfp_connection->line_buffer); 1740 break; 1741 } 1742 // TODO emit ERROR, wrong format 1743 log_info("ERROR Set network operator format: index %s not supported\n", hfp_connection->line_buffer); 1744 break; 1745 case HFP_CMD_ERROR: 1746 break; 1747 case HFP_CMD_EXTENDED_AUDIO_GATEWAY_ERROR: 1748 hfp_connection->extended_audio_gateway_error = 1; 1749 hfp_connection->extended_audio_gateway_error_value = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1750 break; 1751 case HFP_CMD_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR: 1752 hfp_connection->enable_extended_audio_gateway_error_report = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1753 hfp_connection->ok_pending = 1; 1754 hfp_connection->extended_audio_gateway_error = 0; 1755 break; 1756 case HFP_CMD_AG_SENT_PHONE_NUMBER: 1757 case HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE: 1758 case HFP_CMD_AG_SENT_CLIP_INFORMATION: 1759 btstack_strcpy((char *)hfp_connection->bnip_number, sizeof(hfp_connection->bnip_number), (char *)hfp_connection->line_buffer); 1760 break; 1761 case HFP_CMD_CALL_HOLD: 1762 hfp_connection->ag_call_hold_action = hfp_connection->line_buffer[0] - '0'; 1763 if (hfp_connection->line_buffer[1] != '\0'){ 1764 hfp_connection->call_index = btstack_atoi((char *)&hfp_connection->line_buffer[1]); 1765 } 1766 break; 1767 case HFP_CMD_RESPONSE_AND_HOLD_COMMAND: 1768 hfp_connection->ag_response_and_hold_action = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1769 break; 1770 case HFP_CMD_TRANSMIT_DTMF_CODES: 1771 hfp_connection->ag_dtmf_code = hfp_connection->line_buffer[0]; 1772 break; 1773 case HFP_CMD_ENABLE_CLIP: 1774 hfp_connection->clip_enabled = hfp_connection->line_buffer[0] != '0'; 1775 break; 1776 case HFP_CMD_ENABLE_CALL_WAITING_NOTIFICATION: 1777 hfp_connection->call_waiting_notification_enabled = hfp_connection->line_buffer[0] != '0'; 1778 break; 1779 case HFP_CMD_HF_ACTIVATE_VOICE_RECOGNITION: 1780 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1781 hfp_connection->ag_activate_voice_recognition_value = value; 1782 break; 1783 case HFP_CMD_AG_ACTIVATE_VOICE_RECOGNITION: 1784 switch(hfp_connection->parser_item_index){ 1785 case 0: 1786 hfp_connection->ag_vra_status = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1787 break; 1788 case 1: 1789 hfp_connection->ag_vra_state = (hfp_voice_recognition_state_t) btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1790 break; 1791 case 2: 1792 hfp_connection->ag_msg.text_id = 0; 1793 for (i = 0 ; i < 4; i++){ 1794 hfp_connection->ag_msg.text_id = (hfp_connection->ag_msg.text_id << 4) | nibble_for_char(hfp_connection->line_buffer[i]); 1795 } 1796 break; 1797 case 3: 1798 hfp_connection->ag_msg.text_type = (hfp_text_type_t) btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1799 break; 1800 case 4: 1801 hfp_connection->ag_msg.text_operation = (hfp_text_operation_t) btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1802 break; 1803 case 5: 1804 hfp_connection->line_buffer[hfp_connection->line_size] = 0; 1805 hfp_connection->ag_vra_msg_length = hfp_connection->line_size + 1; 1806 break; 1807 default: 1808 break; 1809 } 1810 hfp_connection->parser_item_index++; 1811 break; 1812 default: 1813 break; 1814 } 1815 } 1816 1817 static void hfp_handle_start_sdp_client_query(void * context){ 1818 UNUSED(context); 1819 1820 btstack_linked_list_iterator_t it; 1821 btstack_linked_list_iterator_init(&it, &hfp_connections); 1822 while (btstack_linked_list_iterator_has_next(&it)){ 1823 hfp_connection_t * connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it); 1824 1825 if (connection->state != HFP_W2_SEND_SDP_QUERY) continue; 1826 1827 connection->state = HFP_W4_SDP_QUERY_COMPLETE; 1828 hfp_sdp_query_context.local_role = connection->local_role; 1829 (void)memcpy(hfp_sdp_query_context.remote_address, connection->remote_addr, 6); 1830 sdp_client_query_rfcomm_channel_and_name_for_service_class_uuid(&handle_query_rfcomm_event, connection->remote_addr, connection->service_uuid); 1831 return; 1832 } 1833 } 1834 1835 uint8_t hfp_establish_service_level_connection(bd_addr_t bd_addr, uint16_t service_uuid, hfp_role_t local_role){ 1836 hfp_connection_t * connection = get_hfp_connection_context_for_bd_addr(bd_addr, local_role); 1837 if (connection){ 1838 return ERROR_CODE_COMMAND_DISALLOWED; 1839 } 1840 1841 connection = hfp_create_connection(bd_addr, local_role); 1842 if (!connection){ 1843 return BTSTACK_MEMORY_ALLOC_FAILED; 1844 } 1845 1846 connection->state = HFP_W2_SEND_SDP_QUERY; 1847 1848 bd_addr_copy(connection->remote_addr, bd_addr); 1849 connection->service_uuid = service_uuid; 1850 1851 hfp_sdp_query_request.callback = &hfp_handle_start_sdp_client_query; 1852 // ignore ERROR_CODE_COMMAND_DISALLOWED because in that case, we already have requested an SDP callback 1853 (void) sdp_client_register_query_callback(&hfp_sdp_query_request); 1854 return ERROR_CODE_SUCCESS; 1855 } 1856 1857 void hfp_trigger_release_service_level_connection(hfp_connection_t * hfp_connection){ 1858 // called internally, NULL check already performed 1859 btstack_assert(hfp_connection != NULL); 1860 1861 hfp_trigger_release_audio_connection(hfp_connection); 1862 if (hfp_connection->state < HFP_W4_RFCOMM_CONNECTED){ 1863 hfp_connection->state = HFP_IDLE; 1864 return; 1865 } 1866 1867 if (hfp_connection->state == HFP_W4_RFCOMM_CONNECTED){ 1868 hfp_connection->state = HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN; 1869 return; 1870 } 1871 hfp_connection->release_slc_connection = 1; 1872 if (hfp_connection->state < HFP_W4_SCO_CONNECTED){ 1873 hfp_connection->state = HFP_W2_DISCONNECT_RFCOMM; 1874 return; 1875 } 1876 1877 if (hfp_connection->state < HFP_W4_SCO_DISCONNECTED){ 1878 hfp_connection->state = HFP_W2_DISCONNECT_SCO; 1879 hfp_connection->release_audio_connection = 1; 1880 return; 1881 } 1882 } 1883 1884 uint8_t hfp_trigger_release_audio_connection(hfp_connection_t * hfp_connection){ 1885 // called internally, NULL check already performed 1886 btstack_assert(hfp_connection != NULL); 1887 if (hfp_connection->state <= HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED){ 1888 return ERROR_CODE_COMMAND_DISALLOWED; 1889 } 1890 switch (hfp_connection->state) { 1891 case HFP_W2_CONNECT_SCO: 1892 hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED; 1893 break; 1894 case HFP_W4_SCO_CONNECTED: 1895 case HFP_AUDIO_CONNECTION_ESTABLISHED: 1896 hfp_connection->release_audio_connection = 1; 1897 break; 1898 default: 1899 return ERROR_CODE_COMMAND_DISALLOWED; 1900 } 1901 return ERROR_CODE_SUCCESS; 1902 } 1903 1904 void hfp_setup_synchronous_connection(hfp_connection_t * hfp_connection){ 1905 // all packet types, fixed bandwidth 1906 int setting = hfp_connection->link_setting; 1907 log_info("hfp_setup_synchronous_connection using setting nr %u", setting); 1908 hfp_sco_establishment_active = hfp_connection; 1909 uint16_t sco_voice_setting = hci_get_sco_voice_setting(); 1910 if (hfp_connection->negotiated_codec != HFP_CODEC_CVSD){ 1911 #ifdef ENABLE_BCM_PCM_WBS 1912 sco_voice_setting = 0x0063; // Transparent data, 16-bit for BCM controllers 1913 #else 1914 sco_voice_setting = 0x0043; // Transparent data, 8-bit otherwise 1915 #endif 1916 } 1917 uint16_t packet_types = hfp_link_settings[setting].packet_types; 1918 hfp_connection->packet_types = packet_types; 1919 1920 // get packet types - bits 6-9 are 'don't allow' 1921 uint16_t packet_types_flipped = packet_types ^ 0x03c0; 1922 hci_send_cmd(&hci_setup_synchronous_connection, hfp_connection->acl_handle, 8000, 8000, hfp_link_settings[setting].max_latency, 1923 sco_voice_setting, hfp_link_settings[setting].retransmission_effort, packet_types_flipped); 1924 } 1925 1926 hfp_link_settings_t hfp_safe_settings_for_context(bool use_eSCO, uint8_t negotiated_codec, bool secure_connection_in_use){ 1927 uint8_t i; 1928 hfp_link_settings_t link_setting = HFP_LINK_SETTINGS_NONE; 1929 for (i=0 ; i < ( sizeof(hfp_mandatory_safe_settings) / sizeof(struct hfp_mandatory_safe_setting) ) ; i++){ 1930 if (hfp_link_settings[(uint8_t)(hfp_mandatory_safe_settings[i].link_setting)].eSCO != use_eSCO) continue; 1931 if ((hfp_mandatory_safe_settings[i].codec_mask & (1 << negotiated_codec)) == 0) continue; 1932 if (hfp_mandatory_safe_settings[i].secure_connection_in_use != secure_connection_in_use) continue; 1933 link_setting = hfp_mandatory_safe_settings[i].link_setting; 1934 break; 1935 } 1936 return link_setting; 1937 } 1938 1939 void hfp_accept_synchronous_connection(hfp_connection_t * hfp_connection, bool use_eSCO){ 1940 1941 bool secure_connection_in_use = gap_secure_connection(hfp_connection->acl_handle); 1942 1943 // lookup safe settings based on SCO type, SC use and Codec type 1944 hfp_link_settings_t link_setting = hfp_safe_settings_for_context(use_eSCO, hfp_connection->negotiated_codec, secure_connection_in_use); 1945 btstack_assert(link_setting != HFP_LINK_SETTINGS_NONE); 1946 1947 uint16_t max_latency = hfp_link_settings[(uint8_t) link_setting].max_latency; 1948 uint16_t retransmission_effort = hfp_link_settings[(uint8_t) link_setting].retransmission_effort; 1949 1950 // safer to allow more packet types: 1951 uint16_t packet_types = use_eSCO ? (SCO_PACKET_TYPES_EV3 | SCO_PACKET_TYPES_2EV3) : (SCO_PACKET_TYPES_HV1 | SCO_PACKET_TYPES_HV3); 1952 1953 // transparent data for non-CVSD connections or if codec provided by Controller 1954 uint16_t sco_voice_setting = hci_get_sco_voice_setting(); 1955 if (hfp_connection->negotiated_codec != HFP_CODEC_CVSD){ 1956 #ifdef ENABLE_BCM_PCM_WBS 1957 sco_voice_setting = 0x0063; // Transparent data, 16-bit for BCM controllers 1958 #else 1959 sco_voice_setting = 0x0043; // Transparent data, 8-bit otherwise 1960 #endif 1961 } 1962 1963 // filter packet types 1964 packet_types &= hfp_get_sco_packet_types(); 1965 1966 hfp_connection->packet_types = packet_types; 1967 1968 // bits 6-9 are 'don't allow' 1969 uint16_t packet_types_flipped = packet_types ^ 0x3c0; 1970 1971 log_info("HFP: sending hci_accept_connection_request, packet types 0x%04x, sco_voice_setting 0x%02x", packet_types, sco_voice_setting); 1972 hci_send_cmd(&hci_accept_synchronous_connection, hfp_connection->remote_addr, 8000, 8000, max_latency, 1973 sco_voice_setting, retransmission_effort, packet_types_flipped); 1974 } 1975 1976 #ifdef ENABLE_CC256X_ASSISTED_HFP 1977 void hfp_cc256x_prepare_for_sco(hfp_connection_t * hfp_connection){ 1978 hfp_connection->cc256x_send_write_codec_config = true; 1979 if (hfp_connection->negotiated_codec == HFP_CODEC_MSBC){ 1980 hfp_connection->cc256x_send_wbs_associate = true; 1981 } 1982 } 1983 1984 void hfp_cc256x_write_codec_config(hfp_connection_t * hfp_connection){ 1985 uint32_t sample_rate_hz; 1986 uint16_t clock_rate_khz; 1987 if (hfp_connection->negotiated_codec == HFP_CODEC_MSBC){ 1988 clock_rate_khz = 512; 1989 sample_rate_hz = 16000; 1990 } else { 1991 clock_rate_khz = 256; 1992 sample_rate_hz = 8000; 1993 } 1994 uint8_t clock_direction = 0; // master 1995 uint16_t frame_sync_duty_cycle = 0; // i2s with 50% 1996 uint8_t frame_sync_edge = 1; // rising edge 1997 uint8_t frame_sync_polarity = 0; // active high 1998 uint8_t reserved = 0; 1999 uint16_t size = 16; 2000 uint16_t chan_1_offset = 1; 2001 uint16_t chan_2_offset = chan_1_offset + size; 2002 uint8_t out_edge = 1; // rising 2003 uint8_t in_edge = 0; // falling 2004 hci_send_cmd(&hci_ti_write_codec_config, clock_rate_khz, clock_direction, sample_rate_hz, frame_sync_duty_cycle, 2005 frame_sync_edge, frame_sync_polarity, reserved, 2006 size, chan_1_offset, out_edge, size, chan_1_offset, in_edge, reserved, 2007 size, chan_2_offset, out_edge, size, chan_2_offset, in_edge, reserved); 2008 } 2009 #endif 2010 2011 #ifdef ENABLE_BCM_PCM_WBS 2012 void hfp_bcm_prepare_for_sco(hfp_connection_t * hfp_connection){ 2013 hfp_connection->bcm_send_write_i2spcm_interface_param = true; 2014 if (hfp_connection->negotiated_codec == HFP_CODEC_MSBC){ 2015 hfp_connection->bcm_send_enable_wbs = true; 2016 } 2017 } 2018 void hfp_bcm_write_i2spcm_interface_param(hfp_connection_t * hfp_connection){ 2019 uint8_t sample_rate = (hfp_connection->negotiated_codec == HFP_CODEC_MSBC) ? 1 : 0; 2020 // i2s enable, master, 8/16 kHz, 512 kHz 2021 hci_send_cmd(&hci_bcm_write_i2spcm_interface_paramhci_bcm_write_i2spcm_interface_param, 1, 1, sample_rate, 2); 2022 } 2023 #endif 2024 2025 void hfp_set_hf_callback(btstack_packet_handler_t callback){ 2026 hfp_hf_callback = callback; 2027 } 2028 2029 void hfp_set_ag_callback(btstack_packet_handler_t callback){ 2030 hfp_ag_callback = callback; 2031 } 2032 2033 void hfp_set_ag_rfcomm_packet_handler(btstack_packet_handler_t handler){ 2034 hfp_ag_rfcomm_packet_handler = handler; 2035 } 2036 2037 void hfp_set_hf_rfcomm_packet_handler(btstack_packet_handler_t handler){ 2038 hfp_hf_rfcomm_packet_handler = handler; 2039 } 2040 2041 void hfp_init(void){ 2042 hfp_allowed_sco_packet_types = SCO_PACKET_TYPES_ALL; 2043 } 2044 2045 void hfp_deinit(void){ 2046 hfp_allowed_sco_packet_types = 0; 2047 hfp_connections = NULL; 2048 hfp_hf_callback = NULL; 2049 hfp_ag_callback = NULL; 2050 hfp_hf_rfcomm_packet_handler = NULL; 2051 hfp_ag_rfcomm_packet_handler = NULL; 2052 hfp_sco_establishment_active = NULL; 2053 hfp_custom_commands_ag = NULL; 2054 hfp_custom_commands_hf = NULL; 2055 (void) memset(&hfp_sdp_query_context, 0, sizeof(hfp_sdp_query_context_t)); 2056 (void) memset(&hfp_sdp_query_request, 0, sizeof(btstack_context_callback_registration_t)); 2057 } 2058 2059 void hfp_set_sco_packet_types(uint16_t packet_types){ 2060 hfp_allowed_sco_packet_types = packet_types; 2061 } 2062 2063 uint16_t hfp_get_sco_packet_types(void){ 2064 return hfp_allowed_sco_packet_types; 2065 } 2066 2067 hfp_link_settings_t hfp_next_link_setting(hfp_link_settings_t current_setting, bool local_eSCO_supported, bool remote_eSCO_supported, bool eSCO_S4_supported, uint8_t negotiated_codec){ 2068 int8_t setting = (int8_t) current_setting; 2069 bool can_use_eSCO = local_eSCO_supported && remote_eSCO_supported; 2070 while (setting > 0){ 2071 setting--; 2072 // skip if eSCO required but not available 2073 if (hfp_link_settings[setting].eSCO && !can_use_eSCO) continue; 2074 // skip if S4 but not supported 2075 if ((setting == (int8_t) HFP_LINK_SETTINGS_S4) && !eSCO_S4_supported) continue; 2076 // skip wrong codec 2077 if ((hfp_link_settings[setting].codec_mask & (1 << negotiated_codec)) == 0) continue; 2078 // skip disabled packet types 2079 uint16_t required_packet_types = hfp_link_settings[setting].packet_types; 2080 uint16_t allowed_packet_types = hfp_allowed_sco_packet_types; 2081 if ((required_packet_types & allowed_packet_types) == 0) continue; 2082 2083 // found matching setting 2084 return (hfp_link_settings_t) setting; 2085 } 2086 return HFP_LINK_SETTINGS_NONE; 2087 } 2088 2089 static hfp_link_settings_t hfp_next_link_setting_for_connection(hfp_link_settings_t current_setting, hfp_connection_t * hfp_connection, uint8_t eSCO_S4_supported){ 2090 bool local_eSCO_supported = hci_extended_sco_link_supported(); 2091 bool remote_eSCO_supported = hci_remote_esco_supported(hfp_connection->acl_handle); 2092 uint8_t negotiated_codec = hfp_connection->negotiated_codec; 2093 return hfp_next_link_setting(current_setting, local_eSCO_supported, remote_eSCO_supported, eSCO_S4_supported, negotiated_codec); 2094 } 2095 2096 void hfp_init_link_settings(hfp_connection_t * hfp_connection, uint8_t eSCO_S4_supported){ 2097 // get highest possible link setting 2098 hfp_connection->link_setting = hfp_next_link_setting_for_connection(HFP_LINK_SETTINGS_NONE, hfp_connection, eSCO_S4_supported); 2099 log_info("hfp_init_link_settings: %u", hfp_connection->link_setting); 2100 } 2101 2102 #define HFP_HF_RX_DEBUG_PRINT_LINE 80 2103 2104 void hfp_log_rfcomm_message(const char * tag, uint8_t * packet, uint16_t size){ 2105 #ifdef ENABLE_LOG_INFO 2106 // encode \n\r 2107 char printable[HFP_HF_RX_DEBUG_PRINT_LINE+2]; 2108 int i = 0; 2109 int pos; 2110 for (pos=0 ; (pos < size) && (i < (HFP_HF_RX_DEBUG_PRINT_LINE - 3)) ; pos++){ 2111 switch (packet[pos]){ 2112 case '\n': 2113 printable[i++] = '\\'; 2114 printable[i++] = 'n'; 2115 break; 2116 case '\r': 2117 printable[i++] = '\\'; 2118 printable[i++] = 'r'; 2119 break; 2120 default: 2121 printable[i++] = packet[pos]; 2122 break; 2123 } 2124 } 2125 printable[i] = 0; 2126 log_info("%s: '%s'", tag, printable); 2127 #endif 2128 } 2129 2130 void hfp_register_custom_ag_command(hfp_custom_at_command_t * custom_at_command){ 2131 btstack_linked_list_add(&hfp_custom_commands_ag, (btstack_linked_item_t *) custom_at_command); 2132 } 2133 2134 void hfp_register_custom_hf_command(hfp_custom_at_command_t * custom_at_command){ 2135 btstack_linked_list_add(&hfp_custom_commands_hf, (btstack_linked_item_t *) custom_at_command); 2136 } 2137 2138 // HFP H2 Synchronization - might get moved into a hfp_h2.c 2139 2140 // find position of h2 sync header, returns -1 if not found, or h2 sync position 2141 static int16_t hfp_h2_sync_find(const uint8_t * frame_data, uint16_t frame_len){ 2142 uint16_t i; 2143 for (i=0;i<(frame_len - 1);i++){ 2144 // check: first byte == 1 2145 uint8_t h2_first_byte = frame_data[i]; 2146 if (h2_first_byte == 0x01) { 2147 uint8_t h2_second_byte = frame_data[i + 1]; 2148 // check lower nibble of second byte == 0x08 2149 if ((h2_second_byte & 0x0F) == 8) { 2150 // check if bits 0+2 == bits 1+3 2151 uint8_t hn = h2_second_byte >> 4; 2152 if (((hn >> 1) & 0x05) == (hn & 0x05)) { 2153 return (int16_t) i; 2154 } 2155 } 2156 } 2157 } 2158 return -1; 2159 } 2160 2161 static void hfp_h2_sync_reset(hfp_h2_sync_t * hfp_h2_sync){ 2162 hfp_h2_sync->frame_len = 0; 2163 } 2164 2165 void hfp_h2_sync_init(hfp_h2_sync_t * hfp_h2_sync, 2166 bool (*callback)(bool bad_frame, const uint8_t * frame_data, uint16_t frame_len)){ 2167 hfp_h2_sync->callback = callback; 2168 hfp_h2_sync->dropped_bytes = 0; 2169 hfp_h2_sync_reset(hfp_h2_sync); 2170 } 2171 2172 static void hfp_h2_report_bad_frames(hfp_h2_sync_t *hfp_h2_sync){ 2173 // report bad frames 2174 while (hfp_h2_sync->dropped_bytes >= HFP_H2_SYNC_FRAME_SIZE){ 2175 hfp_h2_sync->dropped_bytes -= HFP_H2_SYNC_FRAME_SIZE; 2176 (void)(*hfp_h2_sync->callback)(true,NULL, HFP_H2_SYNC_FRAME_SIZE); 2177 } 2178 } 2179 2180 static void hfp_h2_sync_drop_bytes(hfp_h2_sync_t * hfp_h2_sync, uint16_t bytes_to_drop){ 2181 btstack_assert(bytes_to_drop <= hfp_h2_sync->frame_len); 2182 memmove(hfp_h2_sync->frame_data, &hfp_h2_sync->frame_data[bytes_to_drop], hfp_h2_sync->frame_len - bytes_to_drop); 2183 hfp_h2_sync->dropped_bytes += bytes_to_drop; 2184 hfp_h2_sync->frame_len -= bytes_to_drop; 2185 hfp_h2_report_bad_frames(hfp_h2_sync); 2186 } 2187 2188 void hfp_h2_sync_process(hfp_h2_sync_t *hfp_h2_sync, bool bad_frame, const uint8_t *frame_data, uint16_t frame_len) { 2189 2190 if (bad_frame){ 2191 // drop all data 2192 hfp_h2_sync->dropped_bytes += hfp_h2_sync->frame_len; 2193 hfp_h2_sync->frame_len = 0; 2194 // all new data is bad, too 2195 hfp_h2_sync->dropped_bytes += frame_len; 2196 // report frames 2197 hfp_h2_report_bad_frames(hfp_h2_sync); 2198 return; 2199 } 2200 2201 while (frame_len > 0){ 2202 // Fill hfp_h2_sync->frame_buffer 2203 uint16_t bytes_free_in_frame_buffer = HFP_H2_SYNC_FRAME_SIZE - hfp_h2_sync->frame_len; 2204 uint16_t bytes_to_append = btstack_min(frame_len, bytes_free_in_frame_buffer); 2205 memcpy(&hfp_h2_sync->frame_data[hfp_h2_sync->frame_len], frame_data, bytes_to_append); 2206 frame_data += bytes_to_append; 2207 frame_len -= bytes_to_append; 2208 hfp_h2_sync->frame_len += bytes_to_append; 2209 // check complete frame for h2 sync 2210 if (hfp_h2_sync->frame_len == HFP_H2_SYNC_FRAME_SIZE){ 2211 bool valid_frame = true; 2212 int16_t h2_pos = hfp_h2_sync_find(hfp_h2_sync->frame_data, hfp_h2_sync->frame_len); 2213 if (h2_pos < 0){ 2214 // no h2 sync, no valid frame, keep last byte if it is 0x01 2215 if (hfp_h2_sync->frame_data[HFP_H2_SYNC_FRAME_SIZE-1] == 0x01){ 2216 hfp_h2_sync_drop_bytes(hfp_h2_sync, HFP_H2_SYNC_FRAME_SIZE - 1); 2217 } else { 2218 hfp_h2_sync_drop_bytes(hfp_h2_sync, HFP_H2_SYNC_FRAME_SIZE); 2219 } 2220 valid_frame = false; 2221 } 2222 else if (h2_pos > 0){ 2223 // drop data before h2 sync 2224 hfp_h2_sync_drop_bytes(hfp_h2_sync, h2_pos); 2225 valid_frame = false; 2226 } 2227 if (valid_frame) { 2228 // h2 sync at pos 0 and complete frame 2229 bool codec_ok = (*hfp_h2_sync->callback)(false, hfp_h2_sync->frame_data, hfp_h2_sync->frame_len); 2230 if (codec_ok){ 2231 hfp_h2_sync_reset(hfp_h2_sync); 2232 } else { 2233 // drop first two bytes 2234 hfp_h2_sync_drop_bytes(hfp_h2_sync, 2); 2235 } 2236 } 2237 } 2238 } 2239 } 2240