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 232253d7684SMatthias Ringwald if key in defines: 233bfd81087SMatthias Ringwald return ' public static final int %s = %s;\n' % (key, defines[key]) 234253d7684SMatthias Ringwald else: 235253d7684SMatthias 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 317*045013feSMatthias Ringwalddef event_supported(event_name): 318*045013feSMatthias Ringwald parts = event_name.split('_') 319*045013feSMatthias Ringwald if parts[0] in ['ATT', 'BTSTACK', 'DAEMON', 'L2CAP', 'RFCOMM', 'SDP', 'GATT', 'GAP', 'HCI', 'SM']: 320*045013feSMatthias Ringwald return True 321*045013feSMatthias Ringwald 322*045013feSMatthias Ringwalddef class_name_for_event(event_name): 323*045013feSMatthias Ringwald return parser.camel_case(event_name.replace('SUBEVENT','EVENT')) 324*045013feSMatthias Ringwald 325bfd81087SMatthias Ringwalddef create_events(events): 326bfd81087SMatthias Ringwald global gen_path 327bfd81087SMatthias Ringwald gen_path_events = gen_path + '/event' 3284b238d71SMatthias Ringwald parser.assert_dir(gen_path_events) 329bfd81087SMatthias Ringwald 330bfd81087SMatthias Ringwald for event_type, event_name, format, args in events: 331*045013feSMatthias Ringwald if not event_supported(event_name): 332*045013feSMatthias Ringwald continue 333*045013feSMatthias Ringwald class_name = class_name_for_event(event_name) 334*045013feSMatthias Ringwald create_event(class_name, format, args) 335*045013feSMatthias Ringwald 336bfd81087SMatthias Ringwald 337ea9294ccSMatthias Ringwalddef create_event_factory(events, subevents, defines): 338bfd81087SMatthias Ringwald global gen_path 339bfd81087SMatthias Ringwald global package 340bfd81087SMatthias Ringwald global java_event_factory_event 341bfd81087SMatthias Ringwald global java_event_factory_template 342bfd81087SMatthias Ringwald 343bfd81087SMatthias Ringwald outfile = '%s/EventFactory.java' % gen_path 344bfd81087SMatthias Ringwald 345bfd81087SMatthias Ringwald cases = '' 346bfd81087SMatthias Ringwald for event_type, event_name, format, args in events: 3474b238d71SMatthias Ringwald event_name = parser.camel_case(event_name) 348bfd81087SMatthias Ringwald cases += java_event_factory_event.format(event_type, event_name) 349bfd81087SMatthias Ringwald subcases = '' 350ea9294ccSMatthias Ringwald for event_type, event_name, format, args in subevents: 351*045013feSMatthias Ringwald if not event_supported(event_name): 352ea9294ccSMatthias Ringwald continue 353*045013feSMatthias Ringwald class_name = class_name_for_event(event_name) 354*045013feSMatthias Ringwald print class_name 355*045013feSMatthias Ringwald subcases += java_event_factory_subevent.format(event_type, class_name) 356bfd81087SMatthias Ringwald 357bfd81087SMatthias Ringwald with open(outfile, 'wt') as fout: 358bfd81087SMatthias Ringwald defines_text = java_defines_string(defines) 359bfd81087SMatthias Ringwald fout.write(java_event_factory_template.format(package, defines_text, cases, subcases)) 360bfd81087SMatthias Ringwald 361bfd81087SMatthias Ringwald 362bfd81087SMatthias Ringwald# read defines from hci_cmds.h and hci.h 363bfd81087SMatthias Ringwalddefines = parser.parse_defines() 364bfd81087SMatthias Ringwald 365bfd81087SMatthias Ringwald# # parse commands 366bfd81087SMatthias Ringwaldcommands = parser.parse_commands() 367bfd81087SMatthias Ringwald 368bfd81087SMatthias Ringwald# parse bluetooth.h to get used events 369bfd81087SMatthias Ringwald(events, le_events, event_types) = parser.parse_events() 370bfd81087SMatthias Ringwald 371bfd81087SMatthias Ringwald# create events, le meta events, event factory, and 372bfd81087SMatthias Ringwaldcreate_events(events) 373bfd81087SMatthias Ringwaldcreate_events(le_events) 374bfd81087SMatthias Ringwaldcreate_event_factory(events, le_events, event_types) 375bfd81087SMatthias Ringwaldcreate_btstack_java(commands) 376bfd81087SMatthias Ringwald 377bfd81087SMatthias Ringwald# done 378bfd81087SMatthias Ringwaldprint('Done!') 379