xref: /btstack/tool/btstack_event_generator.py (revision b5c62b370f012467f4b4846be08eeef5e5d2f8b9)
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
68*b5c62b37SMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
69*b5c62b37SMilanka Ringwald * GMBH 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
862026696cSMatthias Ringwald/**
872026696cSMatthias Ringwald * HCI Event Getter
88c3b5b8a5SMatthias Ringwald *
892026696cSMatthias Ringwald * Note: Don't edit this file. It is generated by tool/btstack_event_generator.py
90c3b5b8a5SMatthias Ringwald *
91c3b5b8a5SMatthias Ringwald */
92c3b5b8a5SMatthias Ringwald
9380e33422SMatthias Ringwald#ifndef BTSTACK_EVENT_H
9480e33422SMatthias Ringwald#define BTSTACK_EVENT_H
95c3b5b8a5SMatthias Ringwald
96c3b5b8a5SMatthias Ringwald#if defined __cplusplus
97c3b5b8a5SMatthias Ringwaldextern "C" {
98c3b5b8a5SMatthias Ringwald#endif
99c3b5b8a5SMatthias Ringwald
100c3b5b8a5SMatthias Ringwald#include "btstack_util.h"
101c3b5b8a5SMatthias Ringwald#include <stdint.h>
102c3b5b8a5SMatthias Ringwald
103313e337bSMatthias Ringwald#ifdef ENABLE_BLE
104313e337bSMatthias Ringwald#include "ble/gatt_client.h"
105313e337bSMatthias Ringwald#endif
106313e337bSMatthias Ringwald
107c3b5b8a5SMatthias Ringwald/* API_START */
108c3b5b8a5SMatthias Ringwald
1090e2df43fSMatthias Ringwald/**
1100e2df43fSMatthias Ringwald * @brief Get event type
1110e2df43fSMatthias Ringwald * @param event
1120e2df43fSMatthias Ringwald * @return type of event
1130e2df43fSMatthias Ringwald */
1140e2df43fSMatthias Ringwaldstatic inline uint8_t hci_event_packet_get_type(const uint8_t * event){
1150e2df43fSMatthias Ringwald    return event[0];
1160e2df43fSMatthias Ringwald}
1170e2df43fSMatthias Ringwald
118c3b5b8a5SMatthias Ringwald"""
119c3b5b8a5SMatthias Ringwald
120c3b5b8a5SMatthias Ringwaldhfile_header_end = """
121c3b5b8a5SMatthias Ringwald
122c3b5b8a5SMatthias Ringwald/* API_END */
123c3b5b8a5SMatthias Ringwald
124c3b5b8a5SMatthias Ringwald#if defined __cplusplus
125c3b5b8a5SMatthias Ringwald}
126c3b5b8a5SMatthias Ringwald#endif
127c3b5b8a5SMatthias Ringwald
12880e33422SMatthias Ringwald#endif // BTSTACK_EVENT_H
129c3b5b8a5SMatthias Ringwald"""
130c3b5b8a5SMatthias Ringwald
131313e337bSMatthias Ringwaldc_prototoype_simple_return = '''/**
132c3b5b8a5SMatthias Ringwald * @brief {description}
1330e2df43fSMatthias Ringwald * @param event packet
134c3b5b8a5SMatthias Ringwald * @return {result_name}
135c3b5b8a5SMatthias Ringwald * @note: btstack_type {format}
136c3b5b8a5SMatthias Ringwald */
137c3b5b8a5SMatthias Ringwaldstatic inline {result_type} {fn_name}(const uint8_t * event){{
138c3b5b8a5SMatthias Ringwald    {code}
139c3b5b8a5SMatthias Ringwald}}
140c3b5b8a5SMatthias Ringwald'''
141c3b5b8a5SMatthias Ringwald
142396f0845SMatthias Ringwaldc_prototoype_array_getter = '''/**
143396f0845SMatthias Ringwald * @brief {description}
144396f0845SMatthias Ringwald * @param event packet
145396f0845SMatthias Ringwald * @param index
146396f0845SMatthias Ringwald * @return {result_name}
147396f0845SMatthias Ringwald * @note: btstack_type {format}
148396f0845SMatthias Ringwald */
149396f0845SMatthias Ringwaldstatic inline {result_type} {fn_name}(const uint8_t * event, uint8_t index){{
150396f0845SMatthias Ringwald    {code}
151396f0845SMatthias Ringwald}}
152396f0845SMatthias Ringwald'''
153396f0845SMatthias Ringwald
154313e337bSMatthias Ringwaldc_prototoype_struct_return = '''/**
155c3b5b8a5SMatthias Ringwald * @brief {description}
1560e2df43fSMatthias Ringwald * @param event packet
157c3b5b8a5SMatthias Ringwald * @param Pointer to storage for {result_name}
158c3b5b8a5SMatthias Ringwald * @note: btstack_type {format}
159c3b5b8a5SMatthias Ringwald */
160c3b5b8a5SMatthias Ringwaldstatic inline void {fn_name}(const uint8_t * event, {result_type} {result_name}){{
161c3b5b8a5SMatthias Ringwald    {code}
162c3b5b8a5SMatthias Ringwald}}
163c3b5b8a5SMatthias Ringwald'''
164c3b5b8a5SMatthias Ringwald
165313e337bSMatthias Ringwaldc_prototoype_unsupported = '''/**
166c3b5b8a5SMatthias Ringwald * @brief {description}
1670e2df43fSMatthias Ringwald * @param event packet
168c3b5b8a5SMatthias Ringwald * @return {result_name}
169c3b5b8a5SMatthias Ringwald * @note: btstack_type {format}
170c3b5b8a5SMatthias Ringwald */
171c3b5b8a5SMatthias Ringwald//  static inline {result_type} {fn_name}(const uint8_t * event){{
172c3b5b8a5SMatthias Ringwald//      not implemented yet
173c3b5b8a5SMatthias Ringwald//  }}
174c3b5b8a5SMatthias Ringwald'''
175c3b5b8a5SMatthias Ringwald
1760e2df43fSMatthias Ringwaldmeta_event_template = '''/***
1770e2df43fSMatthias Ringwald * @brief Get subevent code for {meta_event} event
1780e2df43fSMatthias Ringwald * @param event packet
1790e2df43fSMatthias Ringwald * @return subevent_code
1800e2df43fSMatthias Ringwald */
1810e2df43fSMatthias Ringwaldstatic inline uint8_t hci_event_{meta_event}_meta_get_subevent_code(const uint8_t * event){{
1820e2df43fSMatthias Ringwald    return event[2];
1830e2df43fSMatthias Ringwald}}
1840e2df43fSMatthias Ringwald'''
1850e2df43fSMatthias Ringwald
186c3b5b8a5SMatthias Ringwald# global variables/defines
187c3b5b8a5SMatthias Ringwalddefines = dict()
188c3b5b8a5SMatthias Ringwalddefines_used = set()
189c3b5b8a5SMatthias Ringwald
190c3b5b8a5SMatthias Ringwaldparam_read = {
191c3b5b8a5SMatthias Ringwald    '1' : 'return event[{offset}];',
192c3b5b8a5SMatthias Ringwald    'J' : 'return event[{offset}];',
193f8fbdce0SMatthias Ringwald    '2' : 'return little_endian_read_16(event, {offset});',
194f8fbdce0SMatthias Ringwald    'L' : 'return little_endian_read_16(event, {offset});',
195f8fbdce0SMatthias Ringwald    '3' : 'return little_endian_read_24(event, {offset});',
196f8fbdce0SMatthias Ringwald    '4' : 'return little_endian_read_32(event, {offset});',
197f8fbdce0SMatthias Ringwald    'H' : 'return little_endian_read_16(event, {offset});',
198b1dcf9d8SMatthias Ringwald    'B' : 'reverse_bytes(&event[{offset}], {result_name}, 6);',
1997bd8e93bSMatthias Ringwald    'R' : 'return &event[{offset}];',
20047430bedSMatthias Ringwald    'N' : 'return (const char *) &event[{offset}];',
2014de250b4SMatthias Ringwald    'T' : 'return (const char *) &event[{offset}];',
2028ba9588fSMatthias Ringwald    'D' : 'return (const uint8_t *) &event[{offset}];',
20375a8e4faSMatthias Ringwald    'K' : 'reverse_bytes(&event[{offset}], {result_name}, 16);',
20482180fcaSMatthias Ringwald    'Q' : 'reverse_bytes(&event[{offset}], {result_name}, 32);',
2054de250b4SMatthias Ringwald    'V' : 'return &event[{offset}];',
206313e337bSMatthias Ringwald    'X' : 'gatt_client_deserialize_service(event, {offset}, {result_name});',
207313e337bSMatthias Ringwald    'Y' : 'gatt_client_deserialize_characteristic(event, {offset}, {result_name});',
208313e337bSMatthias Ringwald    'Z' : 'gatt_client_deserialize_characteristic_descriptor(event, {offset}, {result_name});',
20947430bedSMatthias Ringwald    'V' : 'return &event[{offset}];',
210396f0845SMatthias Ringwald    'C' : 'return little_endian_read_16(event, {offset} + (2 * index));'
211c3b5b8a5SMatthias Ringwald}
212c3b5b8a5SMatthias Ringwald
213c3b5b8a5SMatthias Ringwalddef c_type_for_btstack_type(type):
214c3b5b8a5SMatthias Ringwald    param_types = { '1' : 'uint8_t', '2' : 'uint16_t', '3' : 'uint32_t', '4' : 'uint32_t', 'H' : 'hci_con_handle_t', 'B' : 'bd_addr_t',
21547430bedSMatthias Ringwald                    'D' : 'const uint8_t *', 'E' : 'const uint8_t * ', 'N' : 'const char *' , 'P' : 'const uint8_t *', 'A' : 'const uint8_t *',
216c3b5b8a5SMatthias Ringwald                    'R' : 'const uint8_t *', 'S' : 'const uint8_t *',
21738d9ec05SMatthias Ringwald                    'J' : 'uint8_t', 'L' : 'uint16_t', 'V' : 'const uint8_t *', 'U' : 'BT_UUID',
21875a8e4faSMatthias Ringwald                    'Q' : 'uint8_t *', 'K' : 'uint8_t *',
219313e337bSMatthias Ringwald                    'X' : 'gatt_client_service_t *', 'Y' : 'gatt_client_characteristic_t *', 'Z' : 'gatt_client_characteristic_descriptor_t *',
220396f0845SMatthias Ringwald                    'T' : 'const char *', 'C' : 'uint16_t' }
221c3b5b8a5SMatthias Ringwald    return param_types[type]
222c3b5b8a5SMatthias Ringwald
223c3b5b8a5SMatthias Ringwalddef size_for_type(type):
22475a8e4faSMatthias 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,
225396f0845SMatthias Ringwald                    'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'U' : 16, 'X' : 20, 'Y' : 24, 'Z' : 18, 'T':-1, 'C':-1 }
226c3b5b8a5SMatthias Ringwald    return param_sizes[type]
227c3b5b8a5SMatthias Ringwald
228c3b5b8a5SMatthias Ringwalddef format_function_name(event_name):
2297bd8e93bSMatthias Ringwald    event_name = event_name.lower()
2307bd8e93bSMatthias Ringwald    if 'event' in event_name:
2317bd8e93bSMatthias Ringwald        return event_name;
2327bd8e93bSMatthias Ringwald    return event_name+'_event'
233c3b5b8a5SMatthias Ringwald
234c3b5b8a5SMatthias Ringwalddef template_for_type(field_type):
235c3b5b8a5SMatthias Ringwald    global c_prototoype_simple_return
236c3b5b8a5SMatthias Ringwald    global c_prototoype_struct_return
237396f0845SMatthias Ringwald    global c_prototoype_array_getter
238396f0845SMatthias Ringwald    if field_type == 'C':
239396f0845SMatthias Ringwald        return c_prototoype_array_getter
24075a8e4faSMatthias Ringwald    types_with_struct_return = "BKQXYZ"
241c3b5b8a5SMatthias Ringwald    if field_type in types_with_struct_return:
242c3b5b8a5SMatthias Ringwald        return c_prototoype_struct_return
243c3b5b8a5SMatthias Ringwald    else:
244c3b5b8a5SMatthias Ringwald        return c_prototoype_simple_return
245c3b5b8a5SMatthias Ringwald
246c3b5b8a5SMatthias Ringwalddef all_fields_supported(format):
247c3b5b8a5SMatthias Ringwald    global param_read
248c3b5b8a5SMatthias Ringwald    for f in format:
249c3b5b8a5SMatthias Ringwald        if not f in param_read:
250c3b5b8a5SMatthias Ringwald            return False
251c3b5b8a5SMatthias Ringwald    return True
252c3b5b8a5SMatthias Ringwald
253c3b5b8a5SMatthias Ringwalddef create_getter(event_name, field_name, field_type, offset, supported):
254c3b5b8a5SMatthias Ringwald    global c_prototoype_unsupported
255c3b5b8a5SMatthias Ringwald    global param_read
256c3b5b8a5SMatthias Ringwald
257396f0845SMatthias Ringwald    if field_type == 'C':
258396f0845SMatthias Ringwald        description_template = 'Get element of array field %s from event %s'
259396f0845SMatthias Ringwald    else:
260396f0845SMatthias Ringwald        description_template = "Get field %s from event %s"
261396f0845SMatthias Ringwald    description = description_template % (field_name, event_name.upper())
262c3b5b8a5SMatthias Ringwald    result_name = field_name
263c3b5b8a5SMatthias Ringwald    fn_name     = "%s_get_%s" % (event_name, field_name)
264c3b5b8a5SMatthias Ringwald    result_type = c_type_for_btstack_type(field_type)
265c3b5b8a5SMatthias Ringwald    template = c_prototoype_unsupported
266c3b5b8a5SMatthias Ringwald    code = ''
267c3b5b8a5SMatthias Ringwald    if supported and field_type in param_read:
268c3b5b8a5SMatthias Ringwald        template = template_for_type(field_type)
269c3b5b8a5SMatthias Ringwald        code = param_read[field_type].format(offset=offset, result_name=result_name)
270c3b5b8a5SMatthias Ringwald    return template.format(description=description, fn_name=fn_name, result_name=result_name, result_type=result_type, code=code, format=field_type)
271c3b5b8a5SMatthias Ringwald
272313e337bSMatthias Ringwalddef is_le_event(event_group):
273313e337bSMatthias Ringwald    return event_group in ['GATT', 'ANCS', 'SM']
274313e337bSMatthias Ringwald
275c3b5b8a5SMatthias Ringwalddef create_events(events):
276c3b5b8a5SMatthias Ringwald    global gen_path
277c3b5b8a5SMatthias Ringwald    global copyright
278c3b5b8a5SMatthias Ringwald    global hfile_header_begin
279c3b5b8a5SMatthias Ringwald    global hfile_header_end
2800e2df43fSMatthias Ringwald    global meta_event_template
281c3b5b8a5SMatthias Ringwald
282c3b5b8a5SMatthias Ringwald    with open(gen_path, 'wt') as fout:
283c3b5b8a5SMatthias Ringwald        fout.write(copyright)
284c3b5b8a5SMatthias Ringwald        fout.write(hfile_header_begin)
2850e2df43fSMatthias Ringwald
2860e2df43fSMatthias Ringwald        for meta_event in meta_events:
2870e2df43fSMatthias Ringwald            fout.write(meta_event_template.format(meta_event=meta_event.lower()))
2880e2df43fSMatthias Ringwald
289c3b5b8a5SMatthias Ringwald        for event_type, event_name, format, args in events:
29072b50801SMatthias Ringwald            parts = event_name.split("_")
291313e337bSMatthias Ringwald            event_group = parts[0]
292f1b34e8dSMatthias Ringwald            if not event_group in supported_event_groups:
293a59bfbf7SMatthias Ringwald                print("// %s " % event_name)
2947bd8e93bSMatthias Ringwald                continue
2956397af06SMatthias Ringwald            # print(event_name)
2966397af06SMatthias Ringwald            base_name = format_function_name(event_name)
2974de250b4SMatthias Ringwald            length_name = ''
298c3b5b8a5SMatthias Ringwald            offset = 2
299e222d6a0SMatthias Ringwald            offset_is_number = 1
300e222d6a0SMatthias Ringwald            offset_unknown = 0
301c3b5b8a5SMatthias Ringwald            supported = all_fields_supported(format)
302e222d6a0SMatthias Ringwald            last_variable_length_field_pos = ""
303313e337bSMatthias Ringwald            if is_le_event(event_group):
304313e337bSMatthias Ringwald                fout.write("#ifdef ENABLE_BLE\n")
3056397af06SMatthias Ringwald            if len(format) != len(args):
3066397af06SMatthias Ringwald                print(event_name.upper())
3076397af06SMatthias Ringwald                print ("Format %s does not match params %s " % (format, args))
3086397af06SMatthias Ringwald                print
309c3b5b8a5SMatthias Ringwald            for f, arg in zip(format, args):
310c3b5b8a5SMatthias Ringwald                field_name = arg
31190944a9aSMatthias Ringwald                if field_name.lower() == 'subevent_code':
31290944a9aSMatthias Ringwald                    offset += 1
31390944a9aSMatthias Ringwald                    continue
314e222d6a0SMatthias Ringwald                if offset_unknown:
315396f0845SMatthias Ringwald                    print("Param after variable length field without preceding 'J' length field")
316e222d6a0SMatthias Ringwald                    break
317c3b5b8a5SMatthias Ringwald                field_type = f
3186397af06SMatthias Ringwald                text = create_getter(base_name, field_name, field_type, offset, supported)
319c3b5b8a5SMatthias Ringwald                fout.write(text)
3207bd8e93bSMatthias Ringwald                if field_type in 'RT':
321c3b5b8a5SMatthias Ringwald                    break
322e222d6a0SMatthias Ringwald                if field_type in 'J':
323e222d6a0SMatthias Ringwald                    if offset_is_number:
324e222d6a0SMatthias Ringwald                        last_variable_length_field_pos = '%u' % offset
325e222d6a0SMatthias Ringwald                    else:
326e222d6a0SMatthias Ringwald                        last_variable_length_field_pos = offset
327e222d6a0SMatthias Ringwald                if field_type in 'V':
3285c544019SMatthias Ringwald                    if last_variable_length_field_pos != '':
329e222d6a0SMatthias Ringwald                        if offset_is_number:
330e222d6a0SMatthias Ringwald                            # convert to string
3310dd3c6c3SMatthias Ringwald                            offset = '%uu' % offset
332e222d6a0SMatthias Ringwald                            offset_is_number = 0
333e222d6a0SMatthias Ringwald                        offset = offset + ' + event[%s]' % last_variable_length_field_pos
334e222d6a0SMatthias Ringwald                    else:
335e222d6a0SMatthias Ringwald                        offset_unknown = 1
336e222d6a0SMatthias Ringwald                else:
337e222d6a0SMatthias Ringwald                    if offset_is_number:
338c3b5b8a5SMatthias Ringwald                        offset += size_for_type(field_type)
339e222d6a0SMatthias Ringwald                    else:
3400dd3c6c3SMatthias Ringwald                        offset = offset + ' + %uu' % size_for_type(field_type)
341313e337bSMatthias Ringwald            if is_le_event(event_group):
342313e337bSMatthias Ringwald                fout.write("#endif\n")
343313e337bSMatthias Ringwald            fout.write("\n")
344c3b5b8a5SMatthias Ringwald
345c3b5b8a5SMatthias Ringwald        fout.write(hfile_header_end)
346c3b5b8a5SMatthias Ringwald
3479d585a82SMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..')
3489d585a82SMatthias Ringwaldgen_path = btstack_root + '/src/btstack_event.h'
349c3b5b8a5SMatthias Ringwald
350c3b5b8a5SMatthias Ringwaldprint(program_info)
351c3b5b8a5SMatthias Ringwald
352c3b5b8a5SMatthias Ringwald# parse events
353c3b5b8a5SMatthias Ringwald(events, le_events, event_types) = parser.parse_events()
354c3b5b8a5SMatthias Ringwald
355c3b5b8a5SMatthias Ringwald# create event field accesors
356c3b5b8a5SMatthias Ringwaldcreate_events(events + le_events)
357c3b5b8a5SMatthias Ringwald
358c3b5b8a5SMatthias Ringwald# done
359c3b5b8a5SMatthias Ringwaldprint('Done!')
360