xref: /btstack/tool/btstack_event_generator.py (revision b5d69418507df05ced034718c3ebf2f8e285ec39)
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',
23ad58991cSMilanka Ringwald    'MAP',
24b673498bSMatthias Ringwald    'MESH',
25ad58991cSMilanka Ringwald    'PBAP',
267c69f73aSMatthias Ringwald    'OPP'
27f1b34e8dSMatthias Ringwald]
28f1b34e8dSMatthias Ringwald
29f1b34e8dSMatthias Ringwaldsupported_event_groups = meta_events + [
3028e59789SMilanka Ringwald    'ATT',
3128e59789SMilanka Ringwald    'BNEP',
32f1b34e8dSMatthias Ringwald    'BTSTACK',
33f1b34e8dSMatthias Ringwald    'GAP',
3428e59789SMilanka Ringwald    'GATT',
35f1b34e8dSMatthias Ringwald    'HCI',
3628e59789SMilanka Ringwald    'HID',
37f1b34e8dSMatthias Ringwald    'L2CAP',
38f1b34e8dSMatthias Ringwald    'RFCOMM',
3928e59789SMilanka Ringwald    'SDP',
4028e59789SMilanka Ringwald    'SM'
41f1b34e8dSMatthias Ringwald]
42f1b34e8dSMatthias Ringwald
43c3b5b8a5SMatthias Ringwaldprogram_info = '''
44c3b5b8a5SMatthias RingwaldBTstack Event Getter Generator for BTstack
45c3b5b8a5SMatthias RingwaldCopyright 2016, BlueKitchen GmbH
46c3b5b8a5SMatthias Ringwald'''
47c3b5b8a5SMatthias Ringwald
48c3b5b8a5SMatthias Ringwaldcopyright = """/*
49c3b5b8a5SMatthias Ringwald * Copyright (C) 2016 BlueKitchen GmbH
50c3b5b8a5SMatthias Ringwald *
51c3b5b8a5SMatthias Ringwald * Redistribution and use in source and binary forms, with or without
52c3b5b8a5SMatthias Ringwald * modification, are permitted provided that the following conditions
53c3b5b8a5SMatthias Ringwald * are met:
54c3b5b8a5SMatthias Ringwald *
55c3b5b8a5SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright
56c3b5b8a5SMatthias Ringwald *    notice, this list of conditions and the following disclaimer.
57c3b5b8a5SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright
58c3b5b8a5SMatthias Ringwald *    notice, this list of conditions and the following disclaimer in the
59c3b5b8a5SMatthias Ringwald *    documentation and/or other materials provided with the distribution.
60c3b5b8a5SMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of
61c3b5b8a5SMatthias Ringwald *    contributors may be used to endorse or promote products derived
62c3b5b8a5SMatthias Ringwald *    from this software without specific prior written permission.
63c3b5b8a5SMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for
64c3b5b8a5SMatthias Ringwald *    personal benefit and not for any commercial purpose or for
65c3b5b8a5SMatthias Ringwald *    monetary gain.
66c3b5b8a5SMatthias Ringwald *
67c3b5b8a5SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
68c3b5b8a5SMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
69c3b5b8a5SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
70b5c62b37SMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
71b5c62b37SMilanka Ringwald * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
72c3b5b8a5SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
73c3b5b8a5SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
74c3b5b8a5SMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
75c3b5b8a5SMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
76c3b5b8a5SMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
77c3b5b8a5SMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
78c3b5b8a5SMatthias Ringwald * SUCH DAMAGE.
79c3b5b8a5SMatthias Ringwald *
80c3b5b8a5SMatthias Ringwald * Please inquire about commercial licensing options at
81c3b5b8a5SMatthias Ringwald * [email protected]
82c3b5b8a5SMatthias Ringwald *
83c3b5b8a5SMatthias Ringwald */
84c3b5b8a5SMatthias Ringwald"""
85c3b5b8a5SMatthias Ringwald
86c3b5b8a5SMatthias Ringwaldhfile_header_begin = """
87c3b5b8a5SMatthias Ringwald
882026696cSMatthias Ringwald/**
892026696cSMatthias Ringwald * HCI Event Getter
90c3b5b8a5SMatthias Ringwald *
912026696cSMatthias Ringwald * Note: Don't edit this file. It is 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
144396f0845SMatthias Ringwaldc_prototoype_array_getter = '''/**
145396f0845SMatthias Ringwald * @brief {description}
146396f0845SMatthias Ringwald * @param event packet
147396f0845SMatthias Ringwald * @param index
148396f0845SMatthias Ringwald * @return {result_name}
149396f0845SMatthias Ringwald * @note: btstack_type {format}
150396f0845SMatthias Ringwald */
151396f0845SMatthias Ringwaldstatic inline {result_type} {fn_name}(const uint8_t * event, uint8_t index){{
152396f0845SMatthias Ringwald    {code}
153396f0845SMatthias Ringwald}}
154396f0845SMatthias Ringwald'''
155396f0845SMatthias Ringwald
156313e337bSMatthias Ringwaldc_prototoype_struct_return = '''/**
157c3b5b8a5SMatthias Ringwald * @brief {description}
1580e2df43fSMatthias Ringwald * @param event packet
159c3b5b8a5SMatthias Ringwald * @param Pointer to storage for {result_name}
160c3b5b8a5SMatthias Ringwald * @note: btstack_type {format}
161c3b5b8a5SMatthias Ringwald */
162c3b5b8a5SMatthias Ringwaldstatic inline void {fn_name}(const uint8_t * event, {result_type} {result_name}){{
163c3b5b8a5SMatthias Ringwald    {code}
164c3b5b8a5SMatthias Ringwald}}
165c3b5b8a5SMatthias Ringwald'''
166c3b5b8a5SMatthias Ringwald
167313e337bSMatthias Ringwaldc_prototoype_unsupported = '''/**
168c3b5b8a5SMatthias Ringwald * @brief {description}
1690e2df43fSMatthias Ringwald * @param event packet
170c3b5b8a5SMatthias Ringwald * @return {result_name}
171c3b5b8a5SMatthias Ringwald * @note: btstack_type {format}
172c3b5b8a5SMatthias Ringwald */
173c3b5b8a5SMatthias Ringwald//  static inline {result_type} {fn_name}(const uint8_t * event){{
174c3b5b8a5SMatthias Ringwald//      not implemented yet
175c3b5b8a5SMatthias Ringwald//  }}
176c3b5b8a5SMatthias Ringwald'''
177c3b5b8a5SMatthias Ringwald
1780e2df43fSMatthias Ringwaldmeta_event_template = '''/***
1790e2df43fSMatthias Ringwald * @brief Get subevent code for {meta_event} event
1800e2df43fSMatthias Ringwald * @param event packet
1810e2df43fSMatthias Ringwald * @return subevent_code
1820e2df43fSMatthias Ringwald */
1830e2df43fSMatthias Ringwaldstatic inline uint8_t hci_event_{meta_event}_meta_get_subevent_code(const uint8_t * event){{
1840e2df43fSMatthias Ringwald    return event[2];
1850e2df43fSMatthias Ringwald}}
1860e2df43fSMatthias Ringwald'''
1870e2df43fSMatthias Ringwald
188c3b5b8a5SMatthias Ringwald# global variables/defines
189c3b5b8a5SMatthias Ringwalddefines = dict()
190c3b5b8a5SMatthias Ringwalddefines_used = set()
191c3b5b8a5SMatthias Ringwald
192c3b5b8a5SMatthias Ringwaldparam_read = {
193c3b5b8a5SMatthias Ringwald    '1' : 'return event[{offset}];',
194c3b5b8a5SMatthias Ringwald    'J' : 'return event[{offset}];',
195f8fbdce0SMatthias Ringwald    '2' : 'return little_endian_read_16(event, {offset});',
196f8fbdce0SMatthias Ringwald    'L' : 'return little_endian_read_16(event, {offset});',
197f8fbdce0SMatthias Ringwald    '3' : 'return little_endian_read_24(event, {offset});',
198f8fbdce0SMatthias Ringwald    '4' : 'return little_endian_read_32(event, {offset});',
199f8fbdce0SMatthias Ringwald    'H' : 'return little_endian_read_16(event, {offset});',
200b1dcf9d8SMatthias Ringwald    'B' : 'reverse_bytes(&event[{offset}], {result_name}, 6);',
2017bd8e93bSMatthias Ringwald    'R' : 'return &event[{offset}];',
20247430bedSMatthias Ringwald    'N' : 'return (const char *) &event[{offset}];',
2031707474dSSimon Budig    'P' : 'return (const uint8_t *) &event[{offset}];',
2044de250b4SMatthias Ringwald    'T' : 'return (const char *) &event[{offset}];',
2058ba9588fSMatthias Ringwald    'D' : 'return (const uint8_t *) &event[{offset}];',
20675a8e4faSMatthias Ringwald    'K' : 'reverse_bytes(&event[{offset}], {result_name}, 16);',
20782180fcaSMatthias Ringwald    'Q' : 'reverse_bytes(&event[{offset}], {result_name}, 32);',
2084de250b4SMatthias Ringwald    'V' : 'return &event[{offset}];',
209313e337bSMatthias Ringwald    'X' : 'gatt_client_deserialize_service(event, {offset}, {result_name});',
210313e337bSMatthias Ringwald    'Y' : 'gatt_client_deserialize_characteristic(event, {offset}, {result_name});',
211313e337bSMatthias Ringwald    'Z' : 'gatt_client_deserialize_characteristic_descriptor(event, {offset}, {result_name});',
21247430bedSMatthias Ringwald    'V' : 'return &event[{offset}];',
2137b2a466aSMatthias Ringwald    'C' : 'return little_endian_read_16(event, {offset} + (2 * (int) index));'
214c3b5b8a5SMatthias Ringwald}
215c3b5b8a5SMatthias Ringwald
216c3b5b8a5SMatthias Ringwalddef c_type_for_btstack_type(type):
217c3b5b8a5SMatthias Ringwald    param_types = { '1' : 'uint8_t', '2' : 'uint16_t', '3' : 'uint32_t', '4' : 'uint32_t', 'H' : 'hci_con_handle_t', 'B' : 'bd_addr_t',
21847430bedSMatthias Ringwald                    'D' : 'const uint8_t *', 'E' : 'const uint8_t * ', 'N' : 'const char *' , 'P' : 'const uint8_t *', 'A' : 'const uint8_t *',
219c3b5b8a5SMatthias Ringwald                    'R' : 'const uint8_t *', 'S' : 'const uint8_t *',
22038d9ec05SMatthias Ringwald                    'J' : 'uint8_t', 'L' : 'uint16_t', 'V' : 'const uint8_t *', 'U' : 'BT_UUID',
22175a8e4faSMatthias Ringwald                    'Q' : 'uint8_t *', 'K' : 'uint8_t *',
222313e337bSMatthias Ringwald                    'X' : 'gatt_client_service_t *', 'Y' : 'gatt_client_characteristic_t *', 'Z' : 'gatt_client_characteristic_descriptor_t *',
223396f0845SMatthias Ringwald                    'T' : 'const char *', 'C' : 'uint16_t' }
224c3b5b8a5SMatthias Ringwald    return param_types[type]
225c3b5b8a5SMatthias Ringwald
226c3b5b8a5SMatthias Ringwalddef size_for_type(type):
22775a8e4faSMatthias 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,
228396f0845SMatthias Ringwald                    'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'U' : 16, 'X' : 20, 'Y' : 24, 'Z' : 18, 'T':-1, 'C':-1 }
229c3b5b8a5SMatthias Ringwald    return param_sizes[type]
230c3b5b8a5SMatthias Ringwald
231c3b5b8a5SMatthias Ringwalddef format_function_name(event_name):
2327bd8e93bSMatthias Ringwald    event_name = event_name.lower()
2337bd8e93bSMatthias Ringwald    if 'event' in event_name:
2347bd8e93bSMatthias Ringwald        return event_name;
2357bd8e93bSMatthias Ringwald    return event_name+'_event'
236c3b5b8a5SMatthias Ringwald
237c3b5b8a5SMatthias Ringwalddef template_for_type(field_type):
238c3b5b8a5SMatthias Ringwald    global c_prototoype_simple_return
239c3b5b8a5SMatthias Ringwald    global c_prototoype_struct_return
240396f0845SMatthias Ringwald    global c_prototoype_array_getter
241396f0845SMatthias Ringwald    if field_type == 'C':
242396f0845SMatthias Ringwald        return c_prototoype_array_getter
24375a8e4faSMatthias Ringwald    types_with_struct_return = "BKQXYZ"
244c3b5b8a5SMatthias Ringwald    if field_type in types_with_struct_return:
245c3b5b8a5SMatthias Ringwald        return c_prototoype_struct_return
246c3b5b8a5SMatthias Ringwald    else:
247c3b5b8a5SMatthias Ringwald        return c_prototoype_simple_return
248c3b5b8a5SMatthias Ringwald
249c3b5b8a5SMatthias Ringwalddef all_fields_supported(format):
250c3b5b8a5SMatthias Ringwald    global param_read
251c3b5b8a5SMatthias Ringwald    for f in format:
252c3b5b8a5SMatthias Ringwald        if not f in param_read:
253c3b5b8a5SMatthias Ringwald            return False
254c3b5b8a5SMatthias Ringwald    return True
255c3b5b8a5SMatthias Ringwald
256ca1a07f4SMatthias Ringwalddef create_getter(event_name, field_name, field_type, offset, offset_is_number, supported):
257c3b5b8a5SMatthias Ringwald    global c_prototoype_unsupported
258c3b5b8a5SMatthias Ringwald    global param_read
259c3b5b8a5SMatthias Ringwald
260396f0845SMatthias Ringwald    if field_type == 'C':
261396f0845SMatthias Ringwald        description_template = 'Get element of array field %s from event %s'
262396f0845SMatthias Ringwald    else:
263396f0845SMatthias Ringwald        description_template = "Get field %s from event %s"
264396f0845SMatthias Ringwald    description = description_template % (field_name, event_name.upper())
265c3b5b8a5SMatthias Ringwald    result_name = field_name
266c3b5b8a5SMatthias Ringwald    fn_name     = "%s_get_%s" % (event_name, field_name)
267c3b5b8a5SMatthias Ringwald    result_type = c_type_for_btstack_type(field_type)
268c3b5b8a5SMatthias Ringwald    template = c_prototoype_unsupported
269c3b5b8a5SMatthias Ringwald    code = ''
270c3b5b8a5SMatthias Ringwald    if supported and field_type in param_read:
271c3b5b8a5SMatthias Ringwald        template = template_for_type(field_type)
272ca1a07f4SMatthias Ringwald        read_code = param_read[field_type]
273ca1a07f4SMatthias Ringwald        requires_signed = 'little_endian' in read_code or 'gatt_client_deserialize' in read_code
274*b5d69418SMatthias Ringwald        code = ''
275ca1a07f4SMatthias Ringwald        if requires_signed and not offset_is_number:
276*b5d69418SMatthias Ringwald            code += 'uint16_t offset = %s;\n    ' % offset
277*b5d69418SMatthias Ringwald            offset = '(int)(int16_t) offset'
278*b5d69418SMatthias Ringwald        code += read_code.format(offset=offset, result_name=result_name)
279c3b5b8a5SMatthias Ringwald    return template.format(description=description, fn_name=fn_name, result_name=result_name, result_type=result_type, code=code, format=field_type)
280c3b5b8a5SMatthias Ringwald
281313e337bSMatthias Ringwalddef is_le_event(event_group):
282313e337bSMatthias Ringwald    return event_group in ['GATT', 'ANCS', 'SM']
283313e337bSMatthias Ringwald
284c3b5b8a5SMatthias Ringwalddef create_events(events):
285c3b5b8a5SMatthias Ringwald    global gen_path
286c3b5b8a5SMatthias Ringwald    global copyright
287c3b5b8a5SMatthias Ringwald    global hfile_header_begin
288c3b5b8a5SMatthias Ringwald    global hfile_header_end
2890e2df43fSMatthias Ringwald    global meta_event_template
290c3b5b8a5SMatthias Ringwald
291c3b5b8a5SMatthias Ringwald    with open(gen_path, 'wt') as fout:
292c3b5b8a5SMatthias Ringwald        fout.write(copyright)
293c3b5b8a5SMatthias Ringwald        fout.write(hfile_header_begin)
2940e2df43fSMatthias Ringwald
2950e2df43fSMatthias Ringwald        for meta_event in meta_events:
2960e2df43fSMatthias Ringwald            fout.write(meta_event_template.format(meta_event=meta_event.lower()))
2970e2df43fSMatthias Ringwald
298c3b5b8a5SMatthias Ringwald        for event_type, event_name, format, args in events:
29972b50801SMatthias Ringwald            parts = event_name.split("_")
300313e337bSMatthias Ringwald            event_group = parts[0]
301f1b34e8dSMatthias Ringwald            if not event_group in supported_event_groups:
302a59bfbf7SMatthias Ringwald                print("// %s " % event_name)
3037bd8e93bSMatthias Ringwald                continue
3046397af06SMatthias Ringwald            # print(event_name)
3056397af06SMatthias Ringwald            base_name = format_function_name(event_name)
3064de250b4SMatthias Ringwald            length_name = ''
307c3b5b8a5SMatthias Ringwald            offset = 2
308e222d6a0SMatthias Ringwald            offset_is_number = 1
309e222d6a0SMatthias Ringwald            offset_unknown = 0
310c3b5b8a5SMatthias Ringwald            supported = all_fields_supported(format)
311e222d6a0SMatthias Ringwald            last_variable_length_field_pos = ""
312313e337bSMatthias Ringwald            if is_le_event(event_group):
313313e337bSMatthias Ringwald                fout.write("#ifdef ENABLE_BLE\n")
3146397af06SMatthias Ringwald            if len(format) != len(args):
3156397af06SMatthias Ringwald                print(event_name.upper())
3166397af06SMatthias Ringwald                print ("Format %s does not match params %s " % (format, args))
3176397af06SMatthias Ringwald                print
318c3b5b8a5SMatthias Ringwald            for f, arg in zip(format, args):
319c3b5b8a5SMatthias Ringwald                field_name = arg
32090944a9aSMatthias Ringwald                if field_name.lower() == 'subevent_code':
32190944a9aSMatthias Ringwald                    offset += 1
32290944a9aSMatthias Ringwald                    continue
323e222d6a0SMatthias Ringwald                if offset_unknown:
324396f0845SMatthias Ringwald                    print("Param after variable length field without preceding 'J' length field")
325e222d6a0SMatthias Ringwald                    break
326c3b5b8a5SMatthias Ringwald                field_type = f
327ca1a07f4SMatthias Ringwald                text = create_getter(base_name, field_name, field_type, offset, offset_is_number, supported)
328c3b5b8a5SMatthias Ringwald                fout.write(text)
3297bd8e93bSMatthias Ringwald                if field_type in 'RT':
330c3b5b8a5SMatthias Ringwald                    break
331e222d6a0SMatthias Ringwald                if field_type in 'J':
332e222d6a0SMatthias Ringwald                    if offset_is_number:
333e222d6a0SMatthias Ringwald                        last_variable_length_field_pos = '%u' % offset
334e222d6a0SMatthias Ringwald                    else:
335e222d6a0SMatthias Ringwald                        last_variable_length_field_pos = offset
336e222d6a0SMatthias Ringwald                if field_type in 'V':
3375c544019SMatthias Ringwald                    if last_variable_length_field_pos != '':
338e222d6a0SMatthias Ringwald                        if offset_is_number:
339e222d6a0SMatthias Ringwald                            # convert to string
3400dd3c6c3SMatthias Ringwald                            offset = '%uu' % offset
341e222d6a0SMatthias Ringwald                            offset_is_number = 0
342e222d6a0SMatthias Ringwald                        offset = offset + ' + event[%s]' % last_variable_length_field_pos
343e222d6a0SMatthias Ringwald                    else:
344e222d6a0SMatthias Ringwald                        offset_unknown = 1
345e222d6a0SMatthias Ringwald                else:
346e222d6a0SMatthias Ringwald                    if offset_is_number:
347c3b5b8a5SMatthias Ringwald                        offset += size_for_type(field_type)
348e222d6a0SMatthias Ringwald                    else:
3490dd3c6c3SMatthias Ringwald                        offset = offset + ' + %uu' % size_for_type(field_type)
350313e337bSMatthias Ringwald            if is_le_event(event_group):
351313e337bSMatthias Ringwald                fout.write("#endif\n")
352313e337bSMatthias Ringwald            fout.write("\n")
353c3b5b8a5SMatthias Ringwald
354c3b5b8a5SMatthias Ringwald        fout.write(hfile_header_end)
355c3b5b8a5SMatthias Ringwald
3569d585a82SMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..')
3579d585a82SMatthias Ringwaldgen_path = btstack_root + '/src/btstack_event.h'
358c3b5b8a5SMatthias Ringwald
359c3b5b8a5SMatthias Ringwaldprint(program_info)
360c3b5b8a5SMatthias Ringwald
361c3b5b8a5SMatthias Ringwald# parse events
362c3b5b8a5SMatthias Ringwald(events, le_events, event_types) = parser.parse_events()
363c3b5b8a5SMatthias Ringwald
364c3b5b8a5SMatthias Ringwald# create event field accesors
365c3b5b8a5SMatthias Ringwaldcreate_events(events + le_events)
366c3b5b8a5SMatthias Ringwald
367c3b5b8a5SMatthias Ringwald# done
368c3b5b8a5SMatthias Ringwaldprint('Done!')
369