event: support Service, Characteristic, Characteristic Descriptor in event generator needed for GATT Events. use new getter in examples

This commit is contained in:
Matthias Ringwald 2016-02-18 16:16:46 +01:00
parent 6ba2ad2202
commit 313e337b78
7 changed files with 454 additions and 133 deletions

View File

@ -45,21 +45,8 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "btstack_run_loop.h"
#include "hci_cmd.h"
#include "btstack_util.h"
#include "btstack_config.h"
#include "btstack_debug.h" #include "btstack.h"
#include "btstack_memory.h"
#include "hci.h"
#include "hci_dump.h"
#include "l2cap.h"
#include "ble/att_db.h"
#include "ble/gatt_client.h"
#include "ble/ad_parser.h"
#include "ble/sm.h"
typedef struct advertising_report { typedef struct advertising_report {
uint8_t type; uint8_t type;
@ -146,7 +133,7 @@ static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint
case TC_W4_SERVICE_RESULT: case TC_W4_SERVICE_RESULT:
switch(packet[0]){ switch(packet[0]){
case GATT_EVENT_SERVICE_QUERY_RESULT: case GATT_EVENT_SERVICE_QUERY_RESULT:
gatt_client_deserialize_service(packet, 4, &battery_service); gatt_event_service_query_result_get_service(packet, &battery_service);
printf("Battery service found:\n"); printf("Battery service found:\n");
dump_service(&battery_service); dump_service(&battery_service);
break; break;
@ -170,7 +157,7 @@ static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint
switch(packet[0]){ switch(packet[0]){
case GATT_EVENT_CHARACTERISTIC_QUERY_RESULT: case GATT_EVENT_CHARACTERISTIC_QUERY_RESULT:
printf("Battery level characteristic found:\n"); printf("Battery level characteristic found:\n");
gatt_client_deserialize_characteristic(packet, 4, &config_characteristic); gatt_event_characteristic_query_result_get_characteristic(packet, &config_characteristic);
dump_characteristic(&config_characteristic); dump_characteristic(&config_characteristic);
break; break;
case GATT_EVENT_QUERY_COMPLETE: case GATT_EVENT_QUERY_COMPLETE:

View File

@ -55,22 +55,8 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "btstack_run_loop.h"
#include "hci_cmd.h"
#include "btstack_util.h"
#include "btstack_config.h" #include "btstack.h"
#include "btstack_debug.h"
#include "btstack_memory.h"
#include "hci.h"
#include "hci_dump.h"
#include "l2cap.h"
#include "ble/att_db.h"
#include "ble/gatt_client.h"
#include "ble/ad_parser.h"
#include "ble/sm.h"
typedef struct advertising_report { typedef struct advertising_report {
uint8_t type; uint8_t type;
@ -242,12 +228,12 @@ static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint
gatt_client_characteristic_t characteristic; gatt_client_characteristic_t characteristic;
switch(packet[0]){ switch(packet[0]){
case GATT_EVENT_SERVICE_QUERY_RESULT:\ case GATT_EVENT_SERVICE_QUERY_RESULT:\
gatt_client_deserialize_service(packet, 4, &service); gatt_event_service_query_result_get_service(packet, &service);
dump_service(&service); dump_service(&service);
services[service_count++] = service; services[service_count++] = service;
break; break;
case GATT_EVENT_CHARACTERISTIC_QUERY_RESULT: case GATT_EVENT_CHARACTERISTIC_QUERY_RESULT:
gatt_client_deserialize_characteristic(packet, 4, &characteristic); gatt_event_characteristic_query_result_get_characteristic(packet, &characteristic);
dump_characteristic(&characteristic); dump_characteristic(&characteristic);
break; break;
case GATT_EVENT_QUERY_COMPLETE: case GATT_EVENT_QUERY_COMPLETE:

View File

@ -1833,7 +1833,7 @@ void gatt_client_pts_suppress_mtu_exchange(void){
pts_suppress_mtu_exchange = 1; pts_suppress_mtu_exchange = 1;
} }
void gatt_client_deserialize_service(uint8_t *packet, int offset, gatt_client_service_t *service){ void gatt_client_deserialize_service(const uint8_t *packet, int offset, gatt_client_service_t *service){
service->start_group_handle = little_endian_read_16(packet, offset); service->start_group_handle = little_endian_read_16(packet, offset);
service->end_group_handle = little_endian_read_16(packet, offset + 2); service->end_group_handle = little_endian_read_16(packet, offset + 2);
reverse_128(&packet[offset + 4], service->uuid128); reverse_128(&packet[offset + 4], service->uuid128);
@ -1842,7 +1842,7 @@ void gatt_client_deserialize_service(uint8_t *packet, int offset, gatt_client_se
} }
} }
void gatt_client_deserialize_characteristic(uint8_t * packet, int offset, gatt_client_characteristic_t * characteristic){ void gatt_client_deserialize_characteristic(const uint8_t * packet, int offset, gatt_client_characteristic_t * characteristic){
characteristic->start_handle = little_endian_read_16(packet, offset); characteristic->start_handle = little_endian_read_16(packet, offset);
characteristic->value_handle = little_endian_read_16(packet, offset + 2); characteristic->value_handle = little_endian_read_16(packet, offset + 2);
characteristic->end_handle = little_endian_read_16(packet, offset + 4); characteristic->end_handle = little_endian_read_16(packet, offset + 4);
@ -1854,7 +1854,7 @@ void gatt_client_deserialize_characteristic(uint8_t * packet, int offset, gatt_c
} }
} }
void gatt_client_deserialize_characteristic_descriptor(uint8_t * packet, int offset, gatt_client_characteristic_descriptor_t * descriptor){ void gatt_client_deserialize_characteristic_descriptor(const uint8_t * packet, int offset, gatt_client_characteristic_descriptor_t * descriptor){
descriptor->handle = little_endian_read_16(packet, offset); descriptor->handle = little_endian_read_16(packet, offset);
reverse_128(&packet[offset+2], descriptor->uuid128); reverse_128(&packet[offset+2], descriptor->uuid128);
} }

View File

@ -359,9 +359,9 @@ uint8_t gatt_client_cancel_write(btstack_packet_handler_t callback, uint16_t con
// used by generated btstack_event.c // used by generated btstack_event.c
void gatt_client_deserialize_service(uint8_t *packet, int offset, gatt_client_service_t *service); void gatt_client_deserialize_service(const uint8_t *packet, int offset, gatt_client_service_t *service);
void gatt_client_deserialize_characteristic(uint8_t * packet, int offset, gatt_client_characteristic_t * characteristic); void gatt_client_deserialize_characteristic(const uint8_t * packet, int offset, gatt_client_characteristic_t * characteristic);
void gatt_client_deserialize_characteristic_descriptor(uint8_t * packet, int offset, gatt_client_characteristic_descriptor_t * descriptor); void gatt_client_deserialize_characteristic_descriptor(const uint8_t * packet, int offset, gatt_client_characteristic_descriptor_t * descriptor);
// only used for testing // only used for testing
void gatt_client_pts_suppress_mtu_exchange(void); void gatt_client_pts_suppress_mtu_exchange(void);

View File

@ -50,6 +50,7 @@
#include "btstack.h" #include "btstack.h"
#include "btstack_control.h" #include "btstack_control.h"
#include "btstack_debug.h" #include "btstack_debug.h"
#include "btstack_event.h"
#include "btstack_defines.h" #include "btstack_defines.h"
#include "btstack_linked_list.h" #include "btstack_linked_list.h"
#include "btstack_memory.h" #include "btstack_memory.h"

File diff suppressed because it is too large Load Diff

View File

@ -71,6 +71,10 @@ extern "C" {
#include "btstack_util.h" #include "btstack_util.h"
#include <stdint.h> #include <stdint.h>
#ifdef ENABLE_BLE
#include "ble/gatt_client.h"
#endif
/* API_START */ /* API_START */
""" """
@ -86,8 +90,7 @@ hfile_header_end = """
#endif // __BTSTACK_EVENT_H #endif // __BTSTACK_EVENT_H
""" """
c_prototoype_simple_return = ''' c_prototoype_simple_return = '''/**
/**
* @brief {description} * @brief {description}
* @param Event packet * @param Event packet
* @return {result_name} * @return {result_name}
@ -98,8 +101,7 @@ static inline {result_type} {fn_name}(const uint8_t * event){{
}} }}
''' '''
c_prototoype_struct_return = ''' c_prototoype_struct_return = '''/**
/**
* @brief {description} * @brief {description}
* @param Event packet * @param Event packet
* @param Pointer to storage for {result_name} * @param Pointer to storage for {result_name}
@ -110,8 +112,7 @@ static inline void {fn_name}(const uint8_t * event, {result_type} {result_name})
}} }}
''' '''
c_prototoype_unsupported = ''' c_prototoype_unsupported = '''/**
/**
* @brief {description} * @brief {description}
* @param Event packet * @param Event packet
* @return {result_name} * @return {result_name}
@ -136,10 +137,13 @@ param_read = {
'3' : 'return little_endian_read_24(event, {offset});', '3' : 'return little_endian_read_24(event, {offset});',
'4' : 'return little_endian_read_32(event, {offset});', '4' : 'return little_endian_read_32(event, {offset});',
'H' : 'return little_endian_read_16(event, {offset});', 'H' : 'return little_endian_read_16(event, {offset});',
'B' : 'reverse_48(&event[{offset}], {result_name});', 'B' : 'reverse_bd_addr(&event[{offset}], {result_name});',
'R' : 'return &event[{offset}];', 'R' : 'return &event[{offset}];',
'T' : 'return (const char *) &event[{offset}];', 'T' : 'return (const char *) &event[{offset}];',
'V' : 'return &event[{offset}];', 'V' : 'return &event[{offset}];',
'X' : 'gatt_client_deserialize_service(event, {offset}, {result_name});',
'Y' : 'gatt_client_deserialize_characteristic(event, {offset}, {result_name});',
'Z' : 'gatt_client_deserialize_characteristic_descriptor(event, {offset}, {result_name});',
} }
def c_type_for_btstack_type(type): def c_type_for_btstack_type(type):
@ -147,7 +151,7 @@ def c_type_for_btstack_type(type):
'D' : 'const uint8_t *', 'E' : 'const uint8_t * ', 'N' : 'String' , 'P' : 'const uint8_t *', 'A' : 'const uint8_t *', 'D' : 'const uint8_t *', 'E' : 'const uint8_t * ', 'N' : 'String' , 'P' : 'const uint8_t *', 'A' : 'const uint8_t *',
'R' : 'const uint8_t *', 'S' : 'const uint8_t *', 'R' : 'const uint8_t *', 'S' : 'const uint8_t *',
'J' : 'int', 'L' : 'int', 'V' : 'const uint8_t *', 'U' : 'BT_UUID', 'J' : 'int', 'L' : 'int', 'V' : 'const uint8_t *', 'U' : 'BT_UUID',
'X' : 'GATTService', 'Y' : 'GATTCharacteristic', 'Z' : 'GATTCharacteristicDescriptor', 'X' : 'gatt_client_service_t *', 'Y' : 'gatt_client_characteristic_t *', 'Z' : 'gatt_client_characteristic_descriptor_t *',
'T' : 'const char *'} 'T' : 'const char *'}
return param_types[type] return param_types[type]
@ -165,7 +169,7 @@ def format_function_name(event_name):
def template_for_type(field_type): def template_for_type(field_type):
global c_prototoype_simple_return global c_prototoype_simple_return
global c_prototoype_struct_return global c_prototoype_struct_return
types_with_struct_return = "B" types_with_struct_return = "BXYZ"
if field_type in types_with_struct_return: if field_type in types_with_struct_return:
return c_prototoype_struct_return return c_prototoype_struct_return
else: else:
@ -193,6 +197,9 @@ def create_getter(event_name, field_name, field_type, offset, supported):
code = param_read[field_type].format(offset=offset, result_name=result_name) code = param_read[field_type].format(offset=offset, result_name=result_name)
return template.format(description=description, fn_name=fn_name, result_name=result_name, result_type=result_type, code=code, format=field_type) return template.format(description=description, fn_name=fn_name, result_name=result_name, result_type=result_type, code=code, format=field_type)
def is_le_event(event_group):
return event_group in ['GATT', 'ANCS', 'SM']
def create_events(events): def create_events(events):
global gen_path global gen_path
global copyright global copyright
@ -204,12 +211,15 @@ def create_events(events):
fout.write(hfile_header_begin) fout.write(hfile_header_begin)
for event_type, event_name, format, args in events: for event_type, event_name, format, args in events:
parts = event_name.split("_") parts = event_name.split("_")
if not parts[0] in [ 'SDP', 'ANCS', 'SM', 'L2CAP', 'RFCOMM']: event_group = parts[0]
if not event_group in [ 'SDP', 'ANCS', 'SM', 'L2CAP', 'RFCOMM', 'GATT']:
continue continue
event_name = format_function_name(event_name) event_name = format_function_name(event_name)
length_name = '' length_name = ''
offset = 2 offset = 2
supported = all_fields_supported(format) supported = all_fields_supported(format)
if is_le_event(event_group):
fout.write("#ifdef ENABLE_BLE\n")
for f, arg in zip(format, args): for f, arg in zip(format, args):
field_name = arg field_name = arg
field_type = f field_type = f
@ -218,6 +228,9 @@ def create_events(events):
if field_type in 'RT': if field_type in 'RT':
break break
offset += size_for_type(field_type) offset += size_for_type(field_type)
if is_le_event(event_group):
fout.write("#endif\n")
fout.write("\n")
fout.write(hfile_header_end) fout.write(hfile_header_end)