1*5c544019SMatthias 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 []', 145d2fb0b94SMatthias Ringwald 'R' : 'byte []', 'S' : 'byte []', 'Q' : '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, 153d2fb0b94SMatthias Ringwald 'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'Q' : 32, '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);', 172bfd81087SMatthias Ringwald 'A' : 'Util.storeBytes(command, offset, %s, 31);', 173bfd81087SMatthias Ringwald 'S' : 'Util.storeBytes(command, offset, %s);', 174bfd81087SMatthias Ringwald 'B' : 'Util.storeBytes(command, offset, %s.getBytes());', 175bfd81087SMatthias Ringwald 'U' : 'Util.storeBytes(command, offset, %s.getBytes());', 176bfd81087SMatthias Ringwald 'X' : 'Util.storeBytes(command, offset, %s.getBytes());', 177bfd81087SMatthias Ringwald 'Y' : 'Util.storeBytes(command, offset, %s.getBytes());', 178bfd81087SMatthias Ringwald 'Z' : 'Util.storeBytes(command, offset, %s.getBytes());', 179bfd81087SMatthias Ringwald 'N' : 'Util.storeString(command, offset, %s, 248);', 180bfd81087SMatthias Ringwald } 181bfd81087SMatthias Ringwald # method arguments 182bfd81087SMatthias Ringwald arg_counter = 1 183bfd81087SMatthias Ringwald args = [] 184bfd81087SMatthias Ringwald for param_type, arg_name in zip(format, params): 185bfd81087SMatthias Ringwald arg_type = java_type_for_btstack_type(param_type) 186bfd81087SMatthias Ringwald arg_size = size_for_type(param_type) 187bfd81087SMatthias Ringwald arg = (param_type, arg_type, arg_size, arg_name) 188bfd81087SMatthias Ringwald args.append(arg) 189bfd81087SMatthias Ringwald arg_counter += 1 190bfd81087SMatthias Ringwald 191bfd81087SMatthias Ringwald # method argument declaration 192bfd81087SMatthias Ringwald args2 = [] 193bfd81087SMatthias Ringwald for arg in args: 194bfd81087SMatthias Ringwald args2.append('%s %s' % (arg[1], arg[3])) 195bfd81087SMatthias Ringwald args_string = ', '.join(args2) 196bfd81087SMatthias Ringwald 197bfd81087SMatthias Ringwald # command size (opcode, len) 198bfd81087SMatthias Ringwald size_fixed = 3 199bfd81087SMatthias Ringwald size_var = '' 200bfd81087SMatthias Ringwald for arg in args: 201bfd81087SMatthias Ringwald size = arg[2] 202bfd81087SMatthias Ringwald if size > 0: 203bfd81087SMatthias Ringwald size_fixed += size 204bfd81087SMatthias Ringwald else: 205bfd81087SMatthias Ringwald size_var += ' + %s.length' % arg[3] 206bfd81087SMatthias Ringwald size_string = '%u%s' % (size_fixed, size_var) 207bfd81087SMatthias Ringwald 208bfd81087SMatthias Ringwald store_params = '' 209bfd81087SMatthias Ringwald 210bfd81087SMatthias Ringwald length_name = '' 211bfd81087SMatthias Ringwald for (param_type, arg_type, arg_size, arg_name) in args: 212bfd81087SMatthias Ringwald if param_type in ['L', 'J']: 213bfd81087SMatthias Ringwald length_name = arg_name 214bfd81087SMatthias Ringwald if param_type == 'V': 215bfd81087SMatthias Ringwald store_params += ind + 'Util.storeBytes(command, offset, %s, %s);' % (arg_name, length_name) + '\n'; 216bfd81087SMatthias Ringwald store_params += ind + 'offset += %s;\n' % length_name; 217bfd81087SMatthias Ringwald length_name = '' 218bfd81087SMatthias Ringwald else: 219bfd81087SMatthias Ringwald store_params += ind + (param_store[param_type] % arg_name) + '\n'; 220bfd81087SMatthias Ringwald size = arg_size 221bfd81087SMatthias Ringwald if size > 0: 222bfd81087SMatthias Ringwald store_params += ind + 'offset += %u;\n' % arg_size; 223bfd81087SMatthias Ringwald else: 224bfd81087SMatthias Ringwald store_params += ind + 'offset += %s.length;\n' % arg_name 225bfd81087SMatthias Ringwald 226bfd81087SMatthias Ringwald fout.write( java_btstack_command % (name, args_string, format, size_string, ogf, ocf, store_params)) 227bfd81087SMatthias Ringwald 228bfd81087SMatthias Ringwalddef mark_define_as_used(term): 229bfd81087SMatthias Ringwald if term.startswith('0'): 230bfd81087SMatthias Ringwald return 231bfd81087SMatthias Ringwald defines_used.add(term) 232bfd81087SMatthias Ringwald 233bfd81087SMatthias Ringwalddef java_define_string(key): 234bfd81087SMatthias Ringwald global defines 235253d7684SMatthias Ringwald if key in defines: 236bfd81087SMatthias Ringwald return ' public static final int %s = %s;\n' % (key, defines[key]) 237253d7684SMatthias Ringwald else: 238253d7684SMatthias Ringwald return ' // defines[%s] not set\n' % key 239bfd81087SMatthias Ringwald 240bfd81087SMatthias Ringwalddef java_defines_string(keys): 241bfd81087SMatthias Ringwald return '\n'.join( map(java_define_string, sorted(keys))) 242bfd81087SMatthias Ringwald 243bfd81087SMatthias Ringwalddef create_btstack_java(commands): 244bfd81087SMatthias Ringwald global gen_path 2454b238d71SMatthias Ringwald parser.assert_dir(gen_path) 246bfd81087SMatthias Ringwald 247bfd81087SMatthias Ringwald outfile = '%s/BTstack.java' % gen_path 248bfd81087SMatthias Ringwald 249bfd81087SMatthias Ringwald with open(outfile, 'wt') as fout: 250bfd81087SMatthias Ringwald 251bfd81087SMatthias Ringwald fout.write(java_btstack_header % package) 252bfd81087SMatthias Ringwald 253bfd81087SMatthias Ringwald for command in commands: 254bfd81087SMatthias Ringwald (command_name, ogf, ocf, format, params) = command 255bfd81087SMatthias Ringwald create_command_java(fout, command_name, ogf, ocf, format, params); 256bfd81087SMatthias Ringwald mark_define_as_used(ogf) 257bfd81087SMatthias Ringwald mark_define_as_used(ocf) 258bfd81087SMatthias Ringwald 259bfd81087SMatthias Ringwald fout.write('\n /** defines used */\n\n') 260bfd81087SMatthias Ringwald for key in sorted(defines_used): 261bfd81087SMatthias Ringwald fout.write(java_define_string(key)) 262bfd81087SMatthias Ringwald 263bfd81087SMatthias Ringwald fout.write(java_btstack_footer) 264bfd81087SMatthias Ringwald 265bfd81087SMatthias Ringwalddef create_event(event_name, format, args): 266bfd81087SMatthias Ringwald global gen_path 267bfd81087SMatthias Ringwald global package 268bfd81087SMatthias Ringwald global java_event_template 269bfd81087SMatthias Ringwald 270bfd81087SMatthias Ringwald param_read = { 271bfd81087SMatthias Ringwald '1' : 'return Util.readByte(data, %u);', 272bfd81087SMatthias Ringwald 'J' : 'return Util.readByte(data, %u);', 273bfd81087SMatthias Ringwald '2' : 'return Util.readBt16(data, %u);', 27436f83f41SMatthias Ringwald 'H' : 'return Util.readBt16(data, %u);', 27536f83f41SMatthias Ringwald 'L' : 'return Util.readBt16(data, %u);', 276bfd81087SMatthias Ringwald '3' : 'return Util.readBt24(data, %u);', 277bfd81087SMatthias Ringwald '4' : 'return Util.readBt32(data, %u);', 278bfd81087SMatthias Ringwald 'B' : 'return Util.readBdAddr(data, %u);', 279bfd81087SMatthias Ringwald 'X' : 'return Util.readGattService(data, %u);', 280bfd81087SMatthias Ringwald 'Y' : 'return Util.readGattCharacteristic(data, %u);', 281bfd81087SMatthias Ringwald 'Z' : 'return Util.readGattCharacteristicDescriptor(data, %u);', 282bfd81087SMatthias Ringwald 'T' : 'int offset = %u; \n return Util.getText(data, offset, getPayloadLen()-offset);', 283bfd81087SMatthias Ringwald 'N' : 'return Util.getText(data, %u, 248);', 284d2fb0b94SMatthias Ringwald 'D' : 'Util.storeBytes(data, %u, 8);', 285d2fb0b94SMatthias Ringwald 'Q' : 'Util.storeBytes(data, %u, 32);', 286bfd81087SMatthias Ringwald # 'E' : 'Util.storeBytes(data, %u, 240);', 287bfd81087SMatthias Ringwald # 'P' : 'Util.storeBytes(data, %u, 16);', 288bfd81087SMatthias Ringwald # 'A' : 'Util.storeBytes(data, %u, 31);', 289bfd81087SMatthias Ringwald # 'S' : 'Util.storeBytes(data, %u);' 290bfd81087SMatthias Ringwald } 291bfd81087SMatthias Ringwald 292bfd81087SMatthias Ringwald gen_event_path = '%s/event' % gen_path 293bfd81087SMatthias Ringwald outfile = '%s/%s.java' % (gen_event_path, event_name) 294bfd81087SMatthias Ringwald with open(outfile, 'wt') as fout: 295bfd81087SMatthias Ringwald offset = 2 296bfd81087SMatthias Ringwald getters = '' 297bfd81087SMatthias Ringwald length_name = '' 298bfd81087SMatthias Ringwald for f, arg in zip(format, args): 299bfd81087SMatthias Ringwald # just remember name 300bfd81087SMatthias Ringwald if f in ['L','J']: 3014b238d71SMatthias Ringwald length_name = parser.camel_case(arg) 302bfd81087SMatthias Ringwald if f == 'R': 303bfd81087SMatthias Ringwald # remaining data 304bfd81087SMatthias Ringwald access = java_event_getter_remaining_data.format(offset) 305bfd81087SMatthias Ringwald size = 0 306bfd81087SMatthias Ringwald elif f == 'V': 307bfd81087SMatthias Ringwald access = java_event_getter_data.format(length_name, offset) 308bfd81087SMatthias Ringwald size = 0 309d2fb0b94SMatthias Ringwald elif f in ['D', 'Q']: 310d2fb0b94SMatthias Ringwald size = size_for_type(f) 311d2fb0b94SMatthias Ringwald access = java_event_getter_data_fixed.format(size, offset) 312bfd81087SMatthias Ringwald else: 313bfd81087SMatthias Ringwald access = param_read[f] % offset 314bfd81087SMatthias Ringwald size = size_for_type(f) 3154b238d71SMatthias Ringwald getters += java_event_getter.format(java_type_for_btstack_type(f), parser.camel_case(arg), access) 316bfd81087SMatthias Ringwald offset += size 317bfd81087SMatthias Ringwald to_string_args = '' 318bfd81087SMatthias Ringwald for arg in args: 319bfd81087SMatthias Ringwald to_string_args += ' t.append(", %s = ");\n' % arg 3204b238d71SMatthias Ringwald to_string_args += ' t.append(get%s());\n' % parser.camel_case(arg) 321bfd81087SMatthias Ringwald to_string_method = java_event_to_string.format(event_name, to_string_args) 322bfd81087SMatthias Ringwald fout.write(java_event_template.format(package, event_name, getters, to_string_method)) 323bfd81087SMatthias Ringwald 324045013feSMatthias Ringwalddef event_supported(event_name): 325045013feSMatthias Ringwald parts = event_name.split('_') 32628e59789SMilanka Ringwald return parts[0] in ['ATT', 'BTSTACK', 'DAEMON', 'L2CAP', 'RFCOMM', 'SDP', 'GATT', 'GAP', 'HCI', 'SM', 'BNEP'] 327045013feSMatthias Ringwald 328045013feSMatthias Ringwalddef class_name_for_event(event_name): 329045013feSMatthias Ringwald return parser.camel_case(event_name.replace('SUBEVENT','EVENT')) 330045013feSMatthias Ringwald 331bfd81087SMatthias Ringwalddef create_events(events): 332bfd81087SMatthias Ringwald global gen_path 333bfd81087SMatthias Ringwald gen_path_events = gen_path + '/event' 3344b238d71SMatthias Ringwald parser.assert_dir(gen_path_events) 335bfd81087SMatthias Ringwald 336bfd81087SMatthias Ringwald for event_type, event_name, format, args in events: 337045013feSMatthias Ringwald if not event_supported(event_name): 338045013feSMatthias Ringwald continue 339045013feSMatthias Ringwald class_name = class_name_for_event(event_name) 340045013feSMatthias Ringwald create_event(class_name, format, args) 341045013feSMatthias Ringwald 342bfd81087SMatthias Ringwald 343ea9294ccSMatthias Ringwalddef create_event_factory(events, subevents, defines): 344bfd81087SMatthias Ringwald global gen_path 345bfd81087SMatthias Ringwald global package 346bfd81087SMatthias Ringwald global java_event_factory_event 347bfd81087SMatthias Ringwald global java_event_factory_template 348bfd81087SMatthias Ringwald 349bfd81087SMatthias Ringwald outfile = '%s/EventFactory.java' % gen_path 350bfd81087SMatthias Ringwald 351bfd81087SMatthias Ringwald cases = '' 352bfd81087SMatthias Ringwald for event_type, event_name, format, args in events: 3534b238d71SMatthias Ringwald event_name = parser.camel_case(event_name) 354bfd81087SMatthias Ringwald cases += java_event_factory_event.format(event_type, event_name) 355bfd81087SMatthias Ringwald subcases = '' 356ea9294ccSMatthias Ringwald for event_type, event_name, format, args in subevents: 357045013feSMatthias Ringwald if not event_supported(event_name): 358ea9294ccSMatthias Ringwald continue 359045013feSMatthias Ringwald class_name = class_name_for_event(event_name) 360*5c544019SMatthias Ringwald print(class_name) 361045013feSMatthias Ringwald subcases += java_event_factory_subevent.format(event_type, class_name) 362bfd81087SMatthias Ringwald 363bfd81087SMatthias Ringwald with open(outfile, 'wt') as fout: 364bfd81087SMatthias Ringwald defines_text = java_defines_string(defines) 365bfd81087SMatthias Ringwald fout.write(java_event_factory_template.format(package, defines_text, cases, subcases)) 366bfd81087SMatthias Ringwald 367bfd81087SMatthias Ringwald 368bfd81087SMatthias Ringwald# read defines from hci_cmds.h and hci.h 369bfd81087SMatthias Ringwalddefines = parser.parse_defines() 370bfd81087SMatthias Ringwald 371bfd81087SMatthias Ringwald# # parse commands 372bfd81087SMatthias Ringwaldcommands = parser.parse_commands() 373bfd81087SMatthias Ringwald 374bfd81087SMatthias Ringwald# parse bluetooth.h to get used events 375bfd81087SMatthias Ringwald(events, le_events, event_types) = parser.parse_events() 376bfd81087SMatthias Ringwald 377bfd81087SMatthias Ringwald# create events, le meta events, event factory, and 378bfd81087SMatthias Ringwaldcreate_events(events) 379bfd81087SMatthias Ringwaldcreate_events(le_events) 380bfd81087SMatthias Ringwaldcreate_event_factory(events, le_events, event_types) 381bfd81087SMatthias Ringwaldcreate_btstack_java(commands) 382bfd81087SMatthias Ringwald 383bfd81087SMatthias Ringwald# done 384bfd81087SMatthias Ringwaldprint('Done!') 385