xref: /btstack/tool/python_generator.py (revision 73a179741215be11c20b75b3d183df02bb02f3b7)
1*73a17974SMatthias Ringwald#!/usr/bin/env python
2*73a17974SMatthias Ringwald# BlueKitchen GmbH (c) 2018
3*73a17974SMatthias Ringwald
4*73a17974SMatthias Ringwaldimport glob
5*73a17974SMatthias Ringwaldimport re
6*73a17974SMatthias Ringwaldimport sys
7*73a17974SMatthias Ringwaldimport os
8*73a17974SMatthias Ringwald
9*73a17974SMatthias Ringwaldimport btstack_parser as parser
10*73a17974SMatthias Ringwald
11*73a17974SMatthias Ringwaldprint('''
12*73a17974SMatthias RingwaldPython binding generator for BTstack Server
13*73a17974SMatthias RingwaldCopyright 2018, BlueKitchen GmbH
14*73a17974SMatthias Ringwald''')
15*73a17974SMatthias Ringwald
16*73a17974SMatthias Ringwald# com.bluekitchen.btstack.BTstack.java templates
17*73a17974SMatthias Ringwaldcommand_builder_header = \
18*73a17974SMatthias Ringwald'''#!/usr/bin/env python3
19*73a17974SMatthias Ringwald
20*73a17974SMatthias Ringwaldimport struct
21*73a17974SMatthias Ringwald
22*73a17974SMatthias Ringwald# Command Builder
23*73a17974SMatthias Ringwald
24*73a17974SMatthias Ringwaldclass CommandBuilder(object):
25*73a17974SMatthias Ringwald    def __init__(self):
26*73a17974SMatthias Ringwald        pass
27*73a17974SMatthias Ringwald
28*73a17974SMatthias Ringwald    def pack24(value):
29*73a17974SMatthias Ringwald        return struct.pack("B", value & 0xff) + struct.pack("<H", value >> 8)
30*73a17974SMatthias Ringwald
31*73a17974SMatthias Ringwald    def name248(str):
32*73a17974SMatthias Ringwald        arg = str.encode('utf-8')
33*73a17974SMatthias Ringwald        return arg[:248] + bytes(248-len(arg))
34*73a17974SMatthias Ringwald
35*73a17974SMatthias Ringwald    def send_command(command):
36*73a17974SMatthias Ringwald        return FALSE
37*73a17974SMatthias Ringwald
38*73a17974SMatthias Ringwald'''
39*73a17974SMatthias Ringwaldcommand_builder_command = '''
40*73a17974SMatthias Ringwald    def {name}({args}):
41*73a17974SMatthias Ringwald        cmd_args = bytes()
42*73a17974SMatthias Ringwald{args_builder}
43*73a17974SMatthias Ringwald        cmd = struct.pack("<HB", opcode({ogf}, {ocf}), len(cmd_args)) + cmd_args
44*73a17974SMatthias Ringwald        return self.send_hci_command(cmd)
45*73a17974SMatthias Ringwald'''
46*73a17974SMatthias Ringwald
47*73a17974SMatthias Ringwald# com.bluekitchen.btstack.EventFactory template
48*73a17974SMatthias Ringwaldjava_event_factory_template = \
49*73a17974SMatthias Ringwald'''package {0};
50*73a17974SMatthias Ringwald
51*73a17974SMatthias Ringwaldimport {0}.event.*;
52*73a17974SMatthias Ringwald
53*73a17974SMatthias Ringwaldpublic class EventFactory {{
54*73a17974SMatthias Ringwald
55*73a17974SMatthias Ringwald    /** @brief event codes */
56*73a17974SMatthias Ringwald
57*73a17974SMatthias Ringwald{1}
58*73a17974SMatthias Ringwald    public static Event eventForPacket(Packet packet){{
59*73a17974SMatthias Ringwald        int eventType = Util.readByte(packet.getBuffer(), 0);
60*73a17974SMatthias Ringwald        switch (eventType){{
61*73a17974SMatthias Ringwald{2}
62*73a17974SMatthias Ringwald        case 0x3e:  // LE_META_EVENT
63*73a17974SMatthias Ringwald            int subEventType = Util.readByte(packet.getBuffer(), 2);
64*73a17974SMatthias Ringwald            switch (subEventType){{
65*73a17974SMatthias Ringwald{3}
66*73a17974SMatthias Ringwald            default:
67*73a17974SMatthias Ringwald                return new Event(packet);
68*73a17974SMatthias Ringwald            }}
69*73a17974SMatthias Ringwald
70*73a17974SMatthias Ringwald        default:
71*73a17974SMatthias Ringwald            return new Event(packet);
72*73a17974SMatthias Ringwald        }}
73*73a17974SMatthias Ringwald    }}
74*73a17974SMatthias Ringwald}}
75*73a17974SMatthias Ringwald'''
76*73a17974SMatthias Ringwaldjava_event_factory_event = '''
77*73a17974SMatthias Ringwald        case {0}:
78*73a17974SMatthias Ringwald            return new {1}(packet);
79*73a17974SMatthias Ringwald'''
80*73a17974SMatthias Ringwaldjava_event_factory_subevent = '''
81*73a17974SMatthias Ringwald            case {0}:
82*73a17974SMatthias Ringwald                return new {1}(packet);
83*73a17974SMatthias Ringwald'''
84*73a17974SMatthias Ringwald
85*73a17974SMatthias Ringwald# com.bluekitchen.btstack.events.* template
86*73a17974SMatthias Ringwaldjava_event_template = \
87*73a17974SMatthias Ringwald'''package {0}.event;
88*73a17974SMatthias Ringwald
89*73a17974SMatthias Ringwaldimport {0}.*;
90*73a17974SMatthias Ringwald
91*73a17974SMatthias Ringwaldpublic class {1} extends Event {{
92*73a17974SMatthias Ringwald
93*73a17974SMatthias Ringwald    public {1}(Packet packet) {{
94*73a17974SMatthias Ringwald        super(packet);
95*73a17974SMatthias Ringwald    }}
96*73a17974SMatthias Ringwald    {2}
97*73a17974SMatthias Ringwald    {3}
98*73a17974SMatthias Ringwald}}
99*73a17974SMatthias Ringwald'''
100*73a17974SMatthias Ringwald
101*73a17974SMatthias Ringwaldjava_event_getter = \
102*73a17974SMatthias Ringwald'''
103*73a17974SMatthias Ringwald    /**
104*73a17974SMatthias Ringwald     * @return {1} as {0}
105*73a17974SMatthias Ringwald     */
106*73a17974SMatthias Ringwald    public {0} get{1}(){{
107*73a17974SMatthias Ringwald        {2}
108*73a17974SMatthias Ringwald    }}
109*73a17974SMatthias Ringwald'''
110*73a17974SMatthias Ringwald
111*73a17974SMatthias Ringwaldjava_event_getter_data = \
112*73a17974SMatthias Ringwald'''int len = get{0}();
113*73a17974SMatthias Ringwald        byte[] result = new byte[len];
114*73a17974SMatthias Ringwald        System.arraycopy(data, {1}, result, 0, len);
115*73a17974SMatthias Ringwald        return result;'''
116*73a17974SMatthias Ringwald
117*73a17974SMatthias Ringwaldjava_event_getter_data_fixed = \
118*73a17974SMatthias Ringwald'''int len = {0};
119*73a17974SMatthias Ringwald        byte[] result = new byte[len];
120*73a17974SMatthias Ringwald        System.arraycopy(data, {1}, result, 0, len);
121*73a17974SMatthias Ringwald        return result;'''
122*73a17974SMatthias Ringwald
123*73a17974SMatthias Ringwaldjava_event_getter_remaining_data = \
124*73a17974SMatthias Ringwald'''int len = getPayloadLen() - {0};
125*73a17974SMatthias Ringwald        byte[] result = new byte[len];
126*73a17974SMatthias Ringwald        System.arraycopy(data, {0}, result, 0, len);
127*73a17974SMatthias Ringwald        return result;'''
128*73a17974SMatthias Ringwald
129*73a17974SMatthias Ringwaldjava_event_to_string = \
130*73a17974SMatthias Ringwald'''
131*73a17974SMatthias Ringwald    public String toString(){{
132*73a17974SMatthias Ringwald        StringBuffer t = new StringBuffer();
133*73a17974SMatthias Ringwald        t.append("{0} < type = ");
134*73a17974SMatthias Ringwald        t.append(String.format("0x%02x, ", getEventType()));
135*73a17974SMatthias Ringwald        t.append(getEventType());
136*73a17974SMatthias Ringwald{1}        t.append(" >");
137*73a17974SMatthias Ringwald        return t.toString();
138*73a17974SMatthias Ringwald    }}
139*73a17974SMatthias Ringwald'''
140*73a17974SMatthias Ringwald
141*73a17974SMatthias Ringwald
142*73a17974SMatthias Ringwald# global variables/defines
143*73a17974SMatthias Ringwaldpackage  ='com.bluekitchen.btstack'
144*73a17974SMatthias Ringwaldgen_path = 'gen/' + package.replace('.', '/')
145*73a17974SMatthias Ringwald
146*73a17974SMatthias Ringwalddefines = dict()
147*73a17974SMatthias Ringwalddefines_used = set()
148*73a17974SMatthias Ringwald
149*73a17974SMatthias Ringwalddef java_type_for_btstack_type(type):
150*73a17974SMatthias Ringwald    param_types = { '1' : 'int', '2' : 'int', '3' : 'int', '4' : 'long', 'H' : 'int', 'B' : 'BD_ADDR',
151*73a17974SMatthias Ringwald                    'D' : 'byte []', 'E' : 'byte [] ', 'N' : 'String' , 'P' : 'byte []', 'A' : 'byte []',
152*73a17974SMatthias Ringwald                    'R' : 'byte []', 'S' : 'byte []', 'Q' : 'byte []',
153*73a17974SMatthias Ringwald                    'J' : 'int', 'L' : 'int', 'V' : 'byte []', 'U' : 'BT_UUID',
154*73a17974SMatthias Ringwald                    'X' : 'GATTService', 'Y' : 'GATTCharacteristic', 'Z' : 'GATTCharacteristicDescriptor',
155*73a17974SMatthias Ringwald                    'T' : 'String'}
156*73a17974SMatthias Ringwald    return param_types[type]
157*73a17974SMatthias Ringwald
158*73a17974SMatthias Ringwalddef size_for_type(type):
159*73a17974SMatthias Ringwald    param_sizes = { '1' : 1, '2' : 2, '3' : 3, '4' : 4, 'H' : 2, 'B' : 6, 'D' : 8, 'E' : 240, 'N' : 248, 'P' : 16,
160*73a17974SMatthias Ringwald                    'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'Q' : 32, 'U' : 16, 'X' : 20, 'Y' : 24, 'Z' : 18, 'T':-1}
161*73a17974SMatthias Ringwald    return param_sizes[type]
162*73a17974SMatthias Ringwald
163*73a17974SMatthias Ringwalddef create_command_python(fout, name, ogf, ocf, format, params):
164*73a17974SMatthias Ringwald    global command_builder_command
165*73a17974SMatthias Ringwald
166*73a17974SMatthias Ringwald    ind = '        '
167*73a17974SMatthias Ringwald    param_store = {
168*73a17974SMatthias Ringwald     '1' : 'cmd_args += struct.pack("B", %s)',
169*73a17974SMatthias Ringwald     'J' : 'cmd_args += struct.pack("B", %s)',
170*73a17974SMatthias Ringwald     '2' : 'cmd_args += struct.pack("<H", %s)',
171*73a17974SMatthias Ringwald     'H' : 'cmd_args += struct.pack("<H", %s)',
172*73a17974SMatthias Ringwald     'L' : 'cmd_args += struct.pack("<H", %s)',
173*73a17974SMatthias Ringwald     '3' : 'cmd_args += self.pack24(%s)',
174*73a17974SMatthias Ringwald     '4' : 'cmd_args += struct.pack("<H", %s)',
175*73a17974SMatthias Ringwald     'N' : 'cmd_args += self.name248(%s)',
176*73a17974SMatthias Ringwald     'B' : 'cmd_args += %s.get_bytes()',
177*73a17974SMatthias Ringwald     'U' : 'cmd_args += %s.get_bytes()',
178*73a17974SMatthias Ringwald     'X' : 'cmd_args += %s.get_bytes()',
179*73a17974SMatthias Ringwald     'Y' : 'cmd_args += %s.get_bytes()',
180*73a17974SMatthias Ringwald     'Z' : 'cmd_args += %s.get_bytes()',
181*73a17974SMatthias Ringwald     'S' : 'cmd_args += %s',
182*73a17974SMatthias Ringwald     # TODO: support serialization for these
183*73a17974SMatthias Ringwald     'D' : '# D / TODO Util.storeBytes(command, offset, %s, 8)',
184*73a17974SMatthias Ringwald     'E' : '# E / TODO Util.storeBytes(command, offset, %s, 240)',
185*73a17974SMatthias Ringwald     'P' : '# P / TODO Util.storeBytes(command, offset, %s, 16)',
186*73a17974SMatthias Ringwald     'Q' : '# Q / TODO Util.storeBytes(command, offset, %s, 32)',
187*73a17974SMatthias Ringwald     'A' : '# A / TODO Util.storeBytes(command, offset, %s, 31)',
188*73a17974SMatthias Ringwald     }
189*73a17974SMatthias Ringwald    # method arguments
190*73a17974SMatthias Ringwald    arg_counter = 1
191*73a17974SMatthias Ringwald    args = []
192*73a17974SMatthias Ringwald    for param_type, arg_name in zip(format, params):
193*73a17974SMatthias Ringwald        arg_size = size_for_type(param_type)
194*73a17974SMatthias Ringwald        arg = (param_type, arg_size, arg_name)
195*73a17974SMatthias Ringwald        args.append(arg)
196*73a17974SMatthias Ringwald        arg_counter += 1
197*73a17974SMatthias Ringwald    print(args)
198*73a17974SMatthias Ringwald
199*73a17974SMatthias Ringwald    # method argument declaration
200*73a17974SMatthias Ringwald    args2 = []
201*73a17974SMatthias Ringwald    for arg in args:
202*73a17974SMatthias Ringwald        args2.append(arg[2])
203*73a17974SMatthias Ringwald    args_string = ', '.join(args2)
204*73a17974SMatthias Ringwald    print(args_string)
205*73a17974SMatthias Ringwald
206*73a17974SMatthias Ringwald    # command size (opcode, len)
207*73a17974SMatthias Ringwald    size_fixed = 3
208*73a17974SMatthias Ringwald    size_var = ''
209*73a17974SMatthias Ringwald    for arg in args:
210*73a17974SMatthias Ringwald        size = arg[1]
211*73a17974SMatthias Ringwald        if size > 0:
212*73a17974SMatthias Ringwald            size_fixed += size
213*73a17974SMatthias Ringwald        else:
214*73a17974SMatthias Ringwald            size_var += ' + %s.length' % arg[2]
215*73a17974SMatthias Ringwald    size_string = '%u%s' % (size_fixed, size_var)
216*73a17974SMatthias Ringwald    print(size_string)
217*73a17974SMatthias Ringwald
218*73a17974SMatthias Ringwald    store_params = ''
219*73a17974SMatthias Ringwald
220*73a17974SMatthias Ringwald    length_name = ''
221*73a17974SMatthias Ringwald    for (param_type, arg_size, arg_name) in args:
222*73a17974SMatthias Ringwald        if param_type in ['L', 'J']:
223*73a17974SMatthias Ringwald            length_name = arg_name
224*73a17974SMatthias Ringwald        if param_type == 'V':
225*73a17974SMatthias Ringwald            store_params += ind + 'Util.storeBytes(command, offset, %s, %s);' % (arg_name, length_name) + '\n';
226*73a17974SMatthias Ringwald            length_name = ''
227*73a17974SMatthias Ringwald        else:
228*73a17974SMatthias Ringwald            store_params += ind + (param_store[param_type] % arg_name) + '\n';
229*73a17974SMatthias Ringwald            size = arg_size
230*73a17974SMatthias Ringwald
231*73a17974SMatthias Ringwald    fout.write( command_builder_command.format(name=name, args=args_string, ogf=ogf, ocf=ocf, args_builder=store_params))
232*73a17974SMatthias Ringwald
233*73a17974SMatthias Ringwalddef mark_define_as_used(term):
234*73a17974SMatthias Ringwald    if term.startswith('0'):
235*73a17974SMatthias Ringwald        return
236*73a17974SMatthias Ringwald    defines_used.add(term)
237*73a17974SMatthias Ringwald
238*73a17974SMatthias Ringwalddef java_define_string(key):
239*73a17974SMatthias Ringwald    global defines
240*73a17974SMatthias Ringwald    if key in defines:
241*73a17974SMatthias Ringwald        return '    public static final int %s = %s;\n' % (key, defines[key])
242*73a17974SMatthias Ringwald    else:
243*73a17974SMatthias Ringwald        return '    // defines[%s] not set\n' % key
244*73a17974SMatthias Ringwald
245*73a17974SMatthias Ringwalddef java_defines_string(keys):
246*73a17974SMatthias Ringwald    return '\n'.join( map(java_define_string, sorted(keys)))
247*73a17974SMatthias Ringwald
248*73a17974SMatthias Ringwalddef create_command_builder(commands):
249*73a17974SMatthias Ringwald    global gen_path
250*73a17974SMatthias Ringwald    parser.assert_dir(gen_path)
251*73a17974SMatthias Ringwald
252*73a17974SMatthias Ringwald    outfile = '%s/command_builder.py' % gen_path
253*73a17974SMatthias Ringwald
254*73a17974SMatthias Ringwald    with open(outfile, 'wt') as fout:
255*73a17974SMatthias Ringwald
256*73a17974SMatthias Ringwald        fout.write(command_builder_header)
257*73a17974SMatthias Ringwald
258*73a17974SMatthias Ringwald        for command in commands:
259*73a17974SMatthias Ringwald                (command_name, ogf, ocf, format, params) = command
260*73a17974SMatthias Ringwald                create_command_python(fout, command_name, ogf, ocf, format, params);
261*73a17974SMatthias Ringwald                mark_define_as_used(ogf)
262*73a17974SMatthias Ringwald                mark_define_as_used(ocf)
263*73a17974SMatthias Ringwald
264*73a17974SMatthias Ringwald        # fout.write('\n    # defines used\n\n')
265*73a17974SMatthias Ringwald        # for key in sorted(defines_used):
266*73a17974SMatthias Ringwald        #     fout.write(java_define_string(key))
267*73a17974SMatthias Ringwald
268*73a17974SMatthias Ringwalddef create_event(event_name, format, args):
269*73a17974SMatthias Ringwald    global gen_path
270*73a17974SMatthias Ringwald    global package
271*73a17974SMatthias Ringwald    global java_event_template
272*73a17974SMatthias Ringwald
273*73a17974SMatthias Ringwald    param_read = {
274*73a17974SMatthias Ringwald     '1' : 'return Util.readByte(data, %u);',
275*73a17974SMatthias Ringwald     'J' : 'return Util.readByte(data, %u);',
276*73a17974SMatthias Ringwald     '2' : 'return Util.readBt16(data, %u);',
277*73a17974SMatthias Ringwald     'H' : 'return Util.readBt16(data, %u);',
278*73a17974SMatthias Ringwald     'L' : 'return Util.readBt16(data, %u);',
279*73a17974SMatthias Ringwald     '3' : 'return Util.readBt24(data, %u);',
280*73a17974SMatthias Ringwald     '4' : 'return Util.readBt32(data, %u);',
281*73a17974SMatthias Ringwald     'B' : 'return Util.readBdAddr(data, %u);',
282*73a17974SMatthias Ringwald     'X' : 'return Util.readGattService(data, %u);',
283*73a17974SMatthias Ringwald     'Y' : 'return Util.readGattCharacteristic(data, %u);',
284*73a17974SMatthias Ringwald     'Z' : 'return Util.readGattCharacteristicDescriptor(data, %u);',
285*73a17974SMatthias Ringwald     'T' : 'int offset = %u; \n        return Util.getText(data, offset, getPayloadLen()-offset);',
286*73a17974SMatthias Ringwald     'N' : 'return Util.getText(data, %u, 248);',
287*73a17974SMatthias Ringwald     'D' : 'Util.storeBytes(data, %u, 8);',
288*73a17974SMatthias Ringwald     'Q' : 'Util.storeBytes(data, %u, 32);',
289*73a17974SMatthias Ringwald     # 'E' : 'Util.storeBytes(data, %u, 240);',
290*73a17974SMatthias Ringwald     # 'P' : 'Util.storeBytes(data, %u, 16);',
291*73a17974SMatthias Ringwald     # 'A' : 'Util.storeBytes(data, %u, 31);',
292*73a17974SMatthias Ringwald     # 'S' : 'Util.storeBytes(data, %u);'
293*73a17974SMatthias Ringwald     }
294*73a17974SMatthias Ringwald
295*73a17974SMatthias Ringwald    gen_event_path = '%s/event' % gen_path
296*73a17974SMatthias Ringwald    outfile = '%s/%s.java' % (gen_event_path, event_name)
297*73a17974SMatthias Ringwald    with open(outfile, 'wt') as fout:
298*73a17974SMatthias Ringwald        offset = 2
299*73a17974SMatthias Ringwald        getters = ''
300*73a17974SMatthias Ringwald        length_name = ''
301*73a17974SMatthias Ringwald        for f, arg in zip(format, args):
302*73a17974SMatthias Ringwald            # just remember name
303*73a17974SMatthias Ringwald            if f in ['L','J']:
304*73a17974SMatthias Ringwald                length_name = parser.camel_case(arg)
305*73a17974SMatthias Ringwald            if f == 'R':
306*73a17974SMatthias Ringwald                # remaining data
307*73a17974SMatthias Ringwald                access = java_event_getter_remaining_data.format(offset)
308*73a17974SMatthias Ringwald                size = 0
309*73a17974SMatthias Ringwald            elif f == 'V':
310*73a17974SMatthias Ringwald                access = java_event_getter_data.format(length_name, offset)
311*73a17974SMatthias Ringwald                size = 0
312*73a17974SMatthias Ringwald            elif f in ['D', 'Q']:
313*73a17974SMatthias Ringwald                size = size_for_type(f)
314*73a17974SMatthias Ringwald                access = java_event_getter_data_fixed.format(size, offset)
315*73a17974SMatthias Ringwald            else:
316*73a17974SMatthias Ringwald                access = param_read[f] % offset
317*73a17974SMatthias Ringwald                size = size_for_type(f)
318*73a17974SMatthias Ringwald            getters += java_event_getter.format(java_type_for_btstack_type(f), parser.camel_case(arg), access)
319*73a17974SMatthias Ringwald            offset += size
320*73a17974SMatthias Ringwald        to_string_args = ''
321*73a17974SMatthias Ringwald        for arg in args:
322*73a17974SMatthias Ringwald            to_string_args += '        t.append(", %s = ");\n' % arg
323*73a17974SMatthias Ringwald            to_string_args += '        t.append(get%s());\n' % parser.camel_case(arg)
324*73a17974SMatthias Ringwald        to_string_method = java_event_to_string.format(event_name, to_string_args)
325*73a17974SMatthias Ringwald        fout.write(java_event_template.format(package, event_name, getters, to_string_method))
326*73a17974SMatthias Ringwald
327*73a17974SMatthias Ringwalddef event_supported(event_name):
328*73a17974SMatthias Ringwald    parts = event_name.split('_')
329*73a17974SMatthias Ringwald    return parts[0] in ['ATT', 'BTSTACK', 'DAEMON', 'L2CAP', 'RFCOMM', 'SDP', 'GATT', 'GAP', 'HCI', 'SM', 'BNEP']
330*73a17974SMatthias Ringwald
331*73a17974SMatthias Ringwalddef class_name_for_event(event_name):
332*73a17974SMatthias Ringwald    return parser.camel_case(event_name.replace('SUBEVENT','EVENT'))
333*73a17974SMatthias Ringwald
334*73a17974SMatthias Ringwalddef create_events(events):
335*73a17974SMatthias Ringwald    global gen_path
336*73a17974SMatthias Ringwald    gen_path_events = gen_path + '/event'
337*73a17974SMatthias Ringwald    parser.assert_dir(gen_path_events)
338*73a17974SMatthias Ringwald
339*73a17974SMatthias Ringwald    for event_type, event_name, format, args in events:
340*73a17974SMatthias Ringwald        if not event_supported(event_name):
341*73a17974SMatthias Ringwald            continue
342*73a17974SMatthias Ringwald        class_name = class_name_for_event(event_name)
343*73a17974SMatthias Ringwald        create_event(class_name, format, args)
344*73a17974SMatthias Ringwald
345*73a17974SMatthias Ringwald
346*73a17974SMatthias Ringwalddef create_event_factory(events, subevents, defines):
347*73a17974SMatthias Ringwald    global gen_path
348*73a17974SMatthias Ringwald    global package
349*73a17974SMatthias Ringwald    global java_event_factory_event
350*73a17974SMatthias Ringwald    global java_event_factory_template
351*73a17974SMatthias Ringwald
352*73a17974SMatthias Ringwald    outfile = '%s/EventFactory.java' % gen_path
353*73a17974SMatthias Ringwald
354*73a17974SMatthias Ringwald    cases = ''
355*73a17974SMatthias Ringwald    for event_type, event_name, format, args in events:
356*73a17974SMatthias Ringwald        event_name = parser.camel_case(event_name)
357*73a17974SMatthias Ringwald        cases += java_event_factory_event.format(event_type, event_name)
358*73a17974SMatthias Ringwald    subcases = ''
359*73a17974SMatthias Ringwald    for event_type, event_name, format, args in subevents:
360*73a17974SMatthias Ringwald        if not event_supported(event_name):
361*73a17974SMatthias Ringwald            continue
362*73a17974SMatthias Ringwald        class_name = class_name_for_event(event_name)
363*73a17974SMatthias Ringwald        print class_name
364*73a17974SMatthias Ringwald        subcases += java_event_factory_subevent.format(event_type, class_name)
365*73a17974SMatthias Ringwald
366*73a17974SMatthias Ringwald    with open(outfile, 'wt') as fout:
367*73a17974SMatthias Ringwald        defines_text = java_defines_string(defines)
368*73a17974SMatthias Ringwald        fout.write(java_event_factory_template.format(package, defines_text, cases, subcases))
369*73a17974SMatthias Ringwald
370*73a17974SMatthias Ringwald# find root
371*73a17974SMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..')
372*73a17974SMatthias Ringwaldgen_path = btstack_root + '/platform/daemon/binding/python/btstack/'
373*73a17974SMatthias Ringwald
374*73a17974SMatthias Ringwald
375*73a17974SMatthias Ringwald# read defines from hci_cmds.h and hci.h
376*73a17974SMatthias Ringwalddefines = parser.parse_defines()
377*73a17974SMatthias Ringwald
378*73a17974SMatthias Ringwald# parse commands
379*73a17974SMatthias Ringwaldcommands = parser.parse_commands()
380*73a17974SMatthias Ringwald
381*73a17974SMatthias Ringwald# parse bluetooth.h to get used events
382*73a17974SMatthias Ringwald# (events, le_events, event_types) = parser.parse_events()
383*73a17974SMatthias Ringwald
384*73a17974SMatthias Ringwald# create events, le meta events, event factory, and
385*73a17974SMatthias Ringwald# create_events(events)
386*73a17974SMatthias Ringwald# create_events(le_events)
387*73a17974SMatthias Ringwald# create_event_factory(events, le_events, event_types)
388*73a17974SMatthias Ringwaldcreate_command_builder(commands)
389*73a17974SMatthias Ringwald
390*73a17974SMatthias Ringwald# done
391*73a17974SMatthias Ringwaldprint('Done!')
392