Compare commits

..

7 Commits

3 changed files with 99 additions and 16 deletions

View File

@@ -2,7 +2,7 @@
__author__ = "Louis Heredero" __author__ = "Louis Heredero"
__copyright__ = "Copyright 2023, Louis Heredero" __copyright__ = "Copyright 2023, Louis Heredero"
__license__ = "GPL3.0" __license__ = "GPL3.0"
__version__ = "1.1.0" __version__ = "1.2.0"
import json import json
import locale import locale
@@ -111,6 +111,8 @@ def main():
variables["filename_lc"] = variables["filename"].lower() variables["filename_lc"] = variables["filename"].lower()
variables["fn"] = get_input("Filename (short)", None, True).upper() variables["fn"] = get_input("Filename (short)", None, True).upper()
fn_uc = variables["filename"]
########## ##########
# States # # States #
########## ##########
@@ -126,17 +128,76 @@ def main():
else: else:
break break
states = ["ST"+variables["fn"]+"_"+s for s in states] prefix = "ST"+variables["fn"]+"_"
variables["STATES_ENUM"] = ",\n".join(states) variables["STATES_ENUM"] = ",\n".join([prefix+s for s in states])
states_cases = [] states_cases = []
states_cases_entry = []
states_cbs_struct = []
states_cbs_init = []
for state in states: for state in states:
case_ = f"case {state}:\n" case_ = "case {STATE}:\n"
case_ += " break;" case_ += " break;"
case_ = case_.replace("{STATE}", prefix+state)
states_cases.append(case_) states_cases.append(case_)
case_ = "case {STATE}:\n"
case_ += " if (me->{state}.f != NULL) {\n"
case_ += " me->{state}.f(me->{state}.p);\n"
case_ += " }\n"
case_ += " break;"
case_ = case_.replace("{state}", state.lower()).replace("{STATE}", prefix+state)
states_cases_entry.append(case_)
states_cbs_struct.append(f"{fn_uc}_CALLBACK {state.lower()};")
states_cbs_init.append(f"me->{state.lower()}.f = NULL;")
variables["STATES_CASES"] = "\n\n".join(states_cases) variables["STATES_CASES"] = "\n\n".join(states_cases)
variables["STATES_CASES_ENTRY"] = "\n\n".join(states_cases_entry)
variables["STATES_CBS_STRUCT"] = "\n".join(states_cbs_struct)
variables["STATES_CBS_INIT"] = "\n".join(states_cbs_init)
#############
# Callbacks #
#############
callbacks_dec = []
callback_dec = ""
callback_dec += "/**\n"
callback_dec += " * Set the callback function to call when the {filename} is entering state {state}\n"
callback_dec += " * @param me the {filename} itself\n"
callback_dec += " * @param f the function to call\n"
callback_dec += " * @param p the param(s) to pass to the function\n"
callback_dec += " */\n"
callback_dec += "void {filename}_on{State}({filename}* me, {filename}_CALLBACK_FUNCTION f, void* p);"
callback_dec = callback_dec.replace("{filename}", fn_uc)
for state in states:
callbacks_dec.append(
callback_dec.replace("{state}", state.lower())
.replace("{State}", state.capitalize())
)
variables["CALLBACKS_DEC"] = "\n\n".join(callbacks_dec)
callbacks_def = []
callback_def = ""
callback_def += "void {filename}_on{State}({filename}* me, {filename}_CALLBACK_FUNCTION f, void* p) {\n"
callback_def += " me->{state}.f = f;\n"
callback_def += " me->{state}.p = p;\n"
callback_def += "}"
callback_def = callback_def.replace("{filename}", fn_uc)
for state in states:
callbacks_def.append(
callback_def.replace("{state}", state.lower())
.replace("{State}", state.capitalize())
)
variables["CALLBACKS_DEF"] = "\n\n".join(callbacks_def)
########## ##########
# Events # # Events #
@@ -147,7 +208,7 @@ def main():
print("Events (leave empty to end):") print("Events (leave empty to end):")
print("> init") print("> init")
while True: while True:
event = input("> ").lower() event = input("> ")
if event: if event:
events.append(event) events.append(event)
@@ -162,14 +223,14 @@ def main():
events_emits_def = [] events_emits_def = []
emit_def = "" emit_def = ""
emit_def += "void {filename}_emit{Event}({filename}* me, uint16_t t) {\n" emit_def += "void {filename}_emit{Event}({filename}* me, uint16_t t, int64_t data) {\n"
emit_def += " POST(me, &{filename}_processEvent, ev{fn}{event}, t, 0);\n" emit_def += " POST(me, &{filename}_processEvent, ev{fn}{event}, t, data);\n"
emit_def += "}" emit_def += "}"
emit_def = emit_def.replace("{filename}", variables["filename"]).replace("{fn}", variables["fn"]) emit_def = emit_def.replace("{filename}", fn_uc).replace("{fn}", variables["fn"])
for event in events[1:]: for event in events[1:]:
events_emits_def.append( events_emits_def.append(
emit_def.replace("{event}", event).replace("{Event}", event.capitalize()) emit_def.replace("{event}", event).replace("{Event}", ucfirst(event))
) )
variables["EVENTS_EMITS_DEF"] = "\n\n".join(events_emits_def) variables["EVENTS_EMITS_DEF"] = "\n\n".join(events_emits_def)
@@ -180,13 +241,14 @@ def main():
emit_dec += " * Emit the {event} event\n" emit_dec += " * Emit the {event} event\n"
emit_dec += " * @param me the {filename} itself\n" emit_dec += " * @param me the {filename} itself\n"
emit_dec += " * @param t time to wait in ms before triggering event\n" emit_dec += " * @param t time to wait in ms before triggering event\n"
emit_dec += " */" emit_dec += " * @param data data to put on the event for XF\n"
emit_dec += "void {filename}_emit{Event}({filename}* me, uint16_t t);" emit_dec += " */\n"
emit_dec = emit_dec.replace("{filename}", variables["filename"]) emit_dec += "void {filename}_emit{Event}({filename}* me, uint16_t t, int64_t data);"
emit_dec = emit_dec.replace("{filename}", fn_uc)
for event in events[1:]: for event in events[1:]:
events_emits_dec.append( events_emits_dec.append(
emit_dec.replace("{event}", event).replace("{Event}", event.capitalize()) emit_dec.replace("{event}", event).replace("{Event}", ucfirst(event))
) )
variables["EVENTS_EMITS_DEC"] = "\n\n".join(events_emits_dec) variables["EVENTS_EMITS_DEC"] = "\n\n".join(events_emits_dec)
@@ -204,10 +266,10 @@ def main():
setter_def += "void {filename}_set{Name}({filename}* me, {type} v) {\n" setter_def += "void {filename}_set{Name}({filename}* me, {type} v) {\n"
setter_def += " me->{name} = v;\n" setter_def += " me->{name} = v;\n"
setter_def += "}" setter_def += "}"
setter_def = setter_def.replace("{filename}", variables["filename"]) setter_def = setter_def.replace("{filename}", fn_uc)
setter_dec = "void {filename}_set{Name}({filename}* me, {type} v);" setter_dec = "void {filename}_set{Name}({filename}* me, {type} v);"
setter_dec = setter_dec.replace("{filename}", variables["filename"]) setter_dec = setter_dec.replace("{filename}", fn_uc)
print("Variables:") print("Variables:")
print("(leave name empty to end)") print("(leave name empty to end)")

View File

@@ -10,6 +10,7 @@
void ${filename}_init(${filename}* me){ void ${filename}_init(${filename}* me){
me->state = ST${fn}_INIT; me->state = ST${fn}_INIT;
${VARS_INIT} ${VARS_INIT}
${STATES_CBS_INIT}
} }
void ${filename}_startBehaviour(${filename}* me){ void ${filename}_startBehaviour(${filename}* me){
@@ -21,6 +22,7 @@ bool ${filename}_processEvent(Event* ev) {
${filename}* me = (${filename}*)Event_getTarget(ev); ${filename}* me = (${filename}*)Event_getTarget(ev);
${filename}_STATES oldState = me->state; ${filename}_STATES oldState = me->state;
evIDT evid = Event_getId(ev); evIDT evid = Event_getId(ev);
uint64_t data = Event_getData(ev);
switch (me->state) { // onState switch (me->state) { // onState
case ST${fn}_INIT: case ST${fn}_INIT:
@@ -44,7 +46,7 @@ bool ${filename}_processEvent(Event* ev) {
case ST${fn}_INIT: case ST${fn}_INIT:
break; break;
${STATES_CASES} ${STATES_CASES_ENTRY}
} }
processed = true; processed = true;
@@ -52,6 +54,12 @@ bool ${filename}_processEvent(Event* ev) {
return processed; return processed;
} }
/*************
* Callbacks *
*************/
${CALLBACKS_DEF}
/************ /************
* EMITTERS * * EMITTERS *
************/ ************/

View File

@@ -18,9 +18,16 @@ typedef enum {
${EVENTS_ENUM} ${EVENTS_ENUM}
} ${filename}_EVENTS; } ${filename}_EVENTS;
typedef void (*${filename}_CALLBACK_FUNCTION)(void*);
typedef struct {
${filename}_CALLBACK_FUNCTION f; // function
void* p; // param(s)
} ${filename}_CALLBACK;
typedef struct { typedef struct {
${filename}_STATES state; ${filename}_STATES state;
${VARS_STRUCT} ${VARS_STRUCT}
${STATES_CBS_STRUCT}
} ${filename}; } ${filename};
/** /**
@@ -42,6 +49,12 @@ void ${filename}_startBehaviour(${filename}* me);
*/ */
bool ${filename}_processEvent(Event* ev); bool ${filename}_processEvent(Event* ev);
/*************
* Callbacks *
*************/
${CALLBACKS_DEC}
/************ /************
* EMITTERS * * EMITTERS *
************/ ************/