mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-14 10:21:49 +00:00
hid_device: allow separate disconnects
This commit is contained in:
parent
6510739ba0
commit
57c18996ad
@ -63,7 +63,6 @@ typedef struct hid_device {
|
||||
uint16_t interrupt_cid;
|
||||
uint8_t incoming;
|
||||
uint8_t connected;
|
||||
|
||||
hid_device_state_t state;
|
||||
hid_report_type_t report_type;
|
||||
uint16_t report_id;
|
||||
@ -448,13 +447,15 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t * pack
|
||||
|
||||
// connected_before = device->connected;
|
||||
device->incoming = 0;
|
||||
if (l2cap_event_channel_closed_get_local_cid(packet) == device->control_cid){
|
||||
log_info("HID Control closed");
|
||||
device->control_cid = 0;
|
||||
}
|
||||
if (l2cap_event_channel_closed_get_local_cid(packet) == device->interrupt_cid){
|
||||
log_info("HID Interrupt closed");
|
||||
device->interrupt_cid = 0;
|
||||
printf("HID Interrupt closed \n");
|
||||
}
|
||||
if (l2cap_event_channel_closed_get_local_cid(packet) == device->control_cid){
|
||||
log_info("HID Control closed");
|
||||
device->control_cid = 0;
|
||||
printf("HID Control closed \n");
|
||||
}
|
||||
if (!device->interrupt_cid && !device->control_cid){
|
||||
device->connected = 0;
|
||||
@ -464,8 +465,8 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t * pack
|
||||
hid_device_emit_connection_closed_event(device);
|
||||
}
|
||||
break;
|
||||
case L2CAP_EVENT_CAN_SEND_NOW:
|
||||
|
||||
case L2CAP_EVENT_CAN_SEND_NOW:
|
||||
device = hid_device_get_instance_for_cid(l2cap_event_can_send_now_get_local_cid(packet));
|
||||
if (!device) return;
|
||||
switch (device->state){
|
||||
@ -575,7 +576,6 @@ uint8_t hid_device_connect(bd_addr_t addr, uint16_t * hid_cid){
|
||||
// create l2cap control using fixed HID L2CAP PSM
|
||||
log_info("Create outgoing HID Control");
|
||||
uint8_t status = l2cap_create_channel(packet_handler, hid_device->bd_addr, PSM_HID_CONTROL, 48, &hid_device->control_cid);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -584,6 +584,30 @@ uint8_t hid_device_connect(bd_addr_t addr, uint16_t * hid_cid){
|
||||
* @param hid_cid
|
||||
* @result status
|
||||
*/
|
||||
void hid_device_disconnect_interrupt_channel(uint16_t hid_cid){
|
||||
hid_device_t * hid_device = hid_device_get_instance_for_cid(hid_cid);
|
||||
if (!hid_device){
|
||||
log_error("hid_device_disconnect_interrupt_channel: could not find hid device instace");
|
||||
return;
|
||||
}
|
||||
log_info("Disconnect from interrupt channel HID Host");
|
||||
if (hid_device->interrupt_cid){
|
||||
l2cap_disconnect(hid_device->interrupt_cid, 0); // reason isn't used
|
||||
}
|
||||
}
|
||||
|
||||
void hid_device_disconnect_control_channel(uint16_t hid_cid){
|
||||
hid_device_t * hid_device = hid_device_get_instance_for_cid(hid_cid);
|
||||
if (!hid_device){
|
||||
log_error("hid_device_disconnect_control_channel: could not find hid device instace");
|
||||
return;
|
||||
}
|
||||
log_info("Disconnect from control channel HID Host");
|
||||
if (hid_device->control_cid){
|
||||
l2cap_disconnect(hid_device->control_cid, 0); // reason isn't used
|
||||
}
|
||||
}
|
||||
|
||||
void hid_device_disconnect(uint16_t hid_cid){
|
||||
hid_device_t * hid_device = hid_device_get_instance_for_cid(hid_cid);
|
||||
if (!hid_device){
|
||||
@ -591,10 +615,10 @@ void hid_device_disconnect(uint16_t hid_cid){
|
||||
return;
|
||||
}
|
||||
log_info("Disconnect from HID Host");
|
||||
if (hid_device->control_cid){
|
||||
l2cap_disconnect(hid_device->control_cid, 0); // reason isn't used
|
||||
}
|
||||
if (hid_device->interrupt_cid){
|
||||
l2cap_disconnect(hid_device->interrupt_cid, 0); // reason isn't used
|
||||
}
|
||||
if (hid_device->control_cid){
|
||||
l2cap_disconnect(hid_device->control_cid, 0); // reason isn't used
|
||||
}
|
||||
}
|
||||
|
@ -170,6 +170,10 @@ void hid_device_send_control_message(uint16_t hid_cid, const uint8_t * message,
|
||||
|
||||
/* API_END */
|
||||
|
||||
/* Only needed for PTS Testing */
|
||||
void hid_device_disconnect_interrupt_channel(uint16_t hid_cid);
|
||||
void hid_device_disconnect_control_channel(uint16_t hid_cid);
|
||||
|
||||
#if defined __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -283,14 +283,22 @@ static void stdin_process(char character){
|
||||
uint8_t keycode;
|
||||
int found;
|
||||
switch (character){
|
||||
case 'C':
|
||||
case 'D':
|
||||
printf("Disconnect from %s...\n", bd_addr_to_str(device_addr));
|
||||
hid_device_disconnect(hid_cid);
|
||||
break;
|
||||
case 'c':
|
||||
printf("Connecting to %s...\n", bd_addr_to_str(device_addr));
|
||||
printf("Connecting %s...\n", bd_addr_to_str(device_addr));
|
||||
hid_device_connect(device_addr, &hid_cid);
|
||||
return;
|
||||
case 'I':
|
||||
printf("Disconnect from intrrupt channel %s...\n", bd_addr_to_str(device_addr));
|
||||
hid_device_disconnect_interrupt_channel(hid_cid);
|
||||
break;
|
||||
case 'C':
|
||||
printf("Disconnect from control channel %s...\n", bd_addr_to_str(device_addr));
|
||||
hid_device_disconnect_control_channel(hid_cid);
|
||||
break;
|
||||
case 'l':
|
||||
printf("set limited discoverable mode\n");
|
||||
gap_discoverable_control(1);
|
||||
|
Loading…
x
Reference in New Issue
Block a user