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 114*d2fb0b94SMatthias Ringwaldjava_event_getter_data_fixed = \ 115*d2fb0b94SMatthias Ringwald'''int len = {0}; 116*d2fb0b94SMatthias Ringwald byte[] result = new byte[len]; 117*d2fb0b94SMatthias Ringwald System.arraycopy(data, {1}, result, 0, len); 118*d2fb0b94SMatthias Ringwald return result;''' 119*d2fb0b94SMatthias Ringwald 120bfd81087SMatthias Ringwaldjava_event_getter_remaining_data = \ 121bfd81087SMatthias Ringwald'''int len = getPayloadLen() - {0}; 122bfd81087SMatthias Ringwald byte[] result = new byte[len]; 123bfd81087SMatthias Ringwald System.arraycopy(data, {0}, result, 0, len); 124bfd81087SMatthias Ringwald return result;''' 125bfd81087SMatthias Ringwald 126bfd81087SMatthias Ringwaldjava_event_to_string = \ 127bfd81087SMatthias Ringwald''' 128bfd81087SMatthias Ringwald public String toString(){{ 129bfd81087SMatthias Ringwald StringBuffer t = new StringBuffer(); 130bfd81087SMatthias Ringwald t.append("{0} < type = "); 131bfd81087SMatthias Ringwald t.append(String.format("0x%02x, ", getEventType())); 132bfd81087SMatthias Ringwald t.append(getEventType()); 133bfd81087SMatthias Ringwald{1} t.append(" >"); 134bfd81087SMatthias Ringwald return t.toString(); 135bfd81087SMatthias Ringwald }} 136bfd81087SMatthias Ringwald''' 137bfd81087SMatthias Ringwald 138bfd81087SMatthias Ringwald 139bfd81087SMatthias Ringwald# global variables/defines 140bfd81087SMatthias Ringwaldpackage ='com.bluekitchen.btstack' 141bfd81087SMatthias Ringwaldgen_path = 'gen/' + package.replace('.', '/') 142bfd81087SMatthias Ringwald 143bfd81087SMatthias Ringwalddefines = dict() 144bfd81087SMatthias Ringwalddefines_used = set() 145bfd81087SMatthias Ringwald 146bfd81087SMatthias Ringwalddef java_type_for_btstack_type(type): 147bfd81087SMatthias Ringwald param_types = { '1' : 'int', '2' : 'int', '3' : 'int', '4' : 'long', 'H' : 'int', 'B' : 'BD_ADDR', 148bfd81087SMatthias Ringwald 'D' : 'byte []', 'E' : 'byte [] ', 'N' : 'String' , 'P' : 'byte []', 'A' : 'byte []', 149*d2fb0b94SMatthias Ringwald 'R' : 'byte []', 'S' : 'byte []', 'Q' : 'byte []', 150bfd81087SMatthias Ringwald 'J' : 'int', 'L' : 'int', 'V' : 'byte []', 'U' : 'BT_UUID', 151bfd81087SMatthias Ringwald 'X' : 'GATTService', 'Y' : 'GATTCharacteristic', 'Z' : 'GATTCharacteristicDescriptor', 152bfd81087SMatthias Ringwald 'T' : 'String'} 153bfd81087SMatthias Ringwald return param_types[type] 154bfd81087SMatthias Ringwald 155bfd81087SMatthias Ringwalddef size_for_type(type): 156bfd81087SMatthias Ringwald param_sizes = { '1' : 1, '2' : 2, '3' : 3, '4' : 4, 'H' : 2, 'B' : 6, 'D' : 8, 'E' : 240, 'N' : 248, 'P' : 16, 157*d2fb0b94SMatthias Ringwald 'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'Q' : 32, 'U' : 16, 'X' : 20, 'Y' : 24, 'Z' : 18, 'T':-1} 158bfd81087SMatthias Ringwald return param_sizes[type] 159bfd81087SMatthias Ringwald 160bfd81087SMatthias Ringwalddef create_command_java(fout, name, ogf, ocf, format, params): 161bfd81087SMatthias Ringwald global java_btstack_command 162bfd81087SMatthias Ringwald 163bfd81087SMatthias Ringwald ind = ' ' 164bfd81087SMatthias Ringwald param_store = { 165bfd81087SMatthias Ringwald '1' : 'Util.storeByte(command, offset, %s);', 166bfd81087SMatthias Ringwald 'J' : 'Util.storeByte(command, offset, %s);', 167bfd81087SMatthias Ringwald '2' : 'Util.storeBt16(command, offset, %s);', 168bfd81087SMatthias Ringwald 'H' : 'Util.storeBt16(command, offset, %s);', 169bfd81087SMatthias Ringwald 'L' : 'Util.storeBt16(command, offset, %s);', 170bfd81087SMatthias Ringwald '3' : 'Util.storeBt24(command, offset, %s);', 171bfd81087SMatthias Ringwald '4' : 'Util.storeBt32(command, offset, %s);', 172bfd81087SMatthias Ringwald 'D' : 'Util.storeBytes(command, offset, %s, 8);', 173bfd81087SMatthias Ringwald 'E' : 'Util.storeBytes(command, offset, %s, 240);', 174bfd81087SMatthias Ringwald 'P' : 'Util.storeBytes(command, offset, %s, 16);', 175*d2fb0b94SMatthias Ringwald 'Q' : 'Util.storeBytes(command, offset, %s, 32);', 176bfd81087SMatthias Ringwald 'A' : 'Util.storeBytes(command, offset, %s, 31);', 177bfd81087SMatthias Ringwald 'S' : 'Util.storeBytes(command, offset, %s);', 178bfd81087SMatthias Ringwald 'B' : 'Util.storeBytes(command, offset, %s.getBytes());', 179bfd81087SMatthias Ringwald 'U' : 'Util.storeBytes(command, offset, %s.getBytes());', 180bfd81087SMatthias Ringwald 'X' : 'Util.storeBytes(command, offset, %s.getBytes());', 181bfd81087SMatthias Ringwald 'Y' : 'Util.storeBytes(command, offset, %s.getBytes());', 182bfd81087SMatthias Ringwald 'Z' : 'Util.storeBytes(command, offset, %s.getBytes());', 183bfd81087SMatthias Ringwald 'N' : 'Util.storeString(command, offset, %s, 248);', 184bfd81087SMatthias Ringwald } 185bfd81087SMatthias Ringwald # method arguments 186bfd81087SMatthias Ringwald arg_counter = 1 187bfd81087SMatthias Ringwald args = [] 188bfd81087SMatthias Ringwald for param_type, arg_name in zip(format, params): 189bfd81087SMatthias Ringwald arg_type = java_type_for_btstack_type(param_type) 190bfd81087SMatthias Ringwald arg_size = size_for_type(param_type) 191bfd81087SMatthias Ringwald arg = (param_type, arg_type, arg_size, arg_name) 192bfd81087SMatthias Ringwald args.append(arg) 193bfd81087SMatthias Ringwald arg_counter += 1 194bfd81087SMatthias Ringwald 195bfd81087SMatthias Ringwald # method argument declaration 196bfd81087SMatthias Ringwald args2 = [] 197bfd81087SMatthias Ringwald for arg in args: 198bfd81087SMatthias Ringwald args2.append('%s %s' % (arg[1], arg[3])) 199bfd81087SMatthias Ringwald args_string = ', '.join(args2) 200bfd81087SMatthias Ringwald 201bfd81087SMatthias Ringwald # command size (opcode, len) 202bfd81087SMatthias Ringwald size_fixed = 3 203bfd81087SMatthias Ringwald size_var = '' 204bfd81087SMatthias Ringwald for arg in args: 205bfd81087SMatthias Ringwald size = arg[2] 206bfd81087SMatthias Ringwald if size > 0: 207bfd81087SMatthias Ringwald size_fixed += size 208bfd81087SMatthias Ringwald else: 209bfd81087SMatthias Ringwald size_var += ' + %s.length' % arg[3] 210bfd81087SMatthias Ringwald size_string = '%u%s' % (size_fixed, size_var) 211bfd81087SMatthias Ringwald 212bfd81087SMatthias Ringwald store_params = '' 213bfd81087SMatthias Ringwald 214bfd81087SMatthias Ringwald length_name = '' 215bfd81087SMatthias Ringwald for (param_type, arg_type, arg_size, arg_name) in args: 216bfd81087SMatthias Ringwald if param_type in ['L', 'J']: 217bfd81087SMatthias Ringwald length_name = arg_name 218bfd81087SMatthias Ringwald if param_type == 'V': 219bfd81087SMatthias Ringwald store_params += ind + 'Util.storeBytes(command, offset, %s, %s);' % (arg_name, length_name) + '\n'; 220bfd81087SMatthias Ringwald store_params += ind + 'offset += %s;\n' % length_name; 221bfd81087SMatthias Ringwald length_name = '' 222bfd81087SMatthias Ringwald else: 223bfd81087SMatthias Ringwald store_params += ind + (param_store[param_type] % arg_name) + '\n'; 224bfd81087SMatthias Ringwald size = arg_size 225bfd81087SMatthias Ringwald if size > 0: 226bfd81087SMatthias Ringwald store_params += ind + 'offset += %u;\n' % arg_size; 227bfd81087SMatthias Ringwald else: 228bfd81087SMatthias Ringwald store_params += ind + 'offset += %s.length;\n' % arg_name 229bfd81087SMatthias Ringwald 230bfd81087SMatthias Ringwald fout.write( java_btstack_command % (name, args_string, format, size_string, ogf, ocf, store_params)) 231bfd81087SMatthias Ringwald 232bfd81087SMatthias Ringwalddef mark_define_as_used(term): 233bfd81087SMatthias Ringwald if term.startswith('0'): 234bfd81087SMatthias Ringwald return 235bfd81087SMatthias Ringwald defines_used.add(term) 236bfd81087SMatthias Ringwald 237bfd81087SMatthias Ringwalddef java_define_string(key): 238bfd81087SMatthias Ringwald global defines 239253d7684SMatthias Ringwald if key in defines: 240bfd81087SMatthias Ringwald return ' public static final int %s = %s;\n' % (key, defines[key]) 241253d7684SMatthias Ringwald else: 242253d7684SMatthias Ringwald return ' // defines[%s] not set\n' % key 243bfd81087SMatthias Ringwald 244bfd81087SMatthias Ringwalddef java_defines_string(keys): 245bfd81087SMatthias Ringwald return '\n'.join( map(java_define_string, sorted(keys))) 246bfd81087SMatthias Ringwald 247bfd81087SMatthias Ringwalddef create_btstack_java(commands): 248bfd81087SMatthias Ringwald global gen_path 2494b238d71SMatthias Ringwald parser.assert_dir(gen_path) 250bfd81087SMatthias Ringwald 251bfd81087SMatthias Ringwald outfile = '%s/BTstack.java' % gen_path 252bfd81087SMatthias Ringwald 253bfd81087SMatthias Ringwald with open(outfile, 'wt') as fout: 254bfd81087SMatthias Ringwald 255bfd81087SMatthias Ringwald fout.write(java_btstack_header % package) 256bfd81087SMatthias Ringwald 257bfd81087SMatthias Ringwald for command in commands: 258bfd81087SMatthias Ringwald (command_name, ogf, ocf, format, params) = command 259bfd81087SMatthias Ringwald create_command_java(fout, command_name, ogf, ocf, format, params); 260bfd81087SMatthias Ringwald mark_define_as_used(ogf) 261bfd81087SMatthias Ringwald mark_define_as_used(ocf) 262bfd81087SMatthias Ringwald 263bfd81087SMatthias Ringwald fout.write('\n /** defines used */\n\n') 264bfd81087SMatthias Ringwald for key in sorted(defines_used): 265bfd81087SMatthias Ringwald fout.write(java_define_string(key)) 266bfd81087SMatthias Ringwald 267bfd81087SMatthias Ringwald fout.write(java_btstack_footer) 268bfd81087SMatthias Ringwald 269bfd81087SMatthias Ringwalddef create_event(event_name, format, args): 270bfd81087SMatthias Ringwald global gen_path 271bfd81087SMatthias Ringwald global package 272bfd81087SMatthias Ringwald global java_event_template 273bfd81087SMatthias Ringwald 274bfd81087SMatthias Ringwald param_read = { 275bfd81087SMatthias Ringwald '1' : 'return Util.readByte(data, %u);', 276bfd81087SMatthias Ringwald 'J' : 'return Util.readByte(data, %u);', 277bfd81087SMatthias Ringwald '2' : 'return Util.readBt16(data, %u);', 27836f83f41SMatthias Ringwald 'H' : 'return Util.readBt16(data, %u);', 27936f83f41SMatthias Ringwald 'L' : 'return Util.readBt16(data, %u);', 280bfd81087SMatthias Ringwald '3' : 'return Util.readBt24(data, %u);', 281bfd81087SMatthias Ringwald '4' : 'return Util.readBt32(data, %u);', 282bfd81087SMatthias Ringwald 'B' : 'return Util.readBdAddr(data, %u);', 283bfd81087SMatthias Ringwald 'X' : 'return Util.readGattService(data, %u);', 284bfd81087SMatthias Ringwald 'Y' : 'return Util.readGattCharacteristic(data, %u);', 285bfd81087SMatthias Ringwald 'Z' : 'return Util.readGattCharacteristicDescriptor(data, %u);', 286bfd81087SMatthias Ringwald 'T' : 'int offset = %u; \n return Util.getText(data, offset, getPayloadLen()-offset);', 287bfd81087SMatthias Ringwald 'N' : 'return Util.getText(data, %u, 248);', 288*d2fb0b94SMatthias Ringwald 'D' : 'Util.storeBytes(data, %u, 8);', 289*d2fb0b94SMatthias Ringwald 'Q' : 'Util.storeBytes(data, %u, 32);', 290bfd81087SMatthias Ringwald # 'E' : 'Util.storeBytes(data, %u, 240);', 291bfd81087SMatthias Ringwald # 'P' : 'Util.storeBytes(data, %u, 16);', 292bfd81087SMatthias Ringwald # 'A' : 'Util.storeBytes(data, %u, 31);', 293bfd81087SMatthias Ringwald # 'S' : 'Util.storeBytes(data, %u);' 294bfd81087SMatthias Ringwald } 295bfd81087SMatthias Ringwald 296bfd81087SMatthias Ringwald gen_event_path = '%s/event' % gen_path 297bfd81087SMatthias Ringwald outfile = '%s/%s.java' % (gen_event_path, event_name) 298bfd81087SMatthias Ringwald with open(outfile, 'wt') as fout: 299bfd81087SMatthias Ringwald offset = 2 300bfd81087SMatthias Ringwald getters = '' 301bfd81087SMatthias Ringwald length_name = '' 302bfd81087SMatthias Ringwald for f, arg in zip(format, args): 303bfd81087SMatthias Ringwald # just remember name 304bfd81087SMatthias Ringwald if f in ['L','J']: 3054b238d71SMatthias Ringwald length_name = parser.camel_case(arg) 306bfd81087SMatthias Ringwald if f == 'R': 307bfd81087SMatthias Ringwald # remaining data 308bfd81087SMatthias Ringwald access = java_event_getter_remaining_data.format(offset) 309bfd81087SMatthias Ringwald size = 0 310bfd81087SMatthias Ringwald elif f == 'V': 311bfd81087SMatthias Ringwald access = java_event_getter_data.format(length_name, offset) 312bfd81087SMatthias Ringwald size = 0 313*d2fb0b94SMatthias Ringwald elif f in ['D', 'Q']: 314*d2fb0b94SMatthias Ringwald size = size_for_type(f) 315*d2fb0b94SMatthias Ringwald access = java_event_getter_data_fixed.format(size, offset) 316bfd81087SMatthias Ringwald else: 317bfd81087SMatthias Ringwald access = param_read[f] % offset 318bfd81087SMatthias Ringwald size = size_for_type(f) 3194b238d71SMatthias Ringwald getters += java_event_getter.format(java_type_for_btstack_type(f), parser.camel_case(arg), access) 320bfd81087SMatthias Ringwald offset += size 321bfd81087SMatthias Ringwald to_string_args = '' 322bfd81087SMatthias Ringwald for arg in args: 323bfd81087SMatthias Ringwald to_string_args += ' t.append(", %s = ");\n' % arg 3244b238d71SMatthias Ringwald to_string_args += ' t.append(get%s());\n' % parser.camel_case(arg) 325bfd81087SMatthias Ringwald to_string_method = java_event_to_string.format(event_name, to_string_args) 326bfd81087SMatthias Ringwald fout.write(java_event_template.format(package, event_name, getters, to_string_method)) 327bfd81087SMatthias Ringwald 328045013feSMatthias Ringwalddef event_supported(event_name): 329045013feSMatthias Ringwald parts = event_name.split('_') 330fea5a680SMatthias Ringwald if parts[0] in ['ATT', 'BTSTACK', 'DAEMON', 'L2CAP', 'RFCOMM', 'SDP', 'GATT', 'GAP', 'HCI', 'SM', 'BNEP']: 331045013feSMatthias Ringwald return True 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) 365045013feSMatthias 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 376bfd81087SMatthias Ringwald# # parse commands 377bfd81087SMatthias Ringwaldcommands = parser.parse_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