mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-02-22 15:40:16 +00:00
handle notification attribute result received in chunks
This commit is contained in:
parent
7763678c43
commit
2e223452ff
@ -80,7 +80,29 @@ static hci_uart_config_t hci_uart_config_csr8811 = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void app_run();
|
|
||||||
|
typedef enum ancs_chunk_parser_state {
|
||||||
|
W4_ATTRIBUTE_ID,
|
||||||
|
W4_ATTRIBUTE_LEN,
|
||||||
|
W4_ATTRIBUTE_COMPLETE,
|
||||||
|
} ancs_chunk_parser_state_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TC_IDLE,
|
||||||
|
TC_W4_ENCRYPTED_CONNECTION,
|
||||||
|
TC_W4_SERVICE_RESULT,
|
||||||
|
TC_W4_CHARACTERISTIC_RESULT,
|
||||||
|
TC_W4_DATA_SOURCE_SUBSCRIBED,
|
||||||
|
TC_W4_NOTIFICATION_SOURCE_SUBSCRIBED,
|
||||||
|
TC_SUBSCRIBED,
|
||||||
|
TC_W4_DISCONNECT
|
||||||
|
} tc_state_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SET_ADVERTISEMENT_PARAMS = 1 << 0,
|
||||||
|
SET_ADVERTISEMENT_DATA = 1 << 1,
|
||||||
|
ENABLE_ADVERTISEMENTS = 1 << 2,
|
||||||
|
} todo_t;
|
||||||
|
|
||||||
const uint8_t adv_data[] = {
|
const uint8_t adv_data[] = {
|
||||||
// Flags general discoverable
|
// Flags general discoverable
|
||||||
@ -106,28 +128,9 @@ const uint8_t ancs_notification_source_uuid[] = {0x9F,0xBF,0x12,0x0D,0x63,0x01,0
|
|||||||
const uint8_t ancs_control_point_uuid[] = {0x69,0xD1,0xD8,0xF3,0x45,0xE1,0x49,0xA8,0x98,0x21,0x9B,0xBD,0xFD,0xAA,0xD9,0xD9};
|
const uint8_t ancs_control_point_uuid[] = {0x69,0xD1,0xD8,0xF3,0x45,0xE1,0x49,0xA8,0x98,0x21,0x9B,0xBD,0xFD,0xAA,0xD9,0xD9};
|
||||||
const uint8_t ancs_data_source_uuid[] = {0x22,0xEA,0xC6,0xE9,0x24,0xD6,0x4B,0xB5,0xBE,0x44,0xB3,0x6A,0xCE,0x7C,0x7B,0xFB};
|
const uint8_t ancs_data_source_uuid[] = {0x22,0xEA,0xC6,0xE9,0x24,0xD6,0x4B,0xB5,0xBE,0x44,0xB3,0x6A,0xCE,0x7C,0x7B,0xFB};
|
||||||
|
|
||||||
uint32_t ancs_notification_uid;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
SET_ADVERTISEMENT_PARAMS = 1 << 0,
|
|
||||||
SET_ADVERTISEMENT_DATA = 1 << 1,
|
|
||||||
ENABLE_ADVERTISEMENTS = 1 << 2,
|
|
||||||
} todo_t;
|
|
||||||
static todo_t todos = 0;
|
static todo_t todos = 0;
|
||||||
|
static uint32_t ancs_notification_uid;
|
||||||
static uint16_t handle;
|
static uint16_t handle;
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
TC_IDLE,
|
|
||||||
TC_W4_ENCRYPTED_CONNECTION,
|
|
||||||
TC_W4_SERVICE_RESULT,
|
|
||||||
TC_W4_CHARACTERISTIC_RESULT,
|
|
||||||
TC_W4_DATA_SOURCE_SUBSCRIBED,
|
|
||||||
TC_W4_NOTIFICATION_SOURCE_SUBSCRIBED,
|
|
||||||
TC_SUBSCRIBED,
|
|
||||||
TC_W4_DISCONNECT
|
|
||||||
} tc_state_t;
|
|
||||||
|
|
||||||
static gatt_client_t ancs_client_context;
|
static gatt_client_t ancs_client_context;
|
||||||
static int ancs_service_found;
|
static int ancs_service_found;
|
||||||
static le_service_t ancs_service;
|
static le_service_t ancs_service;
|
||||||
@ -137,6 +140,56 @@ static le_characteristic_t ancs_data_source_characteristic;
|
|||||||
static int ancs_characteristcs;
|
static int ancs_characteristcs;
|
||||||
static tc_state_t tc_state = TC_IDLE;
|
static tc_state_t tc_state = TC_IDLE;
|
||||||
|
|
||||||
|
static ancs_chunk_parser_state_t chunk_parser_state;
|
||||||
|
static uint8_t ancs_notification_buffer[50];
|
||||||
|
static uint16_t ancs_bytes_received;
|
||||||
|
static uint16_t ancs_bytes_needed;
|
||||||
|
static uint8_t ancs_attribute_id;
|
||||||
|
static uint16_t ancs_attribute_len;
|
||||||
|
|
||||||
|
static void app_run();
|
||||||
|
|
||||||
|
void print_attribute(){
|
||||||
|
ancs_notification_buffer[ancs_bytes_received] = 0;
|
||||||
|
printf("%14s: %s\n", ancs_attribute_names[ancs_attribute_id], ancs_notification_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ancs_chunk_parser_init(){
|
||||||
|
chunk_parser_state = W4_ATTRIBUTE_ID;
|
||||||
|
ancs_bytes_received = 0;
|
||||||
|
ancs_bytes_needed = 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ancs_chunk_parser_handle_byte(uint8_t data){
|
||||||
|
ancs_notification_buffer[ancs_bytes_received++] = data;
|
||||||
|
if (ancs_bytes_received < ancs_bytes_needed) return;
|
||||||
|
switch (chunk_parser_state){
|
||||||
|
case W4_ATTRIBUTE_ID:
|
||||||
|
ancs_attribute_id = ancs_notification_buffer[ancs_bytes_received-1];
|
||||||
|
ancs_bytes_received = 0;
|
||||||
|
ancs_bytes_needed = 2;
|
||||||
|
chunk_parser_state = W4_ATTRIBUTE_LEN;
|
||||||
|
break;
|
||||||
|
case W4_ATTRIBUTE_LEN:
|
||||||
|
ancs_attribute_len = READ_BT_16(ancs_notification_buffer, ancs_bytes_received-2);
|
||||||
|
ancs_bytes_received = 0;
|
||||||
|
ancs_bytes_needed = ancs_attribute_len;
|
||||||
|
if (ancs_attribute_len == 0) {
|
||||||
|
ancs_bytes_needed = 1;
|
||||||
|
chunk_parser_state = W4_ATTRIBUTE_ID;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
chunk_parser_state = W4_ATTRIBUTE_COMPLETE;
|
||||||
|
break;
|
||||||
|
case W4_ATTRIBUTE_COMPLETE:
|
||||||
|
print_attribute();
|
||||||
|
ancs_bytes_received = 0;
|
||||||
|
ancs_bytes_needed = 1;
|
||||||
|
chunk_parser_state = W4_ATTRIBUTE_ID;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void handle_gatt_client_event(le_event_t * event){
|
void handle_gatt_client_event(le_event_t * event){
|
||||||
le_characteristic_t characteristic;
|
le_characteristic_t characteristic;
|
||||||
le_characteristic_value_event_t * value_event;
|
le_characteristic_value_event_t * value_event;
|
||||||
@ -221,18 +274,9 @@ void handle_gatt_client_event(le_event_t * event){
|
|||||||
if ( event->type != GATT_NOTIFICATION && event->type != GATT_INDICATION ) break;
|
if ( event->type != GATT_NOTIFICATION && event->type != GATT_INDICATION ) break;
|
||||||
value_event = (le_characteristic_value_event_t *) event;
|
value_event = (le_characteristic_value_event_t *) event;
|
||||||
if (value_event->value_handle == ancs_data_source_characteristic.value_handle){
|
if (value_event->value_handle == ancs_data_source_characteristic.value_handle){
|
||||||
int pos = 5;
|
int i;
|
||||||
while (pos < value_event->blob_length){
|
for (i=0;i<value_event->blob_length;i++) {
|
||||||
uint8_t attribute_id = value_event->blob[pos];
|
ancs_chunk_parser_handle_byte(value_event->blob[i]);
|
||||||
pos++;
|
|
||||||
uint16_t attribute_len = READ_BT_16(value_event->blob, pos);
|
|
||||||
pos += 2;
|
|
||||||
char text[32];
|
|
||||||
uint16_t str_len = attribute_len < (sizeof(text)-1) ? attribute_len : (sizeof(text)-1);
|
|
||||||
memcpy(text, &value_event->blob[pos], str_len);
|
|
||||||
text[str_len] = 0;
|
|
||||||
printf("%14s: %s\n", ancs_attribute_names[attribute_id], text);
|
|
||||||
pos += attribute_len;
|
|
||||||
}
|
}
|
||||||
} else if (value_event->value_handle == ancs_notification_source_characteristic.value_handle){
|
} else if (value_event->value_handle == ancs_notification_source_characteristic.value_handle){
|
||||||
ancs_notification_uid = READ_BT_32(value_event->blob, 4);
|
ancs_notification_uid = READ_BT_32(value_event->blob, 4);
|
||||||
@ -241,6 +285,7 @@ void handle_gatt_client_event(le_event_t * event){
|
|||||||
static uint8_t get_notification_attributes[] = {0, 0,0,0,0, 0, 1,32,0, 2,32,0, 3,32,0, 4, 5};
|
static uint8_t get_notification_attributes[] = {0, 0,0,0,0, 0, 1,32,0, 2,32,0, 3,32,0, 4, 5};
|
||||||
bt_store_32(get_notification_attributes, 1, ancs_notification_uid);
|
bt_store_32(get_notification_attributes, 1, ancs_notification_uid);
|
||||||
ancs_notification_uid = 0;
|
ancs_notification_uid = 0;
|
||||||
|
ancs_chunk_parser_init();
|
||||||
gatt_client_write_value_of_characteristic(&ancs_client_context, ancs_control_point_characteristic.value_handle,
|
gatt_client_write_value_of_characteristic(&ancs_client_context, ancs_control_point_characteristic.value_handle,
|
||||||
sizeof(get_notification_attributes), get_notification_attributes);
|
sizeof(get_notification_attributes), get_notification_attributes);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user