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