xref: /btstack/tool/btstack_event_generator.py (revision a4bfc4fed9788167987fe41b4b209fe270426de1)
1c3b5b8a5SMatthias Ringwald#!/usr/bin/env python
2c3b5b8a5SMatthias Ringwald# BlueKitchen GmbH (c) 2014
3c3b5b8a5SMatthias Ringwald
4c3b5b8a5SMatthias Ringwaldimport glob
5c3b5b8a5SMatthias Ringwaldimport re
6c3b5b8a5SMatthias Ringwaldimport sys
7c3b5b8a5SMatthias Ringwaldimport os
8c3b5b8a5SMatthias Ringwald
9c3b5b8a5SMatthias Ringwaldimport btstack_parser as parser
10c3b5b8a5SMatthias Ringwald
11f1b34e8dSMatthias Ringwaldmeta_events = [
12f1b34e8dSMatthias Ringwald    'ANCS',
13f1b34e8dSMatthias Ringwald    'AVDTP',
1446e6b063SMilanka Ringwald    'A2DP',
15f1b34e8dSMatthias Ringwald    'AVRCP',
16f1b34e8dSMatthias Ringwald    'GOEP',
17f1b34e8dSMatthias Ringwald    'HFP',
18f1b34e8dSMatthias Ringwald    'HSP',
19f1b34e8dSMatthias Ringwald    'PBAP',
20dd148ddbSMatthias Ringwald    'LE',
21dd148ddbSMatthias Ringwald    'HID',
22*a4bfc4feSMatthias Ringwald    'HIDS',
23f1b34e8dSMatthias Ringwald]
24f1b34e8dSMatthias Ringwald
25f1b34e8dSMatthias Ringwaldsupported_event_groups = meta_events + [
26f1b34e8dSMatthias Ringwald    'BTSTACK',
27f1b34e8dSMatthias Ringwald    'GAP',
28f1b34e8dSMatthias Ringwald    'HCI',
29f1b34e8dSMatthias Ringwald    'SDP',
30f1b34e8dSMatthias Ringwald    'SM',
31f1b34e8dSMatthias Ringwald    'L2CAP',
32f1b34e8dSMatthias Ringwald    'RFCOMM',
33f1b34e8dSMatthias Ringwald    'GATT',
34f1b34e8dSMatthias Ringwald    'BNEP',
35f1b34e8dSMatthias Ringwald    'ATT',
36dd148ddbSMatthias Ringwald    'HID',
37f1b34e8dSMatthias Ringwald]
38f1b34e8dSMatthias Ringwald
39c3b5b8a5SMatthias Ringwaldprogram_info = '''
40c3b5b8a5SMatthias RingwaldBTstack Event Getter Generator for BTstack
41c3b5b8a5SMatthias RingwaldCopyright 2016, BlueKitchen GmbH
42c3b5b8a5SMatthias Ringwald'''
43c3b5b8a5SMatthias Ringwald
44c3b5b8a5SMatthias Ringwaldcopyright = """/*
45c3b5b8a5SMatthias Ringwald * Copyright (C) 2016 BlueKitchen GmbH
46c3b5b8a5SMatthias Ringwald *
47c3b5b8a5SMatthias Ringwald * Redistribution and use in source and binary forms, with or without
48c3b5b8a5SMatthias Ringwald * modification, are permitted provided that the following conditions
49c3b5b8a5SMatthias Ringwald * are met:
50c3b5b8a5SMatthias Ringwald *
51c3b5b8a5SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright
52c3b5b8a5SMatthias Ringwald *    notice, this list of conditions and the following disclaimer.
53c3b5b8a5SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright
54c3b5b8a5SMatthias Ringwald *    notice, this list of conditions and the following disclaimer in the
55c3b5b8a5SMatthias Ringwald *    documentation and/or other materials provided with the distribution.
56c3b5b8a5SMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of
57c3b5b8a5SMatthias Ringwald *    contributors may be used to endorse or promote products derived
58c3b5b8a5SMatthias Ringwald *    from this software without specific prior written permission.
59c3b5b8a5SMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for
60c3b5b8a5SMatthias Ringwald *    personal benefit and not for any commercial purpose or for
61c3b5b8a5SMatthias Ringwald *    monetary gain.
62c3b5b8a5SMatthias Ringwald *
63c3b5b8a5SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
64c3b5b8a5SMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
65c3b5b8a5SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
66c3b5b8a5SMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
67c3b5b8a5SMatthias Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
68c3b5b8a5SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
69c3b5b8a5SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
70c3b5b8a5SMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
71c3b5b8a5SMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
72c3b5b8a5SMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
73c3b5b8a5SMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
74c3b5b8a5SMatthias Ringwald * SUCH DAMAGE.
75c3b5b8a5SMatthias Ringwald *
76c3b5b8a5SMatthias Ringwald * Please inquire about commercial licensing options at
77c3b5b8a5SMatthias Ringwald * [email protected]
78c3b5b8a5SMatthias Ringwald *
79c3b5b8a5SMatthias Ringwald */
80c3b5b8a5SMatthias Ringwald"""
81c3b5b8a5SMatthias Ringwald
82c3b5b8a5SMatthias Ringwaldhfile_header_begin = """
83c3b5b8a5SMatthias Ringwald
84c3b5b8a5SMatthias Ringwald/*
85c3b5b8a5SMatthias Ringwald *  btstack_event.h
86c3b5b8a5SMatthias Ringwald *
87c3b5b8a5SMatthias Ringwald *  @brief BTstack event getter/setter
88c3b5b8a5SMatthias Ringwald *  @note  Don't edit - generated by tool/btstack_event_generator.py
89c3b5b8a5SMatthias Ringwald *
90c3b5b8a5SMatthias Ringwald */
91c3b5b8a5SMatthias Ringwald
92c3b5b8a5SMatthias Ringwald#ifndef __BTSTACK_EVENT_H
93c3b5b8a5SMatthias Ringwald#define __BTSTACK_EVENT_H
94c3b5b8a5SMatthias Ringwald
95c3b5b8a5SMatthias Ringwald#if defined __cplusplus
96c3b5b8a5SMatthias Ringwaldextern "C" {
97c3b5b8a5SMatthias Ringwald#endif
98c3b5b8a5SMatthias Ringwald
99c3b5b8a5SMatthias Ringwald#include "btstack_util.h"
100c3b5b8a5SMatthias Ringwald#include <stdint.h>
101c3b5b8a5SMatthias Ringwald
102313e337bSMatthias Ringwald#ifdef ENABLE_BLE
103313e337bSMatthias Ringwald#include "ble/gatt_client.h"
104313e337bSMatthias Ringwald#endif
105313e337bSMatthias Ringwald
106c3b5b8a5SMatthias Ringwald/* API_START */
107c3b5b8a5SMatthias Ringwald
1080e2df43fSMatthias Ringwald/**
1090e2df43fSMatthias Ringwald * @brief Get event type
1100e2df43fSMatthias Ringwald * @param event
1110e2df43fSMatthias Ringwald * @return type of event
1120e2df43fSMatthias Ringwald */
1130e2df43fSMatthias Ringwaldstatic inline uint8_t hci_event_packet_get_type(const uint8_t * event){
1140e2df43fSMatthias Ringwald    return event[0];
1150e2df43fSMatthias Ringwald}
1160e2df43fSMatthias Ringwald
117c3b5b8a5SMatthias Ringwald"""
118c3b5b8a5SMatthias Ringwald
119c3b5b8a5SMatthias Ringwaldhfile_header_end = """
120c3b5b8a5SMatthias Ringwald
121c3b5b8a5SMatthias Ringwald/* API_END */
122c3b5b8a5SMatthias Ringwald
123c3b5b8a5SMatthias Ringwald#if defined __cplusplus
124c3b5b8a5SMatthias Ringwald}
125c3b5b8a5SMatthias Ringwald#endif
126c3b5b8a5SMatthias Ringwald
127c3b5b8a5SMatthias Ringwald#endif // __BTSTACK_EVENT_H
128c3b5b8a5SMatthias Ringwald"""
129c3b5b8a5SMatthias Ringwald
130313e337bSMatthias Ringwaldc_prototoype_simple_return = '''/**
131c3b5b8a5SMatthias Ringwald * @brief {description}
1320e2df43fSMatthias Ringwald * @param event packet
133c3b5b8a5SMatthias Ringwald * @return {result_name}
134c3b5b8a5SMatthias Ringwald * @note: btstack_type {format}
135c3b5b8a5SMatthias Ringwald */
136c3b5b8a5SMatthias Ringwaldstatic inline {result_type} {fn_name}(const uint8_t * event){{
137c3b5b8a5SMatthias Ringwald    {code}
138c3b5b8a5SMatthias Ringwald}}
139c3b5b8a5SMatthias Ringwald'''
140c3b5b8a5SMatthias Ringwald
141313e337bSMatthias Ringwaldc_prototoype_struct_return = '''/**
142c3b5b8a5SMatthias Ringwald * @brief {description}
1430e2df43fSMatthias Ringwald * @param event packet
144c3b5b8a5SMatthias Ringwald * @param Pointer to storage for {result_name}
145c3b5b8a5SMatthias Ringwald * @note: btstack_type {format}
146c3b5b8a5SMatthias Ringwald */
147c3b5b8a5SMatthias Ringwaldstatic inline void {fn_name}(const uint8_t * event, {result_type} {result_name}){{
148c3b5b8a5SMatthias Ringwald    {code}
149c3b5b8a5SMatthias Ringwald}}
150c3b5b8a5SMatthias Ringwald'''
151c3b5b8a5SMatthias Ringwald
152313e337bSMatthias Ringwaldc_prototoype_unsupported = '''/**
153c3b5b8a5SMatthias Ringwald * @brief {description}
1540e2df43fSMatthias Ringwald * @param event packet
155c3b5b8a5SMatthias Ringwald * @return {result_name}
156c3b5b8a5SMatthias Ringwald * @note: btstack_type {format}
157c3b5b8a5SMatthias Ringwald */
158c3b5b8a5SMatthias Ringwald//  static inline {result_type} {fn_name}(const uint8_t * event){{
159c3b5b8a5SMatthias Ringwald//      not implemented yet
160c3b5b8a5SMatthias Ringwald//  }}
161c3b5b8a5SMatthias Ringwald'''
162c3b5b8a5SMatthias Ringwald
1630e2df43fSMatthias Ringwaldmeta_event_template = '''/***
1640e2df43fSMatthias Ringwald * @brief Get subevent code for {meta_event} event
1650e2df43fSMatthias Ringwald * @param event packet
1660e2df43fSMatthias Ringwald * @return subevent_code
1670e2df43fSMatthias Ringwald */
1680e2df43fSMatthias Ringwaldstatic inline uint8_t hci_event_{meta_event}_meta_get_subevent_code(const uint8_t * event){{
1690e2df43fSMatthias Ringwald    return event[2];
1700e2df43fSMatthias Ringwald}}
1710e2df43fSMatthias Ringwald'''
1720e2df43fSMatthias Ringwald
173c3b5b8a5SMatthias Ringwald# global variables/defines
1749d585a82SMatthias Ringwald# gen_path = '../src/btstack_event.h'
175c3b5b8a5SMatthias Ringwald
176c3b5b8a5SMatthias Ringwalddefines = dict()
177c3b5b8a5SMatthias Ringwalddefines_used = set()
178c3b5b8a5SMatthias Ringwald
179c3b5b8a5SMatthias Ringwaldparam_read = {
180c3b5b8a5SMatthias Ringwald    '1' : 'return event[{offset}];',
181c3b5b8a5SMatthias Ringwald    'J' : 'return event[{offset}];',
182f8fbdce0SMatthias Ringwald    '2' : 'return little_endian_read_16(event, {offset});',
183f8fbdce0SMatthias Ringwald    'L' : 'return little_endian_read_16(event, {offset});',
184f8fbdce0SMatthias Ringwald    '3' : 'return little_endian_read_24(event, {offset});',
185f8fbdce0SMatthias Ringwald    '4' : 'return little_endian_read_32(event, {offset});',
186f8fbdce0SMatthias Ringwald    'H' : 'return little_endian_read_16(event, {offset});',
187313e337bSMatthias Ringwald    'B' : 'reverse_bd_addr(&event[{offset}], {result_name});',
1887bd8e93bSMatthias Ringwald    'R' : 'return &event[{offset}];',
18947430bedSMatthias Ringwald    'N' : 'return (const char *) &event[{offset}];',
1904de250b4SMatthias Ringwald    'T' : 'return (const char *) &event[{offset}];',
1918ba9588fSMatthias Ringwald    'D' : 'return (const uint8_t *) &event[{offset}];',
19282180fcaSMatthias Ringwald    'Q' : 'reverse_bytes(&event[{offset}], {result_name}, 32);',
1934de250b4SMatthias Ringwald    'V' : 'return &event[{offset}];',
194313e337bSMatthias Ringwald    'X' : 'gatt_client_deserialize_service(event, {offset}, {result_name});',
195313e337bSMatthias Ringwald    'Y' : 'gatt_client_deserialize_characteristic(event, {offset}, {result_name});',
196313e337bSMatthias Ringwald    'Z' : 'gatt_client_deserialize_characteristic_descriptor(event, {offset}, {result_name});',
19747430bedSMatthias Ringwald    'V' : 'return &event[{offset}];',
198c3b5b8a5SMatthias Ringwald}
199c3b5b8a5SMatthias Ringwald
200c3b5b8a5SMatthias Ringwalddef c_type_for_btstack_type(type):
201c3b5b8a5SMatthias Ringwald    param_types = { '1' : 'uint8_t', '2' : 'uint16_t', '3' : 'uint32_t', '4' : 'uint32_t', 'H' : 'hci_con_handle_t', 'B' : 'bd_addr_t',
20247430bedSMatthias Ringwald                    'D' : 'const uint8_t *', 'E' : 'const uint8_t * ', 'N' : 'const char *' , 'P' : 'const uint8_t *', 'A' : 'const uint8_t *',
203c3b5b8a5SMatthias Ringwald                    'R' : 'const uint8_t *', 'S' : 'const uint8_t *',
204c3b5b8a5SMatthias Ringwald                    'J' : 'int', 'L' : 'int', 'V' : 'const uint8_t *', 'U' : 'BT_UUID',
20582180fcaSMatthias Ringwald                    'Q' : 'uint8_t *',
206313e337bSMatthias Ringwald                    'X' : 'gatt_client_service_t *', 'Y' : 'gatt_client_characteristic_t *', 'Z' : 'gatt_client_characteristic_descriptor_t *',
2077bd8e93bSMatthias Ringwald                    'T' : 'const char *'}
208c3b5b8a5SMatthias Ringwald    return param_types[type]
209c3b5b8a5SMatthias Ringwald
210c3b5b8a5SMatthias Ringwalddef size_for_type(type):
21182180fcaSMatthias 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,
212c3b5b8a5SMatthias Ringwald                    'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'U' : 16, 'X' : 20, 'Y' : 24, 'Z' : 18, 'T':-1}
213c3b5b8a5SMatthias Ringwald    return param_sizes[type]
214c3b5b8a5SMatthias Ringwald
215c3b5b8a5SMatthias Ringwalddef format_function_name(event_name):
2167bd8e93bSMatthias Ringwald    event_name = event_name.lower()
2177bd8e93bSMatthias Ringwald    if 'event' in event_name:
2187bd8e93bSMatthias Ringwald        return event_name;
2197bd8e93bSMatthias Ringwald    return event_name+'_event'
220c3b5b8a5SMatthias Ringwald
221c3b5b8a5SMatthias Ringwalddef template_for_type(field_type):
222c3b5b8a5SMatthias Ringwald    global c_prototoype_simple_return
223c3b5b8a5SMatthias Ringwald    global c_prototoype_struct_return
22482180fcaSMatthias Ringwald    types_with_struct_return = "BQXYZ"
225c3b5b8a5SMatthias Ringwald    if field_type in types_with_struct_return:
226c3b5b8a5SMatthias Ringwald        return c_prototoype_struct_return
227c3b5b8a5SMatthias Ringwald    else:
228c3b5b8a5SMatthias Ringwald        return c_prototoype_simple_return
229c3b5b8a5SMatthias Ringwald
230c3b5b8a5SMatthias Ringwalddef all_fields_supported(format):
231c3b5b8a5SMatthias Ringwald    global param_read
232c3b5b8a5SMatthias Ringwald    for f in format:
233c3b5b8a5SMatthias Ringwald        if not f in param_read:
234c3b5b8a5SMatthias Ringwald            return False
235c3b5b8a5SMatthias Ringwald    return True
236c3b5b8a5SMatthias Ringwald
237c3b5b8a5SMatthias Ringwalddef create_getter(event_name, field_name, field_type, offset, supported):
238c3b5b8a5SMatthias Ringwald    global c_prototoype_unsupported
239c3b5b8a5SMatthias Ringwald    global param_read
240c3b5b8a5SMatthias Ringwald
241568284b0SMatthias Ringwald    description = "Get field %s from event %s" % (field_name, event_name.upper())
242c3b5b8a5SMatthias Ringwald    result_name = field_name
243c3b5b8a5SMatthias Ringwald    fn_name     = "%s_get_%s" % (event_name, field_name)
244c3b5b8a5SMatthias Ringwald    result_type = c_type_for_btstack_type(field_type)
245c3b5b8a5SMatthias Ringwald    template = c_prototoype_unsupported
246c3b5b8a5SMatthias Ringwald    code = ''
247c3b5b8a5SMatthias Ringwald    if supported and field_type in param_read:
248c3b5b8a5SMatthias Ringwald        template = template_for_type(field_type)
249c3b5b8a5SMatthias Ringwald        code = param_read[field_type].format(offset=offset, result_name=result_name)
250c3b5b8a5SMatthias Ringwald    return template.format(description=description, fn_name=fn_name, result_name=result_name, result_type=result_type, code=code, format=field_type)
251c3b5b8a5SMatthias Ringwald
252313e337bSMatthias Ringwalddef is_le_event(event_group):
253313e337bSMatthias Ringwald    return event_group in ['GATT', 'ANCS', 'SM']
254313e337bSMatthias Ringwald
255c3b5b8a5SMatthias Ringwalddef create_events(events):
256c3b5b8a5SMatthias Ringwald    global gen_path
257c3b5b8a5SMatthias Ringwald    global copyright
258c3b5b8a5SMatthias Ringwald    global hfile_header_begin
259c3b5b8a5SMatthias Ringwald    global hfile_header_end
2600e2df43fSMatthias Ringwald    global meta_event_template
261c3b5b8a5SMatthias Ringwald
262c3b5b8a5SMatthias Ringwald    with open(gen_path, 'wt') as fout:
263c3b5b8a5SMatthias Ringwald        fout.write(copyright)
264c3b5b8a5SMatthias Ringwald        fout.write(hfile_header_begin)
2650e2df43fSMatthias Ringwald
2660e2df43fSMatthias Ringwald        for meta_event in meta_events:
2670e2df43fSMatthias Ringwald            fout.write(meta_event_template.format(meta_event=meta_event.lower()))
2680e2df43fSMatthias Ringwald
269c3b5b8a5SMatthias Ringwald        for event_type, event_name, format, args in events:
27072b50801SMatthias Ringwald            parts = event_name.split("_")
271313e337bSMatthias Ringwald            event_group = parts[0]
272f1b34e8dSMatthias Ringwald            if not event_group in supported_event_groups:
273a59bfbf7SMatthias Ringwald                print("// %s " % event_name)
2747bd8e93bSMatthias Ringwald                continue
2756397af06SMatthias Ringwald            # print(event_name)
2766397af06SMatthias Ringwald            base_name = format_function_name(event_name)
2774de250b4SMatthias Ringwald            length_name = ''
278c3b5b8a5SMatthias Ringwald            offset = 2
279e222d6a0SMatthias Ringwald            offset_is_number = 1
280e222d6a0SMatthias Ringwald            offset_unknown = 0
281c3b5b8a5SMatthias Ringwald            supported = all_fields_supported(format)
282e222d6a0SMatthias Ringwald            last_variable_length_field_pos = ""
283313e337bSMatthias Ringwald            if is_le_event(event_group):
284313e337bSMatthias Ringwald                fout.write("#ifdef ENABLE_BLE\n")
2856397af06SMatthias Ringwald            if len(format) != len(args):
2866397af06SMatthias Ringwald                print(event_name.upper())
2876397af06SMatthias Ringwald                print ("Format %s does not match params %s " % (format, args))
2886397af06SMatthias Ringwald                print
289c3b5b8a5SMatthias Ringwald            for f, arg in zip(format, args):
290c3b5b8a5SMatthias Ringwald                field_name = arg
29190944a9aSMatthias Ringwald                if field_name.lower() == 'subevent_code':
29290944a9aSMatthias Ringwald                    offset += 1
29390944a9aSMatthias Ringwald                    continue
294e222d6a0SMatthias Ringwald                if offset_unknown:
295e222d6a0SMatthias Ringwald                    print("Param after variable length field without preceding 'J' lenght field")
296e222d6a0SMatthias Ringwald                    break
297c3b5b8a5SMatthias Ringwald                field_type = f
2986397af06SMatthias Ringwald                text = create_getter(base_name, field_name, field_type, offset, supported)
299c3b5b8a5SMatthias Ringwald                fout.write(text)
3007bd8e93bSMatthias Ringwald                if field_type in 'RT':
301c3b5b8a5SMatthias Ringwald                    break
302e222d6a0SMatthias Ringwald                if field_type in 'J':
303e222d6a0SMatthias Ringwald                    if offset_is_number:
304e222d6a0SMatthias Ringwald                        last_variable_length_field_pos = '%u' % offset
305e222d6a0SMatthias Ringwald                    else:
306e222d6a0SMatthias Ringwald                        last_variable_length_field_pos = offset
307e222d6a0SMatthias Ringwald                if field_type in 'V':
308e222d6a0SMatthias Ringwald                    if last_variable_length_field_pos >= 0:
309e222d6a0SMatthias Ringwald                        if offset_is_number:
310e222d6a0SMatthias Ringwald                            # convert to string
311e222d6a0SMatthias Ringwald                            offset = '%u' % offset
312e222d6a0SMatthias Ringwald                            offset_is_number = 0
313e222d6a0SMatthias Ringwald                        offset = offset + ' + event[%s]' % last_variable_length_field_pos
314e222d6a0SMatthias Ringwald                    else:
315e222d6a0SMatthias Ringwald                        offset_unknown = 1
316e222d6a0SMatthias Ringwald                else:
317e222d6a0SMatthias Ringwald                    if offset_is_number:
318c3b5b8a5SMatthias Ringwald                        offset += size_for_type(field_type)
319e222d6a0SMatthias Ringwald                    else:
320e222d6a0SMatthias Ringwald                        offset = offset + ' + %u' % size_for_type(field_type)
321313e337bSMatthias Ringwald            if is_le_event(event_group):
322313e337bSMatthias Ringwald                fout.write("#endif\n")
323313e337bSMatthias Ringwald            fout.write("\n")
324c3b5b8a5SMatthias Ringwald
325c3b5b8a5SMatthias Ringwald        fout.write(hfile_header_end)
326c3b5b8a5SMatthias Ringwald
3279d585a82SMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..')
3289d585a82SMatthias Ringwaldgen_path = btstack_root + '/src/btstack_event.h'
329c3b5b8a5SMatthias Ringwald
330c3b5b8a5SMatthias Ringwaldprint(program_info)
331c3b5b8a5SMatthias Ringwald
332c3b5b8a5SMatthias Ringwald# parse events
333c3b5b8a5SMatthias Ringwald(events, le_events, event_types) = parser.parse_events()
334c3b5b8a5SMatthias Ringwald
335c3b5b8a5SMatthias Ringwald# create event field accesors
336c3b5b8a5SMatthias Ringwaldcreate_events(events + le_events)
337c3b5b8a5SMatthias Ringwald
338c3b5b8a5SMatthias Ringwald# done
339c3b5b8a5SMatthias Ringwaldprint('Done!')
340