xref: /btstack/src/classic/hfp.c (revision 9dc32eb425c45f51cd4be899bc05cae06f314fba)
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