mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-25 09:02:30 +00:00
hid_host: fix delete descriptor similar to PR #528
This commit is contained in:
parent
9c228539c3
commit
04b99c5b35
@ -121,12 +121,15 @@ static hid_host_connection_t * hid_host_get_connection_for_l2cap_cid(uint16_t l2
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void hid_descriptor_storage_init(hid_host_connection_t * connection){
|
static void hid_descriptor_storage_init(hid_host_connection_t * connection){
|
||||||
|
// reserve remaining space for this connection
|
||||||
|
uint16_t available_space = hid_descriptor_storage_get_available_space();
|
||||||
connection->hid_descriptor_len = 0;
|
connection->hid_descriptor_len = 0;
|
||||||
connection->hid_descriptor_max_len = hid_descriptor_storage_get_available_space();
|
connection->hid_descriptor_max_len = available_space;
|
||||||
connection->hid_descriptor_offset = hid_host_descriptor_storage_len - connection->hid_descriptor_max_len;
|
connection->hid_descriptor_offset = hid_host_descriptor_storage_len - available_space;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool hid_descriptor_storage_store(hid_host_connection_t * connection, uint8_t byte){
|
static bool hid_descriptor_storage_store(hid_host_connection_t * connection, uint8_t byte){
|
||||||
|
// store single hid descriptor byte
|
||||||
if (connection->hid_descriptor_len >= connection->hid_descriptor_max_len) return false;
|
if (connection->hid_descriptor_len >= connection->hid_descriptor_max_len) return false;
|
||||||
|
|
||||||
hid_host_descriptor_storage[connection->hid_descriptor_offset + connection->hid_descriptor_len] = byte;
|
hid_host_descriptor_storage[connection->hid_descriptor_offset + connection->hid_descriptor_len] = byte;
|
||||||
@ -135,26 +138,33 @@ static bool hid_descriptor_storage_store(hid_host_connection_t * connection, uin
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void hid_descriptor_storage_delete(hid_host_connection_t * connection){
|
static void hid_descriptor_storage_delete(hid_host_connection_t * connection){
|
||||||
|
uint16_t descriptor_len = connection->hid_descriptor_len;
|
||||||
|
|
||||||
|
if (descriptor_len > 0){
|
||||||
uint16_t next_offset = connection->hid_descriptor_offset + connection->hid_descriptor_len;
|
uint16_t next_offset = connection->hid_descriptor_offset + connection->hid_descriptor_len;
|
||||||
|
|
||||||
|
// move higher descriptors down
|
||||||
memmove(&hid_host_descriptor_storage[connection->hid_descriptor_offset],
|
memmove(&hid_host_descriptor_storage[connection->hid_descriptor_offset],
|
||||||
&hid_host_descriptor_storage[next_offset],
|
&hid_host_descriptor_storage[next_offset],
|
||||||
hid_host_descriptor_storage_len - next_offset);
|
hid_host_descriptor_storage_len - next_offset);
|
||||||
|
|
||||||
connection->hid_descriptor_len = 0;
|
// fix descriptor offset of higher descriptors
|
||||||
connection->hid_descriptor_offset = 0;
|
|
||||||
|
|
||||||
btstack_linked_list_iterator_t it;
|
btstack_linked_list_iterator_t it;
|
||||||
btstack_linked_list_iterator_init(&it, &hid_host_connections);
|
btstack_linked_list_iterator_init(&it, &hid_host_connections);
|
||||||
while (btstack_linked_list_iterator_has_next(&it)){
|
while (btstack_linked_list_iterator_has_next(&it)){
|
||||||
hid_host_connection_t * conn = (hid_host_connection_t *)btstack_linked_list_iterator_next(&it);
|
hid_host_connection_t * conn = (hid_host_connection_t *)btstack_linked_list_iterator_next(&it);
|
||||||
|
if (conn == connection) continue;
|
||||||
if (conn->hid_descriptor_offset >= next_offset){
|
if (conn->hid_descriptor_offset >= next_offset){
|
||||||
conn->hid_descriptor_offset = next_offset;
|
conn->hid_descriptor_offset -= descriptor_len;
|
||||||
next_offset += conn->hid_descriptor_len;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// clear descriptor
|
||||||
|
connection->hid_descriptor_len = 0;
|
||||||
|
connection->hid_descriptor_offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
const uint8_t * hid_descriptor_storage_get_descriptor_data(uint16_t hid_cid){
|
const uint8_t * hid_descriptor_storage_get_descriptor_data(uint16_t hid_cid){
|
||||||
hid_host_connection_t * connection = hid_host_get_connection_for_hid_cid(hid_cid);
|
hid_host_connection_t * connection = hid_host_get_connection_for_hid_cid(hid_cid);
|
||||||
if (!connection){
|
if (!connection){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user