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', 1528e59789SMilanka Ringwald 'GATTSERVICE', 16f1b34e8dSMatthias Ringwald 'GOEP', 17f1b34e8dSMatthias Ringwald 'HFP', 18dd148ddbSMatthias Ringwald 'HID', 19a4bfc4feSMatthias Ringwald 'HIDS', 2028e59789SMilanka Ringwald 'HSP', 2128e59789SMilanka Ringwald 'LE', 22ad58991cSMilanka Ringwald 'MAP', 23b673498bSMatthias Ringwald 'MESH', 24ad58991cSMilanka Ringwald 'PBAP', 25f1b34e8dSMatthias Ringwald] 26f1b34e8dSMatthias Ringwald 27f1b34e8dSMatthias Ringwaldsupported_event_groups = meta_events + [ 2828e59789SMilanka Ringwald 'ATT', 2928e59789SMilanka Ringwald 'BNEP', 30f1b34e8dSMatthias Ringwald 'BTSTACK', 31f1b34e8dSMatthias Ringwald 'GAP', 3228e59789SMilanka Ringwald 'GATT', 33f1b34e8dSMatthias Ringwald 'HCI', 3428e59789SMilanka Ringwald 'HID', 35f1b34e8dSMatthias Ringwald 'L2CAP', 36f1b34e8dSMatthias Ringwald 'RFCOMM', 3728e59789SMilanka Ringwald 'SDP', 3828e59789SMilanka Ringwald 'SM' 39f1b34e8dSMatthias Ringwald] 40f1b34e8dSMatthias Ringwald 41c3b5b8a5SMatthias Ringwaldprogram_info = ''' 42c3b5b8a5SMatthias RingwaldBTstack Event Getter Generator for BTstack 43c3b5b8a5SMatthias RingwaldCopyright 2016, BlueKitchen GmbH 44c3b5b8a5SMatthias Ringwald''' 45c3b5b8a5SMatthias Ringwald 46c3b5b8a5SMatthias Ringwaldcopyright = """/* 47c3b5b8a5SMatthias Ringwald * Copyright (C) 2016 BlueKitchen GmbH 48c3b5b8a5SMatthias Ringwald * 49c3b5b8a5SMatthias Ringwald * Redistribution and use in source and binary forms, with or without 50c3b5b8a5SMatthias Ringwald * modification, are permitted provided that the following conditions 51c3b5b8a5SMatthias Ringwald * are met: 52c3b5b8a5SMatthias Ringwald * 53c3b5b8a5SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright 54c3b5b8a5SMatthias Ringwald * notice, this list of conditions and the following disclaimer. 55c3b5b8a5SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright 56c3b5b8a5SMatthias Ringwald * notice, this list of conditions and the following disclaimer in the 57c3b5b8a5SMatthias Ringwald * documentation and/or other materials provided with the distribution. 58c3b5b8a5SMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of 59c3b5b8a5SMatthias Ringwald * contributors may be used to endorse or promote products derived 60c3b5b8a5SMatthias Ringwald * from this software without specific prior written permission. 61c3b5b8a5SMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for 62c3b5b8a5SMatthias Ringwald * personal benefit and not for any commercial purpose or for 63c3b5b8a5SMatthias Ringwald * monetary gain. 64c3b5b8a5SMatthias Ringwald * 65c3b5b8a5SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 66c3b5b8a5SMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 67c3b5b8a5SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 68c3b5b8a5SMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 69c3b5b8a5SMatthias Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 70c3b5b8a5SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 71c3b5b8a5SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 72c3b5b8a5SMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 73c3b5b8a5SMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 74c3b5b8a5SMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 75c3b5b8a5SMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 76c3b5b8a5SMatthias Ringwald * SUCH DAMAGE. 77c3b5b8a5SMatthias Ringwald * 78c3b5b8a5SMatthias Ringwald * Please inquire about commercial licensing options at 79c3b5b8a5SMatthias Ringwald * [email protected] 80c3b5b8a5SMatthias Ringwald * 81c3b5b8a5SMatthias Ringwald */ 82c3b5b8a5SMatthias Ringwald""" 83c3b5b8a5SMatthias Ringwald 84c3b5b8a5SMatthias Ringwaldhfile_header_begin = """ 85c3b5b8a5SMatthias Ringwald 86c3b5b8a5SMatthias Ringwald/* 87c3b5b8a5SMatthias Ringwald * btstack_event.h 88c3b5b8a5SMatthias Ringwald * 89c3b5b8a5SMatthias Ringwald * @brief BTstack event getter/setter 90c3b5b8a5SMatthias Ringwald * @note Don't edit - generated by tool/btstack_event_generator.py 91c3b5b8a5SMatthias Ringwald * 92c3b5b8a5SMatthias Ringwald */ 93c3b5b8a5SMatthias Ringwald 9480e33422SMatthias Ringwald#ifndef BTSTACK_EVENT_H 9580e33422SMatthias Ringwald#define BTSTACK_EVENT_H 96c3b5b8a5SMatthias Ringwald 97c3b5b8a5SMatthias Ringwald#if defined __cplusplus 98c3b5b8a5SMatthias Ringwaldextern "C" { 99c3b5b8a5SMatthias Ringwald#endif 100c3b5b8a5SMatthias Ringwald 101c3b5b8a5SMatthias Ringwald#include "btstack_util.h" 102c3b5b8a5SMatthias Ringwald#include <stdint.h> 103c3b5b8a5SMatthias Ringwald 104313e337bSMatthias Ringwald#ifdef ENABLE_BLE 105313e337bSMatthias Ringwald#include "ble/gatt_client.h" 106313e337bSMatthias Ringwald#endif 107313e337bSMatthias Ringwald 108c3b5b8a5SMatthias Ringwald/* API_START */ 109c3b5b8a5SMatthias Ringwald 1100e2df43fSMatthias Ringwald/** 1110e2df43fSMatthias Ringwald * @brief Get event type 1120e2df43fSMatthias Ringwald * @param event 1130e2df43fSMatthias Ringwald * @return type of event 1140e2df43fSMatthias Ringwald */ 1150e2df43fSMatthias Ringwaldstatic inline uint8_t hci_event_packet_get_type(const uint8_t * event){ 1160e2df43fSMatthias Ringwald return event[0]; 1170e2df43fSMatthias Ringwald} 1180e2df43fSMatthias Ringwald 119c3b5b8a5SMatthias Ringwald""" 120c3b5b8a5SMatthias Ringwald 121c3b5b8a5SMatthias Ringwaldhfile_header_end = """ 122c3b5b8a5SMatthias Ringwald 123c3b5b8a5SMatthias Ringwald/* API_END */ 124c3b5b8a5SMatthias Ringwald 125c3b5b8a5SMatthias Ringwald#if defined __cplusplus 126c3b5b8a5SMatthias Ringwald} 127c3b5b8a5SMatthias Ringwald#endif 128c3b5b8a5SMatthias Ringwald 12980e33422SMatthias Ringwald#endif // BTSTACK_EVENT_H 130c3b5b8a5SMatthias Ringwald""" 131c3b5b8a5SMatthias Ringwald 132313e337bSMatthias Ringwaldc_prototoype_simple_return = '''/** 133c3b5b8a5SMatthias Ringwald * @brief {description} 1340e2df43fSMatthias Ringwald * @param event packet 135c3b5b8a5SMatthias Ringwald * @return {result_name} 136c3b5b8a5SMatthias Ringwald * @note: btstack_type {format} 137c3b5b8a5SMatthias Ringwald */ 138c3b5b8a5SMatthias Ringwaldstatic inline {result_type} {fn_name}(const uint8_t * event){{ 139c3b5b8a5SMatthias Ringwald {code} 140c3b5b8a5SMatthias Ringwald}} 141c3b5b8a5SMatthias Ringwald''' 142c3b5b8a5SMatthias Ringwald 143313e337bSMatthias Ringwaldc_prototoype_struct_return = '''/** 144c3b5b8a5SMatthias Ringwald * @brief {description} 1450e2df43fSMatthias Ringwald * @param event packet 146c3b5b8a5SMatthias Ringwald * @param Pointer to storage for {result_name} 147c3b5b8a5SMatthias Ringwald * @note: btstack_type {format} 148c3b5b8a5SMatthias Ringwald */ 149c3b5b8a5SMatthias Ringwaldstatic inline void {fn_name}(const uint8_t * event, {result_type} {result_name}){{ 150c3b5b8a5SMatthias Ringwald {code} 151c3b5b8a5SMatthias Ringwald}} 152c3b5b8a5SMatthias Ringwald''' 153c3b5b8a5SMatthias Ringwald 154313e337bSMatthias Ringwaldc_prototoype_unsupported = '''/** 155c3b5b8a5SMatthias Ringwald * @brief {description} 1560e2df43fSMatthias Ringwald * @param event packet 157c3b5b8a5SMatthias Ringwald * @return {result_name} 158c3b5b8a5SMatthias Ringwald * @note: btstack_type {format} 159c3b5b8a5SMatthias Ringwald */ 160c3b5b8a5SMatthias Ringwald// static inline {result_type} {fn_name}(const uint8_t * event){{ 161c3b5b8a5SMatthias Ringwald// not implemented yet 162c3b5b8a5SMatthias Ringwald// }} 163c3b5b8a5SMatthias Ringwald''' 164c3b5b8a5SMatthias Ringwald 1650e2df43fSMatthias Ringwaldmeta_event_template = '''/*** 1660e2df43fSMatthias Ringwald * @brief Get subevent code for {meta_event} event 1670e2df43fSMatthias Ringwald * @param event packet 1680e2df43fSMatthias Ringwald * @return subevent_code 1690e2df43fSMatthias Ringwald */ 1700e2df43fSMatthias Ringwaldstatic inline uint8_t hci_event_{meta_event}_meta_get_subevent_code(const uint8_t * event){{ 1710e2df43fSMatthias Ringwald return event[2]; 1720e2df43fSMatthias Ringwald}} 1730e2df43fSMatthias Ringwald''' 1740e2df43fSMatthias Ringwald 175c3b5b8a5SMatthias Ringwald# global variables/defines 1769d585a82SMatthias Ringwald# gen_path = '../src/btstack_event.h' 177c3b5b8a5SMatthias Ringwald 178c3b5b8a5SMatthias Ringwalddefines = dict() 179c3b5b8a5SMatthias Ringwalddefines_used = set() 180c3b5b8a5SMatthias Ringwald 181c3b5b8a5SMatthias Ringwaldparam_read = { 182c3b5b8a5SMatthias Ringwald '1' : 'return event[{offset}];', 183c3b5b8a5SMatthias Ringwald 'J' : 'return event[{offset}];', 184f8fbdce0SMatthias Ringwald '2' : 'return little_endian_read_16(event, {offset});', 185f8fbdce0SMatthias Ringwald 'L' : 'return little_endian_read_16(event, {offset});', 186f8fbdce0SMatthias Ringwald '3' : 'return little_endian_read_24(event, {offset});', 187f8fbdce0SMatthias Ringwald '4' : 'return little_endian_read_32(event, {offset});', 188f8fbdce0SMatthias Ringwald 'H' : 'return little_endian_read_16(event, {offset});', 189b1dcf9d8SMatthias Ringwald 'B' : 'reverse_bytes(&event[{offset}], {result_name}, 6);', 1907bd8e93bSMatthias Ringwald 'R' : 'return &event[{offset}];', 19147430bedSMatthias Ringwald 'N' : 'return (const char *) &event[{offset}];', 1924de250b4SMatthias Ringwald 'T' : 'return (const char *) &event[{offset}];', 1938ba9588fSMatthias Ringwald 'D' : 'return (const uint8_t *) &event[{offset}];', 194*75a8e4faSMatthias Ringwald 'K' : 'reverse_bytes(&event[{offset}], {result_name}, 16);', 19582180fcaSMatthias Ringwald 'Q' : 'reverse_bytes(&event[{offset}], {result_name}, 32);', 1964de250b4SMatthias Ringwald 'V' : 'return &event[{offset}];', 197313e337bSMatthias Ringwald 'X' : 'gatt_client_deserialize_service(event, {offset}, {result_name});', 198313e337bSMatthias Ringwald 'Y' : 'gatt_client_deserialize_characteristic(event, {offset}, {result_name});', 199313e337bSMatthias Ringwald 'Z' : 'gatt_client_deserialize_characteristic_descriptor(event, {offset}, {result_name});', 20047430bedSMatthias Ringwald 'V' : 'return &event[{offset}];', 201c3b5b8a5SMatthias Ringwald} 202c3b5b8a5SMatthias Ringwald 203c3b5b8a5SMatthias Ringwalddef c_type_for_btstack_type(type): 204c3b5b8a5SMatthias Ringwald param_types = { '1' : 'uint8_t', '2' : 'uint16_t', '3' : 'uint32_t', '4' : 'uint32_t', 'H' : 'hci_con_handle_t', 'B' : 'bd_addr_t', 20547430bedSMatthias Ringwald 'D' : 'const uint8_t *', 'E' : 'const uint8_t * ', 'N' : 'const char *' , 'P' : 'const uint8_t *', 'A' : 'const uint8_t *', 206c3b5b8a5SMatthias Ringwald 'R' : 'const uint8_t *', 'S' : 'const uint8_t *', 20738d9ec05SMatthias Ringwald 'J' : 'uint8_t', 'L' : 'uint16_t', 'V' : 'const uint8_t *', 'U' : 'BT_UUID', 208*75a8e4faSMatthias Ringwald 'Q' : 'uint8_t *', 'K' : 'uint8_t *', 209313e337bSMatthias Ringwald 'X' : 'gatt_client_service_t *', 'Y' : 'gatt_client_characteristic_t *', 'Z' : 'gatt_client_characteristic_descriptor_t *', 2107bd8e93bSMatthias Ringwald 'T' : 'const char *'} 211c3b5b8a5SMatthias Ringwald return param_types[type] 212c3b5b8a5SMatthias Ringwald 213c3b5b8a5SMatthias Ringwalddef size_for_type(type): 214*75a8e4faSMatthias 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, 215c3b5b8a5SMatthias Ringwald 'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'U' : 16, 'X' : 20, 'Y' : 24, 'Z' : 18, 'T':-1} 216c3b5b8a5SMatthias Ringwald return param_sizes[type] 217c3b5b8a5SMatthias Ringwald 218c3b5b8a5SMatthias Ringwalddef format_function_name(event_name): 2197bd8e93bSMatthias Ringwald event_name = event_name.lower() 2207bd8e93bSMatthias Ringwald if 'event' in event_name: 2217bd8e93bSMatthias Ringwald return event_name; 2227bd8e93bSMatthias Ringwald return event_name+'_event' 223c3b5b8a5SMatthias Ringwald 224c3b5b8a5SMatthias Ringwalddef template_for_type(field_type): 225c3b5b8a5SMatthias Ringwald global c_prototoype_simple_return 226c3b5b8a5SMatthias Ringwald global c_prototoype_struct_return 227*75a8e4faSMatthias Ringwald types_with_struct_return = "BKQXYZ" 228c3b5b8a5SMatthias Ringwald if field_type in types_with_struct_return: 229c3b5b8a5SMatthias Ringwald return c_prototoype_struct_return 230c3b5b8a5SMatthias Ringwald else: 231c3b5b8a5SMatthias Ringwald return c_prototoype_simple_return 232c3b5b8a5SMatthias Ringwald 233c3b5b8a5SMatthias Ringwalddef all_fields_supported(format): 234c3b5b8a5SMatthias Ringwald global param_read 235c3b5b8a5SMatthias Ringwald for f in format: 236c3b5b8a5SMatthias Ringwald if not f in param_read: 237c3b5b8a5SMatthias Ringwald return False 238c3b5b8a5SMatthias Ringwald return True 239c3b5b8a5SMatthias Ringwald 240c3b5b8a5SMatthias Ringwalddef create_getter(event_name, field_name, field_type, offset, supported): 241c3b5b8a5SMatthias Ringwald global c_prototoype_unsupported 242c3b5b8a5SMatthias Ringwald global param_read 243c3b5b8a5SMatthias Ringwald 244568284b0SMatthias Ringwald description = "Get field %s from event %s" % (field_name, event_name.upper()) 245c3b5b8a5SMatthias Ringwald result_name = field_name 246c3b5b8a5SMatthias Ringwald fn_name = "%s_get_%s" % (event_name, field_name) 247c3b5b8a5SMatthias Ringwald result_type = c_type_for_btstack_type(field_type) 248c3b5b8a5SMatthias Ringwald template = c_prototoype_unsupported 249c3b5b8a5SMatthias Ringwald code = '' 250c3b5b8a5SMatthias Ringwald if supported and field_type in param_read: 251c3b5b8a5SMatthias Ringwald template = template_for_type(field_type) 252c3b5b8a5SMatthias Ringwald code = param_read[field_type].format(offset=offset, result_name=result_name) 253c3b5b8a5SMatthias Ringwald return template.format(description=description, fn_name=fn_name, result_name=result_name, result_type=result_type, code=code, format=field_type) 254c3b5b8a5SMatthias Ringwald 255313e337bSMatthias Ringwalddef is_le_event(event_group): 256313e337bSMatthias Ringwald return event_group in ['GATT', 'ANCS', 'SM'] 257313e337bSMatthias Ringwald 258c3b5b8a5SMatthias Ringwalddef create_events(events): 259c3b5b8a5SMatthias Ringwald global gen_path 260c3b5b8a5SMatthias Ringwald global copyright 261c3b5b8a5SMatthias Ringwald global hfile_header_begin 262c3b5b8a5SMatthias Ringwald global hfile_header_end 2630e2df43fSMatthias Ringwald global meta_event_template 264c3b5b8a5SMatthias Ringwald 265c3b5b8a5SMatthias Ringwald with open(gen_path, 'wt') as fout: 266c3b5b8a5SMatthias Ringwald fout.write(copyright) 267c3b5b8a5SMatthias Ringwald fout.write(hfile_header_begin) 2680e2df43fSMatthias Ringwald 2690e2df43fSMatthias Ringwald for meta_event in meta_events: 2700e2df43fSMatthias Ringwald fout.write(meta_event_template.format(meta_event=meta_event.lower())) 2710e2df43fSMatthias Ringwald 272c3b5b8a5SMatthias Ringwald for event_type, event_name, format, args in events: 27372b50801SMatthias Ringwald parts = event_name.split("_") 274313e337bSMatthias Ringwald event_group = parts[0] 275f1b34e8dSMatthias Ringwald if not event_group in supported_event_groups: 276a59bfbf7SMatthias Ringwald print("// %s " % event_name) 2777bd8e93bSMatthias Ringwald continue 2786397af06SMatthias Ringwald # print(event_name) 2796397af06SMatthias Ringwald base_name = format_function_name(event_name) 2804de250b4SMatthias Ringwald length_name = '' 281c3b5b8a5SMatthias Ringwald offset = 2 282e222d6a0SMatthias Ringwald offset_is_number = 1 283e222d6a0SMatthias Ringwald offset_unknown = 0 284c3b5b8a5SMatthias Ringwald supported = all_fields_supported(format) 285e222d6a0SMatthias Ringwald last_variable_length_field_pos = "" 286313e337bSMatthias Ringwald if is_le_event(event_group): 287313e337bSMatthias Ringwald fout.write("#ifdef ENABLE_BLE\n") 2886397af06SMatthias Ringwald if len(format) != len(args): 2896397af06SMatthias Ringwald print(event_name.upper()) 2906397af06SMatthias Ringwald print ("Format %s does not match params %s " % (format, args)) 2916397af06SMatthias Ringwald print 292c3b5b8a5SMatthias Ringwald for f, arg in zip(format, args): 293c3b5b8a5SMatthias Ringwald field_name = arg 29490944a9aSMatthias Ringwald if field_name.lower() == 'subevent_code': 29590944a9aSMatthias Ringwald offset += 1 29690944a9aSMatthias Ringwald continue 297e222d6a0SMatthias Ringwald if offset_unknown: 298e222d6a0SMatthias Ringwald print("Param after variable length field without preceding 'J' lenght field") 299e222d6a0SMatthias Ringwald break 300c3b5b8a5SMatthias Ringwald field_type = f 3016397af06SMatthias Ringwald text = create_getter(base_name, field_name, field_type, offset, supported) 302c3b5b8a5SMatthias Ringwald fout.write(text) 3037bd8e93bSMatthias Ringwald if field_type in 'RT': 304c3b5b8a5SMatthias Ringwald break 305e222d6a0SMatthias Ringwald if field_type in 'J': 306e222d6a0SMatthias Ringwald if offset_is_number: 307e222d6a0SMatthias Ringwald last_variable_length_field_pos = '%u' % offset 308e222d6a0SMatthias Ringwald else: 309e222d6a0SMatthias Ringwald last_variable_length_field_pos = offset 310e222d6a0SMatthias Ringwald if field_type in 'V': 3115c544019SMatthias Ringwald if last_variable_length_field_pos != '': 312e222d6a0SMatthias Ringwald if offset_is_number: 313e222d6a0SMatthias Ringwald # convert to string 3140dd3c6c3SMatthias Ringwald offset = '%uu' % offset 315e222d6a0SMatthias Ringwald offset_is_number = 0 316e222d6a0SMatthias Ringwald offset = offset + ' + event[%s]' % last_variable_length_field_pos 317e222d6a0SMatthias Ringwald else: 318e222d6a0SMatthias Ringwald offset_unknown = 1 319e222d6a0SMatthias Ringwald else: 320e222d6a0SMatthias Ringwald if offset_is_number: 321c3b5b8a5SMatthias Ringwald offset += size_for_type(field_type) 322e222d6a0SMatthias Ringwald else: 3230dd3c6c3SMatthias Ringwald offset = offset + ' + %uu' % size_for_type(field_type) 324313e337bSMatthias Ringwald if is_le_event(event_group): 325313e337bSMatthias Ringwald fout.write("#endif\n") 326313e337bSMatthias Ringwald fout.write("\n") 327c3b5b8a5SMatthias Ringwald 328c3b5b8a5SMatthias Ringwald fout.write(hfile_header_end) 329c3b5b8a5SMatthias Ringwald 3309d585a82SMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..') 3319d585a82SMatthias Ringwaldgen_path = btstack_root + '/src/btstack_event.h' 332c3b5b8a5SMatthias Ringwald 333c3b5b8a5SMatthias Ringwaldprint(program_info) 334c3b5b8a5SMatthias Ringwald 335c3b5b8a5SMatthias Ringwald# parse events 336c3b5b8a5SMatthias Ringwald(events, le_events, event_types) = parser.parse_events() 337c3b5b8a5SMatthias Ringwald 338c3b5b8a5SMatthias Ringwald# create event field accesors 339c3b5b8a5SMatthias Ringwaldcreate_events(events + le_events) 340c3b5b8a5SMatthias Ringwald 341c3b5b8a5SMatthias Ringwald# done 342c3b5b8a5SMatthias Ringwaldprint('Done!') 343