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