hfp: register for hci events in hfp.c instead of hfp_ag and hfp_hf

This commit is contained in:
Matthias Ringwald 2018-04-09 15:32:46 +02:00
parent e9c22d4ea1
commit 520c92d527
4 changed files with 34 additions and 34 deletions

View File

@ -106,6 +106,8 @@ static btstack_packet_handler_t hfp_ag_callback;
static btstack_packet_handler_t hfp_hf_rfcomm_packet_handler;
static btstack_packet_handler_t hfp_ag_rfcomm_packet_handler;
static btstack_packet_callback_registration_t hci_event_callback_registration;
static hfp_connection_t * sco_establishment_active;
void hfp_set_hf_callback(btstack_packet_handler_t callback){
@ -498,7 +500,18 @@ static void handle_query_rfcomm_event(uint8_t packet_type, uint16_t channel, uin
if (hfp_connection->rfcomm_channel_nr > 0){
hfp_connection->state = HFP_W4_RFCOMM_CONNECTED;
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);
btstack_packet_handler_t packet_handler = hfp_connection->local_role == HFP_ROLE_AG ? hfp_ag_rfcomm_packet_handler : hfp_hf_rfcomm_packet_handler;
btstack_packet_handler_t packet_handler;
switch (hfp_connection->local_role){
case HFP_ROLE_AG:
packet_handler = hfp_ag_rfcomm_packet_handler;
break;
case HFP_ROLE_HF:
packet_handler = hfp_hf_rfcomm_packet_handler;
break;
default:
log_error("Role %x", hfp_connection->local_role);
return;
}
rfcomm_create_channel(packet_handler, hfp_connection->remote_addr, hfp_connection->rfcomm_channel_nr, NULL);
break;
}
@ -583,6 +596,9 @@ void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet
break;
case RFCOMM_EVENT_INCOMING_CONNECTION:
if (local_role > 1){
log_error("hfp_handle_hci_event role %x", local_role);
}
// data: event (8), len(8), address(48), channel (8), rfcomm_cid (16)
rfcomm_event_incoming_connection_get_bd_addr(packet, event_addr);
hfp_connection = provide_hfp_connection_context_for_bd_addr(event_addr, local_role);
@ -707,6 +723,9 @@ void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet
}
case RFCOMM_EVENT_CHANNEL_CLOSED:
if (local_role > 1){
log_error("hfp_handle_hci_event role %x", local_role);
}
rfcomm_cid = little_endian_read_16(packet,2);
hfp_connection = get_hfp_connection_context_for_rfcomm_cid(rfcomm_cid);
if (!hfp_connection) break;
@ -1478,3 +1497,11 @@ void hfp_set_hf_rfcomm_packet_handler(btstack_packet_handler_t handler){
hfp_hf_rfcomm_packet_handler = handler;
}
static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
hfp_handle_hci_event(packet_type, channel, packet, size, HFP_ROLE_INVALID);
}
void hfp_init(void){
hci_event_callback_registration.callback = &packet_handler;
hci_add_event_handler(&hci_event_callback_registration);
}

View File

@ -155,7 +155,8 @@ extern "C" {
#define HFP_CODEC_MSBC 0x02
typedef enum {
HFP_ROLE_AG = 0,
HFP_ROLE_INVALID = 0,
HFP_ROLE_AG,
HFP_ROLE_HF,
} hfp_role_t;
@ -647,6 +648,8 @@ void hfp_set_ag_rfcomm_packet_handler(btstack_packet_handler_t handler);
void hfp_set_hf_callback(btstack_packet_handler_t callback);
void hfp_set_hf_rfcomm_packet_handler(btstack_packet_handler_t handler);
void hfp_init(void);
void hfp_create_sdp_record(uint8_t * service, uint32_t service_record_handle, uint16_t service_uuid, int rfcomm_channel_nr, const char * name);
void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size, hfp_role_t local_role);
void hfp_emit_event(hfp_connection_t * hfp_connection, uint8_t event_subtype, uint8_t value);

View File

@ -106,7 +106,6 @@ static int hfp_ag_response_and_hold_active = 0;
static hfp_phone_number_t * subscriber_numbers = NULL;
static int subscriber_numbers_count = 0;
static btstack_packet_callback_registration_t hci_event_callback_registration;
hfp_ag_indicator_t * hfp_ag_get_ag_indicators(hfp_connection_t * hfp_connection);
@ -2005,18 +2004,6 @@ static void hfp_run(void){
}
}
static void hci_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
switch (packet_type){
case HCI_EVENT_PACKET:
hfp_handle_hci_event(packet_type, channel, packet, size, HFP_ROLE_AG);
break;
default:
break;
}
hfp_run();
}
static void rfcomm_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
switch (packet_type){
case RFCOMM_DATA_PACKET:
@ -2071,9 +2058,7 @@ void hfp_ag_init_call_hold_services(int call_hold_services_nr, const char * call
void hfp_ag_init(uint16_t rfcomm_channel_nr){
// register for HCI events
hci_event_callback_registration.callback = &hci_packet_handler;
hci_add_event_handler(&hci_event_callback_registration);
hfp_init();
rfcomm_register_service(&rfcomm_packet_handler, rfcomm_channel_nr, 0xffff);
hfp_set_ag_rfcomm_packet_handler(&rfcomm_packet_handler);

View File

@ -85,8 +85,6 @@ static hfp_callheld_status_t hfp_callheld_status;
static char phone_number[25];
static btstack_packet_callback_registration_t hci_event_callback_registration;
void hfp_hf_register_packet_handler(btstack_packet_handler_t callback){
if (callback == NULL){
log_error("hfp_hf_register_packet_handler called with NULL callback");
@ -1069,17 +1067,6 @@ static void hfp_run(void){
}
}
static void hci_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
switch (packet_type){
case HCI_EVENT_PACKET:
hfp_handle_hci_event(packet_type, channel, packet, size, HFP_ROLE_HF);
break;
default:
break;
}
hfp_run();
}
static void rfcomm_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
switch (packet_type){
case RFCOMM_DATA_PACKET:
@ -1095,9 +1082,7 @@ static void rfcomm_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t
}
void hfp_hf_init(uint16_t rfcomm_channel_nr){
// register for HCI events
hci_event_callback_registration.callback = &hci_packet_handler;
hci_add_event_handler(&hci_event_callback_registration);
hfp_init();
rfcomm_register_service(rfcomm_packet_handler, rfcomm_channel_nr, 0xffff);
hfp_set_hf_rfcomm_packet_handler(&rfcomm_packet_handler);