diff --git a/include/btstack/hci_cmds.h b/include/btstack/hci_cmds.h index 9e965971b..e355c9033 100644 --- a/include/btstack/hci_cmds.h +++ b/include/btstack/hci_cmds.h @@ -614,6 +614,9 @@ extern "C" { #define HSP_SUBEVENT_ERROR 0x07 #define HSP_SUBEVENT_RING 0x08 +#define HCI_EVENT_HFP_META 0xE9 + +#define HFP_SUBEVENT_AUDIO_CONNECTION_COMPLETE 0x01 // ANCS Client #define ANCS_CLIENT_CONNECTED 0xF0 diff --git a/src/hfp.c b/src/hfp.c index 39c758b27..b031ccb84 100644 --- a/src/hfp.c +++ b/src/hfp.c @@ -230,6 +230,21 @@ static void handle_query_rfcomm_event(sdp_query_event_t * event, void * context) } } +static void hfp_reset_state(hfp_connection_t * connection){ + if (!connection) return; + connection->state = HFP_IDLE; +} + +static void emit_event(hfp_callback_t callback, uint8_t event_subtype, uint8_t value){ + if (!callback) return; + uint8_t event[4]; + event[0] = HCI_EVENT_HFP_META; + event[1] = sizeof(event) - 2; + event[2] = event_subtype; + event[3] = value; // status 0 == OK + (*callback)(event, sizeof(event)); +} + hfp_connection_t * handle_hci_event(uint8_t packet_type, uint8_t *packet, uint16_t size){ if (packet_type != HCI_EVENT_PACKET) return NULL; @@ -266,18 +281,19 @@ hfp_connection_t * handle_hci_event(uint8_t packet_type, uint8_t *packet, uint16 case RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE: // data: event(8), len(8), status (8), address (48), handle(16), server channel(8), rfcomm_cid(16), max frame size(16) - if (packet[2]) { - // hfp_hf_reset_state(); - // emit_event(HFP_SUBEVENT_AUDIO_CONNECTION_COMPLETE, packet[2]); - } else { - bt_flip_addr(event_addr, &packet[2]); - context = provide_hfp_connection_context_for_bd_addr(event_addr); - - if (!context || context->state != HFP_W4_RFCOMM_CONNECTED) return context; + bt_flip_addr(event_addr, &packet[2]); + context = provide_hfp_connection_context_for_bd_addr(event_addr); + + if (!context || context->state != HFP_W4_RFCOMM_CONNECTED) return context; + if (packet[2]) { + hfp_reset_state(context); + emit_event(context->callback, HFP_SUBEVENT_AUDIO_CONNECTION_COMPLETE, packet[2]); + } else { context->con_handle = READ_BT_16(packet, 9); context->rfcomm_cid = READ_BT_16(packet, 12); uint16_t mtu = READ_BT_16(packet, 14); + printf("RFCOMM channel open succeeded. New RFCOMM Channel ID %u, max frame size %u\n", context->rfcomm_cid, mtu); } break; diff --git a/src/hfp_ag.c b/src/hfp_ag.c index 161f8904b..1ced29e07 100644 --- a/src/hfp_ag.c +++ b/src/hfp_ag.c @@ -102,8 +102,8 @@ static void packet_handler(void * connection, uint8_t packet_type, uint16_t chan } void hfp_ag_init(uint16_t rfcomm_channel_nr){ - rfcomm_register_packet_handler(packet_handler); hfp_init(rfcomm_channel_nr); + rfcomm_register_packet_handler(packet_handler); } void hfp_ag_connect(bd_addr_t bd_addr){ diff --git a/src/hfp_hf.c b/src/hfp_hf.c index c0262b107..1638d91b0 100644 --- a/src/hfp_hf.c +++ b/src/hfp_hf.c @@ -72,15 +72,6 @@ void hfp_hf_create_service(uint8_t * service, int rfcomm_channel_nr, const char hfp_create_service(service, SDP_Handsfree, rfcomm_channel_nr, name, supported_features); } -// static void hfp_hf_reset_state(uint16_t con_handle){ -// hfp_connection_t * connection = provide_hfp_connection_context_for_conn_handle(con_handle); -// if (!connection) { -// log_error("hfp_hf_reset_state for handle 0x%02x failed", con_handle); -// return; -// } -// connection->state = HFP_IDLE; -// } - void hfp_hf_init(uint16_t rfcomm_channel_nr){ hfp_init(rfcomm_channel_nr); rfcomm_register_packet_handler(packet_handler); @@ -113,5 +104,5 @@ void hfp_hf_connect(bd_addr_t bd_addr){ } void hfp_hf_disconnect(bd_addr_t bd_addr){ - + } \ No newline at end of file