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