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[21]; 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 little_endian_store_16(event, pos, rx_packet_length); 506 pos += 2; 507 little_endian_store_16(event, pos, tx_packet_length); 508 pos += 2; 509 hfp_emit_event_for_context(hfp_connection, event, sizeof(event)); 510 } 511 512 void hfp_emit_string_event(hfp_connection_t * hfp_connection, uint8_t event_subtype, const char * value){ 513 btstack_assert(hfp_connection != NULL); 514 #ifdef ENABLE_HFP_AT_MESSAGES 515 uint8_t event[256]; 516 #else 517 uint8_t event[40]; 518 #endif 519 uint16_t string_len = btstack_min((uint16_t) strlen(value), sizeof(event) - 6); 520 event[0] = HCI_EVENT_HFP_META; 521 event[1] = 4 + string_len; 522 event[2] = event_subtype; 523 little_endian_store_16(event, 3, hfp_connection->acl_handle); 524 memcpy((char*)&event[5], value, string_len); 525 event[5 + string_len] = 0; 526 hfp_emit_event_for_context(hfp_connection, event, 6 + string_len); 527 } 528 529 btstack_linked_list_t * hfp_get_connections(void){ 530 return (btstack_linked_list_t *) &hfp_connections; 531 } 532 533 hfp_connection_t * get_hfp_connection_context_for_rfcomm_cid(uint16_t cid){ 534 btstack_linked_list_iterator_t it; 535 btstack_linked_list_iterator_init(&it, hfp_get_connections()); 536 while (btstack_linked_list_iterator_has_next(&it)){ 537 hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it); 538 if (hfp_connection->rfcomm_cid == cid){ 539 return hfp_connection; 540 } 541 } 542 return NULL; 543 } 544 545 hfp_connection_t * get_hfp_connection_context_for_bd_addr(bd_addr_t bd_addr, hfp_role_t hfp_role){ 546 btstack_linked_list_iterator_t it; 547 btstack_linked_list_iterator_init(&it, hfp_get_connections()); 548 while (btstack_linked_list_iterator_has_next(&it)){ 549 hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it); 550 if ((memcmp(hfp_connection->remote_addr, bd_addr, 6) == 0) && (hfp_connection->local_role == hfp_role)) { 551 return hfp_connection; 552 } 553 } 554 return NULL; 555 } 556 557 hfp_connection_t * get_hfp_connection_context_for_sco_handle(uint16_t handle, hfp_role_t hfp_role){ 558 btstack_linked_list_iterator_t it; 559 btstack_linked_list_iterator_init(&it, hfp_get_connections()); 560 while (btstack_linked_list_iterator_has_next(&it)){ 561 hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it); 562 if ((hfp_connection->sco_handle == handle) && (hfp_connection->local_role == hfp_role)){ 563 return hfp_connection; 564 } 565 } 566 return NULL; 567 } 568 569 hfp_connection_t * get_hfp_connection_context_for_acl_handle(uint16_t handle, hfp_role_t hfp_role){ 570 btstack_linked_list_iterator_t it; 571 btstack_linked_list_iterator_init(&it, hfp_get_connections()); 572 while (btstack_linked_list_iterator_has_next(&it)){ 573 hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it); 574 if ((hfp_connection->acl_handle == handle) && (hfp_connection->local_role == hfp_role)){ 575 return hfp_connection; 576 } 577 } 578 return NULL; 579 } 580 581 582 static void hfp_reset_voice_recognition(hfp_connection_t * hfp_connection){ 583 btstack_assert(hfp_connection != NULL); 584 hfp_voice_recognition_activation_status_t current_vra_state = hfp_connection->vra_state; 585 hfp_connection->vra_state = HFP_VRA_VOICE_RECOGNITION_OFF; 586 587 if (current_vra_state != HFP_VRA_VOICE_RECOGNITION_OFF){ 588 hfp_emit_voice_recognition_disabled(hfp_connection, ERROR_CODE_SUCCESS); 589 } else if (hfp_connection->vra_state_requested != HFP_VRA_VOICE_RECOGNITION_OFF){ 590 hfp_emit_voice_recognition_disabled(hfp_connection, ERROR_CODE_SUCCESS); 591 } 592 593 hfp_connection->vra_state_requested = HFP_VRA_VOICE_RECOGNITION_OFF; 594 hfp_connection->activate_voice_recognition = false; 595 hfp_connection->deactivate_voice_recognition = false; 596 hfp_connection->enhanced_voice_recognition_enabled = false; 597 hfp_connection->ag_vra_status = 0; 598 hfp_connection->ag_vra_state = HFP_VOICE_RECOGNITION_STATE_AG_READY; 599 } 600 601 void hfp_reset_context_flags(hfp_connection_t * hfp_connection){ 602 if (!hfp_connection) return; 603 hfp_connection->ok_pending = 0; 604 hfp_connection->send_error = 0; 605 606 hfp_connection->found_equal_sign = false; 607 608 hfp_connection->change_status_update_for_individual_ag_indicators = 0; 609 hfp_connection->operator_name_changed = 0; 610 611 hfp_connection->enable_extended_audio_gateway_error_report = 0; 612 hfp_connection->extended_audio_gateway_error = 0; 613 614 // establish codecs hfp_connection 615 hfp_connection->suggested_codec = 0; 616 hfp_connection->negotiated_codec = 0; 617 hfp_connection->codec_confirmed = 0; 618 619 hfp_connection->establish_audio_connection = 0; 620 hfp_connection->call_waiting_notification_enabled = 0; 621 hfp_connection->command = HFP_CMD_NONE; 622 hfp_connection->enable_status_update_for_ag_indicators = 0xFF; 623 hfp_connection->clip_have_alpha = false; 624 hfp_reset_voice_recognition(hfp_connection); 625 } 626 627 static hfp_connection_t * create_hfp_connection_context(void){ 628 hfp_connection_t * hfp_connection = btstack_memory_hfp_connection_get(); 629 if (!hfp_connection) return NULL; 630 631 hfp_connection->state = HFP_IDLE; 632 hfp_connection->call_state = HFP_CALL_IDLE; 633 hfp_connection->codecs_state = HFP_CODECS_IDLE; 634 635 hfp_connection->parser_state = HFP_PARSER_CMD_HEADER; 636 637 hfp_connection->acl_handle = HCI_CON_HANDLE_INVALID; 638 hfp_connection->sco_handle = HCI_CON_HANDLE_INVALID; 639 640 hfp_reset_context_flags(hfp_connection); 641 642 btstack_linked_list_add(&hfp_connections, (btstack_linked_item_t*)hfp_connection); 643 return hfp_connection; 644 } 645 646 void hfp_finalize_connection_context(hfp_connection_t * hfp_connection){ 647 btstack_linked_list_remove(&hfp_connections, (btstack_linked_item_t*) hfp_connection); 648 btstack_memory_hfp_connection_free(hfp_connection); 649 } 650 651 static hfp_connection_t * hfp_create_connection(bd_addr_t bd_addr, hfp_role_t local_role){ 652 hfp_connection_t * hfp_connection = get_hfp_connection_context_for_bd_addr(bd_addr, local_role); 653 if (hfp_connection) return hfp_connection; 654 hfp_connection = create_hfp_connection_context(); 655 if (!hfp_connection) { 656 return NULL; 657 } 658 (void)memcpy(hfp_connection->remote_addr, bd_addr, 6); 659 hfp_connection->local_role = local_role; 660 log_info("Create HFP context %p: role %u, addr %s", hfp_connection, local_role, bd_addr_to_str(bd_addr)); 661 662 return hfp_connection; 663 } 664 665 /* @param network. 666 * 0 == no ability to reject a call. 667 * 1 == ability to reject a call. 668 */ 669 670 /* @param suported_features 671 * HF bit 0: EC and/or NR function (yes/no, 1 = yes, 0 = no) 672 * HF bit 1: Call waiting or three-way calling(yes/no, 1 = yes, 0 = no) 673 * HF bit 2: CLI presentation capability (yes/no, 1 = yes, 0 = no) 674 * HF bit 3: Voice recognition activation (yes/no, 1= yes, 0 = no) 675 * HF bit 4: Remote volume control (yes/no, 1 = yes, 0 = no) 676 * HF bit 5: Wide band speech (yes/no, 1 = yes, 0 = no) 677 */ 678 /* Bit position: 679 * AG bit 0: Three-way calling (yes/no, 1 = yes, 0 = no) 680 * AG bit 1: EC and/or NR function (yes/no, 1 = yes, 0 = no) 681 * AG bit 2: Voice recognition function (yes/no, 1 = yes, 0 = no) 682 * AG bit 3: In-band ring tone capability (yes/no, 1 = yes, 0 = no) 683 * AG bit 4: Attach a phone number to a voice tag (yes/no, 1 = yes, 0 = no) 684 * AG bit 5: Wide band speech (yes/no, 1 = yes, 0 = no) 685 */ 686 687 void hfp_create_sdp_record(uint8_t * service, uint32_t service_record_handle, uint16_t service_uuid, int rfcomm_channel_nr, const char * name){ 688 uint8_t* attribute; 689 de_create_sequence(service); 690 691 // 0x0000 "Service Record Handle" 692 de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_SERVICE_RECORD_HANDLE); 693 de_add_number(service, DE_UINT, DE_SIZE_32, service_record_handle); 694 695 // 0x0001 "Service Class ID List" 696 de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_SERVICE_CLASS_ID_LIST); 697 attribute = de_push_sequence(service); 698 { 699 // "UUID for Service" 700 de_add_number(attribute, DE_UUID, DE_SIZE_16, service_uuid); 701 de_add_number(attribute, DE_UUID, DE_SIZE_16, BLUETOOTH_SERVICE_CLASS_GENERIC_AUDIO); 702 } 703 de_pop_sequence(service, attribute); 704 705 // 0x0004 "Protocol Descriptor List" 706 de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_PROTOCOL_DESCRIPTOR_LIST); 707 attribute = de_push_sequence(service); 708 { 709 uint8_t* l2cpProtocol = de_push_sequence(attribute); 710 { 711 de_add_number(l2cpProtocol, DE_UUID, DE_SIZE_16, BLUETOOTH_PROTOCOL_L2CAP); 712 } 713 de_pop_sequence(attribute, l2cpProtocol); 714 715 uint8_t* rfcomm = de_push_sequence(attribute); 716 { 717 de_add_number(rfcomm, DE_UUID, DE_SIZE_16, BLUETOOTH_PROTOCOL_RFCOMM); // rfcomm_service 718 de_add_number(rfcomm, DE_UINT, DE_SIZE_8, rfcomm_channel_nr); // rfcomm channel 719 } 720 de_pop_sequence(attribute, rfcomm); 721 } 722 de_pop_sequence(service, attribute); 723 724 725 // 0x0005 "Public Browse Group" 726 de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_BROWSE_GROUP_LIST); // public browse group 727 attribute = de_push_sequence(service); 728 { 729 de_add_number(attribute, DE_UUID, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_PUBLIC_BROWSE_ROOT); 730 } 731 de_pop_sequence(service, attribute); 732 733 // 0x0009 "Bluetooth Profile Descriptor List" 734 de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_BLUETOOTH_PROFILE_DESCRIPTOR_LIST); 735 attribute = de_push_sequence(service); 736 { 737 uint8_t *sppProfile = de_push_sequence(attribute); 738 { 739 de_add_number(sppProfile, DE_UUID, DE_SIZE_16, BLUETOOTH_SERVICE_CLASS_HANDSFREE); 740 de_add_number(sppProfile, DE_UINT, DE_SIZE_16, 0x0108); // Verision 1.8 741 } 742 de_pop_sequence(attribute, sppProfile); 743 } 744 de_pop_sequence(service, attribute); 745 746 // 0x0100 "Service Name" 747 de_add_number(service, DE_UINT, DE_SIZE_16, 0x0100); 748 de_add_data(service, DE_STRING, (uint16_t) strlen(name), (uint8_t *) name); 749 } 750 751 static void hfp_handle_slc_setup_error(hfp_connection_t * hfp_connection, uint8_t status){ 752 // cache fields for event 753 hfp_role_t local_role = hfp_connection->local_role; 754 bd_addr_t remote_addr; 755 // cppcheck-suppress uninitvar ; remote_addr is reported as uninitialized although it's the destination of the memcpy 756 (void)memcpy(remote_addr, hfp_connection->remote_addr, 6); 757 // finalize connection struct 758 hfp_finalize_connection_context(hfp_connection); 759 // emit event 760 hfp_emit_slc_connection_event(local_role, status, HCI_CON_HANDLE_INVALID, remote_addr); 761 } 762 763 static void handle_query_rfcomm_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 764 UNUSED(packet_type); // ok: handling own sdp events 765 UNUSED(channel); // ok: no channel 766 UNUSED(size); // ok: handling own sdp events 767 768 hfp_connection_t * hfp_connection = get_hfp_connection_context_for_bd_addr(hfp_sdp_query_context.remote_address, hfp_sdp_query_context.local_role); 769 if (hfp_connection == NULL) { 770 log_info("connection with %s and local role %d not found", hfp_sdp_query_context.remote_address, hfp_sdp_query_context.local_role); 771 return; 772 } 773 774 switch (hci_event_packet_get_type(packet)){ 775 case SDP_EVENT_QUERY_RFCOMM_SERVICE: 776 hfp_connection->rfcomm_channel_nr = sdp_event_query_rfcomm_service_get_rfcomm_channel(packet); 777 break; 778 case SDP_EVENT_QUERY_COMPLETE: 779 if (hfp_connection->rfcomm_channel_nr > 0){ 780 hfp_connection->state = HFP_W4_RFCOMM_CONNECTED; 781 btstack_packet_handler_t packet_handler; 782 switch (hfp_connection->local_role){ 783 case HFP_ROLE_AG: 784 packet_handler = hfp_ag_rfcomm_packet_handler; 785 break; 786 case HFP_ROLE_HF: 787 packet_handler = hfp_hf_rfcomm_packet_handler; 788 break; 789 default: 790 btstack_assert(false); 791 return; 792 } 793 794 rfcomm_create_channel(packet_handler, hfp_connection->remote_addr, hfp_connection->rfcomm_channel_nr, NULL); 795 796 } else { 797 uint8_t status = sdp_event_query_complete_get_status(packet); 798 if (status == ERROR_CODE_SUCCESS){ 799 // report service not found 800 status = SDP_SERVICE_NOT_FOUND; 801 } 802 hfp_handle_slc_setup_error(hfp_connection, status); 803 log_info("rfcomm service not found, status 0x%02x", status); 804 } 805 806 // register the SDP Query request to check if there is another connection waiting for the query 807 // ignore ERROR_CODE_COMMAND_DISALLOWED because in that case, we already have requested an SDP callback 808 (void) sdp_client_register_query_callback(&hfp_sdp_query_request); 809 break; 810 default: 811 break; 812 } 813 } 814 815 // returns 0 if unexpected error or no other link options remained, otherwise 1 816 static int hfp_handle_failed_sco_connection(uint8_t status){ 817 818 if (!hfp_sco_establishment_active){ 819 log_info("(e)SCO Connection failed but not started by us"); 820 return 0; 821 } 822 823 log_info("(e)SCO Connection failed 0x%02x", status); 824 switch (status){ 825 case ERROR_CODE_SCO_AIR_MODE_REJECTED: 826 case ERROR_CODE_SCO_INTERVAL_REJECTED: 827 case ERROR_CODE_SCO_OFFSET_REJECTED: 828 case ERROR_CODE_UNSPECIFIED_ERROR: 829 case ERROR_CODE_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE: 830 case ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE_UNSUPPORTED_LMP_FEATURE: 831 break; 832 default: 833 return 0; 834 } 835 836 // note: eSCO_S4 supported flag not available, but it's only relevant for highest CVSD link setting (and the current failed) 837 hfp_link_settings_t next_setting = hfp_next_link_setting_for_connection(hfp_sco_establishment_active->link_setting, hfp_sco_establishment_active, false); 838 839 // handle no valid setting found 840 if (next_setting == HFP_LINK_SETTINGS_NONE) { 841 if (hfp_sco_establishment_active->negotiated_codec == HFP_CODEC_MSBC){ 842 log_info("T2/T1 failed, fallback to CVSD - D1"); 843 hfp_sco_establishment_active->negotiated_codec = HFP_CODEC_CVSD; 844 hfp_sco_establishment_active->sco_for_msbc_failed = 1; 845 hfp_sco_establishment_active->ag_send_common_codec = true; 846 hfp_sco_establishment_active->link_setting = HFP_LINK_SETTINGS_D1; 847 } else { 848 // no other options 849 return 0; 850 } 851 } 852 853 log_info("e)SCO Connection: try new link_setting %d", next_setting); 854 hfp_sco_establishment_active->establish_audio_connection = 1; 855 hfp_sco_establishment_active->link_setting = next_setting; 856 hfp_sco_establishment_active = NULL; 857 return 1; 858 } 859 860 void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size, hfp_role_t local_role){ 861 UNUSED(packet_type); 862 UNUSED(channel); // ok: no channel 863 UNUSED(size); 864 865 bd_addr_t event_addr; 866 hci_con_handle_t handle; 867 hfp_connection_t * hfp_connection = NULL; 868 uint8_t status; 869 870 log_debug("HFP HCI event handler type %u, event type %x, size %u", packet_type, hci_event_packet_get_type(packet), size); 871 872 switch (hci_event_packet_get_type(packet)) { 873 874 case HCI_EVENT_CONNECTION_REQUEST: 875 switch(hci_event_connection_request_get_link_type(packet)){ 876 case 0: // SCO 877 case 2: // eSCO 878 hci_event_connection_request_get_bd_addr(packet, event_addr); 879 hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr, local_role); 880 if (!hfp_connection) break; 881 if (hci_event_connection_request_get_link_type(packet) == 2){ 882 hfp_connection->accept_sco = 2; 883 } else { 884 hfp_connection->accept_sco = 1; 885 } 886 #ifdef ENABLE_CC256X_ASSISTED_HFP 887 hfp_cc256x_prepare_for_sco(hfp_connection); 888 #endif 889 #ifdef ENABLE_BCM_PCM_WBS 890 hfp_bcm_prepare_for_sco(hfp_connection); 891 #endif 892 #ifdef ENABLE_RTK_PCM_WBS 893 hfp_connection->rtk_send_sco_config = true; 894 #endif 895 log_info("accept sco %u\n", hfp_connection->accept_sco); 896 hfp_sco_establishment_active = hfp_connection; 897 break; 898 default: 899 break; 900 } 901 break; 902 903 case HCI_EVENT_COMMAND_STATUS: 904 if (hci_event_command_status_get_command_opcode(packet) == hci_setup_synchronous_connection.opcode) { 905 if (hfp_sco_establishment_active == NULL) break; 906 status = hci_event_command_status_get_status(packet); 907 if (status == ERROR_CODE_SUCCESS) break; 908 909 hfp_connection = hfp_sco_establishment_active; 910 if (hfp_handle_failed_sco_connection(status)) break; 911 hfp_connection->establish_audio_connection = 0; 912 hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED; 913 hfp_emit_sco_connection_established(hfp_connection, status, 914 hfp_connection->negotiated_codec, 0, 0); 915 } 916 break; 917 918 case HCI_EVENT_SYNCHRONOUS_CONNECTION_COMPLETE:{ 919 if (hfp_sco_establishment_active == NULL) break; 920 hci_event_synchronous_connection_complete_get_bd_addr(packet, event_addr); 921 hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr, local_role); 922 if (!hfp_connection) { 923 log_error("HFP: connection does not exist for remote with addr %s.", bd_addr_to_str(event_addr)); 924 return; 925 } 926 927 status = hci_event_synchronous_connection_complete_get_status(packet); 928 if (status != ERROR_CODE_SUCCESS){ 929 hfp_connection->accept_sco = 0; 930 if (hfp_handle_failed_sco_connection(status)) break; 931 932 hfp_connection->establish_audio_connection = 0; 933 hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED; 934 hfp_emit_sco_connection_established(hfp_connection, status, 935 hfp_connection->negotiated_codec, 0, 0); 936 break; 937 } 938 939 uint16_t sco_handle = hci_event_synchronous_connection_complete_get_handle(packet); 940 uint8_t link_type = hci_event_synchronous_connection_complete_get_link_type(packet); 941 uint8_t transmission_interval = hci_event_synchronous_connection_complete_get_transmission_interval(packet); // measured in slots 942 uint8_t retransmission_interval = hci_event_synchronous_connection_complete_get_retransmission_interval(packet);// measured in slots 943 uint16_t rx_packet_length = hci_event_synchronous_connection_complete_get_rx_packet_length(packet); // measured in bytes 944 uint16_t tx_packet_length = hci_event_synchronous_connection_complete_get_tx_packet_length(packet); // measured in bytes 945 946 switch (link_type){ 947 case 0x00: 948 log_info("SCO Connection established."); 949 if (transmission_interval != 0) log_error("SCO Connection: transmission_interval not zero: %d.", transmission_interval); 950 if (retransmission_interval != 0) log_error("SCO Connection: retransmission_interval not zero: %d.", retransmission_interval); 951 if (rx_packet_length != 0) log_error("SCO Connection: rx_packet_length not zero: %d.", rx_packet_length); 952 if (tx_packet_length != 0) log_error("SCO Connection: tx_packet_length not zero: %d.", tx_packet_length); 953 break; 954 case 0x02: 955 log_info("eSCO Connection established. \n"); 956 break; 957 default: 958 log_error("(e)SCO reserved link_type 0x%2x", link_type); 959 break; 960 } 961 962 log_info("sco_handle 0x%2x, address %s, transmission_interval %u slots, retransmission_interval %u slots, " 963 " rx_packet_length %u bytes, tx_packet_length %u bytes, air_mode 0x%2x (0x02 == CVSD)\n", sco_handle, 964 bd_addr_to_str(event_addr), transmission_interval, retransmission_interval, rx_packet_length, tx_packet_length, 965 hci_event_synchronous_connection_complete_get_air_mode(packet)); 966 967 if (hfp_connection->state == HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN){ 968 log_info("SCO about to disconnect: HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN"); 969 hfp_connection->state = HFP_W2_DISCONNECT_SCO; 970 break; 971 } 972 hfp_connection->sco_handle = sco_handle; 973 hfp_connection->establish_audio_connection = 0; 974 975 hfp_connection->state = HFP_AUDIO_CONNECTION_ESTABLISHED; 976 977 switch (hfp_connection->vra_state){ 978 case HFP_VRA_VOICE_RECOGNITION_ACTIVATED: 979 hfp_connection->ag_audio_connection_opened_before_vra = false; 980 break; 981 default: 982 hfp_connection->ag_audio_connection_opened_before_vra = true; 983 break; 984 } 985 hfp_emit_sco_connection_established(hfp_connection, status, 986 hfp_connection->negotiated_codec, rx_packet_length, tx_packet_length); 987 break; 988 } 989 990 case HCI_EVENT_DISCONNECTION_COMPLETE: 991 handle = little_endian_read_16(packet,3); 992 hfp_connection = get_hfp_connection_context_for_sco_handle(handle, local_role); 993 994 if (!hfp_connection) break; 995 996 #ifdef ENABLE_CC256X_ASSISTED_HFP 997 hfp_connection->cc256x_send_wbs_disassociate = true; 998 #endif 999 #ifdef ENABLE_BCM_PCM_WBS 1000 hfp_connection->bcm_send_disable_wbs = true; 1001 #endif 1002 if (hfp_connection->sco_handle == handle){ 1003 hfp_connection->sco_handle = HCI_CON_HANDLE_INVALID; 1004 hfp_connection->release_audio_connection = 0; 1005 hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED; 1006 hfp_emit_audio_connection_released(hfp_connection, handle); 1007 1008 hfp_connection->ag_audio_connection_opened_before_vra = false; 1009 1010 if (hfp_connection->acl_handle == HCI_CON_HANDLE_INVALID){ 1011 hfp_reset_voice_recognition(hfp_connection); 1012 hfp_emit_event(hfp_connection, HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_RELEASED, 0); 1013 hfp_finalize_connection_context(hfp_connection); 1014 break; 1015 } else if (hfp_connection->release_slc_connection == 1){ 1016 hfp_connection->release_slc_connection = 0; 1017 hfp_connection->state = HFP_W2_DISCONNECT_RFCOMM; 1018 rfcomm_disconnect(hfp_connection->acl_handle); 1019 } 1020 } 1021 1022 if (hfp_connection->state == HFP_W4_SCO_DISCONNECTED_TO_SHUTDOWN){ 1023 // RFCOMM already closed -> remote power off 1024 #if defined(ENABLE_CC256X_ASSISTED_HFP) || defined (ENABLE_BCM_PCM_WBS) 1025 hfp_connection->state = HFP_W4_WBS_SHUTDOWN; 1026 #else 1027 hfp_finalize_connection_context(hfp_connection); 1028 #endif 1029 break; 1030 } 1031 break; 1032 1033 default: 1034 break; 1035 } 1036 } 1037 1038 1039 void hfp_handle_rfcomm_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size, hfp_role_t local_role){ 1040 UNUSED(packet_type); 1041 UNUSED(channel); // ok: no channel 1042 UNUSED(size); 1043 1044 bd_addr_t event_addr; 1045 uint16_t rfcomm_cid; 1046 hfp_connection_t * hfp_connection = NULL; 1047 uint8_t status; 1048 1049 log_debug("HFP packet_handler type %u, event type %x, size %u", packet_type, hci_event_packet_get_type(packet), size); 1050 1051 switch (hci_event_packet_get_type(packet)) { 1052 1053 case RFCOMM_EVENT_INCOMING_CONNECTION: 1054 // data: event (8), len(8), address(48), channel (8), rfcomm_cid (16) 1055 rfcomm_event_incoming_connection_get_bd_addr(packet, event_addr); 1056 hfp_connection = hfp_create_connection(event_addr, local_role); 1057 if (!hfp_connection){ 1058 log_info("hfp: no memory to accept incoming connection - decline"); 1059 rfcomm_decline_connection(rfcomm_event_incoming_connection_get_rfcomm_cid(packet)); 1060 return; 1061 } 1062 if (hfp_connection->state != HFP_IDLE) { 1063 log_error("hfp: incoming connection but not idle, reject"); 1064 rfcomm_decline_connection(rfcomm_event_incoming_connection_get_rfcomm_cid(packet)); 1065 return; 1066 } 1067 1068 hfp_connection->rfcomm_cid = rfcomm_event_incoming_connection_get_rfcomm_cid(packet); 1069 hfp_connection->state = HFP_W4_RFCOMM_CONNECTED; 1070 rfcomm_accept_connection(hfp_connection->rfcomm_cid); 1071 break; 1072 1073 case RFCOMM_EVENT_CHANNEL_OPENED: 1074 rfcomm_event_channel_opened_get_bd_addr(packet, event_addr); 1075 1076 hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr, local_role); 1077 btstack_assert(hfp_connection != NULL); 1078 1079 if (hfp_connection->state != HFP_W4_RFCOMM_CONNECTED){ 1080 break; 1081 } 1082 1083 status = rfcomm_event_channel_opened_get_status(packet); 1084 if (status != ERROR_CODE_SUCCESS) { 1085 hfp_handle_slc_setup_error(hfp_connection, status); 1086 break; 1087 } 1088 1089 hfp_connection->acl_handle = rfcomm_event_channel_opened_get_con_handle(packet); 1090 hfp_connection->rfcomm_cid = rfcomm_event_channel_opened_get_rfcomm_cid(packet); 1091 hfp_connection->rfcomm_mtu = rfcomm_event_channel_opened_get_max_frame_size(packet); 1092 bd_addr_copy(hfp_connection->remote_addr, event_addr); 1093 hfp_connection->state = HFP_EXCHANGE_SUPPORTED_FEATURES; 1094 1095 rfcomm_request_can_send_now_event(hfp_connection->rfcomm_cid); 1096 break; 1097 1098 case RFCOMM_EVENT_CHANNEL_CLOSED: 1099 rfcomm_cid = little_endian_read_16(packet,2); 1100 hfp_connection = get_hfp_connection_context_for_rfcomm_cid(rfcomm_cid); 1101 if (!hfp_connection) break; 1102 switch (hfp_connection->state){ 1103 case HFP_W4_RFCOMM_DISCONNECTED_AND_RESTART: 1104 hfp_connection->acl_handle = HCI_CON_HANDLE_INVALID; 1105 hfp_connection->state = HFP_IDLE; 1106 hfp_establish_service_level_connection(hfp_connection->remote_addr, hfp_connection->service_uuid, local_role); 1107 break; 1108 1109 case HFP_AUDIO_CONNECTION_ESTABLISHED: 1110 // service connection was released, this implicitly releases audio connection as well 1111 hfp_connection->release_audio_connection = 0; 1112 hfp_connection->acl_handle = HCI_CON_HANDLE_INVALID; 1113 hfp_connection->state = HFP_W4_SCO_DISCONNECTED_TO_SHUTDOWN; 1114 gap_disconnect(hfp_connection->sco_handle); 1115 break; 1116 1117 default: 1118 // regular case 1119 hfp_reset_voice_recognition(hfp_connection); 1120 hfp_emit_event(hfp_connection, HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_RELEASED, 0); 1121 hfp_finalize_connection_context(hfp_connection); 1122 break; 1123 } 1124 break; 1125 1126 default: 1127 break; 1128 } 1129 } 1130 // translates command string into hfp_command_t CMD 1131 1132 typedef struct { 1133 const char * command; 1134 hfp_command_t command_id; 1135 } hfp_command_entry_t; 1136 1137 static hfp_command_entry_t hfp_ag_command_table[] = { 1138 { "AT+BAC=", HFP_CMD_AVAILABLE_CODECS }, 1139 { "AT+BCC", HFP_CMD_TRIGGER_CODEC_CONNECTION_SETUP }, 1140 { "AT+BCS=", HFP_CMD_HF_CONFIRMED_CODEC }, 1141 { "AT+BIA=", HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, }, // +BIA:<enabled>,,<enabled>,,,<enabled> 1142 { "AT+BIEV=", HFP_CMD_HF_INDICATOR_STATUS }, 1143 { "AT+BIND=", HFP_CMD_LIST_GENERIC_STATUS_INDICATORS }, 1144 { "AT+BIND=?", HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS }, 1145 { "AT+BIND?", HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE }, 1146 { "AT+BINP=", HFP_CMD_HF_REQUEST_PHONE_NUMBER }, 1147 { "AT+BLDN", HFP_CMD_REDIAL_LAST_NUMBER }, 1148 { "AT+BRSF=", HFP_CMD_SUPPORTED_FEATURES }, 1149 { "AT+BTRH=", HFP_CMD_RESPONSE_AND_HOLD_COMMAND }, 1150 { "AT+BTRH?", HFP_CMD_RESPONSE_AND_HOLD_QUERY }, 1151 { "AT+BVRA=", HFP_CMD_HF_ACTIVATE_VOICE_RECOGNITION }, 1152 { "AT+CCWA=", HFP_CMD_ENABLE_CALL_WAITING_NOTIFICATION}, 1153 { "AT+CHLD=", HFP_CMD_CALL_HOLD }, 1154 { "AT+CHLD=?", HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES }, 1155 { "AT+CHUP", HFP_CMD_HANG_UP_CALL }, 1156 { "AT+CIND=?", HFP_CMD_RETRIEVE_AG_INDICATORS }, 1157 { "AT+CIND?", HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS }, 1158 { "AT+CLCC", HFP_CMD_LIST_CURRENT_CALLS }, 1159 { "AT+CLIP=", HFP_CMD_ENABLE_CLIP}, 1160 { "AT+CMEE=", HFP_CMD_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR}, 1161 { "AT+CMER=", HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE }, 1162 { "AT+CNUM", HFP_CMD_GET_SUBSCRIBER_NUMBER_INFORMATION }, 1163 { "AT+COPS=", HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT }, 1164 { "AT+COPS?", HFP_CMD_QUERY_OPERATOR_SELECTION_NAME }, 1165 { "AT+NREC=", HFP_CMD_TURN_OFF_EC_AND_NR, }, 1166 { "AT+VGM=", HFP_CMD_SET_MICROPHONE_GAIN }, 1167 { "AT+VGS=", HFP_CMD_SET_SPEAKER_GAIN }, 1168 { "AT+VTS=", HFP_CMD_TRANSMIT_DTMF_CODES }, 1169 { "ATA", HFP_CMD_CALL_ANSWERED }, 1170 }; 1171 1172 static hfp_command_entry_t hfp_hf_command_table[] = { 1173 { "+BCS:", HFP_CMD_AG_SUGGESTED_CODEC }, 1174 { "+BIND:", HFP_CMD_SET_GENERIC_STATUS_INDICATOR_STATUS }, 1175 { "+BINP:", HFP_CMD_AG_SENT_PHONE_NUMBER }, 1176 { "+BRSF:", HFP_CMD_SUPPORTED_FEATURES }, 1177 { "+BSIR:", HFP_CMD_CHANGE_IN_BAND_RING_TONE_SETTING }, 1178 { "+BTRH:", HFP_CMD_RESPONSE_AND_HOLD_STATUS }, 1179 { "+BVRA:", HFP_CMD_AG_ACTIVATE_VOICE_RECOGNITION }, 1180 { "+CCWA:", HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE, }, 1181 { "+CHLD:", HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES }, 1182 { "+CIEV:", HFP_CMD_TRANSFER_AG_INDICATOR_STATUS}, 1183 { "+CIND:", HFP_CMD_RETRIEVE_AG_INDICATORS_GENERIC }, 1184 { "+CLCC:", HFP_CMD_LIST_CURRENT_CALLS }, 1185 { "+CLIP:", HFP_CMD_AG_SENT_CLIP_INFORMATION }, 1186 { "+CME ERROR:", HFP_CMD_EXTENDED_AUDIO_GATEWAY_ERROR }, 1187 { "+CNUM:", HFP_CMD_GET_SUBSCRIBER_NUMBER_INFORMATION}, 1188 { "+COPS:", HFP_CMD_QUERY_OPERATOR_SELECTION_NAME }, 1189 { "+VGM:", HFP_CMD_SET_MICROPHONE_GAIN }, 1190 { "+VGM=", HFP_CMD_SET_MICROPHONE_GAIN }, 1191 { "+VGS:", HFP_CMD_SET_SPEAKER_GAIN}, 1192 { "+VGS=", HFP_CMD_SET_SPEAKER_GAIN}, 1193 { "ERROR", HFP_CMD_ERROR}, 1194 { "NOP", HFP_CMD_NONE}, // dummy command used by unit tests 1195 { "OK", HFP_CMD_OK }, 1196 { "RING", HFP_CMD_RING }, 1197 }; 1198 1199 static const hfp_custom_at_command_t * 1200 hfp_custom_command_lookup(bool isHandsFree, const char *text) { 1201 btstack_linked_list_t * custom_commands = isHandsFree ? &hfp_custom_commands_hf : &hfp_custom_commands_ag; 1202 btstack_linked_list_iterator_t it; 1203 btstack_linked_list_iterator_init(&it, custom_commands); 1204 while (btstack_linked_list_iterator_has_next(&it)) { 1205 hfp_custom_at_command_t *at_command = (hfp_custom_at_command_t *) btstack_linked_list_iterator_next(&it); 1206 int match = strcmp(text, at_command->command); 1207 if (match == 0) { 1208 return at_command; 1209 } 1210 } 1211 return NULL; 1212 } 1213 1214 static hfp_command_t parse_command(const char * line_buffer, int isHandsFree){ 1215 1216 // check for custom commands, AG only 1217 const hfp_custom_at_command_t * custom_at_command = hfp_custom_command_lookup(isHandsFree, line_buffer); 1218 if (custom_at_command != NULL){ 1219 return HFP_CMD_CUSTOM_MESSAGE; 1220 } 1221 1222 // table lookup based on role 1223 uint16_t num_entries; 1224 hfp_command_entry_t * table; 1225 if (isHandsFree == 0){ 1226 table = hfp_ag_command_table; 1227 num_entries = sizeof(hfp_ag_command_table) / sizeof(hfp_command_entry_t); 1228 } else { 1229 table = hfp_hf_command_table; 1230 num_entries = sizeof(hfp_hf_command_table) / sizeof(hfp_command_entry_t); 1231 } 1232 // binary search 1233 uint16_t left = 0; 1234 uint16_t right = num_entries - 1; 1235 while (left <= right){ 1236 uint16_t middle = left + (right - left) / 2; 1237 hfp_command_entry_t *entry = &table[middle]; 1238 int match = strcmp(line_buffer, entry->command); 1239 if (match < 0){ 1240 // search term is lower than middle element 1241 if (right == 0) break; 1242 right = middle - 1; 1243 } else if (match == 0){ 1244 return entry->command_id; 1245 } else { 1246 // search term is higher than middle element 1247 left = middle + 1; 1248 } 1249 } 1250 1251 // note: if parser in CMD_HEADER state would treats digits and maybe '+' as separator, match on "ATD" would work. 1252 // note: phone number is currently expected in line_buffer[3..] 1253 // prefix match on 'ATD', AG only 1254 if ((isHandsFree == 0) && (strncmp(line_buffer, HFP_CALL_PHONE_NUMBER, strlen(HFP_CALL_PHONE_NUMBER)) == 0)){ 1255 return HFP_CMD_CALL_PHONE_NUMBER; 1256 } 1257 1258 // Valid looking, but unknown commands/responses 1259 if ((isHandsFree == 0) && (strncmp(line_buffer, "AT+", 3) == 0)){ 1260 return HFP_CMD_UNKNOWN; 1261 } 1262 1263 if ((isHandsFree != 0) && (strncmp(line_buffer, "+", 1) == 0)){ 1264 return HFP_CMD_UNKNOWN; 1265 } 1266 1267 return HFP_CMD_NONE; 1268 } 1269 1270 static void hfp_parser_store_byte(hfp_connection_t * hfp_connection, uint8_t byte){ 1271 if ((hfp_connection->line_size + 1) >= HFP_MAX_VR_TEXT_SIZE) return; 1272 hfp_connection->line_buffer[hfp_connection->line_size++] = byte; 1273 hfp_connection->line_buffer[hfp_connection->line_size] = 0; 1274 } 1275 static int hfp_parser_is_buffer_empty(hfp_connection_t * hfp_connection){ 1276 return hfp_connection->line_size == 0; 1277 } 1278 1279 static int hfp_parser_is_end_of_line(uint8_t byte){ 1280 return (byte == '\n') || (byte == '\r'); 1281 } 1282 1283 void hfp_parser_reset_line_buffer(hfp_connection_t *hfp_connection) { 1284 hfp_connection->line_size = 0; 1285 // we don't set the first byte to '\0' to allow access to last argument e.g. in hfp_hf_handle_rfcommand 1286 } 1287 1288 static void hfp_parser_store_if_token(hfp_connection_t * hfp_connection, uint8_t byte){ 1289 switch (byte){ 1290 case ',': 1291 case '-': 1292 case ';': 1293 case '(': 1294 case ')': 1295 case '\n': 1296 case '\r': 1297 break; 1298 default: 1299 hfp_parser_store_byte(hfp_connection, byte); 1300 break; 1301 } 1302 } 1303 1304 static bool hfp_parser_is_separator( uint8_t byte){ 1305 switch (byte){ 1306 case ',': 1307 case '-': 1308 case ';': 1309 case '\n': 1310 case '\r': 1311 return true; 1312 default: 1313 return false; 1314 } 1315 } 1316 1317 // returns true if received bytes was processed. Otherwise, functions will be called with same byte again 1318 // this is used to for a one byte lookahead, where an unexpected byte is pushed back by returning false 1319 static bool hfp_parse_byte(hfp_connection_t * hfp_connection, uint8_t byte, int isHandsFree){ 1320 1321 #ifdef HFP_DEBUG 1322 if (byte >= ' '){ 1323 printf("Parse '%c' - state %u, buffer %s\n", byte, hfp_connection->parser_state, hfp_connection->line_buffer); 1324 } else { 1325 printf("Parse 0x%02x - state %u, buffer %s\n", byte, hfp_connection->parser_state, hfp_connection->line_buffer); 1326 } 1327 #endif 1328 1329 // handle doubles quotes 1330 if (byte == '"'){ 1331 hfp_connection->parser_quoted = !hfp_connection->parser_quoted; 1332 return true; 1333 } 1334 if (hfp_connection->parser_quoted) { 1335 hfp_parser_store_byte(hfp_connection, byte); 1336 return true; 1337 } 1338 1339 // ignore spaces outside command or double quotes (required e.g. for '+CME ERROR:..") command 1340 if ((byte == ' ') && (hfp_connection->parser_state != HFP_PARSER_CMD_HEADER)) return true; 1341 1342 bool processed = true; 1343 1344 switch (hfp_connection->parser_state) { 1345 case HFP_PARSER_CMD_HEADER: 1346 switch (byte) { 1347 case '\n': 1348 case '\r': 1349 case ';': 1350 // ignore separator 1351 break; 1352 case ':': 1353 case '?': 1354 // store separator 1355 hfp_parser_store_byte(hfp_connection, byte); 1356 break; 1357 case '=': 1358 // equal sign: remember and wait for next char to decided between '=?' and '=\?' 1359 hfp_connection->found_equal_sign = true; 1360 hfp_parser_store_byte(hfp_connection, byte); 1361 return true; 1362 default: 1363 // store if not lookahead 1364 if (!hfp_connection->found_equal_sign) { 1365 hfp_parser_store_byte(hfp_connection, byte); 1366 return true; 1367 } 1368 // mark as lookahead 1369 processed = false; 1370 break; 1371 } 1372 1373 // ignore empty tokens 1374 if (hfp_parser_is_buffer_empty(hfp_connection)) return true; 1375 1376 // parse 1377 hfp_connection->command = parse_command((char *)hfp_connection->line_buffer, isHandsFree); 1378 1379 // pick +CIND version based on connection state: descriptions during SLC vs. states later 1380 if (hfp_connection->command == HFP_CMD_RETRIEVE_AG_INDICATORS_GENERIC){ 1381 switch(hfp_connection->state){ 1382 case HFP_W4_RETRIEVE_INDICATORS_STATUS: 1383 hfp_connection->command = HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS; 1384 break; 1385 case HFP_W4_RETRIEVE_INDICATORS: 1386 hfp_connection->command = HFP_CMD_RETRIEVE_AG_INDICATORS; 1387 break; 1388 default: 1389 hfp_connection->command = HFP_CMD_UNKNOWN; 1390 break; 1391 } 1392 } 1393 1394 log_info("command string '%s', handsfree %u -> cmd id %u", (char *)hfp_connection->line_buffer, isHandsFree, hfp_connection->command); 1395 1396 // store command id for custom command and just store rest of line 1397 if (hfp_connection->command == HFP_CMD_CUSTOM_MESSAGE){ 1398 const hfp_custom_at_command_t * at_command = hfp_custom_command_lookup(isHandsFree, (const char *) hfp_connection->line_buffer); 1399 hfp_connection->custom_at_command_id = at_command->command_id; 1400 hfp_connection->parser_state = HFP_PARSER_CUSTOM_COMMAND; 1401 return processed; 1402 } 1403 1404 // next state 1405 hfp_parser_reset_line_buffer(hfp_connection); 1406 hfp_connection->parser_state = HFP_PARSER_CMD_SEQUENCE; 1407 1408 return processed; 1409 1410 case HFP_PARSER_CMD_SEQUENCE: 1411 // handle empty fields 1412 if ((byte == ',' ) && (hfp_connection->line_size == 0)){ 1413 hfp_connection->line_buffer[0] = 0; 1414 hfp_connection->ignore_value = 1; 1415 parse_sequence(hfp_connection); 1416 return true; 1417 } 1418 1419 hfp_parser_store_if_token(hfp_connection, byte); 1420 if (!hfp_parser_is_separator(byte)) return true; 1421 1422 // ignore empty tokens 1423 switch (hfp_connection->command){ 1424 case HFP_CMD_AG_ACTIVATE_VOICE_RECOGNITION: 1425 // don't ignore empty string 1426 break; 1427 default: 1428 if (hfp_parser_is_buffer_empty(hfp_connection) && (hfp_connection->ignore_value == 0)) { 1429 return true; 1430 } 1431 break; 1432 } 1433 1434 parse_sequence(hfp_connection); 1435 1436 hfp_parser_reset_line_buffer(hfp_connection); 1437 1438 switch (hfp_connection->command){ 1439 case HFP_CMD_AG_SENT_PHONE_NUMBER: 1440 case HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE: 1441 case HFP_CMD_AG_SENT_CLIP_INFORMATION: 1442 case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS: 1443 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME: 1444 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT: 1445 case HFP_CMD_RETRIEVE_AG_INDICATORS: 1446 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE: 1447 case HFP_CMD_HF_INDICATOR_STATUS: 1448 hfp_connection->parser_state = HFP_PARSER_SECOND_ITEM; 1449 break; 1450 default: 1451 break; 1452 } 1453 return true; 1454 1455 case HFP_PARSER_SECOND_ITEM: 1456 1457 hfp_parser_store_if_token(hfp_connection, byte); 1458 if (!hfp_parser_is_separator(byte)) return true; 1459 1460 switch (hfp_connection->command){ 1461 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME: 1462 log_info("format %s, ", hfp_connection->line_buffer); 1463 hfp_connection->network_operator.format = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1464 break; 1465 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT: 1466 log_info("format %s \n", hfp_connection->line_buffer); 1467 hfp_connection->network_operator.format = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1468 break; 1469 case HFP_CMD_LIST_GENERIC_STATUS_INDICATORS: 1470 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS: 1471 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE: 1472 hfp_connection->generic_status_indicators[hfp_connection->parser_item_index].state = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1473 break; 1474 case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS: 1475 hfp_connection->ag_indicators[hfp_connection->parser_item_index].status = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1476 log_info("%d \n", hfp_connection->ag_indicators[hfp_connection->parser_item_index].status); 1477 hfp_connection->ag_indicators[hfp_connection->parser_item_index].status_changed = 1; 1478 break; 1479 case HFP_CMD_RETRIEVE_AG_INDICATORS: 1480 hfp_connection->ag_indicators[hfp_connection->parser_item_index].min_range = btstack_atoi((char *)hfp_connection->line_buffer); 1481 log_info("%s, ", hfp_connection->line_buffer); 1482 break; 1483 case HFP_CMD_AG_SENT_PHONE_NUMBER: 1484 case HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE: 1485 case HFP_CMD_AG_SENT_CLIP_INFORMATION: 1486 hfp_connection->bnip_type = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1487 break; 1488 case HFP_CMD_HF_INDICATOR_STATUS: 1489 hfp_connection->parser_indicator_value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1490 break; 1491 default: 1492 break; 1493 } 1494 1495 hfp_parser_reset_line_buffer(hfp_connection); 1496 1497 hfp_connection->parser_state = HFP_PARSER_THIRD_ITEM; 1498 1499 return true; 1500 1501 case HFP_PARSER_THIRD_ITEM: 1502 1503 hfp_parser_store_if_token(hfp_connection, byte); 1504 if (!hfp_parser_is_separator(byte)) return true; 1505 1506 switch (hfp_connection->command){ 1507 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME: 1508 btstack_strcpy(hfp_connection->network_operator.name, HFP_MAX_NETWORK_OPERATOR_NAME_SIZE, (char *)hfp_connection->line_buffer); 1509 break; 1510 case HFP_CMD_RETRIEVE_AG_INDICATORS: 1511 hfp_connection->ag_indicators[hfp_connection->parser_item_index].max_range = btstack_atoi((char *)hfp_connection->line_buffer); 1512 hfp_next_indicators_index(hfp_connection); 1513 hfp_connection->ag_indicators_nr = hfp_connection->parser_item_index; 1514 break; 1515 case HFP_CMD_AG_SENT_CLIP_INFORMATION: 1516 case HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE: 1517 // track if last argument exists 1518 hfp_connection->clip_have_alpha = hfp_connection->line_size != 0; 1519 break; 1520 default: 1521 break; 1522 } 1523 1524 hfp_parser_reset_line_buffer(hfp_connection); 1525 1526 if (hfp_connection->command == HFP_CMD_RETRIEVE_AG_INDICATORS){ 1527 hfp_connection->parser_state = HFP_PARSER_CMD_SEQUENCE; 1528 } 1529 return true; 1530 1531 case HFP_PARSER_CUSTOM_COMMAND: 1532 if (hfp_parser_is_end_of_line(byte) == false){ 1533 hfp_parser_store_byte(hfp_connection, byte); 1534 } 1535 return true; 1536 1537 default: 1538 btstack_assert(false); 1539 return true; 1540 } 1541 } 1542 1543 void hfp_parse(hfp_connection_t * hfp_connection, uint8_t byte, int isHandsFree){ 1544 bool processed = false; 1545 while (!processed){ 1546 processed = hfp_parse_byte(hfp_connection, byte, isHandsFree); 1547 } 1548 // reset parser state on end-of-line 1549 if (hfp_parser_is_end_of_line(byte)){ 1550 hfp_connection->found_equal_sign = false; 1551 hfp_connection->parser_item_index = 0; 1552 hfp_connection->parser_state = HFP_PARSER_CMD_HEADER; 1553 } 1554 } 1555 1556 static void parse_sequence(hfp_connection_t * hfp_connection){ 1557 int value; 1558 switch (hfp_connection->command){ 1559 case HFP_CMD_SET_GENERIC_STATUS_INDICATOR_STATUS: 1560 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1561 int i; 1562 switch (hfp_connection->parser_item_index){ 1563 case 0: 1564 for (i=0;i<hfp_connection->generic_status_indicators_nr;i++){ 1565 if (hfp_connection->generic_status_indicators[i].uuid == value){ 1566 hfp_connection->parser_indicator_index = i; 1567 break; 1568 } 1569 } 1570 break; 1571 case 1: 1572 if (hfp_connection->parser_indicator_index <0) break; 1573 hfp_connection->generic_status_indicators[hfp_connection->parser_indicator_index].state = value; 1574 log_info("HFP_CMD_SET_GENERIC_STATUS_INDICATOR_STATUS set indicator at index %u, to %u\n", 1575 hfp_connection->parser_item_index, value); 1576 break; 1577 default: 1578 break; 1579 } 1580 hfp_next_indicators_index(hfp_connection); 1581 break; 1582 1583 case HFP_CMD_GET_SUBSCRIBER_NUMBER_INFORMATION: 1584 switch(hfp_connection->parser_item_index){ 1585 case 0: 1586 // <alpha>: This optional field is not supported, and shall be left blank. 1587 break; 1588 case 1: 1589 // <number>: Quoted string containing the phone number in the format specified by <type>. 1590 btstack_strcpy(hfp_connection->bnip_number, sizeof(hfp_connection->bnip_number), (char *)hfp_connection->line_buffer); 1591 break; 1592 case 2: 1593 /* 1594 <type> field specifies the format of the phone number provided, and can be one of the following values: 1595 - 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. 1596 - 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. 1597 - values 160-175: National number. No prefix nor escape digits included. 1598 */ 1599 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1600 hfp_connection->bnip_type = value; 1601 break; 1602 case 3: 1603 // <speed>: This optional field is not supported, and shall be left blank. 1604 break; 1605 case 4: 1606 // <service>: Indicates which service this phone number relates to. Shall be either 4 (voice) or 5 (fax). 1607 default: 1608 break; 1609 } 1610 // index > 2 are ignored in switch above 1611 hfp_connection->parser_item_index++; 1612 break; 1613 case HFP_CMD_LIST_CURRENT_CALLS: 1614 switch(hfp_connection->parser_item_index){ 1615 case 0: 1616 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1617 hfp_connection->clcc_idx = value; 1618 break; 1619 case 1: 1620 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1621 hfp_connection->clcc_dir = value; 1622 break; 1623 case 2: 1624 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1625 hfp_connection->clcc_status = value; 1626 break; 1627 case 3: 1628 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1629 hfp_connection->clcc_mode = value; 1630 break; 1631 case 4: 1632 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1633 hfp_connection->clcc_mpty = value; 1634 break; 1635 case 5: 1636 btstack_strcpy(hfp_connection->bnip_number, sizeof(hfp_connection->bnip_number), (char *)hfp_connection->line_buffer); 1637 break; 1638 case 6: 1639 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1640 hfp_connection->bnip_type = value; 1641 break; 1642 default: 1643 break; 1644 } 1645 // index > 6 are ignored in switch above 1646 hfp_connection->parser_item_index++; 1647 break; 1648 case HFP_CMD_SET_MICROPHONE_GAIN: 1649 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1650 hfp_connection->microphone_gain = value; 1651 log_info("hfp parse HFP_CMD_SET_MICROPHONE_GAIN %d\n", value); 1652 break; 1653 case HFP_CMD_SET_SPEAKER_GAIN: 1654 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1655 hfp_connection->speaker_gain = value; 1656 log_info("hfp parse HFP_CMD_SET_SPEAKER_GAIN %d\n", value); 1657 break; 1658 case HFP_CMD_TURN_OFF_EC_AND_NR: 1659 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1660 hfp_connection->ag_echo_and_noise_reduction = value; 1661 log_info("hfp parse HFP_CMD_TURN_OFF_EC_AND_NR %d\n", value); 1662 break; 1663 case HFP_CMD_CHANGE_IN_BAND_RING_TONE_SETTING: 1664 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1665 hfp_connection->remote_supported_features = store_bit(hfp_connection->remote_supported_features, HFP_AGSF_IN_BAND_RING_TONE, value); 1666 log_info("hfp parse HFP_CHANGE_IN_BAND_RING_TONE_SETTING %d\n", value); 1667 break; 1668 case HFP_CMD_HF_CONFIRMED_CODEC: 1669 hfp_connection->codec_confirmed = btstack_atoi((char*)hfp_connection->line_buffer); 1670 log_info("hfp parse HFP_CMD_HF_CONFIRMED_CODEC %d\n", hfp_connection->codec_confirmed); 1671 break; 1672 case HFP_CMD_AG_SUGGESTED_CODEC: 1673 hfp_connection->suggested_codec = btstack_atoi((char*)hfp_connection->line_buffer); 1674 log_info("hfp parse HFP_CMD_AG_SUGGESTED_CODEC %d\n", hfp_connection->suggested_codec); 1675 break; 1676 case HFP_CMD_SUPPORTED_FEATURES: 1677 hfp_connection->remote_supported_features = btstack_atoi((char*)hfp_connection->line_buffer); 1678 log_info("Parsed supported feature %d\n", (int) hfp_connection->remote_supported_features); 1679 break; 1680 case HFP_CMD_AVAILABLE_CODECS: 1681 log_info("Parsed codec %s\n", hfp_connection->line_buffer); 1682 hfp_connection->remote_codecs[hfp_connection->parser_item_index] = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1683 hfp_next_codec_index(hfp_connection); 1684 hfp_connection->remote_codecs_nr = hfp_connection->parser_item_index; 1685 break; 1686 case HFP_CMD_RETRIEVE_AG_INDICATORS: 1687 btstack_strcpy((char *)hfp_connection->ag_indicators[hfp_connection->parser_item_index].name, HFP_MAX_INDICATOR_DESC_SIZE, (char *)hfp_connection->line_buffer); 1688 hfp_connection->ag_indicators[hfp_connection->parser_item_index].index = hfp_connection->parser_item_index+1; 1689 log_info("Indicator %d: %s (", hfp_connection->ag_indicators_nr+1, hfp_connection->line_buffer); 1690 break; 1691 case HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS: 1692 log_info("Parsed Indicator %d with status: %s\n", hfp_connection->parser_item_index+1, hfp_connection->line_buffer); 1693 hfp_connection->ag_indicators[hfp_connection->parser_item_index].status = btstack_atoi((char *) hfp_connection->line_buffer); 1694 hfp_next_indicators_index(hfp_connection); 1695 break; 1696 case HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE: 1697 hfp_next_indicators_index(hfp_connection); 1698 if (hfp_connection->parser_item_index != 4) break; 1699 log_info("Parsed Enable indicators: %s\n", hfp_connection->line_buffer); 1700 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1701 hfp_connection->enable_status_update_for_ag_indicators = (uint8_t) value; 1702 break; 1703 case HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES: 1704 log_info("Parsed Support call hold: %s\n", hfp_connection->line_buffer); 1705 if (hfp_connection->line_size > 2 ) break; 1706 memcpy((char *)hfp_connection->remote_call_services[hfp_connection->remote_call_services_index].name, (char *)hfp_connection->line_buffer, HFP_CALL_SERVICE_SIZE-1); 1707 hfp_connection->remote_call_services[hfp_connection->remote_call_services_index].name[HFP_CALL_SERVICE_SIZE - 1] = 0; 1708 hfp_next_remote_call_services_index(hfp_connection); 1709 break; 1710 case HFP_CMD_LIST_GENERIC_STATUS_INDICATORS: 1711 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS: 1712 log_info("Parsed Generic status indicator: %s\n", hfp_connection->line_buffer); 1713 hfp_connection->generic_status_indicators[hfp_connection->parser_item_index].uuid = (uint16_t)btstack_atoi((char*)hfp_connection->line_buffer); 1714 hfp_next_indicators_index(hfp_connection); 1715 hfp_connection->generic_status_indicators_nr = hfp_connection->parser_item_index; 1716 break; 1717 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE: 1718 // HF parses inital AG gen. ind. state 1719 log_info("Parsed List generic status indicator %s state: ", hfp_connection->line_buffer); 1720 hfp_connection->parser_item_index = hfp_parse_indicator_index(hfp_connection); 1721 break; 1722 case HFP_CMD_HF_INDICATOR_STATUS: 1723 hfp_connection->parser_indicator_index = hfp_parse_indicator_index(hfp_connection); 1724 log_info("Parsed HF indicator index %u", hfp_connection->parser_indicator_index); 1725 break; 1726 case HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE: 1727 // AG parses new gen. ind. state 1728 if (hfp_connection->ignore_value){ 1729 hfp_connection->ignore_value = 0; 1730 log_info("Parsed Enable AG indicator pos %u('%s') - unchanged (stays %u)\n", hfp_connection->parser_item_index, 1731 hfp_connection->ag_indicators[hfp_connection->parser_item_index].name, hfp_connection->ag_indicators[hfp_connection->parser_item_index].enabled); 1732 } 1733 else if (hfp_connection->ag_indicators[hfp_connection->parser_item_index].mandatory){ 1734 log_info("Parsed Enable AG indicator pos %u('%s') - ignore (mandatory)\n", 1735 hfp_connection->parser_item_index, hfp_connection->ag_indicators[hfp_connection->parser_item_index].name); 1736 } else { 1737 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1738 hfp_connection->ag_indicators[hfp_connection->parser_item_index].enabled = value; 1739 log_info("Parsed Enable AG indicator pos %u('%s'): %u\n", hfp_connection->parser_item_index, 1740 hfp_connection->ag_indicators[hfp_connection->parser_item_index].name, value); 1741 } 1742 hfp_next_indicators_index(hfp_connection); 1743 break; 1744 case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS: 1745 // indicators are indexed starting with 1 1746 hfp_connection->parser_item_index = hfp_parse_indicator_index(hfp_connection); 1747 log_info("Parsed status of the AG indicator %d, status ", hfp_connection->parser_item_index); 1748 break; 1749 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME: 1750 hfp_connection->network_operator.mode = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1751 log_info("Parsed network operator mode: %d, ", hfp_connection->network_operator.mode); 1752 break; 1753 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT: 1754 if (hfp_connection->line_buffer[0] == '3'){ 1755 log_info("Parsed Set network operator format : %s, ", hfp_connection->line_buffer); 1756 break; 1757 } 1758 // TODO emit ERROR, wrong format 1759 log_info("ERROR Set network operator format: index %s not supported\n", hfp_connection->line_buffer); 1760 break; 1761 case HFP_CMD_ERROR: 1762 break; 1763 case HFP_CMD_EXTENDED_AUDIO_GATEWAY_ERROR: 1764 hfp_connection->extended_audio_gateway_error = 1; 1765 hfp_connection->extended_audio_gateway_error_value = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1766 break; 1767 case HFP_CMD_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR: 1768 hfp_connection->enable_extended_audio_gateway_error_report = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1769 hfp_connection->ok_pending = 1; 1770 hfp_connection->extended_audio_gateway_error = 0; 1771 break; 1772 case HFP_CMD_AG_SENT_PHONE_NUMBER: 1773 case HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE: 1774 case HFP_CMD_AG_SENT_CLIP_INFORMATION: 1775 btstack_strcpy((char *)hfp_connection->bnip_number, sizeof(hfp_connection->bnip_number), (char *)hfp_connection->line_buffer); 1776 break; 1777 case HFP_CMD_CALL_HOLD: 1778 hfp_connection->ag_call_hold_action = hfp_connection->line_buffer[0] - '0'; 1779 if (hfp_connection->line_buffer[1] != '\0'){ 1780 hfp_connection->call_index = btstack_atoi((char *)&hfp_connection->line_buffer[1]); 1781 } 1782 break; 1783 case HFP_CMD_RESPONSE_AND_HOLD_COMMAND: 1784 hfp_connection->ag_response_and_hold_action = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1785 break; 1786 case HFP_CMD_TRANSMIT_DTMF_CODES: 1787 hfp_connection->ag_dtmf_code = hfp_connection->line_buffer[0]; 1788 break; 1789 case HFP_CMD_ENABLE_CLIP: 1790 hfp_connection->clip_enabled = hfp_connection->line_buffer[0] != '0'; 1791 break; 1792 case HFP_CMD_ENABLE_CALL_WAITING_NOTIFICATION: 1793 hfp_connection->call_waiting_notification_enabled = hfp_connection->line_buffer[0] != '0'; 1794 break; 1795 case HFP_CMD_HF_ACTIVATE_VOICE_RECOGNITION: 1796 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1797 hfp_connection->ag_activate_voice_recognition_value = value; 1798 break; 1799 case HFP_CMD_AG_ACTIVATE_VOICE_RECOGNITION: 1800 switch(hfp_connection->parser_item_index){ 1801 case 0: 1802 hfp_connection->ag_vra_status = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1803 break; 1804 case 1: 1805 hfp_connection->ag_vra_state = (hfp_voice_recognition_state_t) btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1806 break; 1807 case 2: 1808 hfp_connection->ag_msg.text_id = 0; 1809 for (i = 0 ; i < 4; i++){ 1810 hfp_connection->ag_msg.text_id = (hfp_connection->ag_msg.text_id << 4) | nibble_for_char(hfp_connection->line_buffer[i]); 1811 } 1812 break; 1813 case 3: 1814 hfp_connection->ag_msg.text_type = (hfp_text_type_t) btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1815 break; 1816 case 4: 1817 hfp_connection->ag_msg.text_operation = (hfp_text_operation_t) btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1818 break; 1819 case 5: 1820 hfp_connection->line_buffer[hfp_connection->line_size] = 0; 1821 hfp_connection->ag_vra_msg_length = hfp_connection->line_size + 1; 1822 break; 1823 default: 1824 break; 1825 } 1826 hfp_connection->parser_item_index++; 1827 break; 1828 default: 1829 break; 1830 } 1831 } 1832 1833 static void hfp_handle_start_sdp_client_query(void * context){ 1834 UNUSED(context); 1835 1836 btstack_linked_list_iterator_t it; 1837 btstack_linked_list_iterator_init(&it, &hfp_connections); 1838 while (btstack_linked_list_iterator_has_next(&it)){ 1839 hfp_connection_t * connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it); 1840 1841 if (connection->state != HFP_W2_SEND_SDP_QUERY) continue; 1842 1843 connection->state = HFP_W4_SDP_QUERY_COMPLETE; 1844 hfp_sdp_query_context.local_role = connection->local_role; 1845 (void)memcpy(hfp_sdp_query_context.remote_address, connection->remote_addr, 6); 1846 sdp_client_query_rfcomm_channel_and_name_for_service_class_uuid(&handle_query_rfcomm_event, connection->remote_addr, connection->service_uuid); 1847 return; 1848 } 1849 } 1850 1851 uint8_t hfp_establish_service_level_connection(bd_addr_t bd_addr, uint16_t service_uuid, hfp_role_t local_role){ 1852 hfp_connection_t * connection = get_hfp_connection_context_for_bd_addr(bd_addr, local_role); 1853 if (connection){ 1854 return ERROR_CODE_COMMAND_DISALLOWED; 1855 } 1856 1857 connection = hfp_create_connection(bd_addr, local_role); 1858 if (!connection){ 1859 return BTSTACK_MEMORY_ALLOC_FAILED; 1860 } 1861 1862 connection->state = HFP_W2_SEND_SDP_QUERY; 1863 1864 bd_addr_copy(connection->remote_addr, bd_addr); 1865 connection->service_uuid = service_uuid; 1866 1867 hfp_sdp_query_request.callback = &hfp_handle_start_sdp_client_query; 1868 // ignore ERROR_CODE_COMMAND_DISALLOWED because in that case, we already have requested an SDP callback 1869 (void) sdp_client_register_query_callback(&hfp_sdp_query_request); 1870 return ERROR_CODE_SUCCESS; 1871 } 1872 1873 void hfp_trigger_release_service_level_connection(hfp_connection_t * hfp_connection){ 1874 // called internally, NULL check already performed 1875 btstack_assert(hfp_connection != NULL); 1876 1877 hfp_trigger_release_audio_connection(hfp_connection); 1878 if (hfp_connection->state < HFP_W4_RFCOMM_CONNECTED){ 1879 hfp_connection->state = HFP_IDLE; 1880 return; 1881 } 1882 1883 if (hfp_connection->state == HFP_W4_RFCOMM_CONNECTED){ 1884 hfp_connection->state = HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN; 1885 return; 1886 } 1887 hfp_connection->release_slc_connection = 1; 1888 if (hfp_connection->state < HFP_W4_SCO_CONNECTED){ 1889 hfp_connection->state = HFP_W2_DISCONNECT_RFCOMM; 1890 return; 1891 } 1892 1893 if (hfp_connection->state < HFP_W4_SCO_DISCONNECTED){ 1894 hfp_connection->state = HFP_W2_DISCONNECT_SCO; 1895 hfp_connection->release_audio_connection = 1; 1896 return; 1897 } 1898 } 1899 1900 uint8_t hfp_trigger_release_audio_connection(hfp_connection_t * hfp_connection){ 1901 // called internally, NULL check already performed 1902 btstack_assert(hfp_connection != NULL); 1903 if (hfp_connection->state <= HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED){ 1904 return ERROR_CODE_COMMAND_DISALLOWED; 1905 } 1906 switch (hfp_connection->state) { 1907 case HFP_W2_CONNECT_SCO: 1908 hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED; 1909 break; 1910 case HFP_W4_SCO_CONNECTED: 1911 case HFP_AUDIO_CONNECTION_ESTABLISHED: 1912 hfp_connection->release_audio_connection = 1; 1913 break; 1914 default: 1915 return ERROR_CODE_COMMAND_DISALLOWED; 1916 } 1917 return ERROR_CODE_SUCCESS; 1918 } 1919 1920 void hfp_setup_synchronous_connection(hfp_connection_t * hfp_connection){ 1921 // all packet types, fixed bandwidth 1922 int setting = hfp_connection->link_setting; 1923 log_info("hfp_setup_synchronous_connection using setting nr %u", setting); 1924 hfp_sco_establishment_active = hfp_connection; 1925 uint16_t sco_voice_setting = hci_get_sco_voice_setting(); 1926 if (hfp_connection->negotiated_codec != HFP_CODEC_CVSD){ 1927 #ifdef ENABLE_BCM_PCM_WBS 1928 sco_voice_setting = 0x0063; // Transparent data, 16-bit for BCM controllers 1929 #else 1930 sco_voice_setting = 0x0043; // Transparent data, 8-bit otherwise 1931 #endif 1932 } 1933 uint16_t packet_types = hfp_link_settings[setting].packet_types; 1934 hfp_connection->packet_types = packet_types; 1935 1936 // get packet types - bits 6-9 are 'don't allow' 1937 uint16_t packet_types_flipped = packet_types ^ 0x03c0; 1938 hci_send_cmd(&hci_setup_synchronous_connection, hfp_connection->acl_handle, 8000, 8000, hfp_link_settings[setting].max_latency, 1939 sco_voice_setting, hfp_link_settings[setting].retransmission_effort, packet_types_flipped); 1940 } 1941 1942 hfp_link_settings_t hfp_safe_settings_for_context(bool use_eSCO, uint8_t negotiated_codec, bool secure_connection_in_use){ 1943 uint8_t i; 1944 hfp_link_settings_t link_setting = HFP_LINK_SETTINGS_NONE; 1945 for (i=0 ; i < ( sizeof(hfp_mandatory_safe_settings) / sizeof(struct hfp_mandatory_safe_setting) ) ; i++){ 1946 if (hfp_link_settings[(uint8_t)(hfp_mandatory_safe_settings[i].link_setting)].eSCO != use_eSCO) continue; 1947 if ((hfp_mandatory_safe_settings[i].codec_mask & (1 << negotiated_codec)) == 0) continue; 1948 if (hfp_mandatory_safe_settings[i].secure_connection_in_use != secure_connection_in_use) continue; 1949 link_setting = hfp_mandatory_safe_settings[i].link_setting; 1950 break; 1951 } 1952 return link_setting; 1953 } 1954 1955 void hfp_accept_synchronous_connection(hfp_connection_t * hfp_connection, bool use_eSCO){ 1956 1957 bool secure_connection_in_use = gap_secure_connection(hfp_connection->acl_handle); 1958 1959 // lookup safe settings based on SCO type, SC use and Codec type 1960 hfp_link_settings_t link_setting = hfp_safe_settings_for_context(use_eSCO, hfp_connection->negotiated_codec, secure_connection_in_use); 1961 btstack_assert(link_setting != HFP_LINK_SETTINGS_NONE); 1962 1963 uint16_t max_latency = hfp_link_settings[(uint8_t) link_setting].max_latency; 1964 uint16_t retransmission_effort = hfp_link_settings[(uint8_t) link_setting].retransmission_effort; 1965 1966 // safer to allow more packet types: 1967 uint16_t packet_types = use_eSCO ? (SCO_PACKET_TYPES_EV3 | SCO_PACKET_TYPES_2EV3) : (SCO_PACKET_TYPES_HV1 | SCO_PACKET_TYPES_HV3); 1968 1969 // transparent data for non-CVSD connections or if codec provided by Controller 1970 uint16_t sco_voice_setting = hci_get_sco_voice_setting(); 1971 if (hfp_connection->negotiated_codec != HFP_CODEC_CVSD){ 1972 #ifdef ENABLE_BCM_PCM_WBS 1973 sco_voice_setting = 0x0063; // Transparent data, 16-bit for BCM controllers 1974 #else 1975 sco_voice_setting = 0x0043; // Transparent data, 8-bit otherwise 1976 #endif 1977 } 1978 1979 // filter packet types 1980 packet_types &= hfp_get_sco_packet_types(); 1981 1982 hfp_connection->packet_types = packet_types; 1983 1984 // bits 6-9 are 'don't allow' 1985 uint16_t packet_types_flipped = packet_types ^ 0x3c0; 1986 1987 log_info("HFP: sending hci_accept_connection_request, packet types 0x%04x, sco_voice_setting 0x%02x", packet_types, sco_voice_setting); 1988 hci_send_cmd(&hci_accept_synchronous_connection, hfp_connection->remote_addr, 8000, 8000, max_latency, 1989 sco_voice_setting, retransmission_effort, packet_types_flipped); 1990 } 1991 1992 #ifdef ENABLE_CC256X_ASSISTED_HFP 1993 void hfp_cc256x_prepare_for_sco(hfp_connection_t * hfp_connection){ 1994 hfp_connection->cc256x_send_write_codec_config = true; 1995 if (hfp_connection->negotiated_codec == HFP_CODEC_MSBC){ 1996 hfp_connection->cc256x_send_wbs_associate = true; 1997 } 1998 } 1999 2000 void hfp_cc256x_write_codec_config(hfp_connection_t * hfp_connection){ 2001 uint32_t sample_rate_hz; 2002 uint16_t clock_rate_khz; 2003 if (hfp_connection->negotiated_codec == HFP_CODEC_MSBC){ 2004 clock_rate_khz = 512; 2005 sample_rate_hz = 16000; 2006 } else { 2007 clock_rate_khz = 256; 2008 sample_rate_hz = 8000; 2009 } 2010 uint8_t clock_direction = 0; // master 2011 uint16_t frame_sync_duty_cycle = 0; // i2s with 50% 2012 uint8_t frame_sync_edge = 1; // rising edge 2013 uint8_t frame_sync_polarity = 0; // active high 2014 uint8_t reserved = 0; 2015 uint16_t size = 16; 2016 uint16_t chan_1_offset = 1; 2017 uint16_t chan_2_offset = chan_1_offset + size; 2018 uint8_t out_edge = 1; // rising 2019 uint8_t in_edge = 0; // falling 2020 hci_send_cmd(&hci_ti_write_codec_config, clock_rate_khz, clock_direction, sample_rate_hz, frame_sync_duty_cycle, 2021 frame_sync_edge, frame_sync_polarity, reserved, 2022 size, chan_1_offset, out_edge, size, chan_1_offset, in_edge, reserved, 2023 size, chan_2_offset, out_edge, size, chan_2_offset, in_edge, reserved); 2024 } 2025 #endif 2026 2027 #ifdef ENABLE_BCM_PCM_WBS 2028 void hfp_bcm_prepare_for_sco(hfp_connection_t * hfp_connection){ 2029 hfp_connection->bcm_send_write_i2spcm_interface_param = true; 2030 if (hfp_connection->negotiated_codec == HFP_CODEC_MSBC){ 2031 hfp_connection->bcm_send_enable_wbs = true; 2032 } 2033 } 2034 void hfp_bcm_write_i2spcm_interface_param(hfp_connection_t * hfp_connection){ 2035 uint8_t sample_rate = (hfp_connection->negotiated_codec == HFP_CODEC_MSBC) ? 1 : 0; 2036 // i2s enable, master, 8/16 kHz, 512 kHz 2037 hci_send_cmd(&hci_bcm_write_i2spcm_interface_paramhci_bcm_write_i2spcm_interface_param, 1, 1, sample_rate, 2); 2038 } 2039 #endif 2040 2041 void hfp_set_hf_callback(btstack_packet_handler_t callback){ 2042 hfp_hf_callback = callback; 2043 } 2044 2045 void hfp_set_ag_callback(btstack_packet_handler_t callback){ 2046 hfp_ag_callback = callback; 2047 } 2048 2049 void hfp_set_ag_rfcomm_packet_handler(btstack_packet_handler_t handler){ 2050 hfp_ag_rfcomm_packet_handler = handler; 2051 } 2052 2053 void hfp_set_hf_rfcomm_packet_handler(btstack_packet_handler_t handler){ 2054 hfp_hf_rfcomm_packet_handler = handler; 2055 } 2056 2057 void hfp_init(void){ 2058 hfp_allowed_sco_packet_types = SCO_PACKET_TYPES_ALL; 2059 } 2060 2061 void hfp_deinit(void){ 2062 hfp_allowed_sco_packet_types = 0; 2063 hfp_connections = NULL; 2064 hfp_hf_callback = NULL; 2065 hfp_ag_callback = NULL; 2066 hfp_hf_rfcomm_packet_handler = NULL; 2067 hfp_ag_rfcomm_packet_handler = NULL; 2068 hfp_sco_establishment_active = NULL; 2069 hfp_custom_commands_ag = NULL; 2070 hfp_custom_commands_hf = NULL; 2071 (void) memset(&hfp_sdp_query_context, 0, sizeof(hfp_sdp_query_context_t)); 2072 (void) memset(&hfp_sdp_query_request, 0, sizeof(btstack_context_callback_registration_t)); 2073 } 2074 2075 void hfp_set_sco_packet_types(uint16_t packet_types){ 2076 hfp_allowed_sco_packet_types = packet_types; 2077 } 2078 2079 uint16_t hfp_get_sco_packet_types(void){ 2080 return hfp_allowed_sco_packet_types; 2081 } 2082 2083 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){ 2084 int8_t setting = (int8_t) current_setting; 2085 bool can_use_eSCO = local_eSCO_supported && remote_eSCO_supported; 2086 while (setting > 0){ 2087 setting--; 2088 // skip if eSCO required but not available 2089 if (hfp_link_settings[setting].eSCO && !can_use_eSCO) continue; 2090 // skip if S4 but not supported 2091 if ((setting == (int8_t) HFP_LINK_SETTINGS_S4) && !eSCO_S4_supported) continue; 2092 // skip wrong codec 2093 if ((hfp_link_settings[setting].codec_mask & (1 << negotiated_codec)) == 0) continue; 2094 // skip disabled packet types 2095 uint16_t required_packet_types = hfp_link_settings[setting].packet_types; 2096 uint16_t allowed_packet_types = hfp_allowed_sco_packet_types; 2097 if ((required_packet_types & allowed_packet_types) == 0) continue; 2098 2099 // found matching setting 2100 return (hfp_link_settings_t) setting; 2101 } 2102 return HFP_LINK_SETTINGS_NONE; 2103 } 2104 2105 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){ 2106 bool local_eSCO_supported = hci_extended_sco_link_supported(); 2107 bool remote_eSCO_supported = hci_remote_esco_supported(hfp_connection->acl_handle); 2108 uint8_t negotiated_codec = hfp_connection->negotiated_codec; 2109 return hfp_next_link_setting(current_setting, local_eSCO_supported, remote_eSCO_supported, eSCO_S4_supported, negotiated_codec); 2110 } 2111 2112 void hfp_init_link_settings(hfp_connection_t * hfp_connection, uint8_t eSCO_S4_supported){ 2113 // get highest possible link setting 2114 hfp_connection->link_setting = hfp_next_link_setting_for_connection(HFP_LINK_SETTINGS_NONE, hfp_connection, eSCO_S4_supported); 2115 log_info("hfp_init_link_settings: %u", hfp_connection->link_setting); 2116 } 2117 2118 #define HFP_HF_RX_DEBUG_PRINT_LINE 80 2119 2120 void hfp_log_rfcomm_message(const char * tag, uint8_t * packet, uint16_t size){ 2121 #ifdef ENABLE_LOG_INFO 2122 // encode \n\r 2123 char printable[HFP_HF_RX_DEBUG_PRINT_LINE+2]; 2124 int i = 0; 2125 int pos; 2126 for (pos=0 ; (pos < size) && (i < (HFP_HF_RX_DEBUG_PRINT_LINE - 3)) ; pos++){ 2127 switch (packet[pos]){ 2128 case '\n': 2129 printable[i++] = '\\'; 2130 printable[i++] = 'n'; 2131 break; 2132 case '\r': 2133 printable[i++] = '\\'; 2134 printable[i++] = 'r'; 2135 break; 2136 default: 2137 printable[i++] = packet[pos]; 2138 break; 2139 } 2140 } 2141 printable[i] = 0; 2142 log_info("%s: '%s'", tag, printable); 2143 #endif 2144 } 2145 2146 void hfp_register_custom_ag_command(hfp_custom_at_command_t * custom_at_command){ 2147 btstack_linked_list_add(&hfp_custom_commands_ag, (btstack_linked_item_t *) custom_at_command); 2148 } 2149 2150 void hfp_register_custom_hf_command(hfp_custom_at_command_t * custom_at_command){ 2151 btstack_linked_list_add(&hfp_custom_commands_hf, (btstack_linked_item_t *) custom_at_command); 2152 } 2153 2154 // HFP H2 Synchronization - might get moved into a hfp_h2.c 2155 2156 // find position of h2 sync header, returns -1 if not found, or h2 sync position 2157 static int16_t hfp_h2_sync_find(const uint8_t * frame_data, uint16_t frame_len){ 2158 uint16_t i; 2159 for (i=0;i<(frame_len - 1);i++){ 2160 // check: first byte == 1 2161 uint8_t h2_first_byte = frame_data[i]; 2162 if (h2_first_byte == 0x01) { 2163 uint8_t h2_second_byte = frame_data[i + 1]; 2164 // check lower nibble of second byte == 0x08 2165 if ((h2_second_byte & 0x0F) == 8) { 2166 // check if bits 0+2 == bits 1+3 2167 uint8_t hn = h2_second_byte >> 4; 2168 if (((hn >> 1) & 0x05) == (hn & 0x05)) { 2169 return (int16_t) i; 2170 } 2171 } 2172 } 2173 } 2174 return -1; 2175 } 2176 2177 static void hfp_h2_sync_reset(hfp_h2_sync_t * hfp_h2_sync){ 2178 hfp_h2_sync->frame_len = 0; 2179 } 2180 2181 void hfp_h2_sync_init(hfp_h2_sync_t * hfp_h2_sync, 2182 bool (*callback)(bool bad_frame, const uint8_t * frame_data, uint16_t frame_len)){ 2183 hfp_h2_sync->callback = callback; 2184 hfp_h2_sync->dropped_bytes = 0; 2185 hfp_h2_sync_reset(hfp_h2_sync); 2186 } 2187 2188 static void hfp_h2_report_bad_frames(hfp_h2_sync_t *hfp_h2_sync){ 2189 // report bad frames 2190 while (hfp_h2_sync->dropped_bytes >= HFP_H2_SYNC_FRAME_SIZE){ 2191 hfp_h2_sync->dropped_bytes -= HFP_H2_SYNC_FRAME_SIZE; 2192 (void)(*hfp_h2_sync->callback)(true,NULL, HFP_H2_SYNC_FRAME_SIZE); 2193 } 2194 } 2195 2196 static void hfp_h2_sync_drop_bytes(hfp_h2_sync_t * hfp_h2_sync, uint16_t bytes_to_drop){ 2197 btstack_assert(bytes_to_drop <= hfp_h2_sync->frame_len); 2198 memmove(hfp_h2_sync->frame_data, &hfp_h2_sync->frame_data[bytes_to_drop], hfp_h2_sync->frame_len - bytes_to_drop); 2199 hfp_h2_sync->dropped_bytes += bytes_to_drop; 2200 hfp_h2_sync->frame_len -= bytes_to_drop; 2201 hfp_h2_report_bad_frames(hfp_h2_sync); 2202 } 2203 2204 void hfp_h2_sync_process(hfp_h2_sync_t *hfp_h2_sync, bool bad_frame, const uint8_t *frame_data, uint16_t frame_len) { 2205 2206 if (bad_frame){ 2207 // drop all data 2208 hfp_h2_sync->dropped_bytes += hfp_h2_sync->frame_len; 2209 hfp_h2_sync->frame_len = 0; 2210 // all new data is bad, too 2211 hfp_h2_sync->dropped_bytes += frame_len; 2212 // report frames 2213 hfp_h2_report_bad_frames(hfp_h2_sync); 2214 return; 2215 } 2216 2217 while (frame_len > 0){ 2218 // Fill hfp_h2_sync->frame_buffer 2219 uint16_t bytes_free_in_frame_buffer = HFP_H2_SYNC_FRAME_SIZE - hfp_h2_sync->frame_len; 2220 uint16_t bytes_to_append = btstack_min(frame_len, bytes_free_in_frame_buffer); 2221 memcpy(&hfp_h2_sync->frame_data[hfp_h2_sync->frame_len], frame_data, bytes_to_append); 2222 frame_data += bytes_to_append; 2223 frame_len -= bytes_to_append; 2224 hfp_h2_sync->frame_len += bytes_to_append; 2225 // check complete frame for h2 sync 2226 if (hfp_h2_sync->frame_len == HFP_H2_SYNC_FRAME_SIZE){ 2227 bool valid_frame = true; 2228 int16_t h2_pos = hfp_h2_sync_find(hfp_h2_sync->frame_data, hfp_h2_sync->frame_len); 2229 if (h2_pos < 0){ 2230 // no h2 sync, no valid frame, keep last byte if it is 0x01 2231 if (hfp_h2_sync->frame_data[HFP_H2_SYNC_FRAME_SIZE-1] == 0x01){ 2232 hfp_h2_sync_drop_bytes(hfp_h2_sync, HFP_H2_SYNC_FRAME_SIZE - 1); 2233 } else { 2234 hfp_h2_sync_drop_bytes(hfp_h2_sync, HFP_H2_SYNC_FRAME_SIZE); 2235 } 2236 valid_frame = false; 2237 } 2238 else if (h2_pos > 0){ 2239 // drop data before h2 sync 2240 hfp_h2_sync_drop_bytes(hfp_h2_sync, h2_pos); 2241 valid_frame = false; 2242 } 2243 if (valid_frame) { 2244 // h2 sync at pos 0 and complete frame 2245 bool codec_ok = (*hfp_h2_sync->callback)(false, hfp_h2_sync->frame_data, hfp_h2_sync->frame_len); 2246 if (codec_ok){ 2247 hfp_h2_sync_reset(hfp_h2_sync); 2248 } else { 2249 // drop first two bytes 2250 hfp_h2_sync_drop_bytes(hfp_h2_sync, 2); 2251 } 2252 } 2253 } 2254 } 2255 } 2256