diff --git a/src/ble/gatt-service/scan_parameters_service_client.c b/src/ble/gatt-service/scan_parameters_service_client.c index cc63e35b1..aba3f03f4 100644 --- a/src/ble/gatt-service/scan_parameters_service_client.c +++ b/src/ble/gatt-service/scan_parameters_service_client.c @@ -57,6 +57,8 @@ #include "btstack_run_loop.h" #include "gap.h" +#include "ble/gatt_service_client.h" + static btstack_packet_callback_registration_t hci_event_callback_registration; static btstack_linked_list_t clients; @@ -65,7 +67,8 @@ static uint16_t scan_parameters_service_scan_window = 0; static uint16_t scan_parameters_service_scan_interval = 0; static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size); -static void scan_parameters_service_run_for_client(scan_parameters_service_client_t * client); +static void scan_parameters_service_send_next_query(void * context); +static btstack_context_callback_registration_t scan_parameters_service_handle_can_send_now; static uint16_t scan_parameters_service_get_next_cid(void){ if (scan_parameters_service_cid_counter == 0xffff) { @@ -76,6 +79,17 @@ static uint16_t scan_parameters_service_get_next_cid(void){ return scan_parameters_service_cid_counter; } +static uint8_t scan_parameters_client_request_send_gatt_query(scan_parameters_service_client_t * client){ + scan_parameters_service_handle_can_send_now.context = (void *) (uintptr_t)client->cid; + uint8_t status = gatt_client_request_to_send_gatt_query(&scan_parameters_service_handle_can_send_now, client->con_handle); + if (status != ERROR_CODE_SUCCESS){ + if (client->state >= SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W2_QUERY_SERVICE){ + client->state = SCAN_PARAMETERS_SERVICE_CLIENT_STATE_IDLE; + } + } + return status; +} + static scan_parameters_service_client_t * scan_parameters_service_create_client(hci_con_handle_t con_handle, uint16_t cid){ scan_parameters_service_client_t * client = btstack_memory_scan_parameters_service_client_get(); if (!client){ @@ -158,10 +172,16 @@ static void handle_notification_event(uint8_t packet_type, uint16_t channel, uin scan_parameters_service_client_t * client = scan_parameters_service_get_client_for_con_handle(gatt_event_notification_get_handle(packet)); btstack_assert(client != NULL); client->scan_interval_window_value_update = true; - scan_parameters_service_run_for_client(client); + scan_parameters_client_request_send_gatt_query(client); } -static void scan_parameters_service_run_for_client(scan_parameters_service_client_t * client){ +static void scan_parameters_service_send_next_query(void * context){ + uint16_t cid = (uint16_t)(uintptr_t)context; + scan_parameters_service_client_t * client = scan_parameters_service_get_client_for_cid(cid); + if (client == NULL){ + return; + } + uint8_t att_status; gatt_client_service_t service; @@ -254,7 +274,7 @@ static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint scan_parameters_service_client_t * client = NULL; gatt_client_service_t service; gatt_client_characteristic_t characteristic; - uint8_t att_status; + uint8_t status; #ifdef ENABLE_TESTING_SUPPORT gatt_client_characteristic_descriptor_t characteristic_descriptor; @@ -339,12 +359,12 @@ static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint client = scan_parameters_service_get_client_for_con_handle(gatt_event_query_complete_get_handle(packet)); btstack_assert(client != NULL); - att_status = gatt_event_query_complete_get_att_status(packet); + status = gatt_service_client_att_status_to_error_code(gatt_event_query_complete_get_att_status(packet)); switch (client->state){ case SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W4_SERVICE_RESULT: - if (att_status != ATT_ERROR_SUCCESS){ - scan_parameters_service_emit_connection_established(client, att_status); + if (status != ERROR_CODE_SUCCESS){ + scan_parameters_service_emit_connection_established(client, status); scan_parameters_service_finalize_client(client); return; } @@ -359,8 +379,8 @@ static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint return; case SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W4_CHARACTERISTIC_RESULT: - if (att_status != ATT_ERROR_SUCCESS){ - scan_parameters_service_emit_connection_established(client, att_status); + if (status != ERROR_CODE_SUCCESS){ + scan_parameters_service_emit_connection_established(client, status); scan_parameters_service_finalize_client(client); break; } @@ -394,7 +414,7 @@ static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint } if (client != NULL){ - scan_parameters_service_run_for_client(client); + scan_parameters_client_request_send_gatt_query(client); } } @@ -433,7 +453,7 @@ void scan_parameters_service_client_set(uint16_t scan_interval, uint16_t scan_wi while (btstack_linked_list_iterator_has_next(&it)){ scan_parameters_service_client_t * client = (scan_parameters_service_client_t*) btstack_linked_list_iterator_next(&it); client->scan_interval_window_value_update = true; - scan_parameters_service_run_for_client(client); + scan_parameters_client_request_send_gatt_query(client); } } @@ -449,8 +469,7 @@ uint8_t scan_parameters_service_client_enable_notifications(uint16_t scan_parame } client->state = SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W2_CONFIGURE_NOTIFICATIONS; - scan_parameters_service_run_for_client(client); - return ERROR_CODE_SUCCESS; + return scan_parameters_client_request_send_gatt_query(client); } uint8_t scan_parameters_service_client_connect(hci_con_handle_t con_handle, btstack_packet_handler_t packet_handler, uint16_t * scan_parameters_service_cid){ @@ -473,8 +492,7 @@ uint8_t scan_parameters_service_client_connect(hci_con_handle_t con_handle, btst client->client_handler = packet_handler; client->state = SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W2_QUERY_SERVICE; - scan_parameters_service_run_for_client(client); - return ERROR_CODE_SUCCESS; + return scan_parameters_client_request_send_gatt_query(client); } uint8_t scan_parameters_service_client_disconnect(uint16_t scan_parameters_service_cid){ @@ -490,6 +508,7 @@ uint8_t scan_parameters_service_client_disconnect(uint16_t scan_parameters_servi void scan_parameters_service_client_init(void){ hci_event_callback_registration.callback = &handle_hci_event; hci_add_event_handler(&hci_event_callback_registration); + scan_parameters_service_handle_can_send_now.callback = &scan_parameters_service_send_next_query; } void scan_parameters_service_client_deinit(void){ diff --git a/src/btstack_defines.h b/src/btstack_defines.h index f84152c94..369908d8a 100644 --- a/src/btstack_defines.h +++ b/src/btstack_defines.h @@ -4171,7 +4171,7 @@ typedef uint8_t sm_key_t[16]; * @format 1H1 * @param subevent_code * @param con_handle - * @param att_status + * @param status */ #define GATTSERVICE_SUBEVENT_SCAN_PARAMETERS_SERVICE_CONNECTED 0x11u