mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-16 08:42:28 +00:00
gatt_client: extract code to handle att read response, read by type and write response
This commit is contained in:
parent
a6e1ba900b
commit
2da0d963df
@ -1420,58 +1420,54 @@ static void gatt_client_event_packet_handler(uint8_t packet_type, uint16_t chann
|
||||
gatt_client_run();
|
||||
}
|
||||
|
||||
static void gatt_client_handle_att_response(gatt_client_t * gatt_client, uint8_t * packet, uint16_t size) {
|
||||
uint8_t error_code;
|
||||
switch (packet[0]) {
|
||||
case ATT_EXCHANGE_MTU_RESPONSE: {
|
||||
if (size < 3u) break;
|
||||
bool update_att_mtu = true;
|
||||
uint16_t remote_rx_mtu = little_endian_read_16(packet, 1);
|
||||
uint16_t local_rx_mtu = l2cap_max_le_mtu();
|
||||
#ifdef ENABLE_GATT_OVER_CLASSIC
|
||||
if (gatt_client->l2cap_psm != 0){
|
||||
local_rx_mtu = gatt_client->mtu;
|
||||
} else {
|
||||
update_att_mtu = false;
|
||||
}
|
||||
#endif
|
||||
uint16_t mtu = (remote_rx_mtu < local_rx_mtu) ? remote_rx_mtu : local_rx_mtu;
|
||||
|
||||
// set gatt client mtu
|
||||
gatt_client->mtu = mtu;
|
||||
gatt_client->mtu_state = MTU_EXCHANGED;
|
||||
|
||||
if (update_att_mtu){
|
||||
// set per connection mtu state - for fixed channel
|
||||
hci_connection_t *hci_connection = hci_connection_for_handle(gatt_client->con_handle);
|
||||
hci_connection->att_connection.mtu = gatt_client->mtu;
|
||||
hci_connection->att_connection.mtu_exchanged = true;
|
||||
}
|
||||
emit_gatt_mtu_exchanged_result_event(gatt_client, gatt_client->mtu);
|
||||
break;
|
||||
}
|
||||
case ATT_READ_BY_GROUP_TYPE_RESPONSE:
|
||||
static void gatt_client_handle_att_read_response(gatt_client_t *gatt_client, uint8_t *packet, uint16_t size) {
|
||||
switch (gatt_client->gatt_client_state) {
|
||||
case P_W4_SERVICE_QUERY_RESULT:
|
||||
report_gatt_services(gatt_client, packet, size);
|
||||
trigger_next_service_query(gatt_client, get_last_result_handle_from_service_list(packet, size));
|
||||
case P_W4_INCLUDED_SERVICE_UUID_WITH_QUERY_RESULT:
|
||||
if (size >= 17) {
|
||||
uint8_t uuid128[16];
|
||||
reverse_128(&packet[1], uuid128);
|
||||
report_gatt_included_service_uuid128(gatt_client, gatt_client->start_group_handle, uuid128);
|
||||
}
|
||||
trigger_next_included_service_query(gatt_client, gatt_client->start_group_handle);
|
||||
// GATT_EVENT_QUERY_COMPLETE is emitted by trigger_next_xxx when done
|
||||
break;
|
||||
|
||||
case P_W4_READ_CHARACTERISTIC_VALUE_RESULT:
|
||||
gatt_client_handle_transaction_complete(gatt_client);
|
||||
report_gatt_characteristic_value(gatt_client, gatt_client->attribute_handle, &packet[1], size - 1u);
|
||||
emit_gatt_complete_event(gatt_client, ATT_ERROR_SUCCESS);
|
||||
break;
|
||||
|
||||
case P_W4_READ_CHARACTERISTIC_DESCRIPTOR_RESULT:
|
||||
gatt_client_handle_transaction_complete(gatt_client);
|
||||
report_gatt_characteristic_descriptor(gatt_client, gatt_client->attribute_handle, &packet[1],
|
||||
size - 1u, 0u);
|
||||
emit_gatt_complete_event(gatt_client, ATT_ERROR_SUCCESS);
|
||||
break;
|
||||
|
||||
// Use ATT_READ_REQUEST for first blob of Read Long Characteristic
|
||||
case P_W4_READ_BLOB_RESULT:
|
||||
report_gatt_long_characteristic_value_blob(gatt_client, gatt_client->attribute_handle, &packet[1],
|
||||
size - 1u, gatt_client->attribute_offset);
|
||||
trigger_next_blob_query(gatt_client, P_W2_SEND_READ_BLOB_QUERY, size - 1u);
|
||||
// GATT_EVENT_QUERY_COMPLETE is emitted by trigger_next_xxx when done
|
||||
break;
|
||||
|
||||
// Use ATT_READ_REQUEST for first blob of Read Long Characteristic Descriptor
|
||||
case P_W4_READ_BLOB_CHARACTERISTIC_DESCRIPTOR_RESULT:
|
||||
report_gatt_long_characteristic_descriptor(gatt_client, gatt_client->attribute_handle, &packet[1],
|
||||
size - 1u, gatt_client->attribute_offset);
|
||||
trigger_next_blob_query(gatt_client, P_W2_SEND_READ_BLOB_CHARACTERISTIC_DESCRIPTOR_QUERY,
|
||||
size - 1u);
|
||||
// GATT_EVENT_QUERY_COMPLETE is emitted by trigger_next_xxx when done
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case ATT_HANDLE_VALUE_NOTIFICATION:
|
||||
if (size < 3u) return;
|
||||
report_gatt_notification(gatt_client, little_endian_read_16(packet, 1u), &packet[3], size - 3u);
|
||||
return;
|
||||
case ATT_HANDLE_VALUE_INDICATION:
|
||||
if (size < 3u) break;
|
||||
report_gatt_indication(gatt_client, little_endian_read_16(packet, 1u), &packet[3], size - 3u);
|
||||
gatt_client->send_confirmation = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
case ATT_READ_BY_TYPE_RESPONSE:
|
||||
static void gatt_client_handle_att_read_by_type_response(gatt_client_t *gatt_client, uint8_t *packet, uint16_t size) {
|
||||
switch (gatt_client->gatt_client_state) {
|
||||
case P_W4_ALL_CHARACTERISTICS_OF_SERVICE_QUERY_RESULT:
|
||||
report_gatt_characteristics(gatt_client, packet, size);
|
||||
@ -1543,54 +1539,83 @@ static void gatt_client_handle_att_response(gatt_client_t * gatt_client, uint8_t
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case ATT_READ_RESPONSE:
|
||||
}
|
||||
|
||||
static void gatt_client_handle_att_write_response(gatt_client_t *gatt_client) {
|
||||
switch (gatt_client->gatt_client_state) {
|
||||
case P_W4_INCLUDED_SERVICE_UUID_WITH_QUERY_RESULT:
|
||||
if (size >= 17) {
|
||||
uint8_t uuid128[16];
|
||||
reverse_128(&packet[1], uuid128);
|
||||
report_gatt_included_service_uuid128(gatt_client, gatt_client->start_group_handle, uuid128);
|
||||
case P_W4_WRITE_CHARACTERISTIC_VALUE_RESULT:
|
||||
gatt_client_handle_transaction_complete(gatt_client);
|
||||
emit_gatt_complete_event(gatt_client, ATT_ERROR_SUCCESS);
|
||||
break;
|
||||
case P_W4_CLIENT_CHARACTERISTIC_CONFIGURATION_RESULT:
|
||||
gatt_client_handle_transaction_complete(gatt_client);
|
||||
emit_gatt_complete_event(gatt_client, ATT_ERROR_SUCCESS);
|
||||
break;
|
||||
case P_W4_WRITE_CHARACTERISTIC_DESCRIPTOR_RESULT:
|
||||
gatt_client_handle_transaction_complete(gatt_client);
|
||||
emit_gatt_complete_event(gatt_client, ATT_ERROR_SUCCESS);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
trigger_next_included_service_query(gatt_client, gatt_client->start_group_handle);
|
||||
}
|
||||
|
||||
static void gatt_client_handle_att_response(gatt_client_t * gatt_client, uint8_t * packet, uint16_t size) {
|
||||
uint8_t error_code;
|
||||
switch (packet[0]) {
|
||||
case ATT_EXCHANGE_MTU_RESPONSE: {
|
||||
if (size < 3u) break;
|
||||
bool update_att_mtu = true;
|
||||
uint16_t remote_rx_mtu = little_endian_read_16(packet, 1);
|
||||
uint16_t local_rx_mtu = l2cap_max_le_mtu();
|
||||
#ifdef ENABLE_GATT_OVER_CLASSIC
|
||||
if (gatt_client->l2cap_psm != 0){
|
||||
local_rx_mtu = gatt_client->mtu;
|
||||
} else {
|
||||
update_att_mtu = false;
|
||||
}
|
||||
#endif
|
||||
uint16_t mtu = (remote_rx_mtu < local_rx_mtu) ? remote_rx_mtu : local_rx_mtu;
|
||||
|
||||
// set gatt client mtu
|
||||
gatt_client->mtu = mtu;
|
||||
gatt_client->mtu_state = MTU_EXCHANGED;
|
||||
|
||||
if (update_att_mtu){
|
||||
// set per connection mtu state - for fixed channel
|
||||
hci_connection_t *hci_connection = hci_connection_for_handle(gatt_client->con_handle);
|
||||
hci_connection->att_connection.mtu = gatt_client->mtu;
|
||||
hci_connection->att_connection.mtu_exchanged = true;
|
||||
}
|
||||
emit_gatt_mtu_exchanged_result_event(gatt_client, gatt_client->mtu);
|
||||
break;
|
||||
}
|
||||
case ATT_READ_BY_GROUP_TYPE_RESPONSE:
|
||||
switch (gatt_client->gatt_client_state) {
|
||||
case P_W4_SERVICE_QUERY_RESULT:
|
||||
report_gatt_services(gatt_client, packet, size);
|
||||
trigger_next_service_query(gatt_client, get_last_result_handle_from_service_list(packet, size));
|
||||
// GATT_EVENT_QUERY_COMPLETE is emitted by trigger_next_xxx when done
|
||||
break;
|
||||
|
||||
case P_W4_READ_CHARACTERISTIC_VALUE_RESULT:
|
||||
gatt_client_handle_transaction_complete(gatt_client);
|
||||
report_gatt_characteristic_value(gatt_client, gatt_client->attribute_handle, &packet[1], size - 1u);
|
||||
emit_gatt_complete_event(gatt_client, ATT_ERROR_SUCCESS);
|
||||
break;
|
||||
|
||||
case P_W4_READ_CHARACTERISTIC_DESCRIPTOR_RESULT:
|
||||
gatt_client_handle_transaction_complete(gatt_client);
|
||||
report_gatt_characteristic_descriptor(gatt_client, gatt_client->attribute_handle, &packet[1],
|
||||
size - 1u, 0u);
|
||||
emit_gatt_complete_event(gatt_client, ATT_ERROR_SUCCESS);
|
||||
break;
|
||||
|
||||
// Use ATT_READ_REQUEST for first blob of Read Long Characteristic
|
||||
case P_W4_READ_BLOB_RESULT:
|
||||
report_gatt_long_characteristic_value_blob(gatt_client, gatt_client->attribute_handle, &packet[1],
|
||||
size - 1u, gatt_client->attribute_offset);
|
||||
trigger_next_blob_query(gatt_client, P_W2_SEND_READ_BLOB_QUERY, size - 1u);
|
||||
// GATT_EVENT_QUERY_COMPLETE is emitted by trigger_next_xxx when done
|
||||
break;
|
||||
|
||||
// Use ATT_READ_REQUEST for first blob of Read Long Characteristic Descriptor
|
||||
case P_W4_READ_BLOB_CHARACTERISTIC_DESCRIPTOR_RESULT:
|
||||
report_gatt_long_characteristic_descriptor(gatt_client, gatt_client->attribute_handle, &packet[1],
|
||||
size - 1u, gatt_client->attribute_offset);
|
||||
trigger_next_blob_query(gatt_client, P_W2_SEND_READ_BLOB_CHARACTERISTIC_DESCRIPTOR_QUERY,
|
||||
size - 1u);
|
||||
// GATT_EVENT_QUERY_COMPLETE is emitted by trigger_next_xxx when done
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case ATT_HANDLE_VALUE_NOTIFICATION:
|
||||
if (size < 3u) return;
|
||||
report_gatt_notification(gatt_client, little_endian_read_16(packet, 1u), &packet[3], size - 3u);
|
||||
return;
|
||||
case ATT_HANDLE_VALUE_INDICATION:
|
||||
if (size < 3u) break;
|
||||
report_gatt_indication(gatt_client, little_endian_read_16(packet, 1u), &packet[3], size - 3u);
|
||||
gatt_client->send_confirmation = 1;
|
||||
break;
|
||||
case ATT_READ_BY_TYPE_RESPONSE:
|
||||
gatt_client_handle_att_read_by_type_response(gatt_client, packet, size);
|
||||
break;
|
||||
case ATT_READ_RESPONSE:
|
||||
gatt_client_handle_att_read_response(gatt_client, packet, size);
|
||||
break;
|
||||
case ATT_FIND_BY_TYPE_VALUE_RESPONSE: {
|
||||
uint8_t pair_size = 4;
|
||||
int i;
|
||||
@ -1651,22 +1676,7 @@ static void gatt_client_handle_att_response(gatt_client_t * gatt_client, uint8_t
|
||||
}
|
||||
|
||||
case ATT_WRITE_RESPONSE:
|
||||
switch (gatt_client->gatt_client_state) {
|
||||
case P_W4_WRITE_CHARACTERISTIC_VALUE_RESULT:
|
||||
gatt_client_handle_transaction_complete(gatt_client);
|
||||
emit_gatt_complete_event(gatt_client, ATT_ERROR_SUCCESS);
|
||||
break;
|
||||
case P_W4_CLIENT_CHARACTERISTIC_CONFIGURATION_RESULT:
|
||||
gatt_client_handle_transaction_complete(gatt_client);
|
||||
emit_gatt_complete_event(gatt_client, ATT_ERROR_SUCCESS);
|
||||
break;
|
||||
case P_W4_WRITE_CHARACTERISTIC_DESCRIPTOR_RESULT:
|
||||
gatt_client_handle_transaction_complete(gatt_client);
|
||||
emit_gatt_complete_event(gatt_client, ATT_ERROR_SUCCESS);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
gatt_client_handle_att_write_response(gatt_client);
|
||||
break;
|
||||
|
||||
case ATT_READ_BLOB_RESPONSE: {
|
||||
|
Loading…
x
Reference in New Issue
Block a user