15c544019SMatthias Ringwald#!/usr/bin/env python3 2c3b5b8a5SMatthias Ringwald 3c3b5b8a5SMatthias Ringwaldimport glob 4c3b5b8a5SMatthias Ringwaldimport re 5c3b5b8a5SMatthias Ringwaldimport sys 6c3b5b8a5SMatthias Ringwaldimport os 7c3b5b8a5SMatthias Ringwald 8c3b5b8a5SMatthias Ringwaldimport btstack_parser as parser 9c3b5b8a5SMatthias Ringwald 10f1b34e8dSMatthias Ringwaldmeta_events = [ 1128e59789SMilanka Ringwald 'A2DP', 12f1b34e8dSMatthias Ringwald 'ANCS', 13f1b34e8dSMatthias Ringwald 'AVDTP', 14f1b34e8dSMatthias Ringwald 'AVRCP', 15a911051fSMatthias Ringwald 'GAP', 1628e59789SMilanka Ringwald 'GATTSERVICE', 17f1b34e8dSMatthias Ringwald 'GOEP', 18f1b34e8dSMatthias Ringwald 'HFP', 19dd148ddbSMatthias Ringwald 'HID', 20a4bfc4feSMatthias Ringwald 'HIDS', 2128e59789SMilanka Ringwald 'HSP', 2228e59789SMilanka Ringwald 'LE', 23ad58991cSMilanka Ringwald 'MAP', 24b673498bSMatthias Ringwald 'MESH', 25ad58991cSMilanka Ringwald 'PBAP', 26*7c69f73aSMatthias Ringwald 'OPP' 27f1b34e8dSMatthias Ringwald] 28f1b34e8dSMatthias Ringwald 29f1b34e8dSMatthias Ringwaldsupported_event_groups = meta_events + [ 3028e59789SMilanka Ringwald 'ATT', 3128e59789SMilanka Ringwald 'BNEP', 32f1b34e8dSMatthias Ringwald 'BTSTACK', 33f1b34e8dSMatthias Ringwald 'GAP', 3428e59789SMilanka Ringwald 'GATT', 35f1b34e8dSMatthias Ringwald 'HCI', 3628e59789SMilanka Ringwald 'HID', 37f1b34e8dSMatthias Ringwald 'L2CAP', 38f1b34e8dSMatthias Ringwald 'RFCOMM', 3928e59789SMilanka Ringwald 'SDP', 4028e59789SMilanka Ringwald 'SM' 41f1b34e8dSMatthias Ringwald] 42f1b34e8dSMatthias Ringwald 43c3b5b8a5SMatthias Ringwaldprogram_info = ''' 44c3b5b8a5SMatthias RingwaldBTstack Event Getter Generator for BTstack 45c3b5b8a5SMatthias RingwaldCopyright 2016, BlueKitchen GmbH 46c3b5b8a5SMatthias Ringwald''' 47c3b5b8a5SMatthias Ringwald 48c3b5b8a5SMatthias Ringwaldcopyright = """/* 49c3b5b8a5SMatthias Ringwald * Copyright (C) 2016 BlueKitchen GmbH 50c3b5b8a5SMatthias Ringwald * 51c3b5b8a5SMatthias Ringwald * Redistribution and use in source and binary forms, with or without 52c3b5b8a5SMatthias Ringwald * modification, are permitted provided that the following conditions 53c3b5b8a5SMatthias Ringwald * are met: 54c3b5b8a5SMatthias Ringwald * 55c3b5b8a5SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright 56c3b5b8a5SMatthias Ringwald * notice, this list of conditions and the following disclaimer. 57c3b5b8a5SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright 58c3b5b8a5SMatthias Ringwald * notice, this list of conditions and the following disclaimer in the 59c3b5b8a5SMatthias Ringwald * documentation and/or other materials provided with the distribution. 60c3b5b8a5SMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of 61c3b5b8a5SMatthias Ringwald * contributors may be used to endorse or promote products derived 62c3b5b8a5SMatthias Ringwald * from this software without specific prior written permission. 63c3b5b8a5SMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for 64c3b5b8a5SMatthias Ringwald * personal benefit and not for any commercial purpose or for 65c3b5b8a5SMatthias Ringwald * monetary gain. 66c3b5b8a5SMatthias Ringwald * 67c3b5b8a5SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 68c3b5b8a5SMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 69c3b5b8a5SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 70b5c62b37SMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 71b5c62b37SMilanka Ringwald * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 72c3b5b8a5SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 73c3b5b8a5SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 74c3b5b8a5SMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 75c3b5b8a5SMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 76c3b5b8a5SMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 77c3b5b8a5SMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 78c3b5b8a5SMatthias Ringwald * SUCH DAMAGE. 79c3b5b8a5SMatthias Ringwald * 80c3b5b8a5SMatthias Ringwald * Please inquire about commercial licensing options at 81c3b5b8a5SMatthias Ringwald * [email protected] 82c3b5b8a5SMatthias Ringwald * 83c3b5b8a5SMatthias Ringwald */ 84c3b5b8a5SMatthias Ringwald""" 85c3b5b8a5SMatthias Ringwald 86c3b5b8a5SMatthias Ringwaldhfile_header_begin = """ 87c3b5b8a5SMatthias Ringwald 882026696cSMatthias Ringwald/** 892026696cSMatthias Ringwald * HCI Event Getter 90c3b5b8a5SMatthias Ringwald * 912026696cSMatthias Ringwald * Note: Don't edit this file. It is generated by tool/btstack_event_generator.py 92c3b5b8a5SMatthias Ringwald * 93c3b5b8a5SMatthias Ringwald */ 94c3b5b8a5SMatthias Ringwald 9580e33422SMatthias Ringwald#ifndef BTSTACK_EVENT_H 9680e33422SMatthias Ringwald#define BTSTACK_EVENT_H 97c3b5b8a5SMatthias Ringwald 98c3b5b8a5SMatthias Ringwald#if defined __cplusplus 99c3b5b8a5SMatthias Ringwaldextern "C" { 100c3b5b8a5SMatthias Ringwald#endif 101c3b5b8a5SMatthias Ringwald 102c3b5b8a5SMatthias Ringwald#include "btstack_util.h" 103c3b5b8a5SMatthias Ringwald#include <stdint.h> 104c3b5b8a5SMatthias Ringwald 105313e337bSMatthias Ringwald#ifdef ENABLE_BLE 106313e337bSMatthias Ringwald#include "ble/gatt_client.h" 107313e337bSMatthias Ringwald#endif 108313e337bSMatthias Ringwald 109c3b5b8a5SMatthias Ringwald/* API_START */ 110c3b5b8a5SMatthias Ringwald 1110e2df43fSMatthias Ringwald/** 1120e2df43fSMatthias Ringwald * @brief Get event type 1130e2df43fSMatthias Ringwald * @param event 1140e2df43fSMatthias Ringwald * @return type of event 1150e2df43fSMatthias Ringwald */ 1160e2df43fSMatthias Ringwaldstatic inline uint8_t hci_event_packet_get_type(const uint8_t * event){ 1170e2df43fSMatthias Ringwald return event[0]; 1180e2df43fSMatthias Ringwald} 1190e2df43fSMatthias Ringwald 120c3b5b8a5SMatthias Ringwald""" 121c3b5b8a5SMatthias Ringwald 122c3b5b8a5SMatthias Ringwaldhfile_header_end = """ 123c3b5b8a5SMatthias Ringwald 124c3b5b8a5SMatthias Ringwald/* API_END */ 125c3b5b8a5SMatthias Ringwald 126c3b5b8a5SMatthias Ringwald#if defined __cplusplus 127c3b5b8a5SMatthias Ringwald} 128c3b5b8a5SMatthias Ringwald#endif 129c3b5b8a5SMatthias Ringwald 13080e33422SMatthias Ringwald#endif // BTSTACK_EVENT_H 131c3b5b8a5SMatthias Ringwald""" 132c3b5b8a5SMatthias Ringwald 133313e337bSMatthias Ringwaldc_prototoype_simple_return = '''/** 134c3b5b8a5SMatthias Ringwald * @brief {description} 1350e2df43fSMatthias Ringwald * @param event packet 136c3b5b8a5SMatthias Ringwald * @return {result_name} 137c3b5b8a5SMatthias Ringwald * @note: btstack_type {format} 138c3b5b8a5SMatthias Ringwald */ 139c3b5b8a5SMatthias Ringwaldstatic inline {result_type} {fn_name}(const uint8_t * event){{ 140c3b5b8a5SMatthias Ringwald {code} 141c3b5b8a5SMatthias Ringwald}} 142c3b5b8a5SMatthias Ringwald''' 143c3b5b8a5SMatthias Ringwald 144396f0845SMatthias Ringwaldc_prototoype_array_getter = '''/** 145396f0845SMatthias Ringwald * @brief {description} 146396f0845SMatthias Ringwald * @param event packet 147396f0845SMatthias Ringwald * @param index 148396f0845SMatthias Ringwald * @return {result_name} 149396f0845SMatthias Ringwald * @note: btstack_type {format} 150396f0845SMatthias Ringwald */ 151396f0845SMatthias Ringwaldstatic inline {result_type} {fn_name}(const uint8_t * event, uint8_t index){{ 152396f0845SMatthias Ringwald {code} 153396f0845SMatthias Ringwald}} 154396f0845SMatthias Ringwald''' 155396f0845SMatthias Ringwald 156313e337bSMatthias Ringwaldc_prototoype_struct_return = '''/** 157c3b5b8a5SMatthias Ringwald * @brief {description} 1580e2df43fSMatthias Ringwald * @param event packet 159c3b5b8a5SMatthias Ringwald * @param Pointer to storage for {result_name} 160c3b5b8a5SMatthias Ringwald * @note: btstack_type {format} 161c3b5b8a5SMatthias Ringwald */ 162c3b5b8a5SMatthias Ringwaldstatic inline void {fn_name}(const uint8_t * event, {result_type} {result_name}){{ 163c3b5b8a5SMatthias Ringwald {code} 164c3b5b8a5SMatthias Ringwald}} 165c3b5b8a5SMatthias Ringwald''' 166c3b5b8a5SMatthias Ringwald 167313e337bSMatthias Ringwaldc_prototoype_unsupported = '''/** 168c3b5b8a5SMatthias Ringwald * @brief {description} 1690e2df43fSMatthias Ringwald * @param event packet 170c3b5b8a5SMatthias Ringwald * @return {result_name} 171c3b5b8a5SMatthias Ringwald * @note: btstack_type {format} 172c3b5b8a5SMatthias Ringwald */ 173c3b5b8a5SMatthias Ringwald// static inline {result_type} {fn_name}(const uint8_t * event){{ 174c3b5b8a5SMatthias Ringwald// not implemented yet 175c3b5b8a5SMatthias Ringwald// }} 176c3b5b8a5SMatthias Ringwald''' 177c3b5b8a5SMatthias Ringwald 1780e2df43fSMatthias Ringwaldmeta_event_template = '''/*** 1790e2df43fSMatthias Ringwald * @brief Get subevent code for {meta_event} event 1800e2df43fSMatthias Ringwald * @param event packet 1810e2df43fSMatthias Ringwald * @return subevent_code 1820e2df43fSMatthias Ringwald */ 1830e2df43fSMatthias Ringwaldstatic inline uint8_t hci_event_{meta_event}_meta_get_subevent_code(const uint8_t * event){{ 1840e2df43fSMatthias Ringwald return event[2]; 1850e2df43fSMatthias Ringwald}} 1860e2df43fSMatthias Ringwald''' 1870e2df43fSMatthias Ringwald 188c3b5b8a5SMatthias Ringwald# global variables/defines 189c3b5b8a5SMatthias Ringwalddefines = dict() 190c3b5b8a5SMatthias Ringwalddefines_used = set() 191c3b5b8a5SMatthias Ringwald 192c3b5b8a5SMatthias Ringwaldparam_read = { 193c3b5b8a5SMatthias Ringwald '1' : 'return event[{offset}];', 194c3b5b8a5SMatthias Ringwald 'J' : 'return event[{offset}];', 195f8fbdce0SMatthias Ringwald '2' : 'return little_endian_read_16(event, {offset});', 196f8fbdce0SMatthias Ringwald 'L' : 'return little_endian_read_16(event, {offset});', 197f8fbdce0SMatthias Ringwald '3' : 'return little_endian_read_24(event, {offset});', 198f8fbdce0SMatthias Ringwald '4' : 'return little_endian_read_32(event, {offset});', 199f8fbdce0SMatthias Ringwald 'H' : 'return little_endian_read_16(event, {offset});', 200b1dcf9d8SMatthias Ringwald 'B' : 'reverse_bytes(&event[{offset}], {result_name}, 6);', 2017bd8e93bSMatthias Ringwald 'R' : 'return &event[{offset}];', 20247430bedSMatthias Ringwald 'N' : 'return (const char *) &event[{offset}];', 2034de250b4SMatthias Ringwald 'T' : 'return (const char *) &event[{offset}];', 2048ba9588fSMatthias Ringwald 'D' : 'return (const uint8_t *) &event[{offset}];', 20575a8e4faSMatthias Ringwald 'K' : 'reverse_bytes(&event[{offset}], {result_name}, 16);', 20682180fcaSMatthias Ringwald 'Q' : 'reverse_bytes(&event[{offset}], {result_name}, 32);', 2074de250b4SMatthias Ringwald 'V' : 'return &event[{offset}];', 208313e337bSMatthias Ringwald 'X' : 'gatt_client_deserialize_service(event, {offset}, {result_name});', 209313e337bSMatthias Ringwald 'Y' : 'gatt_client_deserialize_characteristic(event, {offset}, {result_name});', 210313e337bSMatthias Ringwald 'Z' : 'gatt_client_deserialize_characteristic_descriptor(event, {offset}, {result_name});', 21147430bedSMatthias Ringwald 'V' : 'return &event[{offset}];', 212396f0845SMatthias Ringwald 'C' : 'return little_endian_read_16(event, {offset} + (2 * index));' 213c3b5b8a5SMatthias Ringwald} 214c3b5b8a5SMatthias Ringwald 215c3b5b8a5SMatthias Ringwalddef c_type_for_btstack_type(type): 216c3b5b8a5SMatthias Ringwald param_types = { '1' : 'uint8_t', '2' : 'uint16_t', '3' : 'uint32_t', '4' : 'uint32_t', 'H' : 'hci_con_handle_t', 'B' : 'bd_addr_t', 21747430bedSMatthias Ringwald 'D' : 'const uint8_t *', 'E' : 'const uint8_t * ', 'N' : 'const char *' , 'P' : 'const uint8_t *', 'A' : 'const uint8_t *', 218c3b5b8a5SMatthias Ringwald 'R' : 'const uint8_t *', 'S' : 'const uint8_t *', 21938d9ec05SMatthias Ringwald 'J' : 'uint8_t', 'L' : 'uint16_t', 'V' : 'const uint8_t *', 'U' : 'BT_UUID', 22075a8e4faSMatthias Ringwald 'Q' : 'uint8_t *', 'K' : 'uint8_t *', 221313e337bSMatthias Ringwald 'X' : 'gatt_client_service_t *', 'Y' : 'gatt_client_characteristic_t *', 'Z' : 'gatt_client_characteristic_descriptor_t *', 222396f0845SMatthias Ringwald 'T' : 'const char *', 'C' : 'uint16_t' } 223c3b5b8a5SMatthias Ringwald return param_types[type] 224c3b5b8a5SMatthias Ringwald 225c3b5b8a5SMatthias Ringwalddef size_for_type(type): 22675a8e4faSMatthias Ringwald param_sizes = { '1' : 1, '2' : 2, '3' : 3, '4' : 4, 'H' : 2, 'B' : 6, 'D' : 8, 'E' : 240, 'N' : 248, 'P' : 16, 'Q':32, 'K':16, 227396f0845SMatthias Ringwald 'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'U' : 16, 'X' : 20, 'Y' : 24, 'Z' : 18, 'T':-1, 'C':-1 } 228c3b5b8a5SMatthias Ringwald return param_sizes[type] 229c3b5b8a5SMatthias Ringwald 230c3b5b8a5SMatthias Ringwalddef format_function_name(event_name): 2317bd8e93bSMatthias Ringwald event_name = event_name.lower() 2327bd8e93bSMatthias Ringwald if 'event' in event_name: 2337bd8e93bSMatthias Ringwald return event_name; 2347bd8e93bSMatthias Ringwald return event_name+'_event' 235c3b5b8a5SMatthias Ringwald 236c3b5b8a5SMatthias Ringwalddef template_for_type(field_type): 237c3b5b8a5SMatthias Ringwald global c_prototoype_simple_return 238c3b5b8a5SMatthias Ringwald global c_prototoype_struct_return 239396f0845SMatthias Ringwald global c_prototoype_array_getter 240396f0845SMatthias Ringwald if field_type == 'C': 241396f0845SMatthias Ringwald return c_prototoype_array_getter 24275a8e4faSMatthias Ringwald types_with_struct_return = "BKQXYZ" 243c3b5b8a5SMatthias Ringwald if field_type in types_with_struct_return: 244c3b5b8a5SMatthias Ringwald return c_prototoype_struct_return 245c3b5b8a5SMatthias Ringwald else: 246c3b5b8a5SMatthias Ringwald return c_prototoype_simple_return 247c3b5b8a5SMatthias Ringwald 248c3b5b8a5SMatthias Ringwalddef all_fields_supported(format): 249c3b5b8a5SMatthias Ringwald global param_read 250c3b5b8a5SMatthias Ringwald for f in format: 251c3b5b8a5SMatthias Ringwald if not f in param_read: 252c3b5b8a5SMatthias Ringwald return False 253c3b5b8a5SMatthias Ringwald return True 254c3b5b8a5SMatthias Ringwald 255c3b5b8a5SMatthias Ringwalddef create_getter(event_name, field_name, field_type, offset, supported): 256c3b5b8a5SMatthias Ringwald global c_prototoype_unsupported 257c3b5b8a5SMatthias Ringwald global param_read 258c3b5b8a5SMatthias Ringwald 259396f0845SMatthias Ringwald if field_type == 'C': 260396f0845SMatthias Ringwald description_template = 'Get element of array field %s from event %s' 261396f0845SMatthias Ringwald else: 262396f0845SMatthias Ringwald description_template = "Get field %s from event %s" 263396f0845SMatthias Ringwald description = description_template % (field_name, event_name.upper()) 264c3b5b8a5SMatthias Ringwald result_name = field_name 265c3b5b8a5SMatthias Ringwald fn_name = "%s_get_%s" % (event_name, field_name) 266c3b5b8a5SMatthias Ringwald result_type = c_type_for_btstack_type(field_type) 267c3b5b8a5SMatthias Ringwald template = c_prototoype_unsupported 268c3b5b8a5SMatthias Ringwald code = '' 269c3b5b8a5SMatthias Ringwald if supported and field_type in param_read: 270c3b5b8a5SMatthias Ringwald template = template_for_type(field_type) 271c3b5b8a5SMatthias Ringwald code = param_read[field_type].format(offset=offset, result_name=result_name) 272c3b5b8a5SMatthias Ringwald return template.format(description=description, fn_name=fn_name, result_name=result_name, result_type=result_type, code=code, format=field_type) 273c3b5b8a5SMatthias Ringwald 274313e337bSMatthias Ringwalddef is_le_event(event_group): 275313e337bSMatthias Ringwald return event_group in ['GATT', 'ANCS', 'SM'] 276313e337bSMatthias Ringwald 277c3b5b8a5SMatthias Ringwalddef create_events(events): 278c3b5b8a5SMatthias Ringwald global gen_path 279c3b5b8a5SMatthias Ringwald global copyright 280c3b5b8a5SMatthias Ringwald global hfile_header_begin 281c3b5b8a5SMatthias Ringwald global hfile_header_end 2820e2df43fSMatthias Ringwald global meta_event_template 283c3b5b8a5SMatthias Ringwald 284c3b5b8a5SMatthias Ringwald with open(gen_path, 'wt') as fout: 285c3b5b8a5SMatthias Ringwald fout.write(copyright) 286c3b5b8a5SMatthias Ringwald fout.write(hfile_header_begin) 2870e2df43fSMatthias Ringwald 2880e2df43fSMatthias Ringwald for meta_event in meta_events: 2890e2df43fSMatthias Ringwald fout.write(meta_event_template.format(meta_event=meta_event.lower())) 2900e2df43fSMatthias Ringwald 291c3b5b8a5SMatthias Ringwald for event_type, event_name, format, args in events: 29272b50801SMatthias Ringwald parts = event_name.split("_") 293313e337bSMatthias Ringwald event_group = parts[0] 294f1b34e8dSMatthias Ringwald if not event_group in supported_event_groups: 295a59bfbf7SMatthias Ringwald print("// %s " % event_name) 2967bd8e93bSMatthias Ringwald continue 2976397af06SMatthias Ringwald # print(event_name) 2986397af06SMatthias Ringwald base_name = format_function_name(event_name) 2994de250b4SMatthias Ringwald length_name = '' 300c3b5b8a5SMatthias Ringwald offset = 2 301e222d6a0SMatthias Ringwald offset_is_number = 1 302e222d6a0SMatthias Ringwald offset_unknown = 0 303c3b5b8a5SMatthias Ringwald supported = all_fields_supported(format) 304e222d6a0SMatthias Ringwald last_variable_length_field_pos = "" 305313e337bSMatthias Ringwald if is_le_event(event_group): 306313e337bSMatthias Ringwald fout.write("#ifdef ENABLE_BLE\n") 3076397af06SMatthias Ringwald if len(format) != len(args): 3086397af06SMatthias Ringwald print(event_name.upper()) 3096397af06SMatthias Ringwald print ("Format %s does not match params %s " % (format, args)) 3106397af06SMatthias Ringwald print 311c3b5b8a5SMatthias Ringwald for f, arg in zip(format, args): 312c3b5b8a5SMatthias Ringwald field_name = arg 31390944a9aSMatthias Ringwald if field_name.lower() == 'subevent_code': 31490944a9aSMatthias Ringwald offset += 1 31590944a9aSMatthias Ringwald continue 316e222d6a0SMatthias Ringwald if offset_unknown: 317396f0845SMatthias Ringwald print("Param after variable length field without preceding 'J' length field") 318e222d6a0SMatthias Ringwald break 319c3b5b8a5SMatthias Ringwald field_type = f 3206397af06SMatthias Ringwald text = create_getter(base_name, field_name, field_type, offset, supported) 321c3b5b8a5SMatthias Ringwald fout.write(text) 3227bd8e93bSMatthias Ringwald if field_type in 'RT': 323c3b5b8a5SMatthias Ringwald break 324e222d6a0SMatthias Ringwald if field_type in 'J': 325e222d6a0SMatthias Ringwald if offset_is_number: 326e222d6a0SMatthias Ringwald last_variable_length_field_pos = '%u' % offset 327e222d6a0SMatthias Ringwald else: 328e222d6a0SMatthias Ringwald last_variable_length_field_pos = offset 329e222d6a0SMatthias Ringwald if field_type in 'V': 3305c544019SMatthias Ringwald if last_variable_length_field_pos != '': 331e222d6a0SMatthias Ringwald if offset_is_number: 332e222d6a0SMatthias Ringwald # convert to string 3330dd3c6c3SMatthias Ringwald offset = '%uu' % offset 334e222d6a0SMatthias Ringwald offset_is_number = 0 335e222d6a0SMatthias Ringwald offset = offset + ' + event[%s]' % last_variable_length_field_pos 336e222d6a0SMatthias Ringwald else: 337e222d6a0SMatthias Ringwald offset_unknown = 1 338e222d6a0SMatthias Ringwald else: 339e222d6a0SMatthias Ringwald if offset_is_number: 340c3b5b8a5SMatthias Ringwald offset += size_for_type(field_type) 341e222d6a0SMatthias Ringwald else: 3420dd3c6c3SMatthias Ringwald offset = offset + ' + %uu' % size_for_type(field_type) 343313e337bSMatthias Ringwald if is_le_event(event_group): 344313e337bSMatthias Ringwald fout.write("#endif\n") 345313e337bSMatthias Ringwald fout.write("\n") 346c3b5b8a5SMatthias Ringwald 347c3b5b8a5SMatthias Ringwald fout.write(hfile_header_end) 348c3b5b8a5SMatthias Ringwald 3499d585a82SMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..') 3509d585a82SMatthias Ringwaldgen_path = btstack_root + '/src/btstack_event.h' 351c3b5b8a5SMatthias Ringwald 352c3b5b8a5SMatthias Ringwaldprint(program_info) 353c3b5b8a5SMatthias Ringwald 354c3b5b8a5SMatthias Ringwald# parse events 355c3b5b8a5SMatthias Ringwald(events, le_events, event_types) = parser.parse_events() 356c3b5b8a5SMatthias Ringwald 357c3b5b8a5SMatthias Ringwald# create event field accesors 358c3b5b8a5SMatthias Ringwaldcreate_events(events + le_events) 359c3b5b8a5SMatthias Ringwald 360c3b5b8a5SMatthias Ringwald# done 361c3b5b8a5SMatthias Ringwaldprint('Done!') 362