xref: /btstack/tool/python_generator.py (revision dbd33601372b921c6b07059b9f4582fdd1b4b365)
173a17974SMatthias Ringwald#!/usr/bin/env python
273a17974SMatthias Ringwald# BlueKitchen GmbH (c) 2018
373a17974SMatthias Ringwald
473a17974SMatthias Ringwaldimport glob
573a17974SMatthias Ringwaldimport re
673a17974SMatthias Ringwaldimport sys
773a17974SMatthias Ringwaldimport os
873a17974SMatthias Ringwald
973a17974SMatthias Ringwaldimport btstack_parser as parser
1073a17974SMatthias Ringwald
1173a17974SMatthias Ringwaldprint('''
1273a17974SMatthias RingwaldPython binding generator for BTstack Server
1373a17974SMatthias RingwaldCopyright 2018, BlueKitchen GmbH
1473a17974SMatthias Ringwald''')
1573a17974SMatthias Ringwald
1673a17974SMatthias Ringwald# com.bluekitchen.btstack.BTstack.java templates
1773a17974SMatthias Ringwaldcommand_builder_header = \
1873a17974SMatthias Ringwald'''#!/usr/bin/env python3
1973a17974SMatthias Ringwald
2073a17974SMatthias Ringwaldimport struct
2173a17974SMatthias Ringwald
2201aeeea2SMatthias Ringwalddef opcode(ogf, ocf):
2301aeeea2SMatthias Ringwald    return ocf | (ogf << 10)
2473a17974SMatthias Ringwald
2573a17974SMatthias Ringwalddef pack24(value):
2673a17974SMatthias Ringwald    return struct.pack("B", value & 0xff) + struct.pack("<H", value >> 8)
2773a17974SMatthias Ringwald
2873a17974SMatthias Ringwalddef name248(str):
2973a17974SMatthias Ringwald    arg = str.encode('utf-8')
3073a17974SMatthias Ringwald    return arg[:248] + bytes(248-len(arg))
3173a17974SMatthias Ringwald
3201aeeea2SMatthias Ringwald# Command Builder
3301aeeea2SMatthias Ringwald
3401aeeea2SMatthias Ringwaldclass CommandBuilder(object):
3501aeeea2SMatthias Ringwald    def __init__(self):
3601aeeea2SMatthias Ringwald        pass
3701aeeea2SMatthias Ringwald
3873a17974SMatthias Ringwald    def send_command(command):
3973a17974SMatthias Ringwald        return FALSE
4073a17974SMatthias Ringwald
4173a17974SMatthias Ringwald'''
4273a17974SMatthias Ringwaldcommand_builder_command = '''
4301aeeea2SMatthias Ringwald    def {name}(self, {args}):
4473a17974SMatthias Ringwald        cmd_args = bytes()
4573a17974SMatthias Ringwald{args_builder}
4601aeeea2SMatthias Ringwald        cmd = struct.pack("<HB", opcode(self.{ogf}, self.{ocf}), len(cmd_args)) + cmd_args
4773a17974SMatthias Ringwald        return self.send_hci_command(cmd)
4873a17974SMatthias Ringwald'''
4973a17974SMatthias Ringwald
5073a17974SMatthias Ringwald# com.bluekitchen.btstack.EventFactory template
5173a17974SMatthias Ringwaldjava_event_factory_template = \
52*dbd33601SMatthias Ringwald'''
5373a17974SMatthias Ringwald
54*dbd33601SMatthias Ringwaldclass EventFactory(object:
5573a17974SMatthias Ringwald
56*dbd33601SMatthias Ringwald    # @brief event codes
5773a17974SMatthias Ringwald
58*dbd33601SMatthias Ringwald{0}
59*dbd33601SMatthias Ringwald    def event_for_packet(packet):
60*dbd33601SMatthias Ringwald        event_type = packet.get_payload()[0]
61*dbd33601SMatthias Ringwald        # switch (eventType){{
6273a17974SMatthias Ringwald{1}
63*dbd33601SMatthias Ringwald        # case 0x3e:  // LE_META_EVENT
64*dbd33601SMatthias Ringwald        # int subEventType = Util.readByte(packet.getBuffer(), 2);
65*dbd33601SMatthias Ringwald        # switch (subEventType){{
6673a17974SMatthias Ringwald{2}
67*dbd33601SMatthias Ringwald        # default:
68*dbd33601SMatthias Ringwald        # return new Event(packet);
6973a17974SMatthias Ringwald
70*dbd33601SMatthias Ringwald        # default:
71*dbd33601SMatthias Ringwald        # return new Event(packet);
7273a17974SMatthias Ringwald        }}
7373a17974SMatthias Ringwald    }}
7473a17974SMatthias Ringwald}}
7573a17974SMatthias Ringwald'''
7673a17974SMatthias Ringwaldjava_event_factory_event = '''
7773a17974SMatthias Ringwald        case {0}:
7873a17974SMatthias Ringwald            return new {1}(packet);
7973a17974SMatthias Ringwald'''
8073a17974SMatthias Ringwaldjava_event_factory_subevent = '''
8173a17974SMatthias Ringwald            case {0}:
8273a17974SMatthias Ringwald                return new {1}(packet);
8373a17974SMatthias Ringwald'''
8473a17974SMatthias Ringwald
8573a17974SMatthias Ringwald# com.bluekitchen.btstack.events.* template
8673a17974SMatthias Ringwaldjava_event_template = \
87*dbd33601SMatthias Ringwald'''
8873a17974SMatthias Ringwald
89*dbd33601SMatthias Ringwaldclass {0}(Event):
9073a17974SMatthias Ringwald
91*dbd33601SMatthias Ringwald    def __init__(self, packet):
92*dbd33601SMatthias Ringwald        # super(packet);
93*dbd33601SMatthias Ringwald    {1}
9473a17974SMatthias Ringwald    {2}
9573a17974SMatthias Ringwald'''
9673a17974SMatthias Ringwald
9773a17974SMatthias Ringwaldjava_event_getter = \
9873a17974SMatthias Ringwald'''
99*dbd33601SMatthias Ringwald    # @return {1} as {0}
100*dbd33601SMatthias Ringwald    def get_{1}(self):
10173a17974SMatthias Ringwald        {2}
10273a17974SMatthias Ringwald'''
10373a17974SMatthias Ringwald
10473a17974SMatthias Ringwaldjava_event_getter_data = \
105*dbd33601SMatthias Ringwald'''# java_event_getter_data
106*dbd33601SMatthias Ringwald        # int len = get{length_name}();
107*dbd33601SMatthias Ringwald        # byte[] result = new byte[len];
108*dbd33601SMatthias Ringwald        # System.arraycopy(data, {offset}, result, 0, len);
109*dbd33601SMatthias Ringwald        # return result;'''
11073a17974SMatthias Ringwald
11173a17974SMatthias Ringwaldjava_event_getter_data_fixed = \
112*dbd33601SMatthias Ringwald'''# java_event_getter_data_fixed
113*dbd33601SMatthias Ringwald        # int len = {size};
114*dbd33601SMatthias Ringwald        # byte[] result = new byte[len];
115*dbd33601SMatthias Ringwald        # System.arraycopy(data, {offset}, result, 0, len);
116*dbd33601SMatthias Ringwald        # return result;'''
11773a17974SMatthias Ringwald
11873a17974SMatthias Ringwaldjava_event_getter_remaining_data = \
119*dbd33601SMatthias Ringwald'''# java_event_getter_remaining_data
120*dbd33601SMatthias Ringwald        # int len = getPayloadLen() - {offset};
121*dbd33601SMatthias Ringwald        # byte[] result = new byte[len];
122*dbd33601SMatthias Ringwald        # System.arraycopy(data, {offset}, result, 0, len);
123*dbd33601SMatthias Ringwald        # return result;'''
12473a17974SMatthias Ringwald
12573a17974SMatthias Ringwaldjava_event_to_string = \
126*dbd33601SMatthias Ringwald'''# java_event_to_string
127*dbd33601SMatthias Ringwald    def __str__(self):
128*dbd33601SMatthias Ringwald        # StringBuffer t = new StringBuffer();
129*dbd33601SMatthias Ringwald        # t.append("{0} < type = ");
130*dbd33601SMatthias Ringwald        # t.append(String.format("0x%02x, ", getEventType()));
131*dbd33601SMatthias Ringwald        # t.append(getEventType());
132*dbd33601SMatthias Ringwald{1}
133*dbd33601SMatthias Ringwald        # t.append(" >");
134*dbd33601SMatthias Ringwald        # return t.toString();
13573a17974SMatthias Ringwald'''
13673a17974SMatthias Ringwald
13773a17974SMatthias Ringwald
13873a17974SMatthias Ringwald# global variables/defines
13973a17974SMatthias Ringwaldpackage  ='com.bluekitchen.btstack'
14073a17974SMatthias Ringwaldgen_path = 'gen/' + package.replace('.', '/')
14173a17974SMatthias Ringwald
14273a17974SMatthias Ringwalddefines = dict()
14373a17974SMatthias Ringwalddefines_used = set()
14473a17974SMatthias Ringwald
14573a17974SMatthias Ringwalddef java_type_for_btstack_type(type):
14673a17974SMatthias Ringwald    param_types = { '1' : 'int', '2' : 'int', '3' : 'int', '4' : 'long', 'H' : 'int', 'B' : 'BD_ADDR',
14773a17974SMatthias Ringwald                    'D' : 'byte []', 'E' : 'byte [] ', 'N' : 'String' , 'P' : 'byte []', 'A' : 'byte []',
14873a17974SMatthias Ringwald                    'R' : 'byte []', 'S' : 'byte []', 'Q' : 'byte []',
14973a17974SMatthias Ringwald                    'J' : 'int', 'L' : 'int', 'V' : 'byte []', 'U' : 'BT_UUID',
15073a17974SMatthias Ringwald                    'X' : 'GATTService', 'Y' : 'GATTCharacteristic', 'Z' : 'GATTCharacteristicDescriptor',
15173a17974SMatthias Ringwald                    'T' : 'String'}
15273a17974SMatthias Ringwald    return param_types[type]
15373a17974SMatthias Ringwald
15473a17974SMatthias Ringwalddef size_for_type(type):
15573a17974SMatthias Ringwald    param_sizes = { '1' : 1, '2' : 2, '3' : 3, '4' : 4, 'H' : 2, 'B' : 6, 'D' : 8, 'E' : 240, 'N' : 248, 'P' : 16,
15673a17974SMatthias Ringwald                    'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'Q' : 32, 'U' : 16, 'X' : 20, 'Y' : 24, 'Z' : 18, 'T':-1}
15773a17974SMatthias Ringwald    return param_sizes[type]
15873a17974SMatthias Ringwald
15973a17974SMatthias Ringwalddef create_command_python(fout, name, ogf, ocf, format, params):
16073a17974SMatthias Ringwald    global command_builder_command
16173a17974SMatthias Ringwald
16273a17974SMatthias Ringwald    ind = '        '
16373a17974SMatthias Ringwald    param_store = {
16473a17974SMatthias Ringwald     '1' : 'cmd_args += struct.pack("B", %s)',
16573a17974SMatthias Ringwald     'J' : 'cmd_args += struct.pack("B", %s)',
16673a17974SMatthias Ringwald     '2' : 'cmd_args += struct.pack("<H", %s)',
16773a17974SMatthias Ringwald     'H' : 'cmd_args += struct.pack("<H", %s)',
16873a17974SMatthias Ringwald     'L' : 'cmd_args += struct.pack("<H", %s)',
16901aeeea2SMatthias Ringwald     '3' : 'cmd_args += pack24(%s)',
17073a17974SMatthias Ringwald     '4' : 'cmd_args += struct.pack("<H", %s)',
17101aeeea2SMatthias Ringwald     'N' : 'cmd_args += name248(%s)',
17273a17974SMatthias Ringwald     'B' : 'cmd_args += %s.get_bytes()',
17373a17974SMatthias Ringwald     'U' : 'cmd_args += %s.get_bytes()',
17473a17974SMatthias Ringwald     'X' : 'cmd_args += %s.get_bytes()',
17573a17974SMatthias Ringwald     'Y' : 'cmd_args += %s.get_bytes()',
17673a17974SMatthias Ringwald     'Z' : 'cmd_args += %s.get_bytes()',
17773a17974SMatthias Ringwald     'S' : 'cmd_args += %s',
17873a17974SMatthias Ringwald     # TODO: support serialization for these
17973a17974SMatthias Ringwald     'D' : '# D / TODO Util.storeBytes(command, offset, %s, 8)',
18073a17974SMatthias Ringwald     'E' : '# E / TODO Util.storeBytes(command, offset, %s, 240)',
18173a17974SMatthias Ringwald     'P' : '# P / TODO Util.storeBytes(command, offset, %s, 16)',
18273a17974SMatthias Ringwald     'Q' : '# Q / TODO Util.storeBytes(command, offset, %s, 32)',
18373a17974SMatthias Ringwald     'A' : '# A / TODO Util.storeBytes(command, offset, %s, 31)',
18473a17974SMatthias Ringwald     }
18573a17974SMatthias Ringwald    # method arguments
18673a17974SMatthias Ringwald    arg_counter = 1
18773a17974SMatthias Ringwald    args = []
18873a17974SMatthias Ringwald    for param_type, arg_name in zip(format, params):
18973a17974SMatthias Ringwald        arg_size = size_for_type(param_type)
19073a17974SMatthias Ringwald        arg = (param_type, arg_size, arg_name)
19173a17974SMatthias Ringwald        args.append(arg)
19273a17974SMatthias Ringwald        arg_counter += 1
19373a17974SMatthias Ringwald
19473a17974SMatthias Ringwald    # method argument declaration
19573a17974SMatthias Ringwald    args2 = []
19673a17974SMatthias Ringwald    for arg in args:
19773a17974SMatthias Ringwald        args2.append(arg[2])
19873a17974SMatthias Ringwald    args_string = ', '.join(args2)
19973a17974SMatthias Ringwald
20073a17974SMatthias Ringwald    # command size (opcode, len)
20173a17974SMatthias Ringwald    size_fixed = 3
20273a17974SMatthias Ringwald    size_var = ''
20373a17974SMatthias Ringwald    for arg in args:
20473a17974SMatthias Ringwald        size = arg[1]
20573a17974SMatthias Ringwald        if size > 0:
20673a17974SMatthias Ringwald            size_fixed += size
20773a17974SMatthias Ringwald        else:
20873a17974SMatthias Ringwald            size_var += ' + %s.length' % arg[2]
20973a17974SMatthias Ringwald    size_string = '%u%s' % (size_fixed, size_var)
21073a17974SMatthias Ringwald
21173a17974SMatthias Ringwald    store_params = ''
21273a17974SMatthias Ringwald
21373a17974SMatthias Ringwald    length_name = ''
21473a17974SMatthias Ringwald    for (param_type, arg_size, arg_name) in args:
21573a17974SMatthias Ringwald        if param_type in ['L', 'J']:
21673a17974SMatthias Ringwald            length_name = arg_name
21773a17974SMatthias Ringwald        if param_type == 'V':
21873a17974SMatthias Ringwald            store_params += ind + 'Util.storeBytes(command, offset, %s, %s);' % (arg_name, length_name) + '\n';
21973a17974SMatthias Ringwald            length_name = ''
22073a17974SMatthias Ringwald        else:
22173a17974SMatthias Ringwald            store_params += ind + (param_store[param_type] % arg_name) + '\n';
22273a17974SMatthias Ringwald            size = arg_size
22373a17974SMatthias Ringwald
22473a17974SMatthias Ringwald    fout.write( command_builder_command.format(name=name, args=args_string, ogf=ogf, ocf=ocf, args_builder=store_params))
22573a17974SMatthias Ringwald
22673a17974SMatthias Ringwalddef mark_define_as_used(term):
22773a17974SMatthias Ringwald    if term.startswith('0'):
22873a17974SMatthias Ringwald        return
22973a17974SMatthias Ringwald    defines_used.add(term)
23073a17974SMatthias Ringwald
23101aeeea2SMatthias Ringwalddef python_define_string(key):
23273a17974SMatthias Ringwald    global defines
23373a17974SMatthias Ringwald    if key in defines:
23401aeeea2SMatthias Ringwald        return '    %s = %s\n' % (key, defines[key])
23573a17974SMatthias Ringwald    else:
23601aeeea2SMatthias Ringwald        return '    # defines[%s] not set\n' % key
23773a17974SMatthias Ringwald
238b2929115SMatthias Ringwalddef python_defines_string(keys):
23901aeeea2SMatthias Ringwald    return '\n'.join( map(python_define_string, sorted(keys)))
24073a17974SMatthias Ringwald
24173a17974SMatthias Ringwalddef create_command_builder(commands):
24273a17974SMatthias Ringwald    global gen_path
24373a17974SMatthias Ringwald    parser.assert_dir(gen_path)
24473a17974SMatthias Ringwald
24573a17974SMatthias Ringwald    outfile = '%s/command_builder.py' % gen_path
24673a17974SMatthias Ringwald
24773a17974SMatthias Ringwald    with open(outfile, 'wt') as fout:
24873a17974SMatthias Ringwald
24973a17974SMatthias Ringwald        fout.write(command_builder_header)
25073a17974SMatthias Ringwald
25173a17974SMatthias Ringwald        for command in commands:
25273a17974SMatthias Ringwald                (command_name, ogf, ocf, format, params) = command
25373a17974SMatthias Ringwald                create_command_python(fout, command_name, ogf, ocf, format, params);
25473a17974SMatthias Ringwald                mark_define_as_used(ogf)
25573a17974SMatthias Ringwald                mark_define_as_used(ocf)
25673a17974SMatthias Ringwald
25701aeeea2SMatthias Ringwald        fout.write('\n    # defines used\n\n')
25801aeeea2SMatthias Ringwald        for key in sorted(defines_used):
25901aeeea2SMatthias Ringwald            fout.write(python_define_string(key))
26073a17974SMatthias Ringwald
261b2929115SMatthias Ringwalddef create_event(fout, event_name, format, args):
26273a17974SMatthias Ringwald    global gen_path
26373a17974SMatthias Ringwald    global java_event_template
26473a17974SMatthias Ringwald
26573a17974SMatthias Ringwald    param_read = {
266*dbd33601SMatthias Ringwald     '1' : 'return self.payload[{offset}]',
267*dbd33601SMatthias Ringwald     'J' : 'return self.payload[{offset}]',
268*dbd33601SMatthias Ringwald     '2' : 'return struct.unpack("<H", self.payload[{offset}, {offset}+2])',
269*dbd33601SMatthias Ringwald     'H' : 'return struct.unpack("<H", self.payload[{offset}, {offset}+2])',
270*dbd33601SMatthias Ringwald     'L' : 'return struct.unpack("<H", self.payload[{offset}, {offset}+2])',
271*dbd33601SMatthias Ringwald     '3' : 'return btstack.btstack_types.unpack24(self.payload[{offset}:3])',
272*dbd33601SMatthias Ringwald     '4' : 'return struct.unpack("<I", self.payload[{offset}, {offset}+4])',
273*dbd33601SMatthias Ringwald     'B' : 'return btstack.btstack_types.BD_ADDR(self.payload[{offset}:6])',
274*dbd33601SMatthias Ringwald     'X' : 'return btstack.btstack_types.GATTService(self.payload[{offset}:20])',
275*dbd33601SMatthias Ringwald     'Y' : 'return btstack.btstack_types.GATTCharacteristic(self.payload[{offset}:24])',
276*dbd33601SMatthias Ringwald     'Z' : 'return btstack.btstack_types.GATTCharacteristicDescriptor(self.payload[{offset}:18])',
277*dbd33601SMatthias Ringwald     'T' : '# TODO - convert remaining bytes from {offset} into string object',
278*dbd33601SMatthias Ringwald     'N' : '# TODO - convert 248 bytes from {offset} into string object',
279*dbd33601SMatthias Ringwald     # 'D' : 'Util.storeBytes(self.payload, %u, 8);',
280*dbd33601SMatthias Ringwald     # 'Q' : 'Util.storeBytes(self.payload, %u, 32);',
28173a17974SMatthias Ringwald     # 'E' : 'Util.storeBytes(data, %u, 240);',
28273a17974SMatthias Ringwald     # 'P' : 'Util.storeBytes(data, %u, 16);',
28373a17974SMatthias Ringwald     # 'A' : 'Util.storeBytes(data, %u, 31);',
28473a17974SMatthias Ringwald     # 'S' : 'Util.storeBytes(data, %u);'
28573a17974SMatthias Ringwald     }
28673a17974SMatthias Ringwald
28773a17974SMatthias Ringwald    offset = 2
28873a17974SMatthias Ringwald    getters = ''
28973a17974SMatthias Ringwald    length_name = ''
29073a17974SMatthias Ringwald    for f, arg in zip(format, args):
29173a17974SMatthias Ringwald        # just remember name
29273a17974SMatthias Ringwald        if f in ['L','J']:
293*dbd33601SMatthias Ringwald            length_name = arg.lower()
29473a17974SMatthias Ringwald        if f == 'R':
29573a17974SMatthias Ringwald            # remaining data
296*dbd33601SMatthias Ringwald            access = java_event_getter_remaining_data.format(offset=offset)
29773a17974SMatthias Ringwald            size = 0
29873a17974SMatthias Ringwald        elif f == 'V':
299*dbd33601SMatthias Ringwald            access = java_event_getter_data.format(length_name=length_name, offset=offset)
30073a17974SMatthias Ringwald            size = 0
30173a17974SMatthias Ringwald        elif f in ['D', 'Q']:
30273a17974SMatthias Ringwald            size = size_for_type(f)
303*dbd33601SMatthias Ringwald            access = java_event_getter_data_fixed.format(size=size, offset=offset)
30473a17974SMatthias Ringwald        else:
305*dbd33601SMatthias Ringwald            access = param_read[f].format(offset=offset)
30673a17974SMatthias Ringwald            size = size_for_type(f)
307*dbd33601SMatthias Ringwald        getters += java_event_getter.format(java_type_for_btstack_type(f), arg.lower(), access)
30873a17974SMatthias Ringwald        offset += size
30973a17974SMatthias Ringwald    to_string_args = ''
31073a17974SMatthias Ringwald    for arg in args:
311*dbd33601SMatthias Ringwald        to_string_args += '        # t.append(", %s = ");\n' % arg
312*dbd33601SMatthias Ringwald        to_string_args += '        # t.append(get%s());\n' % parser.camel_case(arg)
31373a17974SMatthias Ringwald    to_string_method = java_event_to_string.format(event_name, to_string_args)
314*dbd33601SMatthias Ringwald    fout.write(java_event_template.format(event_name, getters, to_string_method))
31573a17974SMatthias Ringwald
31673a17974SMatthias Ringwalddef event_supported(event_name):
31773a17974SMatthias Ringwald    parts = event_name.split('_')
31873a17974SMatthias Ringwald    return parts[0] in ['ATT', 'BTSTACK', 'DAEMON', 'L2CAP', 'RFCOMM', 'SDP', 'GATT', 'GAP', 'HCI', 'SM', 'BNEP']
31973a17974SMatthias Ringwald
32073a17974SMatthias Ringwalddef class_name_for_event(event_name):
32173a17974SMatthias Ringwald    return parser.camel_case(event_name.replace('SUBEVENT','EVENT'))
32273a17974SMatthias Ringwald
323b2929115SMatthias Ringwalddef create_events(fout, events):
32473a17974SMatthias Ringwald    global gen_path
32573a17974SMatthias Ringwald    gen_path_events = gen_path + '/event'
32673a17974SMatthias Ringwald    parser.assert_dir(gen_path_events)
32773a17974SMatthias Ringwald
32873a17974SMatthias Ringwald    for event_type, event_name, format, args in events:
32973a17974SMatthias Ringwald        if not event_supported(event_name):
33073a17974SMatthias Ringwald            continue
33173a17974SMatthias Ringwald        class_name = class_name_for_event(event_name)
332b2929115SMatthias Ringwald        create_event(fout, class_name, format, args)
33373a17974SMatthias Ringwald
33473a17974SMatthias Ringwald
33573a17974SMatthias Ringwalddef create_event_factory(events, subevents, defines):
33673a17974SMatthias Ringwald    global gen_path
33773a17974SMatthias Ringwald    global java_event_factory_event
33873a17974SMatthias Ringwald    global java_event_factory_template
33973a17974SMatthias Ringwald
340b2929115SMatthias Ringwald    outfile = '%s/event_factory.py' % gen_path
34173a17974SMatthias Ringwald
34273a17974SMatthias Ringwald    cases = ''
34373a17974SMatthias Ringwald    for event_type, event_name, format, args in events:
34473a17974SMatthias Ringwald        event_name = parser.camel_case(event_name)
34573a17974SMatthias Ringwald        cases += java_event_factory_event.format(event_type, event_name)
34673a17974SMatthias Ringwald    subcases = ''
34773a17974SMatthias Ringwald    for event_type, event_name, format, args in subevents:
34873a17974SMatthias Ringwald        if not event_supported(event_name):
34973a17974SMatthias Ringwald            continue
35073a17974SMatthias Ringwald        class_name = class_name_for_event(event_name)
35173a17974SMatthias Ringwald        subcases += java_event_factory_subevent.format(event_type, class_name)
35273a17974SMatthias Ringwald
35373a17974SMatthias Ringwald    with open(outfile, 'wt') as fout:
354b2929115SMatthias Ringwald        # event classes
355b2929115SMatthias Ringwald        create_events(fout, events)
356b2929115SMatthias Ringwald        create_events(fout, subevents)
357b2929115SMatthias Ringwald        #
358b2929115SMatthias Ringwald        defines_text = python_defines_string(defines)
359*dbd33601SMatthias Ringwald        fout.write(java_event_factory_template.format(defines_text, cases, subcases))
36073a17974SMatthias Ringwald
36173a17974SMatthias Ringwald# find root
36273a17974SMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..')
36373a17974SMatthias Ringwaldgen_path = btstack_root + '/platform/daemon/binding/python/btstack/'
36473a17974SMatthias Ringwald
36573a17974SMatthias Ringwald
36673a17974SMatthias Ringwald# read defines from hci_cmds.h and hci.h
36773a17974SMatthias Ringwalddefines = parser.parse_defines()
36873a17974SMatthias Ringwald
36973a17974SMatthias Ringwald# parse commands
3709fb9416bSMatthias Ringwaldcommands = parser.parse_commands(camel_case=False)
37173a17974SMatthias Ringwald
37273a17974SMatthias Ringwald# parse bluetooth.h to get used events
373b2929115SMatthias Ringwald(events, le_events, event_types) = parser.parse_events()
37473a17974SMatthias Ringwald
37573a17974SMatthias Ringwald# create events, le meta events, event factory, and
376b2929115SMatthias Ringwaldcreate_event_factory(events, le_events, event_types)
37773a17974SMatthias Ringwaldcreate_command_builder(commands)
37873a17974SMatthias Ringwald
37973a17974SMatthias Ringwald# done
38073a17974SMatthias Ringwaldprint('Done!')
381