buildcommands: Move DECL_STATIC_STR code to its own class
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
9cb98a00fc
commit
334507306b
|
@ -59,6 +59,41 @@ void
|
||||||
Handlers.append(HandleCallList())
|
Handlers.append(HandleCallList())
|
||||||
|
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Static string generation
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
STATIC_STRING_MIN = 2
|
||||||
|
|
||||||
|
# Generate a dynamic string to integer mapping
|
||||||
|
class HandleStaticStrings:
|
||||||
|
def __init__(self):
|
||||||
|
self.static_strings = []
|
||||||
|
self.ctr_dispatch = { '_DECL_STATIC_STR': self.decl_static_str }
|
||||||
|
def decl_static_str(self, req):
|
||||||
|
msg = req.split(None, 1)[1]
|
||||||
|
self.static_strings.append(msg)
|
||||||
|
def update_data_dictionary(self, data):
|
||||||
|
data['static_strings'] = { i + STATIC_STRING_MIN: s
|
||||||
|
for i, s in enumerate(self.static_strings) }
|
||||||
|
def generate_code(self):
|
||||||
|
code = []
|
||||||
|
for i, s in enumerate(self.static_strings):
|
||||||
|
code.append(' if (__builtin_strcmp(str, "%s") == 0)\n'
|
||||||
|
' return %d;\n' % (s, i + STATIC_STRING_MIN))
|
||||||
|
fmt = """
|
||||||
|
uint8_t __always_inline
|
||||||
|
ctr_lookup_static_string(const char *str)
|
||||||
|
{
|
||||||
|
%s
|
||||||
|
return 0xff;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
return fmt % ("".join(code).strip(),)
|
||||||
|
|
||||||
|
Handlers.append(HandleStaticStrings())
|
||||||
|
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
# Command and output parser generation
|
# Command and output parser generation
|
||||||
######################################################################
|
######################################################################
|
||||||
|
@ -137,23 +172,6 @@ ctr_lookup_output(const char *str)
|
||||||
return fmt % ("".join(encoder_defs).strip(), "".join(encoder_code).strip(),
|
return fmt % ("".join(encoder_defs).strip(), "".join(encoder_code).strip(),
|
||||||
"".join(output_code).strip())
|
"".join(output_code).strip())
|
||||||
|
|
||||||
STATIC_STRING_MIN = 2
|
|
||||||
|
|
||||||
def build_static_strings(static_strings):
|
|
||||||
code = []
|
|
||||||
for i, s in enumerate(static_strings):
|
|
||||||
code.append(' if (__builtin_strcmp(str, "%s") == 0)\n'
|
|
||||||
' return %d;\n' % (s, i + STATIC_STRING_MIN))
|
|
||||||
fmt = """
|
|
||||||
uint8_t __always_inline
|
|
||||||
ctr_lookup_static_string(const char *str)
|
|
||||||
{
|
|
||||||
%s
|
|
||||||
return 0xff;
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
return fmt % ("".join(code).strip(),)
|
|
||||||
|
|
||||||
def build_param_types(all_param_types):
|
def build_param_types(all_param_types):
|
||||||
sorted_param_types = sorted([(i, a) for a, i in all_param_types.items()])
|
sorted_param_types = sorted([(i, a) for a, i in all_param_types.items()])
|
||||||
params = ['']
|
params = ['']
|
||||||
|
@ -199,16 +217,16 @@ const uint8_t command_index_size PROGMEM = ARRAY_SIZE(command_index);
|
||||||
# Identify data dictionary generation
|
# Identify data dictionary generation
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
def build_identify(cmd_by_id, msg_to_id, responses, static_strings
|
def build_identify(cmd_by_id, msg_to_id, responses
|
||||||
, constants, version, toolstr):
|
, constants, version, toolstr):
|
||||||
#commands, messages, static_strings
|
#commands, messages
|
||||||
messages = dict((msgid, msg) for msg, msgid in msg_to_id.items())
|
messages = dict((msgid, msg) for msg, msgid in msg_to_id.items())
|
||||||
data = {}
|
data = {}
|
||||||
|
for h in Handlers:
|
||||||
|
h.update_data_dictionary(data)
|
||||||
data['messages'] = messages
|
data['messages'] = messages
|
||||||
data['commands'] = sorted(cmd_by_id.keys())
|
data['commands'] = sorted(cmd_by_id.keys())
|
||||||
data['responses'] = sorted(responses)
|
data['responses'] = sorted(responses)
|
||||||
data['static_strings'] = { i + STATIC_STRING_MIN: static_strings[i]
|
|
||||||
for i in range(len(static_strings)) }
|
|
||||||
data['config'] = constants
|
data['config'] = constants
|
||||||
data['version'] = version
|
data['version'] = version
|
||||||
data['build_versions'] = toolstr
|
data['build_versions'] = toolstr
|
||||||
|
@ -335,7 +353,6 @@ def main():
|
||||||
messages_by_name = dict((m.split()[0], m)
|
messages_by_name = dict((m.split()[0], m)
|
||||||
for m in msgproto.DefaultMessages.values())
|
for m in msgproto.DefaultMessages.values())
|
||||||
encoders = []
|
encoders = []
|
||||||
static_strings = []
|
|
||||||
constants = {}
|
constants = {}
|
||||||
# Parse request file
|
# Parse request file
|
||||||
ctr_dispatch = { k: v for h in Handlers for k, v in h.ctr_dispatch.items() }
|
ctr_dispatch = { k: v for h in Handlers for k, v in h.ctr_dispatch.items() }
|
||||||
|
@ -370,8 +387,6 @@ def main():
|
||||||
encoders.append((msgname, msg))
|
encoders.append((msgname, msg))
|
||||||
elif cmd == '_DECL_OUTPUT':
|
elif cmd == '_DECL_OUTPUT':
|
||||||
encoders.append((None, msg))
|
encoders.append((None, msg))
|
||||||
elif cmd == '_DECL_STATIC_STR':
|
|
||||||
static_strings.append(req[17:])
|
|
||||||
elif cmd == '_DECL_CONSTANT':
|
elif cmd == '_DECL_CONSTANT':
|
||||||
name, value = parts[1:]
|
name, value = parts[1:]
|
||||||
value = value.strip()
|
value = value.strip()
|
||||||
|
@ -393,7 +408,6 @@ def main():
|
||||||
# Create message definitions
|
# Create message definitions
|
||||||
all_param_types = {}
|
all_param_types = {}
|
||||||
parsercode = build_encoders(encoders, msg_to_id, all_param_types)
|
parsercode = build_encoders(encoders, msg_to_id, all_param_types)
|
||||||
static_strings_code = build_static_strings(static_strings)
|
|
||||||
# Create command definitions
|
# Create command definitions
|
||||||
cmd_by_id = dict((msg_to_id[messages_by_name.get(msgname, msgname)], cmd)
|
cmd_by_id = dict((msg_to_id[messages_by_name.get(msgname, msgname)], cmd)
|
||||||
for msgname, cmd in commands.items())
|
for msgname, cmd in commands.items())
|
||||||
|
@ -406,12 +420,11 @@ def main():
|
||||||
responses = [msg_to_id[msg] for msgname, msg in messages_by_name.items()
|
responses = [msg_to_id[msg] for msgname, msg in messages_by_name.items()
|
||||||
if msgname not in commands]
|
if msgname not in commands]
|
||||||
datadict, icode = build_identify(
|
datadict, icode = build_identify(
|
||||||
cmd_by_id, msg_to_id, responses,
|
cmd_by_id, msg_to_id, responses, constants, version, toolstr)
|
||||||
static_strings, constants, version, toolstr)
|
|
||||||
# Write output
|
# Write output
|
||||||
f = open(outcfile, 'wb')
|
f = open(outcfile, 'wb')
|
||||||
f.write(FILEHEADER + "".join([h.generate_code() for h in Handlers])
|
f.write(FILEHEADER + "".join([h.generate_code() for h in Handlers])
|
||||||
+ static_strings_code + paramcode + parsercode + cmdcode + icode)
|
+ paramcode + parsercode + cmdcode + icode)
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
# Write data dictionary
|
# Write data dictionary
|
||||||
|
|
Loading…
Reference in New Issue