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