python_generator.py (9fb9416b065bab7144ed8aae4d2cac07fe588a81) | python_generator.py (dbd33601372b921c6b07059b9f4582fdd1b4b365) |
---|---|
1#!/usr/bin/env python 2# BlueKitchen GmbH (c) 2018 3 4import glob 5import re 6import sys 7import os 8 --- 35 unchanged lines hidden (view full) --- 44 cmd_args = bytes() 45{args_builder} 46 cmd = struct.pack("<HB", opcode(self.{ogf}, self.{ocf}), len(cmd_args)) + cmd_args 47 return self.send_hci_command(cmd) 48''' 49 50# com.bluekitchen.btstack.EventFactory template 51java_event_factory_template = \ | 1#!/usr/bin/env python 2# BlueKitchen GmbH (c) 2018 3 4import glob 5import re 6import sys 7import os 8 --- 35 unchanged lines hidden (view full) --- 44 cmd_args = bytes() 45{args_builder} 46 cmd = struct.pack("<HB", opcode(self.{ogf}, self.{ocf}), len(cmd_args)) + cmd_args 47 return self.send_hci_command(cmd) 48''' 49 50# com.bluekitchen.btstack.EventFactory template 51java_event_factory_template = \ |
52'''package {0}; | 52''' |
53 | 53 |
54import {0}.event.*; | 54class EventFactory(object: |
55 | 55 |
56public class EventFactory {{ | 56 # @brief event codes |
57 | 57 |
58 /** @brief event codes */ | 58{0} 59 def event_for_packet(packet): 60 event_type = packet.get_payload()[0] 61 # switch (eventType){{ 62{1} 63 # case 0x3e: // LE_META_EVENT 64 # int subEventType = Util.readByte(packet.getBuffer(), 2); 65 # switch (subEventType){{ 66{2} 67 # default: 68 # return new Event(packet); |
59 | 69 |
60{1} 61 public static Event eventForPacket(Packet packet){{ 62 int eventType = Util.readByte(packet.getBuffer(), 0); 63 switch (eventType){{ 64{2} 65 case 0x3e: // LE_META_EVENT 66 int subEventType = Util.readByte(packet.getBuffer(), 2); 67 switch (subEventType){{ 68{3} 69 default: 70 return new Event(packet); 71 }} 72 73 default: 74 return new Event(packet); | 70 # default: 71 # return new Event(packet); |
75 }} 76 }} 77}} 78''' 79java_event_factory_event = ''' 80 case {0}: 81 return new {1}(packet); 82''' 83java_event_factory_subevent = ''' 84 case {0}: 85 return new {1}(packet); 86''' 87 88# com.bluekitchen.btstack.events.* template 89java_event_template = \ | 72 }} 73 }} 74}} 75''' 76java_event_factory_event = ''' 77 case {0}: 78 return new {1}(packet); 79''' 80java_event_factory_subevent = ''' 81 case {0}: 82 return new {1}(packet); 83''' 84 85# com.bluekitchen.btstack.events.* template 86java_event_template = \ |
90'''package {0}.event; | 87''' |
91 | 88 |
92import {0}.*; | 89class {0}(Event): |
93 | 90 |
94public class {1} extends Event {{ 95 96 public {1}(Packet packet) {{ 97 super(packet); 98 }} | 91 def __init__(self, packet): 92 # super(packet); 93 {1} |
99 {2} | 94 {2} |
100 {3} 101}} | |
102''' 103 104java_event_getter = \ 105''' | 95''' 96 97java_event_getter = \ 98''' |
106 /** 107 * @return {1} as {0} 108 */ 109 public {0} get{1}(){{ | 99 # @return {1} as {0} 100 def get_{1}(self): |
110 {2} | 101 {2} |
111 }} | |
112''' 113 114java_event_getter_data = \ | 102''' 103 104java_event_getter_data = \ |
115'''int len = get{0}(); 116 byte[] result = new byte[len]; 117 System.arraycopy(data, {1}, result, 0, len); 118 return result;''' | 105'''# java_event_getter_data 106 # int len = get{length_name}(); 107 # byte[] result = new byte[len]; 108 # System.arraycopy(data, {offset}, result, 0, len); 109 # return result;''' |
119 120java_event_getter_data_fixed = \ | 110 111java_event_getter_data_fixed = \ |
121'''int len = {0}; 122 byte[] result = new byte[len]; 123 System.arraycopy(data, {1}, result, 0, len); 124 return result;''' | 112'''# java_event_getter_data_fixed 113 # int len = {size}; 114 # byte[] result = new byte[len]; 115 # System.arraycopy(data, {offset}, result, 0, len); 116 # return result;''' |
125 126java_event_getter_remaining_data = \ | 117 118java_event_getter_remaining_data = \ |
127'''int len = getPayloadLen() - {0}; 128 byte[] result = new byte[len]; 129 System.arraycopy(data, {0}, result, 0, len); 130 return result;''' | 119'''# java_event_getter_remaining_data 120 # int len = getPayloadLen() - {offset}; 121 # byte[] result = new byte[len]; 122 # System.arraycopy(data, {offset}, result, 0, len); 123 # return result;''' |
131 132java_event_to_string = \ | 124 125java_event_to_string = \ |
126'''# java_event_to_string 127 def __str__(self): 128 # StringBuffer t = new StringBuffer(); 129 # t.append("{0} < type = "); 130 # t.append(String.format("0x%02x, ", getEventType())); 131 # t.append(getEventType()); 132{1} 133 # t.append(" >"); 134 # return t.toString(); |
|
133''' | 135''' |
134 public String toString(){{ 135 StringBuffer t = new StringBuffer(); 136 t.append("{0} < type = "); 137 t.append(String.format("0x%02x, ", getEventType())); 138 t.append(getEventType()); 139{1} t.append(" >"); 140 return t.toString(); 141 }} 142''' | |
143 144 145# global variables/defines 146package ='com.bluekitchen.btstack' 147gen_path = 'gen/' + package.replace('.', '/') 148 149defines = dict() 150defines_used = set() --- 111 unchanged lines hidden (view full) --- 262 mark_define_as_used(ocf) 263 264 fout.write('\n # defines used\n\n') 265 for key in sorted(defines_used): 266 fout.write(python_define_string(key)) 267 268def create_event(fout, event_name, format, args): 269 global gen_path | 136 137 138# global variables/defines 139package ='com.bluekitchen.btstack' 140gen_path = 'gen/' + package.replace('.', '/') 141 142defines = dict() 143defines_used = set() --- 111 unchanged lines hidden (view full) --- 255 mark_define_as_used(ocf) 256 257 fout.write('\n # defines used\n\n') 258 for key in sorted(defines_used): 259 fout.write(python_define_string(key)) 260 261def create_event(fout, event_name, format, args): 262 global gen_path |
270 global package | |
271 global java_event_template 272 273 param_read = { | 263 global java_event_template 264 265 param_read = { |
274 '1' : 'return Util.readByte(data, %u);', 275 'J' : 'return Util.readByte(data, %u);', 276 '2' : 'return Util.readBt16(data, %u);', 277 'H' : 'return Util.readBt16(data, %u);', 278 'L' : 'return Util.readBt16(data, %u);', 279 '3' : 'return Util.readBt24(data, %u);', 280 '4' : 'return Util.readBt32(data, %u);', 281 'B' : 'return Util.readBdAddr(data, %u);', 282 'X' : 'return Util.readGattService(data, %u);', 283 'Y' : 'return Util.readGattCharacteristic(data, %u);', 284 'Z' : 'return Util.readGattCharacteristicDescriptor(data, %u);', 285 'T' : 'int offset = %u; \n return Util.getText(data, offset, getPayloadLen()-offset);', 286 'N' : 'return Util.getText(data, %u, 248);', 287 'D' : 'Util.storeBytes(data, %u, 8);', 288 'Q' : 'Util.storeBytes(data, %u, 32);', | 266 '1' : 'return self.payload[{offset}]', 267 'J' : 'return self.payload[{offset}]', 268 '2' : 'return struct.unpack("<H", self.payload[{offset}, {offset}+2])', 269 'H' : 'return struct.unpack("<H", self.payload[{offset}, {offset}+2])', 270 'L' : 'return struct.unpack("<H", self.payload[{offset}, {offset}+2])', 271 '3' : 'return btstack.btstack_types.unpack24(self.payload[{offset}:3])', 272 '4' : 'return struct.unpack("<I", self.payload[{offset}, {offset}+4])', 273 'B' : 'return btstack.btstack_types.BD_ADDR(self.payload[{offset}:6])', 274 'X' : 'return btstack.btstack_types.GATTService(self.payload[{offset}:20])', 275 'Y' : 'return btstack.btstack_types.GATTCharacteristic(self.payload[{offset}:24])', 276 'Z' : 'return btstack.btstack_types.GATTCharacteristicDescriptor(self.payload[{offset}:18])', 277 'T' : '# TODO - convert remaining bytes from {offset} into string object', 278 'N' : '# TODO - convert 248 bytes from {offset} into string object', 279 # 'D' : 'Util.storeBytes(self.payload, %u, 8);', 280 # 'Q' : 'Util.storeBytes(self.payload, %u, 32);', |
289 # 'E' : 'Util.storeBytes(data, %u, 240);', 290 # 'P' : 'Util.storeBytes(data, %u, 16);', 291 # 'A' : 'Util.storeBytes(data, %u, 31);', 292 # 'S' : 'Util.storeBytes(data, %u);' 293 } 294 295 offset = 2 296 getters = '' 297 length_name = '' 298 for f, arg in zip(format, args): 299 # just remember name 300 if f in ['L','J']: | 281 # 'E' : 'Util.storeBytes(data, %u, 240);', 282 # 'P' : 'Util.storeBytes(data, %u, 16);', 283 # 'A' : 'Util.storeBytes(data, %u, 31);', 284 # 'S' : 'Util.storeBytes(data, %u);' 285 } 286 287 offset = 2 288 getters = '' 289 length_name = '' 290 for f, arg in zip(format, args): 291 # just remember name 292 if f in ['L','J']: |
301 length_name = parser.camel_case(arg) | 293 length_name = arg.lower() |
302 if f == 'R': 303 # remaining data | 294 if f == 'R': 295 # remaining data |
304 access = java_event_getter_remaining_data.format(offset) | 296 access = java_event_getter_remaining_data.format(offset=offset) |
305 size = 0 306 elif f == 'V': | 297 size = 0 298 elif f == 'V': |
307 access = java_event_getter_data.format(length_name, offset) | 299 access = java_event_getter_data.format(length_name=length_name, offset=offset) |
308 size = 0 309 elif f in ['D', 'Q']: 310 size = size_for_type(f) | 300 size = 0 301 elif f in ['D', 'Q']: 302 size = size_for_type(f) |
311 access = java_event_getter_data_fixed.format(size, offset) | 303 access = java_event_getter_data_fixed.format(size=size, offset=offset) |
312 else: | 304 else: |
313 access = param_read[f] % offset | 305 access = param_read[f].format(offset=offset) |
314 size = size_for_type(f) | 306 size = size_for_type(f) |
315 getters += java_event_getter.format(java_type_for_btstack_type(f), parser.camel_case(arg), access) | 307 getters += java_event_getter.format(java_type_for_btstack_type(f), arg.lower(), access) |
316 offset += size 317 to_string_args = '' 318 for arg in args: | 308 offset += size 309 to_string_args = '' 310 for arg in args: |
319 to_string_args += ' t.append(", %s = ");\n' % arg 320 to_string_args += ' t.append(get%s());\n' % parser.camel_case(arg) | 311 to_string_args += ' # t.append(", %s = ");\n' % arg 312 to_string_args += ' # t.append(get%s());\n' % parser.camel_case(arg) |
321 to_string_method = java_event_to_string.format(event_name, to_string_args) | 313 to_string_method = java_event_to_string.format(event_name, to_string_args) |
322 fout.write(java_event_template.format(package, event_name, getters, to_string_method)) | 314 fout.write(java_event_template.format(event_name, getters, to_string_method)) |
323 324def event_supported(event_name): 325 parts = event_name.split('_') 326 return parts[0] in ['ATT', 'BTSTACK', 'DAEMON', 'L2CAP', 'RFCOMM', 'SDP', 'GATT', 'GAP', 'HCI', 'SM', 'BNEP'] 327 328def class_name_for_event(event_name): 329 return parser.camel_case(event_name.replace('SUBEVENT','EVENT')) 330 --- 6 unchanged lines hidden (view full) --- 337 if not event_supported(event_name): 338 continue 339 class_name = class_name_for_event(event_name) 340 create_event(fout, class_name, format, args) 341 342 343def create_event_factory(events, subevents, defines): 344 global gen_path | 315 316def event_supported(event_name): 317 parts = event_name.split('_') 318 return parts[0] in ['ATT', 'BTSTACK', 'DAEMON', 'L2CAP', 'RFCOMM', 'SDP', 'GATT', 'GAP', 'HCI', 'SM', 'BNEP'] 319 320def class_name_for_event(event_name): 321 return parser.camel_case(event_name.replace('SUBEVENT','EVENT')) 322 --- 6 unchanged lines hidden (view full) --- 329 if not event_supported(event_name): 330 continue 331 class_name = class_name_for_event(event_name) 332 create_event(fout, class_name, format, args) 333 334 335def create_event_factory(events, subevents, defines): 336 global gen_path |
345 global package | |
346 global java_event_factory_event 347 global java_event_factory_template 348 349 outfile = '%s/event_factory.py' % gen_path 350 351 cases = '' 352 for event_type, event_name, format, args in events: 353 event_name = parser.camel_case(event_name) --- 6 unchanged lines hidden (view full) --- 360 subcases += java_event_factory_subevent.format(event_type, class_name) 361 362 with open(outfile, 'wt') as fout: 363 # event classes 364 create_events(fout, events) 365 create_events(fout, subevents) 366 # 367 defines_text = python_defines_string(defines) | 337 global java_event_factory_event 338 global java_event_factory_template 339 340 outfile = '%s/event_factory.py' % gen_path 341 342 cases = '' 343 for event_type, event_name, format, args in events: 344 event_name = parser.camel_case(event_name) --- 6 unchanged lines hidden (view full) --- 351 subcases += java_event_factory_subevent.format(event_type, class_name) 352 353 with open(outfile, 'wt') as fout: 354 # event classes 355 create_events(fout, events) 356 create_events(fout, subevents) 357 # 358 defines_text = python_defines_string(defines) |
368 fout.write(java_event_factory_template.format(package, defines_text, cases, subcases)) | 359 fout.write(java_event_factory_template.format(defines_text, cases, subcases)) |
369 370# find root 371btstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..') 372gen_path = btstack_root + '/platform/daemon/binding/python/btstack/' 373 374 375# read defines from hci_cmds.h and hci.h 376defines = parser.parse_defines() --- 13 unchanged lines hidden --- | 360 361# find root 362btstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..') 363gen_path = btstack_root + '/platform/daemon/binding/python/btstack/' 364 365 366# read defines from hci_cmds.h and hci.h 367defines = parser.parse_defines() --- 13 unchanged lines hidden --- |