From 910a5ad107906b440351e4e81eb2015c9acc1317 Mon Sep 17 00:00:00 2001 From: Aidan Sanders Date: Wed, 11 Jun 2025 14:34:18 -0700 Subject: [PATCH 1/6] Resolved issue where nested state machine states without an initial transition would not output reader-friendly error message if a transition occurs from another state within the nested state machine to the first state of the nested state machine listed within the file. --- autocoder/QmParser.py | 7 ++++++- autocoder/flattenstatemachine.py | 12 ++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/autocoder/QmParser.py b/autocoder/QmParser.py index d5d3533..568951c 100755 --- a/autocoder/QmParser.py +++ b/autocoder/QmParser.py @@ -41,7 +41,11 @@ def parseTrans(qmTrans: ElementTreeType, number_gen: UniqueNumberGenerator): source = xmiNode.id - target = int(qmTrans.get('target')) if qmTrans.get('target') else None + target = None + + if (qmTrans.get("target") != "None"): + target = int(qmTrans.get('target')) if qmTrans.get('target') else None + kind = qmTrans.get('kind') guard = qmlib.pick_guard(qmTrans) action = flatt.pick_action(qmTrans) @@ -106,6 +110,7 @@ def populateXmiModel(qmRoot: ElementTreeType, # Replace the relative target attributes with ID's for node in qmFix.iter(): target = node.get("target") + if target is not None: targetId = flatt.state_from_target(node).get("id") node.set("target", str(targetId)) diff --git a/autocoder/flattenstatemachine.py b/autocoder/flattenstatemachine.py index f34ed65..7b54c11 100755 --- a/autocoder/flattenstatemachine.py +++ b/autocoder/flattenstatemachine.py @@ -169,12 +169,18 @@ def get_this_state(tran: ElementTreeType) -> Optional[str]: def get_state_from_index(root: ElementTreeType, index: int) -> ElementTreeType: count = 0 + for child in root: if child.tag == 'state' or child.tag == 'tran': count = count + 1 + if index == count: - assert child.tag == 'state' - return child + if (child.tag == "state"): + return child; + else: + assert child.tag == "tran" + + return child assert 0 @@ -202,10 +208,12 @@ def mark_self_transition(tran: ElementTreeType): # ----------------------------------------------------------------------- def state_from_target(tran: ElementTreeType) -> ElementTreeType: target = tran.get('target') + if target is None: return tran.getparent() else: root = tran + for i in target.split('/'): if i == "..": root = root.getparent() From e73d9baf6315ae859e5cd67b53d76834b7bc3dde Mon Sep 17 00:00:00 2001 From: Aidan Sanders Date: Wed, 9 Jul 2025 13:41:14 -0700 Subject: [PATCH 2/6] Added -enumName flag to better serve integration with fpp defined enumerations --- autocoder/Stars.py | 8 ++- autocoder/fprime_backend/fprimecoder.py | 12 ++-- autocoder/fprime_backend/fprimetemplates.py | 78 +++++++++++++++++++-- 3 files changed, 85 insertions(+), 13 deletions(-) diff --git a/autocoder/Stars.py b/autocoder/Stars.py index 5e67998..b0cd511 100755 --- a/autocoder/Stars.py +++ b/autocoder/Stars.py @@ -170,6 +170,7 @@ def getQmRoot(modelFileName: str) -> Tuple[ElementTreeType, XmiModel] : parser.add_argument("-noSignals", help="Don't generate the Signals header file", action="store_true") parser.add_argument("-namespace", help="Fprime namespace") parser.add_argument("-debug", help="prints out the models", action = "store_true") +parser.add_argument("-stateEnum", help="name of the enumerator to use (fprime only)") args = parser.parse_args() @@ -200,8 +201,11 @@ def getQmRoot(modelFileName: str) -> Tuple[ElementTreeType, XmiModel] : print("*** Error - missing namespace argument for the fprime backend") exit(0) else: - fppcoder.generateCode(xmiModel) - fprimecoder.generateCode(qmRoot, args.noImpl, args.namespace) + if (args.stateEnum is None): + print("WARNING: No enumeration specified. Autogenerating internal enumeration") + + fppcoder.generateCode(xmiModel) + fprimecoder.generateCode(qmRoot, args.noImpl, args.namespace, args.stateEnum) diff --git a/autocoder/fprime_backend/fprimecoder.py b/autocoder/fprime_backend/fprimecoder.py index 3bc7522..9e3016d 100644 --- a/autocoder/fprime_backend/fprimecoder.py +++ b/autocoder/fprime_backend/fprimecoder.py @@ -44,7 +44,9 @@ class FprimeConfig(BaseModel): # ----------------------------------------------------------------------- def printSmHeader(smname: str, qmRoot: ElementTreeType, - namespace: str): + namespace: str, + enumName: str + ): hFile = open(smname+".hpp", "w") eventList = [] @@ -61,7 +63,7 @@ def printSmHeader(smname: str, funcList = get_function_signatures(qmRoot, smname) - hFile.write(codeTemplate.fileHeader(smname, stateList, eventList, namespace, funcList )) + hFile.write(codeTemplate.fileHeader(smname, stateList, eventList, namespace, funcList, enumName)) # --------------------------------------------------------------------------- @@ -434,7 +436,9 @@ def printEnumFpp(smname: str, # ----------------------------------------------------------------------- def generateCode(qmRoot: ElementTreeType, noImpl: bool, - namespace: str): + namespace: str, + enumName: str + ): global codeTemplate global unitTestTemplate @@ -463,7 +467,7 @@ def generateCode(qmRoot: ElementTreeType, # Generate the state-machine header file print ("Generating " + smname + ".cpp") print ("Generating " + smname + ".trans") - printSmHeader(smname, flatchart, namespace) + printSmHeader(smname, flatchart, namespace, enumName) # Generate the state-machine implementation file print ("Generating " + smname + ".hpp") diff --git a/autocoder/fprime_backend/fprimetemplates.py b/autocoder/fprime_backend/fprimetemplates.py index bdece1e..cb23c87 100644 --- a/autocoder/fprime_backend/fprimetemplates.py +++ b/autocoder/fprime_backend/fprimetemplates.py @@ -157,8 +157,9 @@ def stateTransition(self, signal: str, transition: str, smname) -> str: # ------------------------------------------------------------------------------- # fileHeader # ------------------------------------------------------------------------------- - def fileHeader(self, smname: str, stateList: List[str], eventList: List[str], namespace: str, implFunctions: List[str]) -> str: - template = Template(""" + def fileHeader(self, smname: str, stateList: List[str], eventList: List[str], namespace: str, implFunctions: List[str], enumName: str) -> str: + if (enumName is None): + template = Template(""" // ====================================================================== // \\title $(smname).h // \\author Auto-generated by STARS @@ -219,11 +220,74 @@ class $(smname) { #endif """) - template.stateList = stateList - template.eventList = eventList - template.smname = smname - template.namespace = namespace - template.implFunctions = implFunctions + template.stateList = stateList + template.eventList = eventList + template.smname = smname + template.namespace = namespace + template.implFunctions = implFunctions + else: + template = Template(""" +// ====================================================================== +// \\title $(smname).h +// \\author Auto-generated by STARS +// \\brief header file for state machine $smname +// +// ====================================================================== + +#ifndef $(smname.upper())_H_ +#define $(smname.upper())_H_ + +\#include +\#include + +namespace $(namespace) { + +class $(smname)_Interface { + public: + enum $(smname)_Signals { +#for $event in $eventList + $event, +#end for + }; + +#for $function in $implFunctions + + virtual $function = 0; + +#end for + +}; + +class $(smname) { + + private: + $(smname)_Interface *parent; + + public: + + $(smname)($(smname)_Interface* parent) : parent(parent) {} + + enum $(enumName) state; + + void init(const FwEnumStoreType stateMachineId); + void update( + const FwEnumStoreType stateMachineId, + const $(smname)_Interface::$(smname)_Signals signal, + const Fw::SmSignalBuffer &data + ); +}; + +} + +#endif +""") + template.stateList = stateList + template.eventList = eventList + template.smname = smname + template.namespace = namespace + template.implFunctions = implFunctions + template.enumName = enumName + return str(template) From 3752a2994e0f39ff57adaca4dd56e7891c37e1ab Mon Sep 17 00:00:00 2001 From: Aidan Sanders Date: Thu, 10 Jul 2025 14:40:50 -0700 Subject: [PATCH 3/6] Modified enum template implementation --- autocoder/fprime_backend/fprimetemplates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autocoder/fprime_backend/fprimetemplates.py b/autocoder/fprime_backend/fprimetemplates.py index cb23c87..e7fbea3 100644 --- a/autocoder/fprime_backend/fprimetemplates.py +++ b/autocoder/fprime_backend/fprimetemplates.py @@ -267,7 +267,7 @@ class $(smname) { $(smname)($(smname)_Interface* parent) : parent(parent) {} - enum $(enumName) state; + enum $(enumName)::T state; void init(const FwEnumStoreType stateMachineId); void update( From 4b19993f7b223627be27a81aeff0f8c16d164c0c Mon Sep 17 00:00:00 2001 From: Aidan Sanders Date: Tue, 22 Jul 2025 19:06:21 -0700 Subject: [PATCH 4/6] Update STARS to use FPP enum for fprime backend --- autocoder/Stars.py | 6 +- .../fprime_backend/fprimeImplTemplates.py | 58 ++-- autocoder/fprime_backend/fprimecoder.py | 2 +- autocoder/fprime_backend/fprimetemplates.py | 267 +++++++----------- .../TestModels/nested_states/NestedState.qm | 70 +++++ 5 files changed, 199 insertions(+), 204 deletions(-) create mode 100644 models/TestModels/nested_states/NestedState.qm diff --git a/autocoder/Stars.py b/autocoder/Stars.py index b0cd511..580bff1 100755 --- a/autocoder/Stars.py +++ b/autocoder/Stars.py @@ -170,7 +170,6 @@ def getQmRoot(modelFileName: str) -> Tuple[ElementTreeType, XmiModel] : parser.add_argument("-noSignals", help="Don't generate the Signals header file", action="store_true") parser.add_argument("-namespace", help="Fprime namespace") parser.add_argument("-debug", help="prints out the models", action = "store_true") -parser.add_argument("-stateEnum", help="name of the enumerator to use (fprime only)") args = parser.parse_args() @@ -201,11 +200,8 @@ def getQmRoot(modelFileName: str) -> Tuple[ElementTreeType, XmiModel] : print("*** Error - missing namespace argument for the fprime backend") exit(0) else: - if (args.stateEnum is None): - print("WARNING: No enumeration specified. Autogenerating internal enumeration") - fppcoder.generateCode(xmiModel) - fprimecoder.generateCode(qmRoot, args.noImpl, args.namespace, args.stateEnum) + fprimecoder.generateCode(qmRoot, args.noImpl, args.namespace) diff --git a/autocoder/fprime_backend/fprimeImplTemplates.py b/autocoder/fprime_backend/fprimeImplTemplates.py index 123d62e..2104b81 100644 --- a/autocoder/fprime_backend/fprimeImplTemplates.py +++ b/autocoder/fprime_backend/fprimeImplTemplates.py @@ -17,29 +17,29 @@ class FprimeImplTemplate: # ------------------------------------------------------------------------------- # stateEnumFpp # ------------------------------------------------------------------------------- - def stateEnumFpp(self, smname: str, namespace: str, stateList: List[str]): - template = Template(""" - - enum $(smname)States { - #set $counter = 0 - #for $state in $stateList - $(state) = $counter - #set $counter = $counter + 1 - #end for + def stateEnumFpp(self, smname: str, namespace: str, stateList: List[str]): + template = Template(""" + module $(namespace){ + enum $(smname)_State{ + #set $counter = 0 + #for $state in $stateList + $(state) = $counter + #set $counter = $counter + 1 + #end for + } } - """) - template.smname = smname - template.namespace = namespace - template.stateList = stateList + template.smname = smname + template.namespace = namespace + template.stateList = stateList - return str(template) + return str(template) # ------------------------------------------------------------------------------- # componentHdrFile # ------------------------------------------------------------------------------- - def componentHdrFile(self, smname: str, namespace: str, component: str, funcList: List[str]) -> str: - template = Template(""" + def componentHdrFile(self, smname: str, namespace: str, component: str, funcList: List[str]) -> str: + template = Template(""" #ifndef _SIGNAL_GEN_HPP_ @@ -69,18 +69,18 @@ class $(component) : public $(smname)_Interface { """) - template.funcList = funcList - template.smname = smname - template.namespace = namespace - template.component = component + template.funcList = funcList + template.smname = smname + template.namespace = namespace + template.component = component - return str(template) + return str(template) # ------------------------------------------------------------------------------- # componentFile # ------------------------------------------------------------------------------- - def componentFile(self, smname: str, namespace: str, component: str, guardFunctions: List[ImplFunc], actionFunctions: List[ImplFunc]) -> str: - template = Template(""" + def componentFile(self, smname: str, namespace: str, component: str, guardFunctions: List[ImplFunc], actionFunctions: List[ImplFunc]) -> str: + template = Template(""" \#include "$(component).hpp" \#include "$(smname).hpp" @@ -110,11 +110,11 @@ def componentFile(self, smname: str, namespace: str, component: str, guardFuncti """) - template.guardFunctions = guardFunctions - template.actionFunctions = actionFunctions - template.smname = smname - template.namespace = namespace - template.component = component + template.guardFunctions = guardFunctions + template.actionFunctions = actionFunctions + template.smname = smname + template.namespace = namespace + template.component = component - return str(template) + return str(template) diff --git a/autocoder/fprime_backend/fprimecoder.py b/autocoder/fprime_backend/fprimecoder.py index 9e3016d..201d4c4 100644 --- a/autocoder/fprime_backend/fprimecoder.py +++ b/autocoder/fprime_backend/fprimecoder.py @@ -403,7 +403,7 @@ def printEnumFpp(smname: str, # Open the generated files - fileName = smname + ".fppi" + fileName = smname + "_State.fpp" file = open(fileName, "w") print(f'Generating {fileName}') diff --git a/autocoder/fprime_backend/fprimetemplates.py b/autocoder/fprime_backend/fprimetemplates.py index e7fbea3..d587674 100644 --- a/autocoder/fprime_backend/fprimetemplates.py +++ b/autocoder/fprime_backend/fprimetemplates.py @@ -15,21 +15,21 @@ class FprimeTemplate: # ------------------------------------------------------------------------------- # target # ------------------------------------------------------------------------------- - def target(self, targ: str) -> str: + def target(self, targ: str) -> str: - template = Template("""this->state = $(target);""") + template = Template("""this->state = $(target);""") - template.target = targ - return str(template) + template.target = targ + return str(template) # ------------------------------------------------------------------------------- # ifGuard # ------------------------------------------------------------------------------- - def ifGuard(self, smname: str, action: str, args: str) -> str: - if args == "": - template = Template("""if ( parent->$(smname)_$(action)(stateMachineId) ) {""") - else: - template = Template("""if (parent->$(smname)_$(action)(stateMachineId, signal, data) ) {""") + def ifGuard(self, smname: str, action: str, args: str) -> str: + if args == "": + template = Template("""if ( parent->$(smname)_$(action)(stateMachineId) ) {""") + else: + template = Template("""if (parent->$(smname)_$(action)(stateMachineId, signal, data) ) {""") template.smname = smname template.action = action @@ -39,18 +39,18 @@ def ifGuard(self, smname: str, action: str, args: str) -> str: # ------------------------------------------------------------------------------- # guardSignature # ------------------------------------------------------------------------------- - def guardSignature(self, smname: str, action: str, args: str) -> str: - if args == "": - template = Template("""bool $(smname)_$(action)(const FwEnumStoreType stateMachineId)""") - elif args == "e": - template = Template("""bool $(smname)_$(action)( + def guardSignature(self, smname: str, action: str, args: str) -> str: + if args == "": + template = Template("""bool $(smname)_$(action)(const FwEnumStoreType stateMachineId)""") + elif args == "e": + template = Template("""bool $(smname)_$(action)( const FwEnumStoreType stateMachineId, const $(smname)_Interface::$(smname)_Signals signal, const Fw::SmSignalBuffer &data)""") - elif args.isdigit(): - template = Template("""bool $(smname)_$(action)(int arg)""") - else: - assert True, "Unknown args" + elif args.isdigit(): + template = Template("""bool $(smname)_$(action)(int arg)""") + else: + assert True, "Unknown args" template.smname = smname @@ -60,106 +60,105 @@ def guardSignature(self, smname: str, action: str, args: str) -> str: # ------------------------------------------------------------------------------- # guardDef # ------------------------------------------------------------------------------- - def guardDef(self, smname: str, action: str, component: str, args: str, namespace) -> str: - if args == "": - template = Template("""bool $(namespace)::$(component)::$(smname)_$(action)(const FwEnumStoreType stateMachineId)""") - elif args == "e": - template = Template("""bool $(namespace)::$(component)::$(smname)_$(action)( + def guardDef(self, smname: str, action: str, component: str, args: str, namespace) -> str: + if args == "": + template = Template("""bool $(namespace)::$(component)::$(smname)_$(action)(const FwEnumStoreType stateMachineId)""") + elif args == "e": + template = Template("""bool $(namespace)::$(component)::$(smname)_$(action)( const FwEnumStoreType stateMachineId, const $(smname)_Interface::$(smname)_Signals signal, const Fw::SmSignalBuffer &data)""") - elif args.isdigit(): - template = Template("""bool $(namespace)::$(component)::$(smname)_$(action)(int arg)""") - else: - assert True, "Unknown args" + elif args.isdigit(): + template = Template("""bool $(namespace)::$(component)::$(smname)_$(action)(int arg)""") + else: + assert True, "Unknown args" - template.smname = smname - template.namespace = namespace - template.action = action - template.component = component - return str(template) + template.smname = smname + template.namespace = namespace + template.action = action + template.component = component + return str(template) # ------------------------------------------------------------------------------- # action # ------------------------------------------------------------------------------- - def action(self, smname: str, action: str, args: str) -> str: - if args == "": - template = Template("""parent->$(smname)_$(action)(stateMachineId);""") - else: - template = Template("""parent->$(smname)_$(action)(stateMachineId, signal, data);""") + def action(self, smname: str, action: str, args: str) -> str: + if args == "": + template = Template("""parent->$(smname)_$(action)(stateMachineId);""") + else: + template = Template("""parent->$(smname)_$(action)(stateMachineId, signal, data);""") - template.smname = smname - template.action = action - template.args = args - return str(template) + template.smname = smname + template.action = action + template.args = args + return str(template) # ------------------------------------------------------------------------------- # actionSignature # ------------------------------------------------------------------------------- - def actionSignature(self, smname: str, action: str, args: str) -> str: - if args == "": - template = Template("""void $(smname)_$(action)(const FwEnumStoreType stateMachineId)""") - elif args == "e": - template = Template(""" void $(smname)_$(action)( + def actionSignature(self, smname: str, action: str, args: str) -> str: + if args == "": + template = Template("""void $(smname)_$(action)(const FwEnumStoreType stateMachineId)""") + elif args == "e": + template = Template(""" void $(smname)_$(action)( const FwEnumStoreType stateMachineId, const $(smname)_Interface::$(smname)_Signals signal, const Fw::SmSignalBuffer &data)""") - elif args.isdigit(): - template = Template("""void $(smname)_$(action)(int arg)""") - else: - assert True, "Unknown args" + elif args.isdigit(): + template = Template("""void $(smname)_$(action)(int arg)""") + else: + assert True, "Unknown args" - template.smname = smname - template.action = action - return str(template) + template.smname = smname + template.action = action + return str(template) # ------------------------------------------------------------------------------- # actionDef # ------------------------------------------------------------------------------- - def actionDef(self, smname: str, action: str, component: str, args: str, namespace: str) -> str: - if args == "": - template = Template("""void $(namespace)::$(component)::$(smname)_$(action)(const FwEnumStoreType stateMachineId)""") - elif args == "e": - template = Template("""void $(namespace)::$(component)::$(smname)_$(action)( + def actionDef(self, smname: str, action: str, component: str, args: str, namespace: str) -> str: + if args == "": + template = Template("""void $(namespace)::$(component)::$(smname)_$(action)(const FwEnumStoreType stateMachineId)""") + elif args == "e": + template = Template("""void $(namespace)::$(component)::$(smname)_$(action)( const FwEnumStoreType stateMachineId, const $(smname)_Interface::$(smname)_Signals signal, const Fw::SmSignalBuffer &data)""") - elif args.isdigit(): - template = Template("""void $(namespace)::$(component)::$(smname)_$(action)(int arg)""") - else: - assert True, "Unknown args" + elif args.isdigit(): + template = Template("""void $(namespace)::$(component)::$(smname)_$(action)(int arg)""") + else: + assert True, "Unknown args" - template.namespace = namespace - template.smname = smname - template.action = action - template.component = component - return str(template) + template.namespace = namespace + template.smname = smname + template.action = action + template.component = component + return str(template) # ------------------------------------------------------------------------------- # stateTransition # ------------------------------------------------------------------------------- - def stateTransition(self, signal: str, transition: str, smname) -> str: - template = Template(""" + def stateTransition(self, signal: str, transition: str, smname) -> str: + template = Template(""" case $(smname)_Interface::$(smname)_Signals::$(signal): $(transition) break; """) - template.signal = signal - template.transition = transition - template.smname = smname - return str(template) + template.signal = signal + template.transition = transition + template.smname = smname + return str(template) # ------------------------------------------------------------------------------- # fileHeader # ------------------------------------------------------------------------------- - def fileHeader(self, smname: str, stateList: List[str], eventList: List[str], namespace: str, implFunctions: List[str], enumName: str) -> str: - if (enumName is None): - template = Template(""" + def fileHeader(self, smname: str, stateList: List[str], eventList: List[str], namespace: str, implFunctions: List[str]) -> str: + template = Template(""" // ====================================================================== // \\title $(smname).h // \\author Auto-generated by STARS @@ -199,14 +198,8 @@ class $(smname) { public: $(smname)($(smname)_Interface* parent) : parent(parent) {} - - enum $(smname)_States { -#for $state in $stateList - $state, -#end for - }; - enum $(smname)_States state; + enum $(smname)_State::T state; void init(const FwEnumStoreType stateMachineId); void update( @@ -220,83 +213,19 @@ class $(smname) { #endif """) - template.stateList = stateList - template.eventList = eventList - template.smname = smname - template.namespace = namespace - template.implFunctions = implFunctions - else: - template = Template(""" -// ====================================================================== -// \\title $(smname).h -// \\author Auto-generated by STARS -// \\brief header file for state machine $smname -// -// ====================================================================== - -#ifndef $(smname.upper())_H_ -#define $(smname.upper())_H_ - -\#include -\#include - -namespace $(namespace) { - -class $(smname)_Interface { - public: - enum $(smname)_Signals { -#for $event in $eventList - $event, -#end for - }; - -#for $function in $implFunctions - - virtual $function = 0; - -#end for - -}; - -class $(smname) { - - private: - $(smname)_Interface *parent; - - public: - - $(smname)($(smname)_Interface* parent) : parent(parent) {} - - enum $(enumName)::T state; - - void init(const FwEnumStoreType stateMachineId); - void update( - const FwEnumStoreType stateMachineId, - const $(smname)_Interface::$(smname)_Signals signal, - const Fw::SmSignalBuffer &data - ); -}; - -} - -#endif -""") - template.stateList = stateList - template.eventList = eventList - template.smname = smname - template.namespace = namespace - template.implFunctions = implFunctions - template.enumName = enumName - - return str(template) - + template.stateList = stateList + template.eventList = eventList + template.smname = smname + template.namespace = namespace + template.implFunctions = implFunctions + return str(template) # ------------------------------------------------------------------------------- # stateMachineInit # ------------------------------------------------------------------------------- - def stateMachineInit(self, smname: str, transition: str, namespace: str) -> str: - template = Template(""" + def stateMachineInit(self, smname: str, transition: str, namespace: str) -> str: + template = Template(""" // ====================================================================== // \\title $(smname).cpp // \\author Auto-generated by STARS @@ -322,17 +251,17 @@ def stateMachineInit(self, smname: str, transition: str, namespace: str) -> str: { switch (this->state) { """) - template.smname = smname - template.transition = transition - template.namespace = namespace - return str(template) + template.smname = smname + template.transition = transition + template.namespace = namespace + return str(template) # ------------------------------------------------------------------------------- # stateMachineState # ------------------------------------------------------------------------------- - def stateMachineState(self, state: str) -> str: - template = Template(""" + def stateMachineState(self, state: str) -> str: + template = Template(""" /** * state $state */ @@ -340,31 +269,31 @@ def stateMachineState(self, state: str) -> str: switch (signal) { """) - template.state = state - return str(template) + template.state = state + return str(template) # ------------------------------------------------------------------------------- # stateMachineBreak # ------------------------------------------------------------------------------- - def stateMachineBreak(self) -> str: - template = Template(""" + def stateMachineBreak(self) -> str: + template = Template(""" default: break; } break; """) - return str(template) + return str(template) # ------------------------------------------------------------------------------- # stateMachineFinalBreak # ------------------------------------------------------------------------------- - def stateMachineFinalBreak(self) -> str: - template = Template(""" + def stateMachineFinalBreak(self) -> str: + template = Template(""" default: FW_ASSERT(0); } } """) - return str(template) + return str(template) \ No newline at end of file diff --git a/models/TestModels/nested_states/NestedState.qm b/models/TestModels/nested_states/NestedState.qm new file mode 100644 index 0000000..a5e76b0 --- /dev/null +++ b/models/TestModels/nested_states/NestedState.qm @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From eaae53883a90aec92c19892b4f93dbc34836593a Mon Sep 17 00:00:00 2001 From: Aidan Sanders Date: Tue, 22 Jul 2025 19:09:43 -0700 Subject: [PATCH 5/6] Refactored indentation --- autocoder/fprime_backend/fprimecoder.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autocoder/fprime_backend/fprimecoder.py b/autocoder/fprime_backend/fprimecoder.py index 201d4c4..9eb47b4 100644 --- a/autocoder/fprime_backend/fprimecoder.py +++ b/autocoder/fprime_backend/fprimecoder.py @@ -42,11 +42,11 @@ class FprimeConfig(BaseModel): # # Print the state-machine header file # ----------------------------------------------------------------------- -def printSmHeader(smname: str, - qmRoot: ElementTreeType, - namespace: str, - enumName: str - ): +def printSmHeader( + smname: str, + qmRoot: ElementTreeType, + namespace: str, + ): hFile = open(smname+".hpp", "w") eventList = [] @@ -63,7 +63,7 @@ def printSmHeader(smname: str, funcList = get_function_signatures(qmRoot, smname) - hFile.write(codeTemplate.fileHeader(smname, stateList, eventList, namespace, funcList, enumName)) + hFile.write(codeTemplate.fileHeader(smname, stateList, eventList, namespace, funcList)) # --------------------------------------------------------------------------- From 7771a8bb9b8a682e92c2bdf6941b1e61102971ff Mon Sep 17 00:00:00 2001 From: Aidan Sanders Date: Tue, 22 Jul 2025 19:21:34 -0700 Subject: [PATCH 6/6] Fixed issue with removal of enumName flag --- autocoder/fprime_backend/fprimecoder.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/autocoder/fprime_backend/fprimecoder.py b/autocoder/fprime_backend/fprimecoder.py index 9eb47b4..1f223a7 100644 --- a/autocoder/fprime_backend/fprimecoder.py +++ b/autocoder/fprime_backend/fprimecoder.py @@ -437,7 +437,6 @@ def printEnumFpp(smname: str, def generateCode(qmRoot: ElementTreeType, noImpl: bool, namespace: str, - enumName: str ): global codeTemplate @@ -467,7 +466,7 @@ def generateCode(qmRoot: ElementTreeType, # Generate the state-machine header file print ("Generating " + smname + ".cpp") print ("Generating " + smname + ".trans") - printSmHeader(smname, flatchart, namespace, enumName) + printSmHeader(smname, flatchart, namespace) # Generate the state-machine implementation file print ("Generating " + smname + ".hpp")