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