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 ---