1*73a17974SMatthias Ringwald#!/usr/bin/env python 2*73a17974SMatthias Ringwald# BlueKitchen GmbH (c) 2018 3*73a17974SMatthias Ringwald 4*73a17974SMatthias Ringwaldimport glob 5*73a17974SMatthias Ringwaldimport re 6*73a17974SMatthias Ringwaldimport sys 7*73a17974SMatthias Ringwaldimport os 8*73a17974SMatthias Ringwald 9*73a17974SMatthias Ringwaldimport btstack_parser as parser 10*73a17974SMatthias Ringwald 11*73a17974SMatthias Ringwaldprint(''' 12*73a17974SMatthias RingwaldPython binding generator for BTstack Server 13*73a17974SMatthias RingwaldCopyright 2018, BlueKitchen GmbH 14*73a17974SMatthias Ringwald''') 15*73a17974SMatthias Ringwald 16*73a17974SMatthias Ringwald# com.bluekitchen.btstack.BTstack.java templates 17*73a17974SMatthias Ringwaldcommand_builder_header = \ 18*73a17974SMatthias Ringwald'''#!/usr/bin/env python3 19*73a17974SMatthias Ringwald 20*73a17974SMatthias Ringwaldimport struct 21*73a17974SMatthias Ringwald 22*73a17974SMatthias Ringwald# Command Builder 23*73a17974SMatthias Ringwald 24*73a17974SMatthias Ringwaldclass CommandBuilder(object): 25*73a17974SMatthias Ringwald def __init__(self): 26*73a17974SMatthias Ringwald pass 27*73a17974SMatthias Ringwald 28*73a17974SMatthias Ringwald def pack24(value): 29*73a17974SMatthias Ringwald return struct.pack("B", value & 0xff) + struct.pack("<H", value >> 8) 30*73a17974SMatthias Ringwald 31*73a17974SMatthias Ringwald def name248(str): 32*73a17974SMatthias Ringwald arg = str.encode('utf-8') 33*73a17974SMatthias Ringwald return arg[:248] + bytes(248-len(arg)) 34*73a17974SMatthias Ringwald 35*73a17974SMatthias Ringwald def send_command(command): 36*73a17974SMatthias Ringwald return FALSE 37*73a17974SMatthias Ringwald 38*73a17974SMatthias Ringwald''' 39*73a17974SMatthias Ringwaldcommand_builder_command = ''' 40*73a17974SMatthias Ringwald def {name}({args}): 41*73a17974SMatthias Ringwald cmd_args = bytes() 42*73a17974SMatthias Ringwald{args_builder} 43*73a17974SMatthias Ringwald cmd = struct.pack("<HB", opcode({ogf}, {ocf}), len(cmd_args)) + cmd_args 44*73a17974SMatthias Ringwald return self.send_hci_command(cmd) 45*73a17974SMatthias Ringwald''' 46*73a17974SMatthias Ringwald 47*73a17974SMatthias Ringwald# com.bluekitchen.btstack.EventFactory template 48*73a17974SMatthias Ringwaldjava_event_factory_template = \ 49*73a17974SMatthias Ringwald'''package {0}; 50*73a17974SMatthias Ringwald 51*73a17974SMatthias Ringwaldimport {0}.event.*; 52*73a17974SMatthias Ringwald 53*73a17974SMatthias Ringwaldpublic class EventFactory {{ 54*73a17974SMatthias Ringwald 55*73a17974SMatthias Ringwald /** @brief event codes */ 56*73a17974SMatthias Ringwald 57*73a17974SMatthias Ringwald{1} 58*73a17974SMatthias Ringwald public static Event eventForPacket(Packet packet){{ 59*73a17974SMatthias Ringwald int eventType = Util.readByte(packet.getBuffer(), 0); 60*73a17974SMatthias Ringwald switch (eventType){{ 61*73a17974SMatthias Ringwald{2} 62*73a17974SMatthias Ringwald case 0x3e: // LE_META_EVENT 63*73a17974SMatthias Ringwald int subEventType = Util.readByte(packet.getBuffer(), 2); 64*73a17974SMatthias Ringwald switch (subEventType){{ 65*73a17974SMatthias Ringwald{3} 66*73a17974SMatthias Ringwald default: 67*73a17974SMatthias Ringwald return new Event(packet); 68*73a17974SMatthias Ringwald }} 69*73a17974SMatthias Ringwald 70*73a17974SMatthias Ringwald default: 71*73a17974SMatthias Ringwald return new Event(packet); 72*73a17974SMatthias Ringwald }} 73*73a17974SMatthias Ringwald }} 74*73a17974SMatthias Ringwald}} 75*73a17974SMatthias Ringwald''' 76*73a17974SMatthias Ringwaldjava_event_factory_event = ''' 77*73a17974SMatthias Ringwald case {0}: 78*73a17974SMatthias Ringwald return new {1}(packet); 79*73a17974SMatthias Ringwald''' 80*73a17974SMatthias Ringwaldjava_event_factory_subevent = ''' 81*73a17974SMatthias Ringwald case {0}: 82*73a17974SMatthias Ringwald return new {1}(packet); 83*73a17974SMatthias Ringwald''' 84*73a17974SMatthias Ringwald 85*73a17974SMatthias Ringwald# com.bluekitchen.btstack.events.* template 86*73a17974SMatthias Ringwaldjava_event_template = \ 87*73a17974SMatthias Ringwald'''package {0}.event; 88*73a17974SMatthias Ringwald 89*73a17974SMatthias Ringwaldimport {0}.*; 90*73a17974SMatthias Ringwald 91*73a17974SMatthias Ringwaldpublic class {1} extends Event {{ 92*73a17974SMatthias Ringwald 93*73a17974SMatthias Ringwald public {1}(Packet packet) {{ 94*73a17974SMatthias Ringwald super(packet); 95*73a17974SMatthias Ringwald }} 96*73a17974SMatthias Ringwald {2} 97*73a17974SMatthias Ringwald {3} 98*73a17974SMatthias Ringwald}} 99*73a17974SMatthias Ringwald''' 100*73a17974SMatthias Ringwald 101*73a17974SMatthias Ringwaldjava_event_getter = \ 102*73a17974SMatthias Ringwald''' 103*73a17974SMatthias Ringwald /** 104*73a17974SMatthias Ringwald * @return {1} as {0} 105*73a17974SMatthias Ringwald */ 106*73a17974SMatthias Ringwald public {0} get{1}(){{ 107*73a17974SMatthias Ringwald {2} 108*73a17974SMatthias Ringwald }} 109*73a17974SMatthias Ringwald''' 110*73a17974SMatthias Ringwald 111*73a17974SMatthias Ringwaldjava_event_getter_data = \ 112*73a17974SMatthias Ringwald'''int len = get{0}(); 113*73a17974SMatthias Ringwald byte[] result = new byte[len]; 114*73a17974SMatthias Ringwald System.arraycopy(data, {1}, result, 0, len); 115*73a17974SMatthias Ringwald return result;''' 116*73a17974SMatthias Ringwald 117*73a17974SMatthias Ringwaldjava_event_getter_data_fixed = \ 118*73a17974SMatthias Ringwald'''int len = {0}; 119*73a17974SMatthias Ringwald byte[] result = new byte[len]; 120*73a17974SMatthias Ringwald System.arraycopy(data, {1}, result, 0, len); 121*73a17974SMatthias Ringwald return result;''' 122*73a17974SMatthias Ringwald 123*73a17974SMatthias Ringwaldjava_event_getter_remaining_data = \ 124*73a17974SMatthias Ringwald'''int len = getPayloadLen() - {0}; 125*73a17974SMatthias Ringwald byte[] result = new byte[len]; 126*73a17974SMatthias Ringwald System.arraycopy(data, {0}, result, 0, len); 127*73a17974SMatthias Ringwald return result;''' 128*73a17974SMatthias Ringwald 129*73a17974SMatthias Ringwaldjava_event_to_string = \ 130*73a17974SMatthias Ringwald''' 131*73a17974SMatthias Ringwald public String toString(){{ 132*73a17974SMatthias Ringwald StringBuffer t = new StringBuffer(); 133*73a17974SMatthias Ringwald t.append("{0} < type = "); 134*73a17974SMatthias Ringwald t.append(String.format("0x%02x, ", getEventType())); 135*73a17974SMatthias Ringwald t.append(getEventType()); 136*73a17974SMatthias Ringwald{1} t.append(" >"); 137*73a17974SMatthias Ringwald return t.toString(); 138*73a17974SMatthias Ringwald }} 139*73a17974SMatthias Ringwald''' 140*73a17974SMatthias Ringwald 141*73a17974SMatthias Ringwald 142*73a17974SMatthias Ringwald# global variables/defines 143*73a17974SMatthias Ringwaldpackage ='com.bluekitchen.btstack' 144*73a17974SMatthias Ringwaldgen_path = 'gen/' + package.replace('.', '/') 145*73a17974SMatthias Ringwald 146*73a17974SMatthias Ringwalddefines = dict() 147*73a17974SMatthias Ringwalddefines_used = set() 148*73a17974SMatthias Ringwald 149*73a17974SMatthias Ringwalddef java_type_for_btstack_type(type): 150*73a17974SMatthias Ringwald param_types = { '1' : 'int', '2' : 'int', '3' : 'int', '4' : 'long', 'H' : 'int', 'B' : 'BD_ADDR', 151*73a17974SMatthias Ringwald 'D' : 'byte []', 'E' : 'byte [] ', 'N' : 'String' , 'P' : 'byte []', 'A' : 'byte []', 152*73a17974SMatthias Ringwald 'R' : 'byte []', 'S' : 'byte []', 'Q' : 'byte []', 153*73a17974SMatthias Ringwald 'J' : 'int', 'L' : 'int', 'V' : 'byte []', 'U' : 'BT_UUID', 154*73a17974SMatthias Ringwald 'X' : 'GATTService', 'Y' : 'GATTCharacteristic', 'Z' : 'GATTCharacteristicDescriptor', 155*73a17974SMatthias Ringwald 'T' : 'String'} 156*73a17974SMatthias Ringwald return param_types[type] 157*73a17974SMatthias Ringwald 158*73a17974SMatthias Ringwalddef size_for_type(type): 159*73a17974SMatthias Ringwald param_sizes = { '1' : 1, '2' : 2, '3' : 3, '4' : 4, 'H' : 2, 'B' : 6, 'D' : 8, 'E' : 240, 'N' : 248, 'P' : 16, 160*73a17974SMatthias Ringwald 'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'Q' : 32, 'U' : 16, 'X' : 20, 'Y' : 24, 'Z' : 18, 'T':-1} 161*73a17974SMatthias Ringwald return param_sizes[type] 162*73a17974SMatthias Ringwald 163*73a17974SMatthias Ringwalddef create_command_python(fout, name, ogf, ocf, format, params): 164*73a17974SMatthias Ringwald global command_builder_command 165*73a17974SMatthias Ringwald 166*73a17974SMatthias Ringwald ind = ' ' 167*73a17974SMatthias Ringwald param_store = { 168*73a17974SMatthias Ringwald '1' : 'cmd_args += struct.pack("B", %s)', 169*73a17974SMatthias Ringwald 'J' : 'cmd_args += struct.pack("B", %s)', 170*73a17974SMatthias Ringwald '2' : 'cmd_args += struct.pack("<H", %s)', 171*73a17974SMatthias Ringwald 'H' : 'cmd_args += struct.pack("<H", %s)', 172*73a17974SMatthias Ringwald 'L' : 'cmd_args += struct.pack("<H", %s)', 173*73a17974SMatthias Ringwald '3' : 'cmd_args += self.pack24(%s)', 174*73a17974SMatthias Ringwald '4' : 'cmd_args += struct.pack("<H", %s)', 175*73a17974SMatthias Ringwald 'N' : 'cmd_args += self.name248(%s)', 176*73a17974SMatthias Ringwald 'B' : 'cmd_args += %s.get_bytes()', 177*73a17974SMatthias Ringwald 'U' : 'cmd_args += %s.get_bytes()', 178*73a17974SMatthias Ringwald 'X' : 'cmd_args += %s.get_bytes()', 179*73a17974SMatthias Ringwald 'Y' : 'cmd_args += %s.get_bytes()', 180*73a17974SMatthias Ringwald 'Z' : 'cmd_args += %s.get_bytes()', 181*73a17974SMatthias Ringwald 'S' : 'cmd_args += %s', 182*73a17974SMatthias Ringwald # TODO: support serialization for these 183*73a17974SMatthias Ringwald 'D' : '# D / TODO Util.storeBytes(command, offset, %s, 8)', 184*73a17974SMatthias Ringwald 'E' : '# E / TODO Util.storeBytes(command, offset, %s, 240)', 185*73a17974SMatthias Ringwald 'P' : '# P / TODO Util.storeBytes(command, offset, %s, 16)', 186*73a17974SMatthias Ringwald 'Q' : '# Q / TODO Util.storeBytes(command, offset, %s, 32)', 187*73a17974SMatthias Ringwald 'A' : '# A / TODO Util.storeBytes(command, offset, %s, 31)', 188*73a17974SMatthias Ringwald } 189*73a17974SMatthias Ringwald # method arguments 190*73a17974SMatthias Ringwald arg_counter = 1 191*73a17974SMatthias Ringwald args = [] 192*73a17974SMatthias Ringwald for param_type, arg_name in zip(format, params): 193*73a17974SMatthias Ringwald arg_size = size_for_type(param_type) 194*73a17974SMatthias Ringwald arg = (param_type, arg_size, arg_name) 195*73a17974SMatthias Ringwald args.append(arg) 196*73a17974SMatthias Ringwald arg_counter += 1 197*73a17974SMatthias Ringwald print(args) 198*73a17974SMatthias Ringwald 199*73a17974SMatthias Ringwald # method argument declaration 200*73a17974SMatthias Ringwald args2 = [] 201*73a17974SMatthias Ringwald for arg in args: 202*73a17974SMatthias Ringwald args2.append(arg[2]) 203*73a17974SMatthias Ringwald args_string = ', '.join(args2) 204*73a17974SMatthias Ringwald print(args_string) 205*73a17974SMatthias Ringwald 206*73a17974SMatthias Ringwald # command size (opcode, len) 207*73a17974SMatthias Ringwald size_fixed = 3 208*73a17974SMatthias Ringwald size_var = '' 209*73a17974SMatthias Ringwald for arg in args: 210*73a17974SMatthias Ringwald size = arg[1] 211*73a17974SMatthias Ringwald if size > 0: 212*73a17974SMatthias Ringwald size_fixed += size 213*73a17974SMatthias Ringwald else: 214*73a17974SMatthias Ringwald size_var += ' + %s.length' % arg[2] 215*73a17974SMatthias Ringwald size_string = '%u%s' % (size_fixed, size_var) 216*73a17974SMatthias Ringwald print(size_string) 217*73a17974SMatthias Ringwald 218*73a17974SMatthias Ringwald store_params = '' 219*73a17974SMatthias Ringwald 220*73a17974SMatthias Ringwald length_name = '' 221*73a17974SMatthias Ringwald for (param_type, arg_size, arg_name) in args: 222*73a17974SMatthias Ringwald if param_type in ['L', 'J']: 223*73a17974SMatthias Ringwald length_name = arg_name 224*73a17974SMatthias Ringwald if param_type == 'V': 225*73a17974SMatthias Ringwald store_params += ind + 'Util.storeBytes(command, offset, %s, %s);' % (arg_name, length_name) + '\n'; 226*73a17974SMatthias Ringwald length_name = '' 227*73a17974SMatthias Ringwald else: 228*73a17974SMatthias Ringwald store_params += ind + (param_store[param_type] % arg_name) + '\n'; 229*73a17974SMatthias Ringwald size = arg_size 230*73a17974SMatthias Ringwald 231*73a17974SMatthias Ringwald fout.write( command_builder_command.format(name=name, args=args_string, ogf=ogf, ocf=ocf, args_builder=store_params)) 232*73a17974SMatthias Ringwald 233*73a17974SMatthias Ringwalddef mark_define_as_used(term): 234*73a17974SMatthias Ringwald if term.startswith('0'): 235*73a17974SMatthias Ringwald return 236*73a17974SMatthias Ringwald defines_used.add(term) 237*73a17974SMatthias Ringwald 238*73a17974SMatthias Ringwalddef java_define_string(key): 239*73a17974SMatthias Ringwald global defines 240*73a17974SMatthias Ringwald if key in defines: 241*73a17974SMatthias Ringwald return ' public static final int %s = %s;\n' % (key, defines[key]) 242*73a17974SMatthias Ringwald else: 243*73a17974SMatthias Ringwald return ' // defines[%s] not set\n' % key 244*73a17974SMatthias Ringwald 245*73a17974SMatthias Ringwalddef java_defines_string(keys): 246*73a17974SMatthias Ringwald return '\n'.join( map(java_define_string, sorted(keys))) 247*73a17974SMatthias Ringwald 248*73a17974SMatthias Ringwalddef create_command_builder(commands): 249*73a17974SMatthias Ringwald global gen_path 250*73a17974SMatthias Ringwald parser.assert_dir(gen_path) 251*73a17974SMatthias Ringwald 252*73a17974SMatthias Ringwald outfile = '%s/command_builder.py' % gen_path 253*73a17974SMatthias Ringwald 254*73a17974SMatthias Ringwald with open(outfile, 'wt') as fout: 255*73a17974SMatthias Ringwald 256*73a17974SMatthias Ringwald fout.write(command_builder_header) 257*73a17974SMatthias Ringwald 258*73a17974SMatthias Ringwald for command in commands: 259*73a17974SMatthias Ringwald (command_name, ogf, ocf, format, params) = command 260*73a17974SMatthias Ringwald create_command_python(fout, command_name, ogf, ocf, format, params); 261*73a17974SMatthias Ringwald mark_define_as_used(ogf) 262*73a17974SMatthias Ringwald mark_define_as_used(ocf) 263*73a17974SMatthias Ringwald 264*73a17974SMatthias Ringwald # fout.write('\n # defines used\n\n') 265*73a17974SMatthias Ringwald # for key in sorted(defines_used): 266*73a17974SMatthias Ringwald # fout.write(java_define_string(key)) 267*73a17974SMatthias Ringwald 268*73a17974SMatthias Ringwalddef create_event(event_name, format, args): 269*73a17974SMatthias Ringwald global gen_path 270*73a17974SMatthias Ringwald global package 271*73a17974SMatthias Ringwald global java_event_template 272*73a17974SMatthias Ringwald 273*73a17974SMatthias Ringwald param_read = { 274*73a17974SMatthias Ringwald '1' : 'return Util.readByte(data, %u);', 275*73a17974SMatthias Ringwald 'J' : 'return Util.readByte(data, %u);', 276*73a17974SMatthias Ringwald '2' : 'return Util.readBt16(data, %u);', 277*73a17974SMatthias Ringwald 'H' : 'return Util.readBt16(data, %u);', 278*73a17974SMatthias Ringwald 'L' : 'return Util.readBt16(data, %u);', 279*73a17974SMatthias Ringwald '3' : 'return Util.readBt24(data, %u);', 280*73a17974SMatthias Ringwald '4' : 'return Util.readBt32(data, %u);', 281*73a17974SMatthias Ringwald 'B' : 'return Util.readBdAddr(data, %u);', 282*73a17974SMatthias Ringwald 'X' : 'return Util.readGattService(data, %u);', 283*73a17974SMatthias Ringwald 'Y' : 'return Util.readGattCharacteristic(data, %u);', 284*73a17974SMatthias Ringwald 'Z' : 'return Util.readGattCharacteristicDescriptor(data, %u);', 285*73a17974SMatthias Ringwald 'T' : 'int offset = %u; \n return Util.getText(data, offset, getPayloadLen()-offset);', 286*73a17974SMatthias Ringwald 'N' : 'return Util.getText(data, %u, 248);', 287*73a17974SMatthias Ringwald 'D' : 'Util.storeBytes(data, %u, 8);', 288*73a17974SMatthias Ringwald 'Q' : 'Util.storeBytes(data, %u, 32);', 289*73a17974SMatthias Ringwald # 'E' : 'Util.storeBytes(data, %u, 240);', 290*73a17974SMatthias Ringwald # 'P' : 'Util.storeBytes(data, %u, 16);', 291*73a17974SMatthias Ringwald # 'A' : 'Util.storeBytes(data, %u, 31);', 292*73a17974SMatthias Ringwald # 'S' : 'Util.storeBytes(data, %u);' 293*73a17974SMatthias Ringwald } 294*73a17974SMatthias Ringwald 295*73a17974SMatthias Ringwald gen_event_path = '%s/event' % gen_path 296*73a17974SMatthias Ringwald outfile = '%s/%s.java' % (gen_event_path, event_name) 297*73a17974SMatthias Ringwald with open(outfile, 'wt') as fout: 298*73a17974SMatthias Ringwald offset = 2 299*73a17974SMatthias Ringwald getters = '' 300*73a17974SMatthias Ringwald length_name = '' 301*73a17974SMatthias Ringwald for f, arg in zip(format, args): 302*73a17974SMatthias Ringwald # just remember name 303*73a17974SMatthias Ringwald if f in ['L','J']: 304*73a17974SMatthias Ringwald length_name = parser.camel_case(arg) 305*73a17974SMatthias Ringwald if f == 'R': 306*73a17974SMatthias Ringwald # remaining data 307*73a17974SMatthias Ringwald access = java_event_getter_remaining_data.format(offset) 308*73a17974SMatthias Ringwald size = 0 309*73a17974SMatthias Ringwald elif f == 'V': 310*73a17974SMatthias Ringwald access = java_event_getter_data.format(length_name, offset) 311*73a17974SMatthias Ringwald size = 0 312*73a17974SMatthias Ringwald elif f in ['D', 'Q']: 313*73a17974SMatthias Ringwald size = size_for_type(f) 314*73a17974SMatthias Ringwald access = java_event_getter_data_fixed.format(size, offset) 315*73a17974SMatthias Ringwald else: 316*73a17974SMatthias Ringwald access = param_read[f] % offset 317*73a17974SMatthias Ringwald size = size_for_type(f) 318*73a17974SMatthias Ringwald getters += java_event_getter.format(java_type_for_btstack_type(f), parser.camel_case(arg), access) 319*73a17974SMatthias Ringwald offset += size 320*73a17974SMatthias Ringwald to_string_args = '' 321*73a17974SMatthias Ringwald for arg in args: 322*73a17974SMatthias Ringwald to_string_args += ' t.append(", %s = ");\n' % arg 323*73a17974SMatthias Ringwald to_string_args += ' t.append(get%s());\n' % parser.camel_case(arg) 324*73a17974SMatthias Ringwald to_string_method = java_event_to_string.format(event_name, to_string_args) 325*73a17974SMatthias Ringwald fout.write(java_event_template.format(package, event_name, getters, to_string_method)) 326*73a17974SMatthias Ringwald 327*73a17974SMatthias Ringwalddef event_supported(event_name): 328*73a17974SMatthias Ringwald parts = event_name.split('_') 329*73a17974SMatthias Ringwald return parts[0] in ['ATT', 'BTSTACK', 'DAEMON', 'L2CAP', 'RFCOMM', 'SDP', 'GATT', 'GAP', 'HCI', 'SM', 'BNEP'] 330*73a17974SMatthias Ringwald 331*73a17974SMatthias Ringwalddef class_name_for_event(event_name): 332*73a17974SMatthias Ringwald return parser.camel_case(event_name.replace('SUBEVENT','EVENT')) 333*73a17974SMatthias Ringwald 334*73a17974SMatthias Ringwalddef create_events(events): 335*73a17974SMatthias Ringwald global gen_path 336*73a17974SMatthias Ringwald gen_path_events = gen_path + '/event' 337*73a17974SMatthias Ringwald parser.assert_dir(gen_path_events) 338*73a17974SMatthias Ringwald 339*73a17974SMatthias Ringwald for event_type, event_name, format, args in events: 340*73a17974SMatthias Ringwald if not event_supported(event_name): 341*73a17974SMatthias Ringwald continue 342*73a17974SMatthias Ringwald class_name = class_name_for_event(event_name) 343*73a17974SMatthias Ringwald create_event(class_name, format, args) 344*73a17974SMatthias Ringwald 345*73a17974SMatthias Ringwald 346*73a17974SMatthias Ringwalddef create_event_factory(events, subevents, defines): 347*73a17974SMatthias Ringwald global gen_path 348*73a17974SMatthias Ringwald global package 349*73a17974SMatthias Ringwald global java_event_factory_event 350*73a17974SMatthias Ringwald global java_event_factory_template 351*73a17974SMatthias Ringwald 352*73a17974SMatthias Ringwald outfile = '%s/EventFactory.java' % gen_path 353*73a17974SMatthias Ringwald 354*73a17974SMatthias Ringwald cases = '' 355*73a17974SMatthias Ringwald for event_type, event_name, format, args in events: 356*73a17974SMatthias Ringwald event_name = parser.camel_case(event_name) 357*73a17974SMatthias Ringwald cases += java_event_factory_event.format(event_type, event_name) 358*73a17974SMatthias Ringwald subcases = '' 359*73a17974SMatthias Ringwald for event_type, event_name, format, args in subevents: 360*73a17974SMatthias Ringwald if not event_supported(event_name): 361*73a17974SMatthias Ringwald continue 362*73a17974SMatthias Ringwald class_name = class_name_for_event(event_name) 363*73a17974SMatthias Ringwald print class_name 364*73a17974SMatthias Ringwald subcases += java_event_factory_subevent.format(event_type, class_name) 365*73a17974SMatthias Ringwald 366*73a17974SMatthias Ringwald with open(outfile, 'wt') as fout: 367*73a17974SMatthias Ringwald defines_text = java_defines_string(defines) 368*73a17974SMatthias Ringwald fout.write(java_event_factory_template.format(package, defines_text, cases, subcases)) 369*73a17974SMatthias Ringwald 370*73a17974SMatthias Ringwald# find root 371*73a17974SMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..') 372*73a17974SMatthias Ringwaldgen_path = btstack_root + '/platform/daemon/binding/python/btstack/' 373*73a17974SMatthias Ringwald 374*73a17974SMatthias Ringwald 375*73a17974SMatthias Ringwald# read defines from hci_cmds.h and hci.h 376*73a17974SMatthias Ringwalddefines = parser.parse_defines() 377*73a17974SMatthias Ringwald 378*73a17974SMatthias Ringwald# parse commands 379*73a17974SMatthias Ringwaldcommands = parser.parse_commands() 380*73a17974SMatthias Ringwald 381*73a17974SMatthias Ringwald# parse bluetooth.h to get used events 382*73a17974SMatthias Ringwald# (events, le_events, event_types) = parser.parse_events() 383*73a17974SMatthias Ringwald 384*73a17974SMatthias Ringwald# create events, le meta events, event factory, and 385*73a17974SMatthias Ringwald# create_events(events) 386*73a17974SMatthias Ringwald# create_events(le_events) 387*73a17974SMatthias Ringwald# create_event_factory(events, le_events, event_types) 388*73a17974SMatthias Ringwaldcreate_command_builder(commands) 389*73a17974SMatthias Ringwald 390*73a17974SMatthias Ringwald# done 391*73a17974SMatthias Ringwaldprint('Done!') 392