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 MATTHIAS 24 * RINGWALD 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 <stdlib.h> 46 #include <string.h> 47 #include <inttypes.h> 48 49 #include "bluetooth_sdp.h" 50 #include "btstack_debug.h" 51 #include "btstack_event.h" 52 #include "btstack_memory.h" 53 #include "btstack_run_loop.h" 54 #include "classic/core.h" 55 #include "classic/sdp_client_rfcomm.h" 56 #include "classic/sdp_server.h" 57 #include "classic/sdp_util.h" 58 #include "hci.h" 59 #include "hci_cmd.h" 60 #include "hci_dump.h" 61 #include "l2cap.h" 62 63 #define HFP_HF_FEATURES_SIZE 10 64 #define HFP_AG_FEATURES_SIZE 12 65 66 67 static const char * hfp_hf_features[] = { 68 "EC and/or NR function", 69 "Three-way calling", 70 "CLI presentation capability", 71 "Voice recognition activation", 72 "Remote volume control", 73 74 "Enhanced call status", 75 "Enhanced call control", 76 77 "Codec negotiation", 78 79 "HF Indicators", 80 "eSCO S4 (and T2) Settings Supported", 81 "Reserved for future definition" 82 }; 83 84 static const char * hfp_ag_features[] = { 85 "Three-way calling", 86 "EC and/or NR function", 87 "Voice recognition function", 88 "In-band ring tone capability", 89 "Attach a number to a voice tag", 90 "Ability to reject a call", 91 "Enhanced call status", 92 "Enhanced call control", 93 "Extended Error Result Codes", 94 "Codec negotiation", 95 "HF Indicators", 96 "eSCO S4 (and T2) Settings Supported", 97 "Reserved for future definition" 98 }; 99 100 static btstack_linked_list_t hfp_connections = NULL; 101 static void parse_sequence(hfp_connection_t * context); 102 static btstack_packet_handler_t hfp_callback; 103 static btstack_packet_handler_t rfcomm_packet_handler; 104 105 static hfp_connection_t * sco_establishment_active; 106 107 void hfp_set_callback(btstack_packet_handler_t callback){ 108 hfp_callback = callback; 109 } 110 111 const char * hfp_hf_feature(int index){ 112 if (index > HFP_HF_FEATURES_SIZE){ 113 return hfp_hf_features[HFP_HF_FEATURES_SIZE]; 114 } 115 return hfp_hf_features[index]; 116 } 117 118 const char * hfp_ag_feature(int index){ 119 if (index > HFP_AG_FEATURES_SIZE){ 120 return hfp_ag_features[HFP_AG_FEATURES_SIZE]; 121 } 122 return hfp_ag_features[index]; 123 } 124 125 int send_str_over_rfcomm(uint16_t cid, char * command){ 126 if (!rfcomm_can_send_packet_now(cid)) return 1; 127 log_info("HFP_TX %s", command); 128 int err = rfcomm_send(cid, (uint8_t*) command, strlen(command)); 129 if (err){ 130 log_error("rfcomm_send -> error 0x%02x \n", err); 131 } 132 return 1; 133 } 134 135 int hfp_supports_codec(uint8_t codec, int codecs_nr, uint8_t * codecs){ 136 137 // mSBC requires support for eSCO connections 138 if (codec == HFP_CODEC_MSBC && !hci_extended_sco_link_supported()) return 0; 139 140 int i; 141 for (i = 0; i < codecs_nr; i++){ 142 if (codecs[i] != codec) continue; 143 return 1; 144 } 145 return 0; 146 } 147 148 void hfp_hf_drop_mSBC_if_eSCO_not_supported(uint8_t * codecs, uint8_t * codecs_nr){ 149 if (hci_extended_sco_link_supported()) return; 150 uint8_t tmp_codecs[HFP_MAX_NUM_CODECS]; 151 int i; 152 int tmp_codec_nr = 0; 153 for (i=0; i < *codecs_nr; i++){ 154 if (codecs[i] == HFP_CODEC_MSBC) continue; 155 tmp_codecs[tmp_codec_nr++] = codecs[i]; 156 } 157 *codecs_nr = tmp_codec_nr; 158 memcpy(codecs, tmp_codecs, tmp_codec_nr); 159 } 160 161 // UTILS 162 int get_bit(uint16_t bitmap, int position){ 163 return (bitmap >> position) & 1; 164 } 165 166 int store_bit(uint32_t bitmap, int position, uint8_t value){ 167 if (value){ 168 bitmap |= 1 << position; 169 } else { 170 bitmap &= ~ (1 << position); 171 } 172 return bitmap; 173 } 174 175 int join(char * buffer, int buffer_size, uint8_t * values, int values_nr){ 176 if (buffer_size < values_nr * 3) return 0; 177 int i; 178 int offset = 0; 179 for (i = 0; i < values_nr-1; i++) { 180 offset += snprintf(buffer+offset, buffer_size-offset, "%d,", values[i]); // puts string into buffer 181 } 182 if (i<values_nr){ 183 offset += snprintf(buffer+offset, buffer_size-offset, "%d", values[i]); 184 } 185 return offset; 186 } 187 188 int join_bitmap(char * buffer, int buffer_size, uint32_t values, int values_nr){ 189 if (buffer_size < values_nr * 3) return 0; 190 191 int i; 192 int offset = 0; 193 for (i = 0; i < values_nr-1; i++) { 194 offset += snprintf(buffer+offset, buffer_size-offset, "%d,", get_bit(values,i)); // puts string into buffer 195 } 196 197 if (i<values_nr){ 198 offset += snprintf(buffer+offset, buffer_size-offset, "%d", get_bit(values,i)); 199 } 200 return offset; 201 } 202 203 void hfp_emit_simple_event(btstack_packet_handler_t callback, uint8_t event_subtype){ 204 if (!callback) return; 205 uint8_t event[3]; 206 event[0] = HCI_EVENT_HFP_META; 207 event[1] = sizeof(event) - 2; 208 event[2] = event_subtype; 209 (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event)); 210 } 211 212 void hfp_emit_event(btstack_packet_handler_t callback, uint8_t event_subtype, uint8_t value){ 213 if (!callback) return; 214 uint8_t event[4]; 215 event[0] = HCI_EVENT_HFP_META; 216 event[1] = sizeof(event) - 2; 217 event[2] = event_subtype; 218 event[3] = value; // status 0 == OK 219 (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event)); 220 } 221 222 void hfp_emit_slc_connection_event(btstack_packet_handler_t callback, uint8_t status, hci_con_handle_t con_handle, bd_addr_t addr){ 223 if (!callback) return; 224 uint8_t event[12]; 225 int pos = 0; 226 event[pos++] = HCI_EVENT_HFP_META; 227 event[pos++] = sizeof(event) - 2; 228 event[pos++] = HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_ESTABLISHED; 229 event[pos++] = status; // status 0 == OK 230 little_endian_store_16(event, pos, con_handle); 231 pos += 2; 232 reverse_bd_addr(addr,&event[pos]); 233 pos += 6; 234 (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event)); 235 } 236 237 static void hfp_emit_sco_event(btstack_packet_handler_t callback, uint8_t status, hci_con_handle_t con_handle, bd_addr_t addr, uint8_t negotiated_codec){ 238 if (!callback) return; 239 uint8_t event[13]; 240 int pos = 0; 241 event[pos++] = HCI_EVENT_HFP_META; 242 event[pos++] = sizeof(event) - 2; 243 event[pos++] = HFP_SUBEVENT_AUDIO_CONNECTION_ESTABLISHED; 244 event[pos++] = status; // status 0 == OK 245 little_endian_store_16(event, pos, con_handle); 246 pos += 2; 247 reverse_bd_addr(addr,&event[pos]); 248 pos += 6; 249 event[pos++] = negotiated_codec; 250 (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event)); 251 } 252 253 void hfp_emit_string_event(btstack_packet_handler_t callback, uint8_t event_subtype, const char * value){ 254 if (!callback) return; 255 uint8_t event[40]; 256 event[0] = HCI_EVENT_HFP_META; 257 event[1] = sizeof(event) - 2; 258 event[2] = event_subtype; 259 int size = ( strlen(value) < sizeof(event) - 4) ? (int) strlen(value) : (int) sizeof(event) - 4; 260 strncpy((char*)&event[3], value, size); 261 event[3 + size] = 0; 262 (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event)); 263 } 264 265 btstack_linked_list_t * hfp_get_connections(void){ 266 return (btstack_linked_list_t *) &hfp_connections; 267 } 268 269 hfp_connection_t * get_hfp_connection_context_for_rfcomm_cid(uint16_t cid){ 270 btstack_linked_list_iterator_t it; 271 btstack_linked_list_iterator_init(&it, hfp_get_connections()); 272 while (btstack_linked_list_iterator_has_next(&it)){ 273 hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it); 274 if (hfp_connection->rfcomm_cid == cid){ 275 return hfp_connection; 276 } 277 } 278 return NULL; 279 } 280 281 hfp_connection_t * get_hfp_connection_context_for_bd_addr(bd_addr_t bd_addr){ 282 btstack_linked_list_iterator_t it; 283 btstack_linked_list_iterator_init(&it, hfp_get_connections()); 284 while (btstack_linked_list_iterator_has_next(&it)){ 285 hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it); 286 if (memcmp(hfp_connection->remote_addr, bd_addr, 6) == 0) { 287 return hfp_connection; 288 } 289 } 290 return NULL; 291 } 292 293 hfp_connection_t * get_hfp_connection_context_for_sco_handle(uint16_t handle){ 294 btstack_linked_list_iterator_t it; 295 btstack_linked_list_iterator_init(&it, hfp_get_connections()); 296 while (btstack_linked_list_iterator_has_next(&it)){ 297 hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it); 298 if (hfp_connection->sco_handle == handle){ 299 return hfp_connection; 300 } 301 } 302 return NULL; 303 } 304 305 hfp_connection_t * get_hfp_connection_context_for_acl_handle(uint16_t handle){ 306 btstack_linked_list_iterator_t it; 307 btstack_linked_list_iterator_init(&it, hfp_get_connections()); 308 while (btstack_linked_list_iterator_has_next(&it)){ 309 hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it); 310 if (hfp_connection->acl_handle == handle){ 311 return hfp_connection; 312 } 313 } 314 return NULL; 315 } 316 317 void hfp_reset_context_flags(hfp_connection_t * hfp_connection){ 318 if (!hfp_connection) return; 319 hfp_connection->ok_pending = 0; 320 hfp_connection->send_error = 0; 321 322 hfp_connection->keep_byte = 0; 323 324 hfp_connection->change_status_update_for_individual_ag_indicators = 0; 325 hfp_connection->operator_name_changed = 0; 326 327 hfp_connection->enable_extended_audio_gateway_error_report = 0; 328 hfp_connection->extended_audio_gateway_error = 0; 329 330 // establish codecs hfp_connection 331 hfp_connection->suggested_codec = 0; 332 hfp_connection->negotiated_codec = 0; 333 hfp_connection->codec_confirmed = 0; 334 335 hfp_connection->establish_audio_connection = 0; 336 hfp_connection->call_waiting_notification_enabled = 0; 337 hfp_connection->command = HFP_CMD_NONE; 338 hfp_connection->enable_status_update_for_ag_indicators = 0xFF; 339 } 340 341 static hfp_connection_t * create_hfp_connection_context(void){ 342 hfp_connection_t * hfp_connection = btstack_memory_hfp_connection_get(); 343 if (!hfp_connection) return NULL; 344 // init state 345 memset(hfp_connection,0, sizeof(hfp_connection_t)); 346 347 hfp_connection->state = HFP_IDLE; 348 hfp_connection->call_state = HFP_CALL_IDLE; 349 hfp_connection->codecs_state = HFP_CODECS_IDLE; 350 351 hfp_connection->parser_state = HFP_PARSER_CMD_HEADER; 352 hfp_connection->command = HFP_CMD_NONE; 353 354 hfp_reset_context_flags(hfp_connection); 355 356 btstack_linked_list_add(&hfp_connections, (btstack_linked_item_t*)hfp_connection); 357 return hfp_connection; 358 } 359 360 static void remove_hfp_connection_context(hfp_connection_t * hfp_connection){ 361 btstack_linked_list_remove(&hfp_connections, (btstack_linked_item_t*) hfp_connection); 362 btstack_memory_hfp_connection_free(hfp_connection); 363 } 364 365 static hfp_connection_t * provide_hfp_connection_context_for_bd_addr(bd_addr_t bd_addr){ 366 hfp_connection_t * hfp_connection = get_hfp_connection_context_for_bd_addr(bd_addr); 367 if (hfp_connection) return hfp_connection; 368 hfp_connection = create_hfp_connection_context(); 369 memcpy(hfp_connection->remote_addr, bd_addr, 6); 370 return hfp_connection; 371 } 372 373 /* @param network. 374 * 0 == no ability to reject a call. 375 * 1 == ability to reject a call. 376 */ 377 378 /* @param suported_features 379 * HF bit 0: EC and/or NR function (yes/no, 1 = yes, 0 = no) 380 * HF bit 1: Call waiting or three-way calling(yes/no, 1 = yes, 0 = no) 381 * HF bit 2: CLI presentation capability (yes/no, 1 = yes, 0 = no) 382 * HF bit 3: Voice recognition activation (yes/no, 1= yes, 0 = no) 383 * HF bit 4: Remote volume control (yes/no, 1 = yes, 0 = no) 384 * HF bit 5: Wide band speech (yes/no, 1 = yes, 0 = no) 385 */ 386 /* Bit position: 387 * AG bit 0: Three-way calling (yes/no, 1 = yes, 0 = no) 388 * AG bit 1: EC and/or NR function (yes/no, 1 = yes, 0 = no) 389 * AG bit 2: Voice recognition function (yes/no, 1 = yes, 0 = no) 390 * AG bit 3: In-band ring tone capability (yes/no, 1 = yes, 0 = no) 391 * AG bit 4: Attach a phone number to a voice tag (yes/no, 1 = yes, 0 = no) 392 * AG bit 5: Wide band speech (yes/no, 1 = yes, 0 = no) 393 */ 394 395 void hfp_create_sdp_record(uint8_t * service, uint32_t service_record_handle, uint16_t service_uuid, int rfcomm_channel_nr, const char * name){ 396 uint8_t* attribute; 397 de_create_sequence(service); 398 399 // 0x0000 "Service Record Handle" 400 de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_SERVICE_RECORD_HANDLE); 401 de_add_number(service, DE_UINT, DE_SIZE_32, service_record_handle); 402 403 // 0x0001 "Service Class ID List" 404 de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_SERVICE_CLASS_ID_LIST); 405 attribute = de_push_sequence(service); 406 { 407 // "UUID for Service" 408 de_add_number(attribute, DE_UUID, DE_SIZE_16, service_uuid); 409 de_add_number(attribute, DE_UUID, DE_SIZE_16, BLUETOOTH_SERVICE_CLASS_GENERIC_AUDIO); 410 } 411 de_pop_sequence(service, attribute); 412 413 // 0x0004 "Protocol Descriptor List" 414 de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_PROTOCOL_DESCRIPTOR_LIST); 415 attribute = de_push_sequence(service); 416 { 417 uint8_t* l2cpProtocol = de_push_sequence(attribute); 418 { 419 de_add_number(l2cpProtocol, DE_UUID, DE_SIZE_16, BLUETOOTH_PROTOCOL_L2CAP); 420 } 421 de_pop_sequence(attribute, l2cpProtocol); 422 423 uint8_t* rfcomm = de_push_sequence(attribute); 424 { 425 de_add_number(rfcomm, DE_UUID, DE_SIZE_16, BLUETOOTH_PROTOCOL_RFCOMM); // rfcomm_service 426 de_add_number(rfcomm, DE_UINT, DE_SIZE_8, rfcomm_channel_nr); // rfcomm channel 427 } 428 de_pop_sequence(attribute, rfcomm); 429 } 430 de_pop_sequence(service, attribute); 431 432 433 // 0x0005 "Public Browse Group" 434 de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_BROWSE_GROUP_LIST); // public browse group 435 attribute = de_push_sequence(service); 436 { 437 de_add_number(attribute, DE_UUID, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_PUBLIC_BROWSE_ROOT); 438 } 439 de_pop_sequence(service, attribute); 440 441 // 0x0009 "Bluetooth Profile Descriptor List" 442 de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_BLUETOOTH_PROFILE_DESCRIPTOR_LIST); 443 attribute = de_push_sequence(service); 444 { 445 uint8_t *sppProfile = de_push_sequence(attribute); 446 { 447 de_add_number(sppProfile, DE_UUID, DE_SIZE_16, BLUETOOTH_SERVICE_CLASS_HANDSFREE); 448 de_add_number(sppProfile, DE_UINT, DE_SIZE_16, 0x0107); // Verision 1.7 449 } 450 de_pop_sequence(attribute, sppProfile); 451 } 452 de_pop_sequence(service, attribute); 453 454 // 0x0100 "Service Name" 455 de_add_number(service, DE_UINT, DE_SIZE_16, 0x0100); 456 de_add_data(service, DE_STRING, strlen(name), (uint8_t *) name); 457 } 458 459 static hfp_connection_t * connection_doing_sdp_query = NULL; 460 461 static void handle_query_rfcomm_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 462 UNUSED(packet_type); // ok: handling own sdp events 463 UNUSED(channel); // ok: no channel 464 UNUSED(size); // ok: handling own sdp events 465 466 hfp_connection_t * hfp_connection = connection_doing_sdp_query; 467 if (!hfp_connection) { 468 log_error("handle_query_rfcomm_event, no connection"); 469 return; 470 } 471 472 switch (hci_event_packet_get_type(packet)){ 473 case SDP_EVENT_QUERY_RFCOMM_SERVICE: 474 hfp_connection->rfcomm_channel_nr = sdp_event_query_rfcomm_service_get_rfcomm_channel(packet); 475 break; 476 case SDP_EVENT_QUERY_COMPLETE: 477 connection_doing_sdp_query = NULL; 478 if (hfp_connection->rfcomm_channel_nr > 0){ 479 hfp_connection->state = HFP_W4_RFCOMM_CONNECTED; 480 log_info("HFP: SDP_EVENT_QUERY_COMPLETE context %p, addr %s, state %d", hfp_connection, bd_addr_to_str( hfp_connection->remote_addr), hfp_connection->state); 481 rfcomm_create_channel(rfcomm_packet_handler, hfp_connection->remote_addr, hfp_connection->rfcomm_channel_nr, NULL); 482 break; 483 } 484 hfp_connection->state = HFP_IDLE; 485 hfp_emit_slc_connection_event(hfp_callback, sdp_event_query_complete_get_status(packet), HCI_CON_HANDLE_INVALID, hfp_connection->remote_addr); 486 log_info("rfcomm service not found, status %u.", sdp_event_query_complete_get_status(packet)); 487 break; 488 default: 489 break; 490 } 491 } 492 493 static void hfp_handle_failed_sco_connection(uint8_t status){ 494 495 if (!sco_establishment_active){ 496 log_error("(e)SCO Connection failed but not started by us"); 497 return; 498 } 499 log_error("(e)SCO Connection failed status 0x%02x", status); 500 501 // invalid params / unspecified error 502 if (status != 0x11 && status != 0x1f) return; 503 504 switch (sco_establishment_active->link_setting){ 505 case HFP_LINK_SETTINGS_D0: 506 return; // no other option left 507 case HFP_LINK_SETTINGS_D1: 508 sco_establishment_active->link_setting = HFP_LINK_SETTINGS_D0; 509 break; 510 case HFP_LINK_SETTINGS_S1: 511 sco_establishment_active->link_setting = HFP_LINK_SETTINGS_D1; 512 break; 513 case HFP_LINK_SETTINGS_S2: 514 sco_establishment_active->link_setting = HFP_LINK_SETTINGS_S1; 515 break; 516 case HFP_LINK_SETTINGS_S3: 517 sco_establishment_active->link_setting = HFP_LINK_SETTINGS_S2; 518 break; 519 case HFP_LINK_SETTINGS_S4: 520 sco_establishment_active->link_setting = HFP_LINK_SETTINGS_S3; 521 break; 522 case HFP_LINK_SETTINGS_T1: 523 log_info("T1 failed, fallback to CVSD - D1"); 524 sco_establishment_active->negotiated_codec = HFP_CODEC_CVSD; 525 sco_establishment_active->sco_for_msbc_failed = 1; 526 sco_establishment_active->command = HFP_CMD_AG_SEND_COMMON_CODEC; 527 sco_establishment_active->link_setting = HFP_LINK_SETTINGS_D1; 528 break; 529 case HFP_LINK_SETTINGS_T2: 530 sco_establishment_active->link_setting = HFP_LINK_SETTINGS_T1; 531 break; 532 } 533 sco_establishment_active->establish_audio_connection = 1; 534 sco_establishment_active = 0; 535 } 536 537 538 void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 539 UNUSED(channel); // ok: no channel 540 541 bd_addr_t event_addr; 542 uint16_t rfcomm_cid, handle; 543 hfp_connection_t * hfp_connection = NULL; 544 uint8_t status; 545 546 log_debug("HFP packet_handler type %u, event type %x, size %u", packet_type, hci_event_packet_get_type(packet), size); 547 548 switch (hci_event_packet_get_type(packet)) { 549 case HCI_EVENT_CONNECTION_REQUEST: 550 // printf("hfp HCI_EVENT_CONNECTION_REQUEST\n"); 551 switch(hci_event_connection_request_get_link_type(packet)){ 552 case 0: // SCO 553 case 2: // eSCO 554 hci_event_connection_request_get_bd_addr(packet, event_addr); 555 hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr); 556 if (!hfp_connection) break; 557 hfp_connection->hf_accept_sco = 1; 558 break; 559 default: 560 break; 561 } 562 break; 563 564 case RFCOMM_EVENT_INCOMING_CONNECTION: 565 // data: event (8), len(8), address(48), channel (8), rfcomm_cid (16) 566 rfcomm_event_incoming_connection_get_bd_addr(packet, event_addr); 567 hfp_connection = provide_hfp_connection_context_for_bd_addr(event_addr); 568 if (!hfp_connection){ 569 log_info("hfp: no memory to accept incoming connection - decline"); 570 rfcomm_decline_connection(rfcomm_event_incoming_connection_get_rfcomm_cid(packet)); 571 return; 572 } 573 if (hfp_connection->state != HFP_IDLE) { 574 log_error("hfp: incoming connection but state != HFP_IDLE"); 575 return; 576 } 577 578 hfp_connection->rfcomm_cid = rfcomm_event_incoming_connection_get_rfcomm_cid(packet); 579 hfp_connection->state = HFP_W4_RFCOMM_CONNECTED; 580 // printf("RFCOMM channel %u requested for %s\n", hfp_connection->rfcomm_cid, bd_addr_to_str(hfp_connection->remote_addr)); 581 rfcomm_accept_connection(hfp_connection->rfcomm_cid); 582 break; 583 584 case RFCOMM_EVENT_CHANNEL_OPENED: 585 // data: event(8), len(8), status (8), address (48), handle(16), server channel(8), rfcomm_cid(16), max frame size(16) 586 587 rfcomm_event_channel_opened_get_bd_addr(packet, event_addr); 588 status = rfcomm_event_channel_opened_get_status(packet); 589 590 hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr); 591 if (!hfp_connection || hfp_connection->state != HFP_W4_RFCOMM_CONNECTED) return; 592 593 if (status) { 594 hfp_emit_slc_connection_event(hfp_callback, status, rfcomm_event_channel_opened_get_con_handle(packet), event_addr); 595 remove_hfp_connection_context(hfp_connection); 596 } else { 597 hfp_connection->acl_handle = rfcomm_event_channel_opened_get_con_handle(packet); 598 hfp_connection->rfcomm_cid = rfcomm_event_channel_opened_get_rfcomm_cid(packet); 599 bd_addr_copy(hfp_connection->remote_addr, event_addr); 600 // uint16_t mtu = rfcomm_event_channel_opened_get_max_frame_size(packet); 601 // printf("RFCOMM channel open succeeded. hfp_connection %p, RFCOMM Channel ID 0x%02x, max frame size %u\n", hfp_connection, hfp_connection->rfcomm_cid, mtu); 602 603 switch (hfp_connection->state){ 604 case HFP_W4_RFCOMM_CONNECTED: 605 hfp_connection->state = HFP_EXCHANGE_SUPPORTED_FEATURES; 606 break; 607 case HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN: 608 hfp_connection->state = HFP_W2_DISCONNECT_RFCOMM; 609 // printf("Shutting down RFCOMM.\n"); 610 break; 611 default: 612 break; 613 } 614 rfcomm_request_can_send_now_event(hfp_connection->rfcomm_cid); 615 } 616 break; 617 618 case HCI_EVENT_COMMAND_STATUS: 619 if (hci_event_command_status_get_command_opcode(packet) == hci_setup_synchronous_connection.opcode) { 620 status = hci_event_command_status_get_status(packet); 621 if (status) { 622 hfp_handle_failed_sco_connection(hci_event_command_status_get_status(packet)); 623 } 624 } 625 break; 626 627 case HCI_EVENT_SYNCHRONOUS_CONNECTION_COMPLETE:{ 628 hci_event_synchronous_connection_complete_get_bd_addr(packet, event_addr); 629 hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr); 630 if (!hfp_connection) { 631 log_error("HFP: connection does not exist for remote with addr %s.", bd_addr_to_str(event_addr)); 632 return; 633 } 634 635 status = hci_event_synchronous_connection_complete_get_status(packet); 636 if (status != 0){ 637 hfp_connection->hf_accept_sco = 0; 638 hfp_handle_failed_sco_connection(status); 639 break; 640 } 641 642 uint16_t sco_handle = hci_event_synchronous_connection_complete_get_handle(packet); 643 uint8_t link_type = hci_event_synchronous_connection_complete_get_link_type(packet); 644 uint8_t transmission_interval = hci_event_synchronous_connection_complete_get_transmission_interval(packet); // measured in slots 645 uint8_t retransmission_interval = hci_event_synchronous_connection_complete_get_retransmission_interval(packet);// measured in slots 646 uint16_t rx_packet_length = hci_event_synchronous_connection_complete_get_rx_packet_length(packet); // measured in bytes 647 uint16_t tx_packet_length = hci_event_synchronous_connection_complete_get_tx_packet_length(packet); // measured in bytes 648 uint8_t air_mode = hci_event_synchronous_connection_complete_get_air_mode(packet); 649 650 switch (link_type){ 651 case 0x00: 652 log_info("SCO Connection established."); 653 if (transmission_interval != 0) log_error("SCO Connection: transmission_interval not zero: %d.", transmission_interval); 654 if (retransmission_interval != 0) log_error("SCO Connection: retransmission_interval not zero: %d.", retransmission_interval); 655 if (rx_packet_length != 0) log_error("SCO Connection: rx_packet_length not zero: %d.", rx_packet_length); 656 if (tx_packet_length != 0) log_error("SCO Connection: tx_packet_length not zero: %d.", tx_packet_length); 657 break; 658 case 0x02: 659 log_info("eSCO Connection established. \n"); 660 break; 661 default: 662 log_error("(e)SCO reserved link_type 0x%2x", link_type); 663 break; 664 } 665 log_info("sco_handle 0x%2x, address %s, transmission_interval %u slots, retransmission_interval %u slots, " 666 " rx_packet_length %u bytes, tx_packet_length %u bytes, air_mode 0x%2x (0x02 == CVSD)\n", sco_handle, 667 bd_addr_to_str(event_addr), transmission_interval, retransmission_interval, rx_packet_length, tx_packet_length, air_mode); 668 669 hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr); 670 671 if (!hfp_connection) { 672 log_error("SCO link created, hfp_connection for address %s not found.", bd_addr_to_str(event_addr)); 673 break; 674 } 675 676 if (hfp_connection->state == HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN){ 677 log_info("SCO about to disconnect: HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN"); 678 hfp_connection->state = HFP_W2_DISCONNECT_SCO; 679 break; 680 } 681 hfp_connection->sco_handle = sco_handle; 682 hfp_connection->establish_audio_connection = 0; 683 hfp_connection->state = HFP_AUDIO_CONNECTION_ESTABLISHED; 684 hfp_emit_sco_event(hfp_callback, packet[2], sco_handle, event_addr, hfp_connection->negotiated_codec); 685 break; 686 } 687 688 case RFCOMM_EVENT_CHANNEL_CLOSED: 689 rfcomm_cid = little_endian_read_16(packet,2); 690 hfp_connection = get_hfp_connection_context_for_rfcomm_cid(rfcomm_cid); 691 if (!hfp_connection) break; 692 if (hfp_connection->state == HFP_W4_RFCOMM_DISCONNECTED_AND_RESTART){ 693 hfp_connection->state = HFP_IDLE; 694 hfp_establish_service_level_connection(hfp_connection->remote_addr, hfp_connection->service_uuid); 695 break; 696 } 697 698 hfp_emit_event(hfp_callback, HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_RELEASED, 0); 699 remove_hfp_connection_context(hfp_connection); 700 break; 701 702 case HCI_EVENT_DISCONNECTION_COMPLETE: 703 handle = little_endian_read_16(packet,3); 704 hfp_connection = get_hfp_connection_context_for_sco_handle(handle); 705 706 if (!hfp_connection) break; 707 708 if (hfp_connection->state != HFP_W4_SCO_DISCONNECTED){ 709 log_info("Received gap disconnect in wrong hfp state"); 710 } 711 log_info("Check SCO handle: incoming 0x%02x, hfp_connection 0x%02x\n", handle, hfp_connection->sco_handle); 712 713 if (handle == hfp_connection->sco_handle){ 714 log_info("SCO disconnected, w2 disconnect RFCOMM\n"); 715 hfp_connection->sco_handle = 0; 716 hfp_connection->release_audio_connection = 0; 717 hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED; 718 hfp_emit_event(hfp_callback, HFP_SUBEVENT_AUDIO_CONNECTION_RELEASED, 0); 719 break; 720 } 721 break; 722 723 default: 724 break; 725 } 726 } 727 728 // translates command string into hfp_command_t CMD 729 static hfp_command_t parse_command(const char * line_buffer, int isHandsFree){ 730 int offset = isHandsFree ? 0 : 2; 731 732 if (strncmp(line_buffer+offset, HFP_LIST_CURRENT_CALLS, strlen(HFP_LIST_CURRENT_CALLS)) == 0){ 733 return HFP_CMD_LIST_CURRENT_CALLS; 734 } 735 736 if (strncmp(line_buffer+offset, HFP_SUBSCRIBER_NUMBER_INFORMATION, strlen(HFP_SUBSCRIBER_NUMBER_INFORMATION)) == 0){ 737 return HFP_CMD_GET_SUBSCRIBER_NUMBER_INFORMATION; 738 } 739 740 if (strncmp(line_buffer+offset, HFP_PHONE_NUMBER_FOR_VOICE_TAG, strlen(HFP_PHONE_NUMBER_FOR_VOICE_TAG)) == 0){ 741 if (isHandsFree) return HFP_CMD_AG_SENT_PHONE_NUMBER; 742 return HFP_CMD_HF_REQUEST_PHONE_NUMBER; 743 } 744 745 if (strncmp(line_buffer+offset, HFP_TRANSMIT_DTMF_CODES, strlen(HFP_TRANSMIT_DTMF_CODES)) == 0){ 746 return HFP_CMD_TRANSMIT_DTMF_CODES; 747 } 748 749 if (strncmp(line_buffer+offset, HFP_SET_MICROPHONE_GAIN, strlen(HFP_SET_MICROPHONE_GAIN)) == 0){ 750 return HFP_CMD_SET_MICROPHONE_GAIN; 751 } 752 753 if (strncmp(line_buffer+offset, HFP_SET_SPEAKER_GAIN, strlen(HFP_SET_SPEAKER_GAIN)) == 0){ 754 return HFP_CMD_SET_SPEAKER_GAIN; 755 } 756 757 if (strncmp(line_buffer+offset, HFP_ACTIVATE_VOICE_RECOGNITION, strlen(HFP_ACTIVATE_VOICE_RECOGNITION)) == 0){ 758 if (isHandsFree) return HFP_CMD_AG_ACTIVATE_VOICE_RECOGNITION; 759 return HFP_CMD_HF_ACTIVATE_VOICE_RECOGNITION; 760 } 761 762 if (strncmp(line_buffer+offset, HFP_TURN_OFF_EC_AND_NR, strlen(HFP_TURN_OFF_EC_AND_NR)) == 0){ 763 return HFP_CMD_TURN_OFF_EC_AND_NR; 764 } 765 766 if (strncmp(line_buffer, HFP_CALL_ANSWERED, strlen(HFP_CALL_ANSWERED)) == 0){ 767 return HFP_CMD_CALL_ANSWERED; 768 } 769 770 if (strncmp(line_buffer, HFP_CALL_PHONE_NUMBER, strlen(HFP_CALL_PHONE_NUMBER)) == 0){ 771 return HFP_CMD_CALL_PHONE_NUMBER; 772 } 773 774 if (strncmp(line_buffer+offset, HFP_REDIAL_LAST_NUMBER, strlen(HFP_REDIAL_LAST_NUMBER)) == 0){ 775 return HFP_CMD_REDIAL_LAST_NUMBER; 776 } 777 778 if (strncmp(line_buffer+offset, HFP_CHANGE_IN_BAND_RING_TONE_SETTING, strlen(HFP_CHANGE_IN_BAND_RING_TONE_SETTING)) == 0){ 779 return HFP_CMD_CHANGE_IN_BAND_RING_TONE_SETTING; 780 } 781 782 if (strncmp(line_buffer+offset, HFP_HANG_UP_CALL, strlen(HFP_HANG_UP_CALL)) == 0){ 783 return HFP_CMD_HANG_UP_CALL; 784 } 785 786 if (strncmp(line_buffer+offset, HFP_ERROR, strlen(HFP_ERROR)) == 0){ 787 return HFP_CMD_ERROR; 788 } 789 790 if (strncmp(line_buffer+offset, HFP_RING, strlen(HFP_RING)) == 0){ 791 return HFP_CMD_RING; 792 } 793 794 if (isHandsFree && strncmp(line_buffer+offset, HFP_OK, strlen(HFP_OK)) == 0){ 795 return HFP_CMD_OK; 796 } 797 798 if (strncmp(line_buffer+offset, HFP_SUPPORTED_FEATURES, strlen(HFP_SUPPORTED_FEATURES)) == 0){ 799 return HFP_CMD_SUPPORTED_FEATURES; 800 } 801 802 if (strncmp(line_buffer+offset, HFP_TRANSFER_HF_INDICATOR_STATUS, strlen(HFP_TRANSFER_HF_INDICATOR_STATUS)) == 0){ 803 return HFP_CMD_HF_INDICATOR_STATUS; 804 } 805 806 if (strncmp(line_buffer+offset, HFP_RESPONSE_AND_HOLD, strlen(HFP_RESPONSE_AND_HOLD)) == 0){ 807 if (strncmp(line_buffer+strlen(HFP_RESPONSE_AND_HOLD)+offset, "?", 1) == 0){ 808 return HFP_CMD_RESPONSE_AND_HOLD_QUERY; 809 } 810 if (strncmp(line_buffer+strlen(HFP_RESPONSE_AND_HOLD)+offset, "=", 1) == 0){ 811 return HFP_CMD_RESPONSE_AND_HOLD_COMMAND; 812 } 813 return HFP_CMD_RESPONSE_AND_HOLD_STATUS; 814 } 815 816 if (strncmp(line_buffer+offset, HFP_INDICATOR, strlen(HFP_INDICATOR)) == 0){ 817 if (strncmp(line_buffer+strlen(HFP_INDICATOR)+offset, "?", 1) == 0){ 818 return HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS; 819 } 820 821 if (strncmp(line_buffer+strlen(HFP_INDICATOR)+offset, "=?", 2) == 0){ 822 return HFP_CMD_RETRIEVE_AG_INDICATORS; 823 } 824 } 825 826 if (strncmp(line_buffer+offset, HFP_AVAILABLE_CODECS, strlen(HFP_AVAILABLE_CODECS)) == 0){ 827 return HFP_CMD_AVAILABLE_CODECS; 828 } 829 830 if (strncmp(line_buffer+offset, HFP_ENABLE_STATUS_UPDATE_FOR_AG_INDICATORS, strlen(HFP_ENABLE_STATUS_UPDATE_FOR_AG_INDICATORS)) == 0){ 831 return HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE; 832 } 833 834 if (strncmp(line_buffer+offset, HFP_ENABLE_CLIP, strlen(HFP_ENABLE_CLIP)) == 0){ 835 if (isHandsFree) return HFP_CMD_AG_SENT_CLIP_INFORMATION; 836 return HFP_CMD_ENABLE_CLIP; 837 } 838 839 if (strncmp(line_buffer+offset, HFP_ENABLE_CALL_WAITING_NOTIFICATION, strlen(HFP_ENABLE_CALL_WAITING_NOTIFICATION)) == 0){ 840 if (isHandsFree) return HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE; 841 return HFP_CMD_ENABLE_CALL_WAITING_NOTIFICATION; 842 } 843 844 if (strncmp(line_buffer+offset, HFP_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES, strlen(HFP_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES)) == 0){ 845 846 if (isHandsFree) return HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES; 847 848 if (strncmp(line_buffer+strlen(HFP_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES)+offset, "=?", 2) == 0){ 849 return HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES; 850 } 851 if (strncmp(line_buffer+strlen(HFP_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES)+offset, "=", 1) == 0){ 852 return HFP_CMD_CALL_HOLD; 853 } 854 855 return HFP_CMD_UNKNOWN; 856 } 857 858 if (strncmp(line_buffer+offset, HFP_GENERIC_STATUS_INDICATOR, strlen(HFP_GENERIC_STATUS_INDICATOR)) == 0){ 859 if (isHandsFree) { 860 return HFP_CMD_SET_GENERIC_STATUS_INDICATOR_STATUS; 861 } 862 if (strncmp(line_buffer+strlen(HFP_GENERIC_STATUS_INDICATOR)+offset, "=?", 2) == 0){ 863 return HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS; 864 } 865 if (strncmp(line_buffer+strlen(HFP_GENERIC_STATUS_INDICATOR)+offset, "=", 1) == 0){ 866 return HFP_CMD_LIST_GENERIC_STATUS_INDICATORS; 867 } 868 return HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE; 869 } 870 871 if (strncmp(line_buffer+offset, HFP_UPDATE_ENABLE_STATUS_FOR_INDIVIDUAL_AG_INDICATORS, strlen(HFP_UPDATE_ENABLE_STATUS_FOR_INDIVIDUAL_AG_INDICATORS)) == 0){ 872 return HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE; 873 } 874 875 876 if (strncmp(line_buffer+offset, HFP_QUERY_OPERATOR_SELECTION, strlen(HFP_QUERY_OPERATOR_SELECTION)) == 0){ 877 if (strncmp(line_buffer+strlen(HFP_QUERY_OPERATOR_SELECTION)+offset, "=", 1) == 0){ 878 return HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT; 879 } 880 return HFP_CMD_QUERY_OPERATOR_SELECTION_NAME; 881 } 882 883 if (strncmp(line_buffer+offset, HFP_TRANSFER_AG_INDICATOR_STATUS, strlen(HFP_TRANSFER_AG_INDICATOR_STATUS)) == 0){ 884 return HFP_CMD_TRANSFER_AG_INDICATOR_STATUS; 885 } 886 887 if (isHandsFree && strncmp(line_buffer+offset, HFP_EXTENDED_AUDIO_GATEWAY_ERROR, strlen(HFP_EXTENDED_AUDIO_GATEWAY_ERROR)) == 0){ 888 return HFP_CMD_EXTENDED_AUDIO_GATEWAY_ERROR; 889 } 890 891 if (!isHandsFree && strncmp(line_buffer+offset, HFP_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR, strlen(HFP_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR)) == 0){ 892 return HFP_CMD_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR; 893 } 894 895 if (strncmp(line_buffer+offset, HFP_TRIGGER_CODEC_CONNECTION_SETUP, strlen(HFP_TRIGGER_CODEC_CONNECTION_SETUP)) == 0){ 896 return HFP_CMD_TRIGGER_CODEC_CONNECTION_SETUP; 897 } 898 899 if (strncmp(line_buffer+offset, HFP_CONFIRM_COMMON_CODEC, strlen(HFP_CONFIRM_COMMON_CODEC)) == 0){ 900 if (isHandsFree){ 901 return HFP_CMD_AG_SUGGESTED_CODEC; 902 } else { 903 return HFP_CMD_HF_CONFIRMED_CODEC; 904 } 905 } 906 907 if (strncmp(line_buffer+offset, "AT+", 3) == 0){ 908 log_info("process unknown HF command %s \n", line_buffer); 909 return HFP_CMD_UNKNOWN; 910 } 911 912 if (strncmp(line_buffer+offset, "+", 1) == 0){ 913 log_info(" process unknown AG command %s \n", line_buffer); 914 return HFP_CMD_UNKNOWN; 915 } 916 917 if (strncmp(line_buffer+offset, "NOP", 3) == 0){ 918 return HFP_CMD_NONE; 919 } 920 921 return HFP_CMD_NONE; 922 } 923 924 static void hfp_parser_store_byte(hfp_connection_t * hfp_connection, uint8_t byte){ 925 // printf("hfp_parser_store_byte %c at pos %u\n", (char) byte, context->line_size); 926 // TODO: add limit 927 hfp_connection->line_buffer[hfp_connection->line_size++] = byte; 928 hfp_connection->line_buffer[hfp_connection->line_size] = 0; 929 } 930 static int hfp_parser_is_buffer_empty(hfp_connection_t * hfp_connection){ 931 return hfp_connection->line_size == 0; 932 } 933 934 static int hfp_parser_is_end_of_line(uint8_t byte){ 935 return byte == '\n' || byte == '\r'; 936 } 937 938 static int hfp_parser_is_end_of_header(uint8_t byte){ 939 return hfp_parser_is_end_of_line(byte) || byte == ':' || byte == '?'; 940 } 941 942 static int hfp_parser_found_separator(hfp_connection_t * hfp_connection, uint8_t byte){ 943 if (hfp_connection->keep_byte == 1) return 1; 944 945 int found_separator = byte == ',' || byte == '\n'|| byte == '\r'|| 946 byte == ')' || byte == '(' || byte == ':' || 947 byte == '-' || byte == '"' || byte == '?'|| byte == '='; 948 return found_separator; 949 } 950 951 static void hfp_parser_next_state(hfp_connection_t * hfp_connection, uint8_t byte){ 952 hfp_connection->line_size = 0; 953 if (hfp_parser_is_end_of_line(byte)){ 954 hfp_connection->parser_item_index = 0; 955 hfp_connection->parser_state = HFP_PARSER_CMD_HEADER; 956 return; 957 } 958 switch (hfp_connection->parser_state){ 959 case HFP_PARSER_CMD_HEADER: 960 hfp_connection->parser_state = HFP_PARSER_CMD_SEQUENCE; 961 if (hfp_connection->keep_byte == 1){ 962 hfp_parser_store_byte(hfp_connection, byte); 963 hfp_connection->keep_byte = 0; 964 } 965 break; 966 case HFP_PARSER_CMD_SEQUENCE: 967 switch (hfp_connection->command){ 968 case HFP_CMD_AG_SENT_PHONE_NUMBER: 969 case HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE: 970 case HFP_CMD_AG_SENT_CLIP_INFORMATION: 971 case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS: 972 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME: 973 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT: 974 case HFP_CMD_RETRIEVE_AG_INDICATORS: 975 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE: 976 case HFP_CMD_HF_INDICATOR_STATUS: 977 hfp_connection->parser_state = HFP_PARSER_SECOND_ITEM; 978 break; 979 default: 980 break; 981 } 982 break; 983 case HFP_PARSER_SECOND_ITEM: 984 hfp_connection->parser_state = HFP_PARSER_THIRD_ITEM; 985 break; 986 case HFP_PARSER_THIRD_ITEM: 987 if (hfp_connection->command == HFP_CMD_RETRIEVE_AG_INDICATORS){ 988 hfp_connection->parser_state = HFP_PARSER_CMD_SEQUENCE; 989 break; 990 } 991 hfp_connection->parser_state = HFP_PARSER_CMD_HEADER; 992 break; 993 } 994 } 995 996 void hfp_parse(hfp_connection_t * hfp_connection, uint8_t byte, int isHandsFree){ 997 // handle ATD<dial_string>; 998 if (strncmp((const char*)hfp_connection->line_buffer, HFP_CALL_PHONE_NUMBER, strlen(HFP_CALL_PHONE_NUMBER)) == 0){ 999 // check for end-of-line or ';' 1000 if (byte == ';' || hfp_parser_is_end_of_line(byte)){ 1001 hfp_connection->line_buffer[hfp_connection->line_size] = 0; 1002 hfp_connection->line_size = 0; 1003 hfp_connection->command = HFP_CMD_CALL_PHONE_NUMBER; 1004 } else { 1005 hfp_connection->line_buffer[hfp_connection->line_size++] = byte; 1006 } 1007 return; 1008 } 1009 1010 // TODO: handle space inside word 1011 if (byte == ' ' && hfp_connection->parser_state > HFP_PARSER_CMD_HEADER) return; 1012 1013 if (byte == ',' && hfp_connection->command == HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE){ 1014 if (hfp_connection->line_size == 0){ 1015 hfp_connection->line_buffer[0] = 0; 1016 hfp_connection->ignore_value = 1; 1017 parse_sequence(hfp_connection); 1018 return; 1019 } 1020 } 1021 1022 if (!hfp_parser_found_separator(hfp_connection, byte)){ 1023 hfp_parser_store_byte(hfp_connection, byte); 1024 return; 1025 } 1026 1027 if (hfp_parser_is_end_of_line(byte)) { 1028 if (hfp_parser_is_buffer_empty(hfp_connection)){ 1029 hfp_connection->parser_state = HFP_PARSER_CMD_HEADER; 1030 } 1031 } 1032 if (hfp_parser_is_buffer_empty(hfp_connection)) return; 1033 1034 switch (hfp_connection->parser_state){ 1035 case HFP_PARSER_CMD_HEADER: // header 1036 if (byte == '='){ 1037 hfp_connection->keep_byte = 1; 1038 hfp_parser_store_byte(hfp_connection, byte); 1039 return; 1040 } 1041 1042 if (byte == '?'){ 1043 hfp_connection->keep_byte = 0; 1044 hfp_parser_store_byte(hfp_connection, byte); 1045 return; 1046 } 1047 1048 if (byte == ','){ 1049 hfp_connection->resolve_byte = 1; 1050 } 1051 1052 // printf(" parse header 2 %s, keep separator $ %d\n", hfp_connection->line_buffer, hfp_connection->keep_byte); 1053 if (hfp_parser_is_end_of_header(byte) || hfp_connection->keep_byte == 1){ 1054 // printf(" parse header 3 %s, keep separator $ %d\n", hfp_connection->line_buffer, hfp_connection->keep_byte); 1055 char * line_buffer = (char *)hfp_connection->line_buffer; 1056 hfp_connection->command = parse_command(line_buffer, isHandsFree); 1057 1058 /* resolve command name according to hfp_connection */ 1059 if (hfp_connection->command == HFP_CMD_UNKNOWN){ 1060 switch(hfp_connection->state){ 1061 case HFP_W4_LIST_GENERIC_STATUS_INDICATORS: 1062 hfp_connection->command = HFP_CMD_LIST_GENERIC_STATUS_INDICATORS; 1063 break; 1064 case HFP_W4_RETRIEVE_GENERIC_STATUS_INDICATORS: 1065 hfp_connection->command = HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS; 1066 break; 1067 case HFP_W4_RETRIEVE_INITITAL_STATE_GENERIC_STATUS_INDICATORS: 1068 hfp_connection->command = HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE; 1069 break; 1070 case HFP_W4_RETRIEVE_INDICATORS_STATUS: 1071 hfp_connection->command = HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS; 1072 break; 1073 case HFP_W4_RETRIEVE_INDICATORS: 1074 hfp_connection->send_ag_indicators_segment = 0; 1075 hfp_connection->command = HFP_CMD_RETRIEVE_AG_INDICATORS; 1076 break; 1077 default: 1078 break; 1079 } 1080 } 1081 } 1082 break; 1083 1084 case HFP_PARSER_CMD_SEQUENCE: 1085 parse_sequence(hfp_connection); 1086 break; 1087 case HFP_PARSER_SECOND_ITEM: 1088 switch (hfp_connection->command){ 1089 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME: 1090 log_info("format %s, ", hfp_connection->line_buffer); 1091 hfp_connection->network_operator.format = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1092 break; 1093 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT: 1094 log_info("format %s \n", hfp_connection->line_buffer); 1095 hfp_connection->network_operator.format = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1096 break; 1097 case HFP_CMD_LIST_GENERIC_STATUS_INDICATORS: 1098 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS: 1099 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE: 1100 hfp_connection->generic_status_indicators[hfp_connection->parser_item_index].state = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1101 break; 1102 case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS: 1103 hfp_connection->ag_indicators[hfp_connection->parser_item_index].status = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1104 log_info("%d \n", hfp_connection->ag_indicators[hfp_connection->parser_item_index].status); 1105 hfp_connection->ag_indicators[hfp_connection->parser_item_index].status_changed = 1; 1106 break; 1107 case HFP_CMD_RETRIEVE_AG_INDICATORS: 1108 hfp_connection->ag_indicators[hfp_connection->parser_item_index].min_range = btstack_atoi((char *)hfp_connection->line_buffer); 1109 log_info("%s, ", hfp_connection->line_buffer); 1110 break; 1111 case HFP_CMD_AG_SENT_PHONE_NUMBER: 1112 case HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE: 1113 case HFP_CMD_AG_SENT_CLIP_INFORMATION: 1114 hfp_connection->bnip_type = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1115 break; 1116 default: 1117 break; 1118 } 1119 break; 1120 1121 case HFP_PARSER_THIRD_ITEM: 1122 switch (hfp_connection->command){ 1123 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME: 1124 strncpy(hfp_connection->network_operator.name, (char *)hfp_connection->line_buffer, HFP_MAX_NETWORK_OPERATOR_NAME_SIZE); 1125 hfp_connection->network_operator.name[HFP_MAX_NETWORK_OPERATOR_NAME_SIZE - 1] = 0; 1126 log_info("name %s\n", hfp_connection->line_buffer); 1127 break; 1128 case HFP_CMD_RETRIEVE_AG_INDICATORS: 1129 hfp_connection->ag_indicators[hfp_connection->parser_item_index].max_range = btstack_atoi((char *)hfp_connection->line_buffer); 1130 hfp_connection->parser_item_index++; 1131 hfp_connection->ag_indicators_nr = hfp_connection->parser_item_index; 1132 log_info("%s)\n", hfp_connection->line_buffer); 1133 break; 1134 default: 1135 break; 1136 } 1137 break; 1138 } 1139 hfp_parser_next_state(hfp_connection, byte); 1140 1141 if (hfp_connection->resolve_byte && hfp_connection->command == HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE){ 1142 hfp_connection->resolve_byte = 0; 1143 hfp_connection->ignore_value = 1; 1144 parse_sequence(hfp_connection); 1145 hfp_connection->line_buffer[0] = 0; 1146 hfp_connection->line_size = 0; 1147 } 1148 } 1149 1150 static void parse_sequence(hfp_connection_t * hfp_connection){ 1151 int value; 1152 switch (hfp_connection->command){ 1153 case HFP_CMD_SET_GENERIC_STATUS_INDICATOR_STATUS: 1154 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1155 int i; 1156 switch (hfp_connection->parser_item_index){ 1157 case 0: 1158 for (i=0;i<hfp_connection->generic_status_indicators_nr;i++){ 1159 if (hfp_connection->generic_status_indicators[i].uuid == value){ 1160 hfp_connection->parser_indicator_index = i; 1161 break; 1162 } 1163 } 1164 break; 1165 case 1: 1166 if (hfp_connection->parser_indicator_index <0) break; 1167 hfp_connection->generic_status_indicators[hfp_connection->parser_indicator_index].state = value; 1168 log_info("HFP_CMD_SET_GENERIC_STATUS_INDICATOR_STATUS set indicator at index %u, to %u\n", 1169 hfp_connection->parser_item_index, value); 1170 break; 1171 default: 1172 break; 1173 } 1174 hfp_connection->parser_item_index++; 1175 break; 1176 1177 case HFP_CMD_GET_SUBSCRIBER_NUMBER_INFORMATION: 1178 switch(hfp_connection->parser_item_index){ 1179 case 0: 1180 strncpy(hfp_connection->bnip_number, (char *)hfp_connection->line_buffer, sizeof(hfp_connection->bnip_number)); 1181 hfp_connection->bnip_number[sizeof(hfp_connection->bnip_number)-1] = 0; 1182 break; 1183 case 1: 1184 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1185 hfp_connection->bnip_type = value; 1186 break; 1187 default: 1188 break; 1189 } 1190 hfp_connection->parser_item_index++; 1191 break; 1192 case HFP_CMD_LIST_CURRENT_CALLS: 1193 switch(hfp_connection->parser_item_index){ 1194 case 0: 1195 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1196 hfp_connection->clcc_idx = value; 1197 break; 1198 case 1: 1199 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1200 hfp_connection->clcc_dir = value; 1201 break; 1202 case 2: 1203 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1204 hfp_connection->clcc_status = value; 1205 break; 1206 case 3: 1207 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1208 hfp_connection->clcc_mpty = value; 1209 break; 1210 case 4: 1211 strncpy(hfp_connection->bnip_number, (char *)hfp_connection->line_buffer, sizeof(hfp_connection->bnip_number)); 1212 hfp_connection->bnip_number[sizeof(hfp_connection->bnip_number)-1] = 0; 1213 break; 1214 case 5: 1215 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1216 hfp_connection->bnip_type = value; 1217 break; 1218 default: 1219 break; 1220 } 1221 hfp_connection->parser_item_index++; 1222 break; 1223 case HFP_CMD_SET_MICROPHONE_GAIN: 1224 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1225 hfp_connection->microphone_gain = value; 1226 log_info("hfp parse HFP_CMD_SET_MICROPHONE_GAIN %d\n", value); 1227 break; 1228 case HFP_CMD_SET_SPEAKER_GAIN: 1229 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1230 hfp_connection->speaker_gain = value; 1231 log_info("hfp parse HFP_CMD_SET_SPEAKER_GAIN %d\n", value); 1232 break; 1233 case HFP_CMD_HF_ACTIVATE_VOICE_RECOGNITION: 1234 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1235 hfp_connection->ag_activate_voice_recognition = value; 1236 log_info("hfp parse HFP_CMD_HF_ACTIVATE_VOICE_RECOGNITION %d\n", value); 1237 break; 1238 case HFP_CMD_TURN_OFF_EC_AND_NR: 1239 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1240 hfp_connection->ag_echo_and_noise_reduction = value; 1241 log_info("hfp parse HFP_CMD_TURN_OFF_EC_AND_NR %d\n", value); 1242 break; 1243 case HFP_CMD_CHANGE_IN_BAND_RING_TONE_SETTING: 1244 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1245 hfp_connection->remote_supported_features = store_bit(hfp_connection->remote_supported_features, HFP_AGSF_IN_BAND_RING_TONE, value); 1246 log_info("hfp parse HFP_CHANGE_IN_BAND_RING_TONE_SETTING %d\n", value); 1247 break; 1248 case HFP_CMD_HF_CONFIRMED_CODEC: 1249 hfp_connection->codec_confirmed = btstack_atoi((char*)hfp_connection->line_buffer); 1250 log_info("hfp parse HFP_CMD_HF_CONFIRMED_CODEC %d\n", hfp_connection->codec_confirmed); 1251 break; 1252 case HFP_CMD_AG_SUGGESTED_CODEC: 1253 hfp_connection->suggested_codec = btstack_atoi((char*)hfp_connection->line_buffer); 1254 log_info("hfp parse HFP_CMD_AG_SUGGESTED_CODEC %d\n", hfp_connection->suggested_codec); 1255 break; 1256 case HFP_CMD_SUPPORTED_FEATURES: 1257 hfp_connection->remote_supported_features = btstack_atoi((char*)hfp_connection->line_buffer); 1258 log_info("Parsed supported feature %d\n", (int) hfp_connection->remote_supported_features); 1259 break; 1260 case HFP_CMD_AVAILABLE_CODECS: 1261 log_info("Parsed codec %s\n", hfp_connection->line_buffer); 1262 hfp_connection->remote_codecs[hfp_connection->parser_item_index] = (uint16_t)btstack_atoi((char*)hfp_connection->line_buffer); 1263 hfp_connection->parser_item_index++; 1264 hfp_connection->remote_codecs_nr = hfp_connection->parser_item_index; 1265 break; 1266 case HFP_CMD_RETRIEVE_AG_INDICATORS: 1267 strncpy((char *)hfp_connection->ag_indicators[hfp_connection->parser_item_index].name, (char *)hfp_connection->line_buffer, HFP_MAX_INDICATOR_DESC_SIZE); 1268 hfp_connection->ag_indicators[hfp_connection->parser_item_index].name[HFP_MAX_INDICATOR_DESC_SIZE-1] = 0; 1269 hfp_connection->ag_indicators[hfp_connection->parser_item_index].index = hfp_connection->parser_item_index+1; 1270 log_info("Indicator %d: %s (", hfp_connection->ag_indicators_nr+1, hfp_connection->line_buffer); 1271 break; 1272 case HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS: 1273 log_info("Parsed Indicator %d with status: %s\n", hfp_connection->parser_item_index+1, hfp_connection->line_buffer); 1274 hfp_connection->ag_indicators[hfp_connection->parser_item_index].status = btstack_atoi((char *) hfp_connection->line_buffer); 1275 hfp_connection->parser_item_index++; 1276 break; 1277 case HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE: 1278 hfp_connection->parser_item_index++; 1279 if (hfp_connection->parser_item_index != 4) break; 1280 log_info("Parsed Enable indicators: %s\n", hfp_connection->line_buffer); 1281 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1282 hfp_connection->enable_status_update_for_ag_indicators = (uint8_t) value; 1283 break; 1284 case HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES: 1285 log_info("Parsed Support call hold: %s\n", hfp_connection->line_buffer); 1286 if (hfp_connection->line_size > 2 ) break; 1287 strncpy((char *)hfp_connection->remote_call_services[hfp_connection->remote_call_services_nr].name, (char *)hfp_connection->line_buffer, HFP_CALL_SERVICE_SIZE); 1288 hfp_connection->remote_call_services[hfp_connection->remote_call_services_nr].name[HFP_CALL_SERVICE_SIZE - 1] = 0; 1289 hfp_connection->remote_call_services_nr++; 1290 break; 1291 case HFP_CMD_LIST_GENERIC_STATUS_INDICATORS: 1292 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS: 1293 log_info("Parsed Generic status indicator: %s\n", hfp_connection->line_buffer); 1294 hfp_connection->generic_status_indicators[hfp_connection->parser_item_index].uuid = (uint16_t)btstack_atoi((char*)hfp_connection->line_buffer); 1295 hfp_connection->parser_item_index++; 1296 hfp_connection->generic_status_indicators_nr = hfp_connection->parser_item_index; 1297 break; 1298 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE: 1299 // HF parses inital AG gen. ind. state 1300 log_info("Parsed List generic status indicator %s state: ", hfp_connection->line_buffer); 1301 hfp_connection->parser_item_index = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1302 break; 1303 case HFP_CMD_HF_INDICATOR_STATUS: 1304 hfp_connection->parser_indicator_index = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1305 log_info("Parsed HF indicator index %u", hfp_connection->parser_indicator_index); 1306 break; 1307 case HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE: 1308 // AG parses new gen. ind. state 1309 if (hfp_connection->ignore_value){ 1310 hfp_connection->ignore_value = 0; 1311 log_info("Parsed Enable AG indicator pos %u('%s') - unchanged (stays %u)\n", hfp_connection->parser_item_index, 1312 hfp_connection->ag_indicators[hfp_connection->parser_item_index].name, hfp_connection->ag_indicators[hfp_connection->parser_item_index].enabled); 1313 } 1314 else if (hfp_connection->ag_indicators[hfp_connection->parser_item_index].mandatory){ 1315 log_info("Parsed Enable AG indicator pos %u('%s') - ignore (mandatory)\n", 1316 hfp_connection->parser_item_index, hfp_connection->ag_indicators[hfp_connection->parser_item_index].name); 1317 } else { 1318 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1319 hfp_connection->ag_indicators[hfp_connection->parser_item_index].enabled = value; 1320 log_info("Parsed Enable AG indicator pos %u('%s'): %u\n", hfp_connection->parser_item_index, 1321 hfp_connection->ag_indicators[hfp_connection->parser_item_index].name, value); 1322 } 1323 hfp_connection->parser_item_index++; 1324 break; 1325 case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS: 1326 // indicators are indexed starting with 1 1327 hfp_connection->parser_item_index = btstack_atoi((char *)&hfp_connection->line_buffer[0]) - 1; 1328 log_info("Parsed status of the AG indicator %d, status ", hfp_connection->parser_item_index); 1329 break; 1330 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME: 1331 hfp_connection->network_operator.mode = btstack_atoi((char *)&hfp_connection->line_buffer[0]); 1332 log_info("Parsed network operator mode: %d, ", hfp_connection->network_operator.mode); 1333 break; 1334 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT: 1335 if (hfp_connection->line_buffer[0] == '3'){ 1336 log_info("Parsed Set network operator format : %s, ", hfp_connection->line_buffer); 1337 break; 1338 } 1339 // TODO emit ERROR, wrong format 1340 log_info("ERROR Set network operator format: index %s not supported\n", hfp_connection->line_buffer); 1341 break; 1342 case HFP_CMD_ERROR: 1343 break; 1344 case HFP_CMD_EXTENDED_AUDIO_GATEWAY_ERROR: 1345 hfp_connection->extended_audio_gateway_error = 1; 1346 hfp_connection->extended_audio_gateway_error_value = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1347 break; 1348 case HFP_CMD_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR: 1349 hfp_connection->enable_extended_audio_gateway_error_report = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer); 1350 hfp_connection->ok_pending = 1; 1351 hfp_connection->extended_audio_gateway_error = 0; 1352 break; 1353 case HFP_CMD_AG_SENT_PHONE_NUMBER: 1354 case HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE: 1355 case HFP_CMD_AG_SENT_CLIP_INFORMATION: 1356 strncpy(hfp_connection->bnip_number, (char *)hfp_connection->line_buffer, sizeof(hfp_connection->bnip_number)); 1357 hfp_connection->bnip_number[sizeof(hfp_connection->bnip_number)-1] = 0; 1358 break; 1359 default: 1360 break; 1361 } 1362 } 1363 1364 void hfp_establish_service_level_connection(bd_addr_t bd_addr, uint16_t service_uuid){ 1365 hfp_connection_t * hfp_connection = provide_hfp_connection_context_for_bd_addr(bd_addr); 1366 log_info("hfp_connect %s, hfp_connection %p", bd_addr_to_str(bd_addr), hfp_connection); 1367 1368 if (!hfp_connection) { 1369 log_error("hfp_establish_service_level_connection for addr %s failed", bd_addr_to_str(bd_addr)); 1370 return; 1371 } 1372 1373 switch (hfp_connection->state){ 1374 case HFP_W2_DISCONNECT_RFCOMM: 1375 hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED; 1376 return; 1377 case HFP_W4_RFCOMM_DISCONNECTED: 1378 hfp_connection->state = HFP_W4_RFCOMM_DISCONNECTED_AND_RESTART; 1379 return; 1380 case HFP_IDLE: 1381 memcpy(hfp_connection->remote_addr, bd_addr, 6); 1382 hfp_connection->state = HFP_W4_SDP_QUERY_COMPLETE; 1383 connection_doing_sdp_query = hfp_connection; 1384 hfp_connection->service_uuid = service_uuid; 1385 sdp_client_query_rfcomm_channel_and_name_for_uuid(&handle_query_rfcomm_event, hfp_connection->remote_addr, service_uuid); 1386 break; 1387 default: 1388 break; 1389 } 1390 } 1391 1392 void hfp_release_service_level_connection(hfp_connection_t * hfp_connection){ 1393 if (!hfp_connection) return; 1394 hfp_release_audio_connection(hfp_connection); 1395 1396 if (hfp_connection->state < HFP_W4_RFCOMM_CONNECTED){ 1397 hfp_connection->state = HFP_IDLE; 1398 return; 1399 } 1400 1401 if (hfp_connection->state == HFP_W4_RFCOMM_CONNECTED){ 1402 hfp_connection->state = HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN; 1403 return; 1404 } 1405 1406 if (hfp_connection->state < HFP_W4_SCO_CONNECTED){ 1407 hfp_connection->state = HFP_W2_DISCONNECT_RFCOMM; 1408 return; 1409 } 1410 1411 if (hfp_connection->state < HFP_W4_SCO_DISCONNECTED){ 1412 hfp_connection->state = HFP_W2_DISCONNECT_SCO; 1413 return; 1414 } 1415 1416 return; 1417 } 1418 1419 void hfp_release_audio_connection(hfp_connection_t * hfp_connection){ 1420 if (!hfp_connection) return; 1421 if (hfp_connection->state >= HFP_W2_DISCONNECT_SCO) return; 1422 hfp_connection->release_audio_connection = 1; 1423 } 1424 1425 static const struct link_settings { 1426 const uint16_t max_latency; 1427 const uint8_t retransmission_effort; 1428 const uint16_t packet_types; 1429 } hfp_link_settings [] = { 1430 { 0xffff, 0xff, 0x03c1 }, // HFP_LINK_SETTINGS_D0, HV1 1431 { 0xffff, 0xff, 0x03c4 }, // HFP_LINK_SETTINGS_D1, HV3 1432 { 0x0007, 0x01, 0x03c8 }, // HFP_LINK_SETTINGS_S1, EV3 1433 { 0x0007, 0x01, 0x0380 }, // HFP_LINK_SETTINGS_S2, 2-EV3 1434 { 0x000a, 0x01, 0x0380 }, // HFP_LINK_SETTINGS_S3, 2-EV3 1435 { 0x000c, 0x02, 0x0380 }, // HFP_LINK_SETTINGS_S4, 2-EV3 1436 { 0x0008, 0x02, 0x03c8 }, // HFP_LINK_SETTINGS_T1, EV3 1437 { 0x000d, 0x02, 0x0380 } // HFP_LINK_SETTINGS_T2, 2-EV3 1438 }; 1439 1440 void hfp_setup_synchronous_connection(hfp_connection_t * hfp_connection){ 1441 // all packet types, fixed bandwidth 1442 int setting = hfp_connection->link_setting; 1443 log_info("hfp_setup_synchronous_connection using setting nr %u", setting); 1444 sco_establishment_active = hfp_connection; 1445 uint16_t sco_voice_setting = hci_get_sco_voice_setting(); 1446 if (hfp_connection->negotiated_codec == HFP_CODEC_MSBC){ 1447 sco_voice_setting = 0x0043; // Transparent data 1448 } 1449 hci_send_cmd(&hci_setup_synchronous_connection, hfp_connection->acl_handle, 8000, 8000, hfp_link_settings[setting].max_latency, 1450 sco_voice_setting, hfp_link_settings[setting].retransmission_effort, hfp_link_settings[setting].packet_types); // all types 0x003f, only 2-ev3 0x380 1451 } 1452 1453 void hfp_set_packet_handler_for_rfcomm_connections(btstack_packet_handler_t handler){ 1454 rfcomm_packet_handler = handler; 1455 } 1456 1457