173a17974SMatthias Ringwald#!/usr/bin/env python 273a17974SMatthias Ringwald# BlueKitchen GmbH (c) 2018 373a17974SMatthias Ringwald 473a17974SMatthias Ringwaldimport glob 573a17974SMatthias Ringwaldimport re 673a17974SMatthias Ringwaldimport sys 773a17974SMatthias Ringwaldimport os 873a17974SMatthias Ringwald 973a17974SMatthias Ringwaldimport btstack_parser as parser 1073a17974SMatthias Ringwald 1173a17974SMatthias Ringwaldprint(''' 1273a17974SMatthias RingwaldPython binding generator for BTstack Server 1373a17974SMatthias RingwaldCopyright 2018, BlueKitchen GmbH 1473a17974SMatthias Ringwald''') 1573a17974SMatthias Ringwald 1673a17974SMatthias Ringwald# com.bluekitchen.btstack.BTstack.java templates 1773a17974SMatthias Ringwaldcommand_builder_header = \ 1873a17974SMatthias Ringwald'''#!/usr/bin/env python3 1973a17974SMatthias Ringwald 2073a17974SMatthias Ringwaldimport struct 2173a17974SMatthias Ringwald 2201aeeea2SMatthias Ringwalddef opcode(ogf, ocf): 2301aeeea2SMatthias Ringwald return ocf | (ogf << 10) 2473a17974SMatthias Ringwald 2573a17974SMatthias Ringwalddef pack24(value): 2673a17974SMatthias Ringwald return struct.pack("B", value & 0xff) + struct.pack("<H", value >> 8) 2773a17974SMatthias Ringwald 2873a17974SMatthias Ringwalddef name248(str): 2973a17974SMatthias Ringwald arg = str.encode('utf-8') 3073a17974SMatthias Ringwald return arg[:248] + bytes(248-len(arg)) 3173a17974SMatthias Ringwald 3201aeeea2SMatthias Ringwald# Command Builder 3301aeeea2SMatthias Ringwald 3401aeeea2SMatthias Ringwaldclass CommandBuilder(object): 3501aeeea2SMatthias Ringwald def __init__(self): 3601aeeea2SMatthias Ringwald pass 3701aeeea2SMatthias Ringwald 3873a17974SMatthias Ringwald def send_command(command): 3973a17974SMatthias Ringwald return FALSE 4073a17974SMatthias Ringwald 4173a17974SMatthias Ringwald''' 4273a17974SMatthias Ringwaldcommand_builder_command = ''' 4301aeeea2SMatthias Ringwald def {name}(self, {args}): 4473a17974SMatthias Ringwald cmd_args = bytes() 4573a17974SMatthias Ringwald{args_builder} 4601aeeea2SMatthias Ringwald cmd = struct.pack("<HB", opcode(self.{ogf}, self.{ocf}), len(cmd_args)) + cmd_args 4773a17974SMatthias Ringwald return self.send_hci_command(cmd) 4873a17974SMatthias Ringwald''' 4973a17974SMatthias Ringwald 5073a17974SMatthias Ringwald# com.bluekitchen.btstack.EventFactory template 5173a17974SMatthias Ringwaldjava_event_factory_template = \ 52*dbd33601SMatthias Ringwald''' 5373a17974SMatthias Ringwald 54*dbd33601SMatthias Ringwaldclass EventFactory(object: 5573a17974SMatthias Ringwald 56*dbd33601SMatthias Ringwald # @brief event codes 5773a17974SMatthias Ringwald 58*dbd33601SMatthias Ringwald{0} 59*dbd33601SMatthias Ringwald def event_for_packet(packet): 60*dbd33601SMatthias Ringwald event_type = packet.get_payload()[0] 61*dbd33601SMatthias Ringwald # switch (eventType){{ 6273a17974SMatthias Ringwald{1} 63*dbd33601SMatthias Ringwald # case 0x3e: // LE_META_EVENT 64*dbd33601SMatthias Ringwald # int subEventType = Util.readByte(packet.getBuffer(), 2); 65*dbd33601SMatthias Ringwald # switch (subEventType){{ 6673a17974SMatthias Ringwald{2} 67*dbd33601SMatthias Ringwald # default: 68*dbd33601SMatthias Ringwald # return new Event(packet); 6973a17974SMatthias Ringwald 70*dbd33601SMatthias Ringwald # default: 71*dbd33601SMatthias Ringwald # return new Event(packet); 7273a17974SMatthias Ringwald }} 7373a17974SMatthias Ringwald }} 7473a17974SMatthias Ringwald}} 7573a17974SMatthias Ringwald''' 7673a17974SMatthias Ringwaldjava_event_factory_event = ''' 7773a17974SMatthias Ringwald case {0}: 7873a17974SMatthias Ringwald return new {1}(packet); 7973a17974SMatthias Ringwald''' 8073a17974SMatthias Ringwaldjava_event_factory_subevent = ''' 8173a17974SMatthias Ringwald case {0}: 8273a17974SMatthias Ringwald return new {1}(packet); 8373a17974SMatthias Ringwald''' 8473a17974SMatthias Ringwald 8573a17974SMatthias Ringwald# com.bluekitchen.btstack.events.* template 8673a17974SMatthias Ringwaldjava_event_template = \ 87*dbd33601SMatthias Ringwald''' 8873a17974SMatthias Ringwald 89*dbd33601SMatthias Ringwaldclass {0}(Event): 9073a17974SMatthias Ringwald 91*dbd33601SMatthias Ringwald def __init__(self, packet): 92*dbd33601SMatthias Ringwald # super(packet); 93*dbd33601SMatthias Ringwald {1} 9473a17974SMatthias Ringwald {2} 9573a17974SMatthias Ringwald''' 9673a17974SMatthias Ringwald 9773a17974SMatthias Ringwaldjava_event_getter = \ 9873a17974SMatthias Ringwald''' 99*dbd33601SMatthias Ringwald # @return {1} as {0} 100*dbd33601SMatthias Ringwald def get_{1}(self): 10173a17974SMatthias Ringwald {2} 10273a17974SMatthias Ringwald''' 10373a17974SMatthias Ringwald 10473a17974SMatthias Ringwaldjava_event_getter_data = \ 105*dbd33601SMatthias Ringwald'''# java_event_getter_data 106*dbd33601SMatthias Ringwald # int len = get{length_name}(); 107*dbd33601SMatthias Ringwald # byte[] result = new byte[len]; 108*dbd33601SMatthias Ringwald # System.arraycopy(data, {offset}, result, 0, len); 109*dbd33601SMatthias Ringwald # return result;''' 11073a17974SMatthias Ringwald 11173a17974SMatthias Ringwaldjava_event_getter_data_fixed = \ 112*dbd33601SMatthias Ringwald'''# java_event_getter_data_fixed 113*dbd33601SMatthias Ringwald # int len = {size}; 114*dbd33601SMatthias Ringwald # byte[] result = new byte[len]; 115*dbd33601SMatthias Ringwald # System.arraycopy(data, {offset}, result, 0, len); 116*dbd33601SMatthias Ringwald # return result;''' 11773a17974SMatthias Ringwald 11873a17974SMatthias Ringwaldjava_event_getter_remaining_data = \ 119*dbd33601SMatthias Ringwald'''# java_event_getter_remaining_data 120*dbd33601SMatthias Ringwald # int len = getPayloadLen() - {offset}; 121*dbd33601SMatthias Ringwald # byte[] result = new byte[len]; 122*dbd33601SMatthias Ringwald # System.arraycopy(data, {offset}, result, 0, len); 123*dbd33601SMatthias Ringwald # return result;''' 12473a17974SMatthias Ringwald 12573a17974SMatthias Ringwaldjava_event_to_string = \ 126*dbd33601SMatthias Ringwald'''# java_event_to_string 127*dbd33601SMatthias Ringwald def __str__(self): 128*dbd33601SMatthias Ringwald # StringBuffer t = new StringBuffer(); 129*dbd33601SMatthias Ringwald # t.append("{0} < type = "); 130*dbd33601SMatthias Ringwald # t.append(String.format("0x%02x, ", getEventType())); 131*dbd33601SMatthias Ringwald # t.append(getEventType()); 132*dbd33601SMatthias Ringwald{1} 133*dbd33601SMatthias Ringwald # t.append(" >"); 134*dbd33601SMatthias Ringwald # return t.toString(); 13573a17974SMatthias Ringwald''' 13673a17974SMatthias Ringwald 13773a17974SMatthias Ringwald 13873a17974SMatthias Ringwald# global variables/defines 13973a17974SMatthias Ringwaldpackage ='com.bluekitchen.btstack' 14073a17974SMatthias Ringwaldgen_path = 'gen/' + package.replace('.', '/') 14173a17974SMatthias Ringwald 14273a17974SMatthias Ringwalddefines = dict() 14373a17974SMatthias Ringwalddefines_used = set() 14473a17974SMatthias Ringwald 14573a17974SMatthias Ringwalddef java_type_for_btstack_type(type): 14673a17974SMatthias Ringwald param_types = { '1' : 'int', '2' : 'int', '3' : 'int', '4' : 'long', 'H' : 'int', 'B' : 'BD_ADDR', 14773a17974SMatthias Ringwald 'D' : 'byte []', 'E' : 'byte [] ', 'N' : 'String' , 'P' : 'byte []', 'A' : 'byte []', 14873a17974SMatthias Ringwald 'R' : 'byte []', 'S' : 'byte []', 'Q' : 'byte []', 14973a17974SMatthias Ringwald 'J' : 'int', 'L' : 'int', 'V' : 'byte []', 'U' : 'BT_UUID', 15073a17974SMatthias Ringwald 'X' : 'GATTService', 'Y' : 'GATTCharacteristic', 'Z' : 'GATTCharacteristicDescriptor', 15173a17974SMatthias Ringwald 'T' : 'String'} 15273a17974SMatthias Ringwald return param_types[type] 15373a17974SMatthias Ringwald 15473a17974SMatthias Ringwalddef size_for_type(type): 15573a17974SMatthias Ringwald param_sizes = { '1' : 1, '2' : 2, '3' : 3, '4' : 4, 'H' : 2, 'B' : 6, 'D' : 8, 'E' : 240, 'N' : 248, 'P' : 16, 15673a17974SMatthias Ringwald 'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'Q' : 32, 'U' : 16, 'X' : 20, 'Y' : 24, 'Z' : 18, 'T':-1} 15773a17974SMatthias Ringwald return param_sizes[type] 15873a17974SMatthias Ringwald 15973a17974SMatthias Ringwalddef create_command_python(fout, name, ogf, ocf, format, params): 16073a17974SMatthias Ringwald global command_builder_command 16173a17974SMatthias Ringwald 16273a17974SMatthias Ringwald ind = ' ' 16373a17974SMatthias Ringwald param_store = { 16473a17974SMatthias Ringwald '1' : 'cmd_args += struct.pack("B", %s)', 16573a17974SMatthias Ringwald 'J' : 'cmd_args += struct.pack("B", %s)', 16673a17974SMatthias Ringwald '2' : 'cmd_args += struct.pack("<H", %s)', 16773a17974SMatthias Ringwald 'H' : 'cmd_args += struct.pack("<H", %s)', 16873a17974SMatthias Ringwald 'L' : 'cmd_args += struct.pack("<H", %s)', 16901aeeea2SMatthias Ringwald '3' : 'cmd_args += pack24(%s)', 17073a17974SMatthias Ringwald '4' : 'cmd_args += struct.pack("<H", %s)', 17101aeeea2SMatthias Ringwald 'N' : 'cmd_args += name248(%s)', 17273a17974SMatthias Ringwald 'B' : 'cmd_args += %s.get_bytes()', 17373a17974SMatthias Ringwald 'U' : 'cmd_args += %s.get_bytes()', 17473a17974SMatthias Ringwald 'X' : 'cmd_args += %s.get_bytes()', 17573a17974SMatthias Ringwald 'Y' : 'cmd_args += %s.get_bytes()', 17673a17974SMatthias Ringwald 'Z' : 'cmd_args += %s.get_bytes()', 17773a17974SMatthias Ringwald 'S' : 'cmd_args += %s', 17873a17974SMatthias Ringwald # TODO: support serialization for these 17973a17974SMatthias Ringwald 'D' : '# D / TODO Util.storeBytes(command, offset, %s, 8)', 18073a17974SMatthias Ringwald 'E' : '# E / TODO Util.storeBytes(command, offset, %s, 240)', 18173a17974SMatthias Ringwald 'P' : '# P / TODO Util.storeBytes(command, offset, %s, 16)', 18273a17974SMatthias Ringwald 'Q' : '# Q / TODO Util.storeBytes(command, offset, %s, 32)', 18373a17974SMatthias Ringwald 'A' : '# A / TODO Util.storeBytes(command, offset, %s, 31)', 18473a17974SMatthias Ringwald } 18573a17974SMatthias Ringwald # method arguments 18673a17974SMatthias Ringwald arg_counter = 1 18773a17974SMatthias Ringwald args = [] 18873a17974SMatthias Ringwald for param_type, arg_name in zip(format, params): 18973a17974SMatthias Ringwald arg_size = size_for_type(param_type) 19073a17974SMatthias Ringwald arg = (param_type, arg_size, arg_name) 19173a17974SMatthias Ringwald args.append(arg) 19273a17974SMatthias Ringwald arg_counter += 1 19373a17974SMatthias Ringwald 19473a17974SMatthias Ringwald # method argument declaration 19573a17974SMatthias Ringwald args2 = [] 19673a17974SMatthias Ringwald for arg in args: 19773a17974SMatthias Ringwald args2.append(arg[2]) 19873a17974SMatthias Ringwald args_string = ', '.join(args2) 19973a17974SMatthias Ringwald 20073a17974SMatthias Ringwald # command size (opcode, len) 20173a17974SMatthias Ringwald size_fixed = 3 20273a17974SMatthias Ringwald size_var = '' 20373a17974SMatthias Ringwald for arg in args: 20473a17974SMatthias Ringwald size = arg[1] 20573a17974SMatthias Ringwald if size > 0: 20673a17974SMatthias Ringwald size_fixed += size 20773a17974SMatthias Ringwald else: 20873a17974SMatthias Ringwald size_var += ' + %s.length' % arg[2] 20973a17974SMatthias Ringwald size_string = '%u%s' % (size_fixed, size_var) 21073a17974SMatthias Ringwald 21173a17974SMatthias Ringwald store_params = '' 21273a17974SMatthias Ringwald 21373a17974SMatthias Ringwald length_name = '' 21473a17974SMatthias Ringwald for (param_type, arg_size, arg_name) in args: 21573a17974SMatthias Ringwald if param_type in ['L', 'J']: 21673a17974SMatthias Ringwald length_name = arg_name 21773a17974SMatthias Ringwald if param_type == 'V': 21873a17974SMatthias Ringwald store_params += ind + 'Util.storeBytes(command, offset, %s, %s);' % (arg_name, length_name) + '\n'; 21973a17974SMatthias Ringwald length_name = '' 22073a17974SMatthias Ringwald else: 22173a17974SMatthias Ringwald store_params += ind + (param_store[param_type] % arg_name) + '\n'; 22273a17974SMatthias Ringwald size = arg_size 22373a17974SMatthias Ringwald 22473a17974SMatthias Ringwald fout.write( command_builder_command.format(name=name, args=args_string, ogf=ogf, ocf=ocf, args_builder=store_params)) 22573a17974SMatthias Ringwald 22673a17974SMatthias Ringwalddef mark_define_as_used(term): 22773a17974SMatthias Ringwald if term.startswith('0'): 22873a17974SMatthias Ringwald return 22973a17974SMatthias Ringwald defines_used.add(term) 23073a17974SMatthias Ringwald 23101aeeea2SMatthias Ringwalddef python_define_string(key): 23273a17974SMatthias Ringwald global defines 23373a17974SMatthias Ringwald if key in defines: 23401aeeea2SMatthias Ringwald return ' %s = %s\n' % (key, defines[key]) 23573a17974SMatthias Ringwald else: 23601aeeea2SMatthias Ringwald return ' # defines[%s] not set\n' % key 23773a17974SMatthias Ringwald 238b2929115SMatthias Ringwalddef python_defines_string(keys): 23901aeeea2SMatthias Ringwald return '\n'.join( map(python_define_string, sorted(keys))) 24073a17974SMatthias Ringwald 24173a17974SMatthias Ringwalddef create_command_builder(commands): 24273a17974SMatthias Ringwald global gen_path 24373a17974SMatthias Ringwald parser.assert_dir(gen_path) 24473a17974SMatthias Ringwald 24573a17974SMatthias Ringwald outfile = '%s/command_builder.py' % gen_path 24673a17974SMatthias Ringwald 24773a17974SMatthias Ringwald with open(outfile, 'wt') as fout: 24873a17974SMatthias Ringwald 24973a17974SMatthias Ringwald fout.write(command_builder_header) 25073a17974SMatthias Ringwald 25173a17974SMatthias Ringwald for command in commands: 25273a17974SMatthias Ringwald (command_name, ogf, ocf, format, params) = command 25373a17974SMatthias Ringwald create_command_python(fout, command_name, ogf, ocf, format, params); 25473a17974SMatthias Ringwald mark_define_as_used(ogf) 25573a17974SMatthias Ringwald mark_define_as_used(ocf) 25673a17974SMatthias Ringwald 25701aeeea2SMatthias Ringwald fout.write('\n # defines used\n\n') 25801aeeea2SMatthias Ringwald for key in sorted(defines_used): 25901aeeea2SMatthias Ringwald fout.write(python_define_string(key)) 26073a17974SMatthias Ringwald 261b2929115SMatthias Ringwalddef create_event(fout, event_name, format, args): 26273a17974SMatthias Ringwald global gen_path 26373a17974SMatthias Ringwald global java_event_template 26473a17974SMatthias Ringwald 26573a17974SMatthias Ringwald param_read = { 266*dbd33601SMatthias Ringwald '1' : 'return self.payload[{offset}]', 267*dbd33601SMatthias Ringwald 'J' : 'return self.payload[{offset}]', 268*dbd33601SMatthias Ringwald '2' : 'return struct.unpack("<H", self.payload[{offset}, {offset}+2])', 269*dbd33601SMatthias Ringwald 'H' : 'return struct.unpack("<H", self.payload[{offset}, {offset}+2])', 270*dbd33601SMatthias Ringwald 'L' : 'return struct.unpack("<H", self.payload[{offset}, {offset}+2])', 271*dbd33601SMatthias Ringwald '3' : 'return btstack.btstack_types.unpack24(self.payload[{offset}:3])', 272*dbd33601SMatthias Ringwald '4' : 'return struct.unpack("<I", self.payload[{offset}, {offset}+4])', 273*dbd33601SMatthias Ringwald 'B' : 'return btstack.btstack_types.BD_ADDR(self.payload[{offset}:6])', 274*dbd33601SMatthias Ringwald 'X' : 'return btstack.btstack_types.GATTService(self.payload[{offset}:20])', 275*dbd33601SMatthias Ringwald 'Y' : 'return btstack.btstack_types.GATTCharacteristic(self.payload[{offset}:24])', 276*dbd33601SMatthias Ringwald 'Z' : 'return btstack.btstack_types.GATTCharacteristicDescriptor(self.payload[{offset}:18])', 277*dbd33601SMatthias Ringwald 'T' : '# TODO - convert remaining bytes from {offset} into string object', 278*dbd33601SMatthias Ringwald 'N' : '# TODO - convert 248 bytes from {offset} into string object', 279*dbd33601SMatthias Ringwald # 'D' : 'Util.storeBytes(self.payload, %u, 8);', 280*dbd33601SMatthias Ringwald # 'Q' : 'Util.storeBytes(self.payload, %u, 32);', 28173a17974SMatthias Ringwald # 'E' : 'Util.storeBytes(data, %u, 240);', 28273a17974SMatthias Ringwald # 'P' : 'Util.storeBytes(data, %u, 16);', 28373a17974SMatthias Ringwald # 'A' : 'Util.storeBytes(data, %u, 31);', 28473a17974SMatthias Ringwald # 'S' : 'Util.storeBytes(data, %u);' 28573a17974SMatthias Ringwald } 28673a17974SMatthias Ringwald 28773a17974SMatthias Ringwald offset = 2 28873a17974SMatthias Ringwald getters = '' 28973a17974SMatthias Ringwald length_name = '' 29073a17974SMatthias Ringwald for f, arg in zip(format, args): 29173a17974SMatthias Ringwald # just remember name 29273a17974SMatthias Ringwald if f in ['L','J']: 293*dbd33601SMatthias Ringwald length_name = arg.lower() 29473a17974SMatthias Ringwald if f == 'R': 29573a17974SMatthias Ringwald # remaining data 296*dbd33601SMatthias Ringwald access = java_event_getter_remaining_data.format(offset=offset) 29773a17974SMatthias Ringwald size = 0 29873a17974SMatthias Ringwald elif f == 'V': 299*dbd33601SMatthias Ringwald access = java_event_getter_data.format(length_name=length_name, offset=offset) 30073a17974SMatthias Ringwald size = 0 30173a17974SMatthias Ringwald elif f in ['D', 'Q']: 30273a17974SMatthias Ringwald size = size_for_type(f) 303*dbd33601SMatthias Ringwald access = java_event_getter_data_fixed.format(size=size, offset=offset) 30473a17974SMatthias Ringwald else: 305*dbd33601SMatthias Ringwald access = param_read[f].format(offset=offset) 30673a17974SMatthias Ringwald size = size_for_type(f) 307*dbd33601SMatthias Ringwald getters += java_event_getter.format(java_type_for_btstack_type(f), arg.lower(), access) 30873a17974SMatthias Ringwald offset += size 30973a17974SMatthias Ringwald to_string_args = '' 31073a17974SMatthias Ringwald for arg in args: 311*dbd33601SMatthias Ringwald to_string_args += ' # t.append(", %s = ");\n' % arg 312*dbd33601SMatthias Ringwald to_string_args += ' # t.append(get%s());\n' % parser.camel_case(arg) 31373a17974SMatthias Ringwald to_string_method = java_event_to_string.format(event_name, to_string_args) 314*dbd33601SMatthias Ringwald fout.write(java_event_template.format(event_name, getters, to_string_method)) 31573a17974SMatthias Ringwald 31673a17974SMatthias Ringwalddef event_supported(event_name): 31773a17974SMatthias Ringwald parts = event_name.split('_') 31873a17974SMatthias Ringwald return parts[0] in ['ATT', 'BTSTACK', 'DAEMON', 'L2CAP', 'RFCOMM', 'SDP', 'GATT', 'GAP', 'HCI', 'SM', 'BNEP'] 31973a17974SMatthias Ringwald 32073a17974SMatthias Ringwalddef class_name_for_event(event_name): 32173a17974SMatthias Ringwald return parser.camel_case(event_name.replace('SUBEVENT','EVENT')) 32273a17974SMatthias Ringwald 323b2929115SMatthias Ringwalddef create_events(fout, events): 32473a17974SMatthias Ringwald global gen_path 32573a17974SMatthias Ringwald gen_path_events = gen_path + '/event' 32673a17974SMatthias Ringwald parser.assert_dir(gen_path_events) 32773a17974SMatthias Ringwald 32873a17974SMatthias Ringwald for event_type, event_name, format, args in events: 32973a17974SMatthias Ringwald if not event_supported(event_name): 33073a17974SMatthias Ringwald continue 33173a17974SMatthias Ringwald class_name = class_name_for_event(event_name) 332b2929115SMatthias Ringwald create_event(fout, class_name, format, args) 33373a17974SMatthias Ringwald 33473a17974SMatthias Ringwald 33573a17974SMatthias Ringwalddef create_event_factory(events, subevents, defines): 33673a17974SMatthias Ringwald global gen_path 33773a17974SMatthias Ringwald global java_event_factory_event 33873a17974SMatthias Ringwald global java_event_factory_template 33973a17974SMatthias Ringwald 340b2929115SMatthias Ringwald outfile = '%s/event_factory.py' % gen_path 34173a17974SMatthias Ringwald 34273a17974SMatthias Ringwald cases = '' 34373a17974SMatthias Ringwald for event_type, event_name, format, args in events: 34473a17974SMatthias Ringwald event_name = parser.camel_case(event_name) 34573a17974SMatthias Ringwald cases += java_event_factory_event.format(event_type, event_name) 34673a17974SMatthias Ringwald subcases = '' 34773a17974SMatthias Ringwald for event_type, event_name, format, args in subevents: 34873a17974SMatthias Ringwald if not event_supported(event_name): 34973a17974SMatthias Ringwald continue 35073a17974SMatthias Ringwald class_name = class_name_for_event(event_name) 35173a17974SMatthias Ringwald subcases += java_event_factory_subevent.format(event_type, class_name) 35273a17974SMatthias Ringwald 35373a17974SMatthias Ringwald with open(outfile, 'wt') as fout: 354b2929115SMatthias Ringwald # event classes 355b2929115SMatthias Ringwald create_events(fout, events) 356b2929115SMatthias Ringwald create_events(fout, subevents) 357b2929115SMatthias Ringwald # 358b2929115SMatthias Ringwald defines_text = python_defines_string(defines) 359*dbd33601SMatthias Ringwald fout.write(java_event_factory_template.format(defines_text, cases, subcases)) 36073a17974SMatthias Ringwald 36173a17974SMatthias Ringwald# find root 36273a17974SMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..') 36373a17974SMatthias Ringwaldgen_path = btstack_root + '/platform/daemon/binding/python/btstack/' 36473a17974SMatthias Ringwald 36573a17974SMatthias Ringwald 36673a17974SMatthias Ringwald# read defines from hci_cmds.h and hci.h 36773a17974SMatthias Ringwalddefines = parser.parse_defines() 36873a17974SMatthias Ringwald 36973a17974SMatthias Ringwald# parse commands 3709fb9416bSMatthias Ringwaldcommands = parser.parse_commands(camel_case=False) 37173a17974SMatthias Ringwald 37273a17974SMatthias Ringwald# parse bluetooth.h to get used events 373b2929115SMatthias Ringwald(events, le_events, event_types) = parser.parse_events() 37473a17974SMatthias Ringwald 37573a17974SMatthias Ringwald# create events, le meta events, event factory, and 376b2929115SMatthias Ringwaldcreate_event_factory(events, le_events, event_types) 37773a17974SMatthias Ringwaldcreate_command_builder(commands) 37873a17974SMatthias Ringwald 37973a17974SMatthias Ringwald# done 38073a17974SMatthias Ringwaldprint('Done!') 381