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