xref: /btstack/tool/btstack_event_generator.py (revision ae3042838ecab39355f8220511b931dbf8f87c8e)
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',
23*ae304283SMilanka Ringwald    'LEAUDIO',
24ad58991cSMilanka Ringwald    'MAP',
25b673498bSMatthias Ringwald    'MESH',
26ad58991cSMilanka Ringwald    'PBAP',
277c69f73aSMatthias Ringwald    'OPP'
28f1b34e8dSMatthias Ringwald]
29f1b34e8dSMatthias Ringwald
30f1b34e8dSMatthias Ringwaldsupported_event_groups = meta_events + [
3128e59789SMilanka Ringwald    'ATT',
3228e59789SMilanka Ringwald    'BNEP',
33f1b34e8dSMatthias Ringwald    'BTSTACK',
34f1b34e8dSMatthias Ringwald    'GAP',
3528e59789SMilanka Ringwald    'GATT',
36f1b34e8dSMatthias Ringwald    'HCI',
3728e59789SMilanka Ringwald    'HID',
38f1b34e8dSMatthias Ringwald    'L2CAP',
39f1b34e8dSMatthias Ringwald    'RFCOMM',
4028e59789SMilanka Ringwald    'SDP',
4128e59789SMilanka Ringwald    'SM'
42f1b34e8dSMatthias Ringwald]
43f1b34e8dSMatthias Ringwald
44c3b5b8a5SMatthias Ringwaldprogram_info = '''
45c3b5b8a5SMatthias RingwaldBTstack Event Getter Generator for BTstack
46c3b5b8a5SMatthias RingwaldCopyright 2016, BlueKitchen GmbH
47c3b5b8a5SMatthias Ringwald'''
48c3b5b8a5SMatthias Ringwald
49c3b5b8a5SMatthias Ringwaldcopyright = """/*
50c3b5b8a5SMatthias Ringwald * Copyright (C) 2016 BlueKitchen GmbH
51c3b5b8a5SMatthias Ringwald *
52c3b5b8a5SMatthias Ringwald * Redistribution and use in source and binary forms, with or without
53c3b5b8a5SMatthias Ringwald * modification, are permitted provided that the following conditions
54c3b5b8a5SMatthias Ringwald * are met:
55c3b5b8a5SMatthias Ringwald *
56c3b5b8a5SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright
57c3b5b8a5SMatthias Ringwald *    notice, this list of conditions and the following disclaimer.
58c3b5b8a5SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright
59c3b5b8a5SMatthias Ringwald *    notice, this list of conditions and the following disclaimer in the
60c3b5b8a5SMatthias Ringwald *    documentation and/or other materials provided with the distribution.
61c3b5b8a5SMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of
62c3b5b8a5SMatthias Ringwald *    contributors may be used to endorse or promote products derived
63c3b5b8a5SMatthias Ringwald *    from this software without specific prior written permission.
64c3b5b8a5SMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for
65c3b5b8a5SMatthias Ringwald *    personal benefit and not for any commercial purpose or for
66c3b5b8a5SMatthias Ringwald *    monetary gain.
67c3b5b8a5SMatthias Ringwald *
68c3b5b8a5SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
69c3b5b8a5SMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
70c3b5b8a5SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
71b5c62b37SMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
72b5c62b37SMilanka Ringwald * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
73c3b5b8a5SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
74c3b5b8a5SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
75c3b5b8a5SMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
76c3b5b8a5SMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
77c3b5b8a5SMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
78c3b5b8a5SMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
79c3b5b8a5SMatthias Ringwald * SUCH DAMAGE.
80c3b5b8a5SMatthias Ringwald *
81c3b5b8a5SMatthias Ringwald * Please inquire about commercial licensing options at
82c3b5b8a5SMatthias Ringwald * [email protected]
83c3b5b8a5SMatthias Ringwald *
84c3b5b8a5SMatthias Ringwald */
85c3b5b8a5SMatthias Ringwald"""
86c3b5b8a5SMatthias Ringwald
87c3b5b8a5SMatthias Ringwaldhfile_header_begin = """
88c3b5b8a5SMatthias Ringwald
892026696cSMatthias Ringwald/**
902026696cSMatthias Ringwald * HCI Event Getter
91c3b5b8a5SMatthias Ringwald *
922026696cSMatthias Ringwald * Note: Don't edit this file. It is generated by tool/btstack_event_generator.py
93c3b5b8a5SMatthias Ringwald *
94c3b5b8a5SMatthias Ringwald */
95c3b5b8a5SMatthias Ringwald
9680e33422SMatthias Ringwald#ifndef BTSTACK_EVENT_H
9780e33422SMatthias Ringwald#define BTSTACK_EVENT_H
98c3b5b8a5SMatthias Ringwald
99c3b5b8a5SMatthias Ringwald#if defined __cplusplus
100c3b5b8a5SMatthias Ringwaldextern "C" {
101c3b5b8a5SMatthias Ringwald#endif
102c3b5b8a5SMatthias Ringwald
103c3b5b8a5SMatthias Ringwald#include "btstack_util.h"
104c3b5b8a5SMatthias Ringwald#include <stdint.h>
105c3b5b8a5SMatthias Ringwald
106313e337bSMatthias Ringwald#ifdef ENABLE_BLE
107313e337bSMatthias Ringwald#include "ble/gatt_client.h"
108313e337bSMatthias Ringwald#endif
109313e337bSMatthias Ringwald
110c3b5b8a5SMatthias Ringwald/* API_START */
111c3b5b8a5SMatthias Ringwald
1120e2df43fSMatthias Ringwald/**
1130e2df43fSMatthias Ringwald * @brief Get event type
1140e2df43fSMatthias Ringwald * @param event
1150e2df43fSMatthias Ringwald * @return type of event
1160e2df43fSMatthias Ringwald */
1170e2df43fSMatthias Ringwaldstatic inline uint8_t hci_event_packet_get_type(const uint8_t * event){
1180e2df43fSMatthias Ringwald    return event[0];
1190e2df43fSMatthias Ringwald}
1200e2df43fSMatthias Ringwald
121c3b5b8a5SMatthias Ringwald"""
122c3b5b8a5SMatthias Ringwald
123c3b5b8a5SMatthias Ringwaldhfile_header_end = """
124c3b5b8a5SMatthias Ringwald
125c3b5b8a5SMatthias Ringwald/* API_END */
126c3b5b8a5SMatthias Ringwald
127c3b5b8a5SMatthias Ringwald#if defined __cplusplus
128c3b5b8a5SMatthias Ringwald}
129c3b5b8a5SMatthias Ringwald#endif
130c3b5b8a5SMatthias Ringwald
13180e33422SMatthias Ringwald#endif // BTSTACK_EVENT_H
132c3b5b8a5SMatthias Ringwald"""
133c3b5b8a5SMatthias Ringwald
134313e337bSMatthias Ringwaldc_prototoype_simple_return = '''/**
135c3b5b8a5SMatthias Ringwald * @brief {description}
1360e2df43fSMatthias Ringwald * @param event packet
137c3b5b8a5SMatthias Ringwald * @return {result_name}
138c3b5b8a5SMatthias Ringwald * @note: btstack_type {format}
139c3b5b8a5SMatthias Ringwald */
140c3b5b8a5SMatthias Ringwaldstatic inline {result_type} {fn_name}(const uint8_t * event){{
141c3b5b8a5SMatthias Ringwald    {code}
142c3b5b8a5SMatthias Ringwald}}
143c3b5b8a5SMatthias Ringwald'''
144c3b5b8a5SMatthias Ringwald
145396f0845SMatthias Ringwaldc_prototoype_array_getter = '''/**
146396f0845SMatthias Ringwald * @brief {description}
147396f0845SMatthias Ringwald * @param event packet
148396f0845SMatthias Ringwald * @param index
149396f0845SMatthias Ringwald * @return {result_name}
150396f0845SMatthias Ringwald * @note: btstack_type {format}
151396f0845SMatthias Ringwald */
152396f0845SMatthias Ringwaldstatic inline {result_type} {fn_name}(const uint8_t * event, uint8_t index){{
153396f0845SMatthias Ringwald    {code}
154396f0845SMatthias Ringwald}}
155396f0845SMatthias Ringwald'''
156396f0845SMatthias Ringwald
157313e337bSMatthias Ringwaldc_prototoype_struct_return = '''/**
158c3b5b8a5SMatthias Ringwald * @brief {description}
1590e2df43fSMatthias Ringwald * @param event packet
160c3b5b8a5SMatthias Ringwald * @param Pointer to storage for {result_name}
161c3b5b8a5SMatthias Ringwald * @note: btstack_type {format}
162c3b5b8a5SMatthias Ringwald */
163c3b5b8a5SMatthias Ringwaldstatic inline void {fn_name}(const uint8_t * event, {result_type} {result_name}){{
164c3b5b8a5SMatthias Ringwald    {code}
165c3b5b8a5SMatthias Ringwald}}
166c3b5b8a5SMatthias Ringwald'''
167c3b5b8a5SMatthias Ringwald
168313e337bSMatthias Ringwaldc_prototoype_unsupported = '''/**
169c3b5b8a5SMatthias Ringwald * @brief {description}
1700e2df43fSMatthias Ringwald * @param event packet
171c3b5b8a5SMatthias Ringwald * @return {result_name}
172c3b5b8a5SMatthias Ringwald * @note: btstack_type {format}
173c3b5b8a5SMatthias Ringwald */
174c3b5b8a5SMatthias Ringwald//  static inline {result_type} {fn_name}(const uint8_t * event){{
175c3b5b8a5SMatthias Ringwald//      not implemented yet
176c3b5b8a5SMatthias Ringwald//  }}
177c3b5b8a5SMatthias Ringwald'''
178c3b5b8a5SMatthias Ringwald
1790e2df43fSMatthias Ringwaldmeta_event_template = '''/***
1800e2df43fSMatthias Ringwald * @brief Get subevent code for {meta_event} event
1810e2df43fSMatthias Ringwald * @param event packet
1820e2df43fSMatthias Ringwald * @return subevent_code
1830e2df43fSMatthias Ringwald */
1840e2df43fSMatthias Ringwaldstatic inline uint8_t hci_event_{meta_event}_meta_get_subevent_code(const uint8_t * event){{
1850e2df43fSMatthias Ringwald    return event[2];
1860e2df43fSMatthias Ringwald}}
1870e2df43fSMatthias Ringwald'''
1880e2df43fSMatthias Ringwald
189c3b5b8a5SMatthias Ringwald# global variables/defines
190c3b5b8a5SMatthias Ringwalddefines = dict()
191c3b5b8a5SMatthias Ringwalddefines_used = set()
192c3b5b8a5SMatthias Ringwald
193c3b5b8a5SMatthias Ringwaldparam_read = {
194c3b5b8a5SMatthias Ringwald    '1' : 'return event[{offset}];',
195c3b5b8a5SMatthias Ringwald    'J' : 'return event[{offset}];',
196f8fbdce0SMatthias Ringwald    '2' : 'return little_endian_read_16(event, {offset});',
197f8fbdce0SMatthias Ringwald    'L' : 'return little_endian_read_16(event, {offset});',
198f8fbdce0SMatthias Ringwald    '3' : 'return little_endian_read_24(event, {offset});',
199f8fbdce0SMatthias Ringwald    '4' : 'return little_endian_read_32(event, {offset});',
200f8fbdce0SMatthias Ringwald    'H' : 'return little_endian_read_16(event, {offset});',
201b1dcf9d8SMatthias Ringwald    'B' : 'reverse_bytes(&event[{offset}], {result_name}, 6);',
2027bd8e93bSMatthias Ringwald    'R' : 'return &event[{offset}];',
20347430bedSMatthias Ringwald    'N' : 'return (const char *) &event[{offset}];',
2041707474dSSimon Budig    'P' : 'return (const uint8_t *) &event[{offset}];',
2054de250b4SMatthias Ringwald    'T' : 'return (const char *) &event[{offset}];',
2068ba9588fSMatthias Ringwald    'D' : 'return (const uint8_t *) &event[{offset}];',
20775a8e4faSMatthias Ringwald    'K' : 'reverse_bytes(&event[{offset}], {result_name}, 16);',
20882180fcaSMatthias Ringwald    'Q' : 'reverse_bytes(&event[{offset}], {result_name}, 32);',
2094de250b4SMatthias Ringwald    'V' : 'return &event[{offset}];',
210313e337bSMatthias Ringwald    'X' : 'gatt_client_deserialize_service(event, {offset}, {result_name});',
211313e337bSMatthias Ringwald    'Y' : 'gatt_client_deserialize_characteristic(event, {offset}, {result_name});',
212313e337bSMatthias Ringwald    'Z' : 'gatt_client_deserialize_characteristic_descriptor(event, {offset}, {result_name});',
21347430bedSMatthias Ringwald    'V' : 'return &event[{offset}];',
2147b2a466aSMatthias Ringwald    'C' : 'return little_endian_read_16(event, {offset} + (2 * (int) index));'
215c3b5b8a5SMatthias Ringwald}
216c3b5b8a5SMatthias Ringwald
217c3b5b8a5SMatthias Ringwalddef c_type_for_btstack_type(type):
218c3b5b8a5SMatthias Ringwald    param_types = { '1' : 'uint8_t', '2' : 'uint16_t', '3' : 'uint32_t', '4' : 'uint32_t', 'H' : 'hci_con_handle_t', 'B' : 'bd_addr_t',
21947430bedSMatthias Ringwald                    'D' : 'const uint8_t *', 'E' : 'const uint8_t * ', 'N' : 'const char *' , 'P' : 'const uint8_t *', 'A' : 'const uint8_t *',
220c3b5b8a5SMatthias Ringwald                    'R' : 'const uint8_t *', 'S' : 'const uint8_t *',
22138d9ec05SMatthias Ringwald                    'J' : 'uint8_t', 'L' : 'uint16_t', 'V' : 'const uint8_t *', 'U' : 'BT_UUID',
22275a8e4faSMatthias Ringwald                    'Q' : 'uint8_t *', 'K' : 'uint8_t *',
223313e337bSMatthias Ringwald                    'X' : 'gatt_client_service_t *', 'Y' : 'gatt_client_characteristic_t *', 'Z' : 'gatt_client_characteristic_descriptor_t *',
224396f0845SMatthias Ringwald                    'T' : 'const char *', 'C' : 'uint16_t' }
225c3b5b8a5SMatthias Ringwald    return param_types[type]
226c3b5b8a5SMatthias Ringwald
227c3b5b8a5SMatthias Ringwalddef size_for_type(type):
22875a8e4faSMatthias 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,
229396f0845SMatthias Ringwald                    'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'U' : 16, 'X' : 20, 'Y' : 24, 'Z' : 18, 'T':-1, 'C':-1 }
230c3b5b8a5SMatthias Ringwald    return param_sizes[type]
231c3b5b8a5SMatthias Ringwald
232c3b5b8a5SMatthias Ringwalddef format_function_name(event_name):
2337bd8e93bSMatthias Ringwald    event_name = event_name.lower()
2347bd8e93bSMatthias Ringwald    if 'event' in event_name:
2357bd8e93bSMatthias Ringwald        return event_name;
2367bd8e93bSMatthias Ringwald    return event_name+'_event'
237c3b5b8a5SMatthias Ringwald
238c3b5b8a5SMatthias Ringwalddef template_for_type(field_type):
239c3b5b8a5SMatthias Ringwald    global c_prototoype_simple_return
240c3b5b8a5SMatthias Ringwald    global c_prototoype_struct_return
241396f0845SMatthias Ringwald    global c_prototoype_array_getter
242396f0845SMatthias Ringwald    if field_type == 'C':
243396f0845SMatthias Ringwald        return c_prototoype_array_getter
24475a8e4faSMatthias Ringwald    types_with_struct_return = "BKQXYZ"
245c3b5b8a5SMatthias Ringwald    if field_type in types_with_struct_return:
246c3b5b8a5SMatthias Ringwald        return c_prototoype_struct_return
247c3b5b8a5SMatthias Ringwald    else:
248c3b5b8a5SMatthias Ringwald        return c_prototoype_simple_return
249c3b5b8a5SMatthias Ringwald
250c3b5b8a5SMatthias Ringwalddef all_fields_supported(format):
251c3b5b8a5SMatthias Ringwald    global param_read
252c3b5b8a5SMatthias Ringwald    for f in format:
253c3b5b8a5SMatthias Ringwald        if not f in param_read:
254c3b5b8a5SMatthias Ringwald            return False
255c3b5b8a5SMatthias Ringwald    return True
256c3b5b8a5SMatthias Ringwald
257ca1a07f4SMatthias Ringwalddef create_getter(event_name, field_name, field_type, offset, offset_is_number, supported):
258c3b5b8a5SMatthias Ringwald    global c_prototoype_unsupported
259c3b5b8a5SMatthias Ringwald    global param_read
260c3b5b8a5SMatthias Ringwald
261396f0845SMatthias Ringwald    if field_type == 'C':
262396f0845SMatthias Ringwald        description_template = 'Get element of array field %s from event %s'
263396f0845SMatthias Ringwald    else:
264396f0845SMatthias Ringwald        description_template = "Get field %s from event %s"
265396f0845SMatthias Ringwald    description = description_template % (field_name, event_name.upper())
266c3b5b8a5SMatthias Ringwald    result_name = field_name
267c3b5b8a5SMatthias Ringwald    fn_name     = "%s_get_%s" % (event_name, field_name)
268c3b5b8a5SMatthias Ringwald    result_type = c_type_for_btstack_type(field_type)
269c3b5b8a5SMatthias Ringwald    template = c_prototoype_unsupported
270c3b5b8a5SMatthias Ringwald    code = ''
271c3b5b8a5SMatthias Ringwald    if supported and field_type in param_read:
272c3b5b8a5SMatthias Ringwald        template = template_for_type(field_type)
273ca1a07f4SMatthias Ringwald        read_code = param_read[field_type]
274ca1a07f4SMatthias Ringwald        requires_signed = 'little_endian' in read_code or 'gatt_client_deserialize' in read_code
275b5d69418SMatthias Ringwald        code = ''
276ca1a07f4SMatthias Ringwald        if requires_signed and not offset_is_number:
277e52cfa76SMatthias Ringwald            code += 'uint8_t offset = %s;\n    ' % offset
278e52cfa76SMatthias Ringwald            offset = '(int)(int8_t) offset'
279b5d69418SMatthias Ringwald        code += read_code.format(offset=offset, result_name=result_name)
280c3b5b8a5SMatthias Ringwald    return template.format(description=description, fn_name=fn_name, result_name=result_name, result_type=result_type, code=code, format=field_type)
281c3b5b8a5SMatthias Ringwald
282313e337bSMatthias Ringwalddef is_le_event(event_group):
283313e337bSMatthias Ringwald    return event_group in ['GATT', 'ANCS', 'SM']
284313e337bSMatthias Ringwald
285c3b5b8a5SMatthias Ringwalddef create_events(events):
286c3b5b8a5SMatthias Ringwald    global gen_path
287c3b5b8a5SMatthias Ringwald    global copyright
288c3b5b8a5SMatthias Ringwald    global hfile_header_begin
289c3b5b8a5SMatthias Ringwald    global hfile_header_end
2900e2df43fSMatthias Ringwald    global meta_event_template
291c3b5b8a5SMatthias Ringwald
292c3b5b8a5SMatthias Ringwald    with open(gen_path, 'wt') as fout:
293c3b5b8a5SMatthias Ringwald        fout.write(copyright)
294c3b5b8a5SMatthias Ringwald        fout.write(hfile_header_begin)
2950e2df43fSMatthias Ringwald
2960e2df43fSMatthias Ringwald        for meta_event in meta_events:
2970e2df43fSMatthias Ringwald            fout.write(meta_event_template.format(meta_event=meta_event.lower()))
2980e2df43fSMatthias Ringwald
299c3b5b8a5SMatthias Ringwald        for event_type, event_name, format, args in events:
30072b50801SMatthias Ringwald            parts = event_name.split("_")
301313e337bSMatthias Ringwald            event_group = parts[0]
302f1b34e8dSMatthias Ringwald            if not event_group in supported_event_groups:
303a59bfbf7SMatthias Ringwald                print("// %s " % event_name)
3047bd8e93bSMatthias Ringwald                continue
3056397af06SMatthias Ringwald            # print(event_name)
3066397af06SMatthias Ringwald            base_name = format_function_name(event_name)
3074de250b4SMatthias Ringwald            length_name = ''
308c3b5b8a5SMatthias Ringwald            offset = 2
309e222d6a0SMatthias Ringwald            offset_is_number = 1
310e222d6a0SMatthias Ringwald            offset_unknown = 0
311c3b5b8a5SMatthias Ringwald            supported = all_fields_supported(format)
312e222d6a0SMatthias Ringwald            last_variable_length_field_pos = ""
313313e337bSMatthias Ringwald            if is_le_event(event_group):
314313e337bSMatthias Ringwald                fout.write("#ifdef ENABLE_BLE\n")
3156397af06SMatthias Ringwald            if len(format) != len(args):
3166397af06SMatthias Ringwald                print(event_name.upper())
3176397af06SMatthias Ringwald                print ("Format %s does not match params %s " % (format, args))
3186397af06SMatthias Ringwald                print
319c3b5b8a5SMatthias Ringwald            for f, arg in zip(format, args):
320c3b5b8a5SMatthias Ringwald                field_name = arg
32190944a9aSMatthias Ringwald                if field_name.lower() == 'subevent_code':
32290944a9aSMatthias Ringwald                    offset += 1
32390944a9aSMatthias Ringwald                    continue
324e222d6a0SMatthias Ringwald                if offset_unknown:
325396f0845SMatthias Ringwald                    print("Param after variable length field without preceding 'J' length field")
326e222d6a0SMatthias Ringwald                    break
327c3b5b8a5SMatthias Ringwald                field_type = f
328ca1a07f4SMatthias Ringwald                text = create_getter(base_name, field_name, field_type, offset, offset_is_number, supported)
329c3b5b8a5SMatthias Ringwald                fout.write(text)
3307bd8e93bSMatthias Ringwald                if field_type in 'RT':
331c3b5b8a5SMatthias Ringwald                    break
332e222d6a0SMatthias Ringwald                if field_type in 'J':
333e222d6a0SMatthias Ringwald                    if offset_is_number:
334e222d6a0SMatthias Ringwald                        last_variable_length_field_pos = '%u' % offset
335e222d6a0SMatthias Ringwald                    else:
336e222d6a0SMatthias Ringwald                        last_variable_length_field_pos = offset
337e222d6a0SMatthias Ringwald                if field_type in 'V':
3385c544019SMatthias Ringwald                    if last_variable_length_field_pos != '':
339e222d6a0SMatthias Ringwald                        if offset_is_number:
340e222d6a0SMatthias Ringwald                            # convert to string
3410dd3c6c3SMatthias Ringwald                            offset = '%uu' % offset
342e222d6a0SMatthias Ringwald                            offset_is_number = 0
343e222d6a0SMatthias Ringwald                        offset = offset + ' + event[%s]' % last_variable_length_field_pos
344e222d6a0SMatthias Ringwald                    else:
345e222d6a0SMatthias Ringwald                        offset_unknown = 1
346e222d6a0SMatthias Ringwald                else:
347e222d6a0SMatthias Ringwald                    if offset_is_number:
348c3b5b8a5SMatthias Ringwald                        offset += size_for_type(field_type)
349e222d6a0SMatthias Ringwald                    else:
3500dd3c6c3SMatthias Ringwald                        offset = offset + ' + %uu' % size_for_type(field_type)
351313e337bSMatthias Ringwald            if is_le_event(event_group):
352313e337bSMatthias Ringwald                fout.write("#endif\n")
353313e337bSMatthias Ringwald            fout.write("\n")
354c3b5b8a5SMatthias Ringwald
355c3b5b8a5SMatthias Ringwald        fout.write(hfile_header_end)
356c3b5b8a5SMatthias Ringwald
3579d585a82SMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..')
3589d585a82SMatthias Ringwaldgen_path = btstack_root + '/src/btstack_event.h'
359c3b5b8a5SMatthias Ringwald
360c3b5b8a5SMatthias Ringwaldprint(program_info)
361c3b5b8a5SMatthias Ringwald
362c3b5b8a5SMatthias Ringwald# parse events
363c3b5b8a5SMatthias Ringwald(events, le_events, event_types) = parser.parse_events()
364c3b5b8a5SMatthias Ringwald
365c3b5b8a5SMatthias Ringwald# create event field accesors
366c3b5b8a5SMatthias Ringwaldcreate_events(events + le_events)
367c3b5b8a5SMatthias Ringwald
368c3b5b8a5SMatthias Ringwald# done
369c3b5b8a5SMatthias Ringwaldprint('Done!')
370