diff --git a/example/le_streamer_client.c b/example/le_streamer_client.c index 8eec4df5c..0464eefec 100644 --- a/example/le_streamer_client.c +++ b/example/le_streamer_client.c @@ -57,8 +57,16 @@ #include "btstack.h" -// prototypes -static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size); +typedef struct { + char name; + int le_notification_enabled; + int counter; + char test_data[200]; + int test_data_len; + uint32_t test_data_sent; + uint32_t test_data_start; + btstack_context_callback_registration_t write_without_response_request; +} le_streamer_connection_t; typedef enum { TC_OFF, @@ -96,6 +104,11 @@ static int listener_registered; static gc_state_t state = TC_OFF; static btstack_packet_callback_registration_t hci_event_callback_registration; +// prototypes +static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size); +static void le_streamer_handle_can_write_without_response(void * context); +static void le_streamer_client_request_to_send(le_streamer_connection_t * connection); + /* * @section Track throughput * @text We calculate the throughput by setting a start time and measuring the amount of @@ -115,16 +128,6 @@ static btstack_packet_callback_registration_t hci_event_callback_registration; #define REPORT_INTERVAL_MS 3000 // support for multiple clients -typedef struct { - char name; - int le_notification_enabled; - int counter; - char test_data[200]; - int test_data_len; - uint32_t test_data_sent; - uint32_t test_data_start; -} le_streamer_connection_t; - static le_streamer_connection_t le_streamer_connection; static void test_reset(le_streamer_connection_t * context){ @@ -149,28 +152,33 @@ static void test_track_data(le_streamer_connection_t * context, int bytes_sent){ /* LISTING_END(tracking): Tracking throughput */ -// stramer -static void streamer(le_streamer_connection_t * context){ - if (connection_handle == HCI_CON_HANDLE_INVALID) return; +// streamer +static void le_streamer_handle_can_write_without_response(void * context){ + le_streamer_connection_t * connection = (le_streamer_connection_t *) context; // create test data - context->counter++; - if (context->counter > 'Z') context->counter = 'A'; - memset(context->test_data, context->counter, context->test_data_len); + connection->counter++; + if (connection->counter > 'Z') connection->counter = 'A'; + memset(connection->test_data, connection->counter, connection->test_data_len); // send - uint8_t status = gatt_client_write_value_of_characteristic_without_response(connection_handle, le_streamer_characteristic_rx.value_handle, context->test_data_len, (uint8_t*) context->test_data); + uint8_t status = gatt_client_write_value_of_characteristic_without_response(connection_handle, le_streamer_characteristic_rx.value_handle, connection->test_data_len, (uint8_t*) connection->test_data); if (status){ printf("Write without response failed, status 0x%02x.\n", status); return; } else { - test_track_data(&le_streamer_connection, context->test_data_len); + test_track_data(connection, connection->test_data_len); } // request again - gatt_client_request_can_write_without_response_event(handle_gatt_client_event, connection_handle); + le_streamer_client_request_to_send(connection); } +static void le_streamer_client_request_to_send(le_streamer_connection_t * connection){ + connection->write_without_response_request.callback = &le_streamer_handle_can_write_without_response; + connection->write_without_response_request.context = connection; + gatt_client_request_to_write_without_response(&connection->write_without_response_request, connection_handle); +} // returns 1 if name is found in advertisement static int advertisement_report_contains_name(const char * name, uint8_t * advertisement_report){ @@ -285,7 +293,7 @@ static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint state = TC_W4_TEST_DATA; #if (TEST_MODE & TEST_MODE_WRITE_WITHOUT_RESPONSE) printf("Start streaming - request can send now.\n"); - gatt_client_request_can_write_without_response_event(handle_gatt_client_event, connection_handle); + le_streamer_client_request_to_send(&le_streamer_connection); #endif break; default: @@ -301,7 +309,7 @@ static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint state = TC_W4_TEST_DATA; #if (TEST_MODE & TEST_MODE_WRITE_WITHOUT_RESPONSE) printf("Start streaming - request can send now.\n"); - gatt_client_request_can_write_without_response_event(handle_gatt_client_event, connection_handle); + le_streamer_client_request_to_send(&le_streamer_connection); #endif break; default: @@ -317,7 +325,7 @@ static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint case GATT_EVENT_QUERY_COMPLETE: break; case GATT_EVENT_CAN_WRITE_WITHOUT_RESPONSE: - streamer(&le_streamer_connection); + le_streamer_handle_can_write_without_response(&le_streamer_connection); break; default: printf("Unknown packet type 0x%02x\n", hci_event_packet_get_type(packet));