xref: /btstack/tool/btstack_event_generator.py (revision b673498b9a0a6a76a23c81d2b53e5a6ee5b6325b)
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 = [
1228e59789SMilanka Ringwald    'A2DP',
13f1b34e8dSMatthias Ringwald    'ANCS',
14f1b34e8dSMatthias Ringwald    'AVDTP',
15f1b34e8dSMatthias Ringwald    'AVRCP',
1628e59789SMilanka Ringwald    'GATTSERVICE',
17f1b34e8dSMatthias Ringwald    'GOEP',
18f1b34e8dSMatthias Ringwald    'HFP',
19dd148ddbSMatthias Ringwald    'HID',
20a4bfc4feSMatthias Ringwald    'HIDS',
2128e59789SMilanka Ringwald    'HSP',
2228e59789SMilanka Ringwald    'LE',
23ad58991cSMilanka Ringwald    'MAP',
24*b673498bSMatthias Ringwald    'MESH',
25ad58991cSMilanka Ringwald    'PBAP',
26f1b34e8dSMatthias Ringwald]
27f1b34e8dSMatthias Ringwald
28f1b34e8dSMatthias Ringwaldsupported_event_groups = meta_events + [
2928e59789SMilanka Ringwald    'ATT',
3028e59789SMilanka Ringwald    'BNEP',
31f1b34e8dSMatthias Ringwald    'BTSTACK',
32f1b34e8dSMatthias Ringwald    'GAP',
3328e59789SMilanka Ringwald    'GATT',
34f1b34e8dSMatthias Ringwald    'HCI',
3528e59789SMilanka Ringwald    'HID',
36f1b34e8dSMatthias Ringwald    'L2CAP',
37f1b34e8dSMatthias Ringwald    'RFCOMM',
3828e59789SMilanka Ringwald    'SDP',
3928e59789SMilanka Ringwald    'SM'
40f1b34e8dSMatthias Ringwald]
41f1b34e8dSMatthias Ringwald
42c3b5b8a5SMatthias Ringwaldprogram_info = '''
43c3b5b8a5SMatthias RingwaldBTstack Event Getter Generator for BTstack
44c3b5b8a5SMatthias RingwaldCopyright 2016, BlueKitchen GmbH
45c3b5b8a5SMatthias Ringwald'''
46c3b5b8a5SMatthias Ringwald
47c3b5b8a5SMatthias Ringwaldcopyright = """/*
48c3b5b8a5SMatthias Ringwald * Copyright (C) 2016 BlueKitchen GmbH
49c3b5b8a5SMatthias Ringwald *
50c3b5b8a5SMatthias Ringwald * Redistribution and use in source and binary forms, with or without
51c3b5b8a5SMatthias Ringwald * modification, are permitted provided that the following conditions
52c3b5b8a5SMatthias Ringwald * are met:
53c3b5b8a5SMatthias Ringwald *
54c3b5b8a5SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright
55c3b5b8a5SMatthias Ringwald *    notice, this list of conditions and the following disclaimer.
56c3b5b8a5SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright
57c3b5b8a5SMatthias Ringwald *    notice, this list of conditions and the following disclaimer in the
58c3b5b8a5SMatthias Ringwald *    documentation and/or other materials provided with the distribution.
59c3b5b8a5SMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of
60c3b5b8a5SMatthias Ringwald *    contributors may be used to endorse or promote products derived
61c3b5b8a5SMatthias Ringwald *    from this software without specific prior written permission.
62c3b5b8a5SMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for
63c3b5b8a5SMatthias Ringwald *    personal benefit and not for any commercial purpose or for
64c3b5b8a5SMatthias Ringwald *    monetary gain.
65c3b5b8a5SMatthias Ringwald *
66c3b5b8a5SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
67c3b5b8a5SMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
68c3b5b8a5SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
69c3b5b8a5SMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
70c3b5b8a5SMatthias Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
71c3b5b8a5SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
72c3b5b8a5SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
73c3b5b8a5SMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
74c3b5b8a5SMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
75c3b5b8a5SMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
76c3b5b8a5SMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
77c3b5b8a5SMatthias Ringwald * SUCH DAMAGE.
78c3b5b8a5SMatthias Ringwald *
79c3b5b8a5SMatthias Ringwald * Please inquire about commercial licensing options at
80c3b5b8a5SMatthias Ringwald * [email protected]
81c3b5b8a5SMatthias Ringwald *
82c3b5b8a5SMatthias Ringwald */
83c3b5b8a5SMatthias Ringwald"""
84c3b5b8a5SMatthias Ringwald
85c3b5b8a5SMatthias Ringwaldhfile_header_begin = """
86c3b5b8a5SMatthias Ringwald
87c3b5b8a5SMatthias Ringwald/*
88c3b5b8a5SMatthias Ringwald *  btstack_event.h
89c3b5b8a5SMatthias Ringwald *
90c3b5b8a5SMatthias Ringwald *  @brief BTstack event getter/setter
91c3b5b8a5SMatthias Ringwald *  @note  Don't edit - 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
144313e337bSMatthias Ringwaldc_prototoype_struct_return = '''/**
145c3b5b8a5SMatthias Ringwald * @brief {description}
1460e2df43fSMatthias Ringwald * @param event packet
147c3b5b8a5SMatthias Ringwald * @param Pointer to storage for {result_name}
148c3b5b8a5SMatthias Ringwald * @note: btstack_type {format}
149c3b5b8a5SMatthias Ringwald */
150c3b5b8a5SMatthias Ringwaldstatic inline void {fn_name}(const uint8_t * event, {result_type} {result_name}){{
151c3b5b8a5SMatthias Ringwald    {code}
152c3b5b8a5SMatthias Ringwald}}
153c3b5b8a5SMatthias Ringwald'''
154c3b5b8a5SMatthias Ringwald
155313e337bSMatthias Ringwaldc_prototoype_unsupported = '''/**
156c3b5b8a5SMatthias Ringwald * @brief {description}
1570e2df43fSMatthias Ringwald * @param event packet
158c3b5b8a5SMatthias Ringwald * @return {result_name}
159c3b5b8a5SMatthias Ringwald * @note: btstack_type {format}
160c3b5b8a5SMatthias Ringwald */
161c3b5b8a5SMatthias Ringwald//  static inline {result_type} {fn_name}(const uint8_t * event){{
162c3b5b8a5SMatthias Ringwald//      not implemented yet
163c3b5b8a5SMatthias Ringwald//  }}
164c3b5b8a5SMatthias Ringwald'''
165c3b5b8a5SMatthias Ringwald
1660e2df43fSMatthias Ringwaldmeta_event_template = '''/***
1670e2df43fSMatthias Ringwald * @brief Get subevent code for {meta_event} event
1680e2df43fSMatthias Ringwald * @param event packet
1690e2df43fSMatthias Ringwald * @return subevent_code
1700e2df43fSMatthias Ringwald */
1710e2df43fSMatthias Ringwaldstatic inline uint8_t hci_event_{meta_event}_meta_get_subevent_code(const uint8_t * event){{
1720e2df43fSMatthias Ringwald    return event[2];
1730e2df43fSMatthias Ringwald}}
1740e2df43fSMatthias Ringwald'''
1750e2df43fSMatthias Ringwald
176c3b5b8a5SMatthias Ringwald# global variables/defines
1779d585a82SMatthias Ringwald# gen_path = '../src/btstack_event.h'
178c3b5b8a5SMatthias Ringwald
179c3b5b8a5SMatthias Ringwalddefines = dict()
180c3b5b8a5SMatthias Ringwalddefines_used = set()
181c3b5b8a5SMatthias Ringwald
182c3b5b8a5SMatthias Ringwaldparam_read = {
183c3b5b8a5SMatthias Ringwald    '1' : 'return event[{offset}];',
184c3b5b8a5SMatthias Ringwald    'J' : 'return event[{offset}];',
185f8fbdce0SMatthias Ringwald    '2' : 'return little_endian_read_16(event, {offset});',
186f8fbdce0SMatthias Ringwald    'L' : 'return little_endian_read_16(event, {offset});',
187f8fbdce0SMatthias Ringwald    '3' : 'return little_endian_read_24(event, {offset});',
188f8fbdce0SMatthias Ringwald    '4' : 'return little_endian_read_32(event, {offset});',
189f8fbdce0SMatthias Ringwald    'H' : 'return little_endian_read_16(event, {offset});',
190313e337bSMatthias Ringwald    'B' : 'reverse_bd_addr(&event[{offset}], {result_name});',
1917bd8e93bSMatthias Ringwald    'R' : 'return &event[{offset}];',
19247430bedSMatthias Ringwald    'N' : 'return (const char *) &event[{offset}];',
1934de250b4SMatthias Ringwald    'T' : 'return (const char *) &event[{offset}];',
1948ba9588fSMatthias Ringwald    'D' : 'return (const uint8_t *) &event[{offset}];',
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',
20882180fcaSMatthias Ringwald                    'Q' : '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):
21482180fcaSMatthias 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,
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
22782180fcaSMatthias Ringwald    types_with_struct_return = "BQXYZ"
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':
311e222d6a0SMatthias Ringwald                    if last_variable_length_field_pos >= 0:
312e222d6a0SMatthias Ringwald                        if offset_is_number:
313e222d6a0SMatthias Ringwald                            # convert to string
314e222d6a0SMatthias Ringwald                            offset = '%u' % 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:
323e222d6a0SMatthias Ringwald                        offset = offset + ' + %u' % 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