mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-07 16:20:19 +00:00
hfp: handle RFCOMM channel open failed
This commit is contained in:
parent
fc4dcb0960
commit
fdba85bc1b
@ -614,6 +614,9 @@ extern "C" {
|
|||||||
#define HSP_SUBEVENT_ERROR 0x07
|
#define HSP_SUBEVENT_ERROR 0x07
|
||||||
#define HSP_SUBEVENT_RING 0x08
|
#define HSP_SUBEVENT_RING 0x08
|
||||||
|
|
||||||
|
#define HCI_EVENT_HFP_META 0xE9
|
||||||
|
|
||||||
|
#define HFP_SUBEVENT_AUDIO_CONNECTION_COMPLETE 0x01
|
||||||
|
|
||||||
// ANCS Client
|
// ANCS Client
|
||||||
#define ANCS_CLIENT_CONNECTED 0xF0
|
#define ANCS_CLIENT_CONNECTED 0xF0
|
||||||
|
32
src/hfp.c
32
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){
|
hfp_connection_t * handle_hci_event(uint8_t packet_type, uint8_t *packet, uint16_t size){
|
||||||
if (packet_type != HCI_EVENT_PACKET) return NULL;
|
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:
|
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)
|
// data: event(8), len(8), status (8), address (48), handle(16), server channel(8), rfcomm_cid(16), max frame size(16)
|
||||||
if (packet[2]) {
|
bt_flip_addr(event_addr, &packet[2]);
|
||||||
// hfp_hf_reset_state();
|
context = provide_hfp_connection_context_for_bd_addr(event_addr);
|
||||||
// emit_event(HFP_SUBEVENT_AUDIO_CONNECTION_COMPLETE, packet[2]);
|
|
||||||
} else {
|
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->con_handle = READ_BT_16(packet, 9);
|
||||||
context->rfcomm_cid = READ_BT_16(packet, 12);
|
context->rfcomm_cid = READ_BT_16(packet, 12);
|
||||||
uint16_t mtu = READ_BT_16(packet, 14);
|
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);
|
printf("RFCOMM channel open succeeded. New RFCOMM Channel ID %u, max frame size %u\n", context->rfcomm_cid, mtu);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -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){
|
void hfp_ag_init(uint16_t rfcomm_channel_nr){
|
||||||
rfcomm_register_packet_handler(packet_handler);
|
|
||||||
hfp_init(rfcomm_channel_nr);
|
hfp_init(rfcomm_channel_nr);
|
||||||
|
rfcomm_register_packet_handler(packet_handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
void hfp_ag_connect(bd_addr_t bd_addr){
|
void hfp_ag_connect(bd_addr_t bd_addr){
|
||||||
|
11
src/hfp_hf.c
11
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);
|
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){
|
void hfp_hf_init(uint16_t rfcomm_channel_nr){
|
||||||
hfp_init(rfcomm_channel_nr);
|
hfp_init(rfcomm_channel_nr);
|
||||||
rfcomm_register_packet_handler(packet_handler);
|
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){
|
void hfp_hf_disconnect(bd_addr_t bd_addr){
|
||||||
|
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user