Merge branch 'master' into ble-api-cleanup

This commit is contained in:
Matthias Ringwald 2016-01-28 22:27:52 +01:00
commit bfd81087a7
2 changed files with 19 additions and 104 deletions

View File

@ -17,7 +17,7 @@
<target name="generate">
<mkdir dir="${gen.dir}"/>
<exec executable="../../tool/generate.py"/>
<exec executable="../../tool/java_binding.py"/>
</target>
<target name="compile" depends="generate">

View File

@ -1,14 +1,16 @@
#!/usr/bin/env python
# BlueKtichen GmbH (c) 2014
# BlueKitchen GmbH (c) 2014
import glob
import re
import sys
import os
import btstack_parser as parser
print('''
Java binding generator for BTstack
Copyright 2015, BlueKitchen GmbH
Copyright 2014, BlueKitchen GmbH
''')
# com.bluekitchen.btstack.BTstack.java templates
@ -130,14 +132,8 @@ java_event_to_string = \
# global variables/defines
package='com.bluekitchen.btstack'
package ='com.bluekitchen.btstack'
gen_path = 'gen/' + package.replace('.', '/')
hci_cmds_h_path = '../../src/hci_cmd.h'
hci_cmds_c_path = '../../src/hci_cmd.c'
daemon_cmds_c_path = '../../platform/daemon/daemon_cmds.c'
hci_h_path = '../../src/hci.h'
bluetooth_h_path = '../../src/bluetooth.h'
btstack_defines_h_path = '../../src/btstack_defines.h'
defines = dict()
defines_used = set()
@ -157,22 +153,6 @@ def cap(x):
def camel_case(name):
return ''.join(map(cap, name.split('_')))
def camel_case_var(name):
if name in ['uuid128', 'uuid16']:
return name
camel = camel_case(name)
return camel[0].lower() + camel[1:]
def read_defines(infile):
global defines
with open (infile, 'rt') as fin:
for line in fin:
parts = re.match('#define\s+(\w+)\s+(\w*)',line)
if parts and len(parts.groups()) == 2:
(key, value) = parts.groups()
defines[key] = value
def java_type_for_btstack_type(type):
param_types = { '1' : 'int', '2' : 'int', '3' : 'int', '4' : 'long', 'H' : 'int', 'B' : 'BD_ADDR',
'D' : 'byte []', 'E' : 'byte [] ', 'N' : 'String' , 'P' : 'byte []', 'A' : 'byte []',
@ -270,7 +250,7 @@ def java_define_string(key):
def java_defines_string(keys):
return '\n'.join( map(java_define_string, sorted(keys)))
def parse_commands(infile):
def create_btstack_java(commands):
global gen_path
assert_dir(gen_path)
@ -281,39 +261,11 @@ def parse_commands(infile):
fout.write(java_btstack_header % package)
with open (infile, 'rt') as fin:
params = []
for line in fin:
parts = re.match('.*@param\s*(\w*)\s*', line)
if parts and len(parts.groups()) == 1:
param = parts.groups()[0]
params.append(camel_case_var(param))
continue
declaration = re.match('const\s+hci_cmd_t\s+(\w+)[\s=]+', line)
if declaration:
command_name = camel_case(declaration.groups()[0])
if command_name.endswith('Cmd'):
command_name = command_name[:-len('Cmd')]
continue
definition = re.match('\s*OPCODE\\(\s*(\w+)\s*,\s+(\w+)\s*\\)\s*,\s\\"(\w*)\\".*', line)
if definition:
(ogf, ocf, format) = definition.groups()
if len(params) != len(format):
params = []
arg_counter = 1
for f in format:
arg_name = 'arg%u' % arg_counter
params.append(arg_name)
arg_counter += 1
create_command_java(fout, command_name, ogf, ocf, format, params);
mark_define_as_used(ogf)
mark_define_as_used(ocf)
params = []
continue
for command in commands:
(command_name, ogf, ocf, format, params) = command
create_command_java(fout, command_name, ogf, ocf, format, params);
mark_define_as_used(ogf)
mark_define_as_used(ocf)
fout.write('\n /** defines used */\n\n')
for key in sorted(defines_used):
@ -406,58 +358,21 @@ def create_event_factory(events, le_events, defines):
defines_text = java_defines_string(defines)
fout.write(java_event_factory_template.format(package, defines_text, cases, subcases))
def parse_events(path):
global gen_path
events = []
le_events = []
params = []
event_types = set()
format = None
with open (path, 'rt') as fin:
for line in fin:
parts = re.match('.*@format\s*(\w*)\s*', line)
if parts and len(parts.groups()) == 1:
format = parts.groups()[0]
parts = re.match('.*@param\s*(\w*)\s*', line)
if parts and len(parts.groups()) == 1:
param = parts.groups()[0]
params.append(param)
parts = re.match('\s*#define\s+(\w+)\s+(\w*)',line)
if parts and len(parts.groups()) == 2:
(key, value) = parts.groups()
if format != None:
if key.lower().startswith('hci_subevent_'):
le_events.append((value, key.lower().replace('hci_subevent_', 'hci_event_'), format, params))
else:
events.append((value, key, format, params))
event_types.add(key)
params = []
format = None
return (events, le_events, event_types)
# read defines from hci_cmd.h and hci.h
read_defines(hci_cmds_h_path)
read_defines(hci_h_path)
read_defines(bluetooth_h_path)
read_defines(btstack_defines_h_path)
# read defines from hci_cmds.h and hci.h
defines = parser.parse_defines()
# parse commands and generate BTstack.java
parse_commands(hci_cmds_c_path)
parse_commands(daemon_cmds_c_path)
# # parse commands
commands = parser.parse_commands()
# parse bluetooth.h to get used events
(bluetooth_events, bluetooth_le_events, bluetooth_event_types) = parse_events(bluetooth_h_path)
(events, le_events, event_types) = parser.parse_events()
# parse btstack_defines to get events
(btstack_events, btstack_le_events, btstack_event_types) = parse_events(btstack_defines_h_path)
# concat lists
(events, le_events, event_types) = (bluetooth_events + btstack_events, bluetooth_le_events + btstack_le_events, bluetooth_event_types | btstack_event_types)
# create events, le meta events, and event factory
# create events, le meta events, event factory, and
create_events(events)
create_events(le_events)
create_event_factory(events, le_events, event_types)
create_btstack_java(commands)
# done
print('Done!')