diff --git a/vscode/CMakeLists.txt b/vscode/CMakeLists.txt index db5c3bf..bb30d7d 100644 --- a/vscode/CMakeLists.txt +++ b/vscode/CMakeLists.txt @@ -6,7 +6,7 @@ include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM) aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP) -set(keytest 789) +# set(keytest 789) # set(child_parent 789) if(DEFINED keytest) include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest) diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c index 7acf10d..4e49dc1 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -29,21 +29,13 @@ */ static inline void setNextState(FSM* pFSM){ int curState = pFSM->privateVars->curState; - if(curState != 0){ - pFSM->signals.lastTriggeredSignal = Idle_Signal; - pFSM->privateVars->nextState = pFSM->privateVars->fcns.selectNextState[curState](pFSM->data, &pFSM->signals); - pFSM->privateVars->index = pFSM->privateVars->curState * pFSM->privateVars->numState + pFSM->privateVars->nextState; - } - - if(0 == pFSM->privateVars->numChild) + if(curState == 0) return; + pFSM->signals.lastTriggeredSignal = Idle_Signal; + pFSM->privateVars->nextState = pFSM->privateVars->fcns.selectNextState[curState](pFSM->data, &pFSM->signals); + pFSM->privateVars->index = pFSM->privateVars->curState * pFSM->privateVars->numState + pFSM->privateVars->nextState; - for (int i = 0; i < pFSM->privateVars->numChild; i++) - { - FSM *cFSM = pFSM->privateVars->childFSM[i]; - setNextState(cFSM); - } } /** @@ -80,38 +72,29 @@ void stepBaseFSM(FSM *pFSM) FSM **childFSM = pFSM->privateVars->childFSM; int index = pFSM->privateVars->index; int nextState = pFSM->privateVars->nextState; - - if(nextState && curState != nextState){ // 状态切换 - if (fcns->exitActionTable[curState] != NULL) - fcns->exitActionTable[curState](data, childFSM); - - if (fcns->transitionTable[index] != NULL) // 有特定的状态转移函数 - (*fcns->transitionTable[index])(data); - - if(fcns->transitionGeneralAction != NULL) - fcns->transitionGeneralAction(data); // 通用状态转移函数 - - if (fcns->enterActionTable[nextState] != NULL) - fcns->enterActionTable[nextState](data, childFSM); + fcns->exitActionTable[curState](data, childFSM); + fcns->transitionTable[index](data); // 有特定的状态转移函数 + fcns->transitionGeneralAction(data); // 通用状态转移函数 + fcns->enterActionTable[nextState](data, childFSM); pFSM->privateVars->curState = nextState; } else if(curState == 0){ // 处理刚运行进入的默认状态 nextState = pFSM->privateVars->defaultState; - if (fcns->enterActionTable[nextState] != NULL) - fcns->enterActionTable[nextState](data, childFSM); + fcns->enterActionTable[nextState](data, childFSM); pFSM->privateVars->curState = nextState; } else // 状态机没动 { - if (fcns->duringActionTable[curState] != NULL) - fcns->duringActionTable[curState](data, childFSM); + fcns->duringActionTable[curState](data, childFSM); } } + + /* -------------------------------------------------------------------------- */ /* public 函数 */ /* -------------------------------------------------------------------------- */ @@ -127,7 +110,6 @@ void _stepFSM(FSM *pFSM){ pFSM->publicFcns.step(pFSM); } - int getFSMCurState(FSM *pFSM){ return pFSM->privateVars->curState; } @@ -136,14 +118,17 @@ int getFSMNextState(FSM *pFSM){ } -void setChildNum(FSM *pFSM, int num){ - pFSM->privateVars->numChild = num; - pFSM->privateVars->childFSM = (FSM **)calloc(num, sizeof(FSM *)); + + +void registerChildFSM(FSM *parent, FSM *child){ + // parent->privateVars->childFSM[index] = child; + // parent->privateVars->hasChild++; } -void registerChildFSM(FSM *parent, FSM *child, int index){ - parent->privateVars->childFSM[index] = child; -} + + + + const void *_getData(FSM* pFSM){ return (const void *)pFSM->data; @@ -153,6 +138,9 @@ void _setSignal(FSM *pFSM, Uint16 signalFlag){ pFSM->signals.all |= (1 << signalFlag); } + + + /** * @brief * @deprecated 弃用 @@ -231,6 +219,8 @@ void constructFSM(FSM* pFSM){ assert(pFSM->pureVtbl.initData); assert(pFSM->pureVtbl.initDataLoader); + + pFSM->pureVtbl.setupHandler(&pFSM->privateVars->fcns); pFSM->pureVtbl.initData(pFSM); pFSM->pureVtbl.initDataLoader(pFSM); diff --git a/vscode/FSM_OOP/baseFSM/FSM_private.h b/vscode/FSM_OOP/baseFSM/FSM_private.h index 8531d7d..7f540d2 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_private.h +++ b/vscode/FSM_OOP/baseFSM/FSM_private.h @@ -53,14 +53,16 @@ typedef struct FSMPrivateVars FSMHandler fcns; /**< 状态函数表 */ - int numChild; /**< @deprecated 和子状态机相关的暂时弃用 */ - FSM **childFSM; /**< @deprecated 和子状态机相关的暂时弃用 */ + FSM *childFSM; /**< 限定只能有一个子状态机 */ FSMDataLoader preloader; /**< @deprecated 弃用 */ }FSMPrivateVars; +static void empty_func(){ +} + /** * @brief 仅在FSM.c中调用,新建私有变量并分配空间 @@ -80,21 +82,41 @@ FSMPrivateVars* newFMSPrivateVars(int numState, int defaultState){ privateVars->defaultState = defaultState; privateVars->curState = 0; privateVars->nextState = 0; - privateVars->numChild = 0; + privateVars->childFSM = NULL; privateVars->preloader.isReady = 0; privateVars->fcns.duringActionTable = calloc(numState, sizeof(StateFuncPtr)); privateVars->fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr)); privateVars->fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr)); + + for (int i = 0; i < numState; i++) + { + privateVars->fcns.duringActionTable[i] = empty_func; + privateVars->fcns.enterActionTable[i] = empty_func; + privateVars->fcns.exitActionTable[i] = empty_func; + } + privateVars->fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr)); privateVars->fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr)); + for (int i = 0; i < numState * numState; i++) + { + privateVars->fcns.transitionTable[i] = empty_func; + } + privateVars->fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr)); + privateVars->fcns.transitionGeneralAction = empty_func; privateVars->fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr)); return privateVars; } -#endif \ No newline at end of file + +static int hasChildFSM(FSM *pFSM){ + return (pFSM->privateVars->childFSM != NULL); +} + + +#endif diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index de926b7..0d58b52 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -68,7 +68,7 @@ typedef struct FSMHandler{ int (**selectNextState)(void *data, FSMSignals* signals); /**< 每个状态配置的状态选择函数 */ void (**transitionTable)(void *data); /**< 状态转移函数表 */ - void (*transitionGeneralAction)(void *data); /**< 通用状态转移函数,不论有没有独立的状态转移函数都会执行 */ + void (*transitionGeneralAction)(void *data); /**< 通用状态转移函数,不论有没有独立的状态转移函数都会执行。常用来清空内部变量 */ void (**enterActionTable)(void *data, FSM **cFSM); /**< 进入状态时运行的函数,和plecs对标 */ void (**duringActionTable)(void *data, FSM **cFSM); /**< 状态不变时运行的函数,和plecs对标 */ @@ -151,4 +151,6 @@ static inline void clearAllSignals(FSMSignals *signals){ } + + #endif diff --git a/vscode/FSM_OOP/baseFSM/FSM_public.h b/vscode/FSM_OOP/baseFSM/FSM_public.h index 60d03c3..3be36fa 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_public.h +++ b/vscode/FSM_OOP/baseFSM/FSM_public.h @@ -41,8 +41,6 @@ void _stepFSM(FSM *pFSM); /* --------------------------------- 状态机信息获取 -------------------------------- */ int getFSMCurState(FSM *pFSM); int getFSMNextState(FSM *pFSM); -void setChildNum(FSM *pFSM, int num); -void registerChildFSM(FSM *parent, FSM *child, int index); /* ------------------------------ Data和Signals ------------------------------ */ const void *_getData(FSM* pFSM); @@ -54,6 +52,7 @@ void _preloaderGetReady(FSM *pFSM); int _getPreloaderOverFlag(FSM *pFSM); void _clearPreloaderOverFlag(FSM *pFSM); - +/* ---------------------------------- 子状态机 ---------------------------------- */ +void registerChildFSM(FSM *parent, FSM *child); #endif diff --git a/vscode/FSM_OOP/keytest/main.c b/vscode/FSM_OOP/keytest/main.c index 59ac37c..bccc799 100644 --- a/vscode/FSM_OOP/keytest/main.c +++ b/vscode/FSM_OOP/keytest/main.c @@ -1,4 +1,5 @@ #include +#include "assert.h" #include "keyFSM.h" #include "FSM_public.h" @@ -23,6 +24,7 @@ KeyIn keystat; int main(){ + KeyFSM* keyFSM = createKeyFSM(); for (int i = 0; i < NUM; i++) diff --git a/vscode/FSM_OOP/template/main.c b/vscode/FSM_OOP/template/main.c index 41ad74d..c81dbd5 100644 --- a/vscode/FSM_OOP/template/main.c +++ b/vscode/FSM_OOP/template/main.c @@ -1,4 +1,5 @@ #include +#include #include "templateFSM.h" #include "FSM_public.h" diff --git a/父子状态机测试.plecs b/父子状态机测试.plecs index 7627446..2a92ff8 100644 --- a/父子状态机测试.plecs +++ b/父子状态机测试.plecs @@ -1,5 +1,5 @@ Plecs { - Name base64 "54q25oCB5py65rWL6K+V" + Name base64 "54i25a2Q54q25oCB5py65rWL6K+V" Version "4.7" CircuitModel "ContStateSpace" StartTime "0.0" @@ -47,7 +47,7 @@ Plecs { ScriptsDialogGeometry "" ScriptsDialogSplitterPos "0" Schematic { - Location [1734, 301; 2376, 730] + Location [818, 291; 1460, 717] ZoomFactor 1.71498 SliderPosition [0, 0] ShowBrowser off @@ -139,9 +139,9 @@ Plecs { Show off } FSM { - Location [-1, -8; 2559, 1309] - ZoomFactor 1.14437 - SliderPosition [0, 0] + Location [0, 0; 1918, 923] + ZoomFactor 0.76361 + SliderPosition [0, 44] FsmState { Name "A" Position [360, 480] @@ -161,8 +161,8 @@ Plecs { } FsmState { Name "B" - Position [1110, 430] - Frame [-420, -270; 420, 270] + Position [1400, 420] + Frame [-710, -260; 710, 260] Parameter { Name "EnterAction" Value "printf(\" enterB \");" @@ -177,7 +177,7 @@ Plecs { } FsmState { Name "D" - Position [-240, -10] + Position [-530, 0] Frame [-100, -90; 100, 90] Parameter { Name "EnterAction" @@ -192,48 +192,107 @@ Plecs { Value "printf(\" exitD \");" } } + FsmState { + Name ".Junction" + Position [-380, -150] + } + FsmState { + Name ".PointState" + Position [-380, -190] + } FsmState { Name "E" - Position [210, -10] - Frame [-100, -90; 100, 90] + Position [220, 40] + Frame [-400, -130; 400, 130] Parameter { Name "EnterAction" Value "printf(\" enterE \");" } Parameter { Name "DuringAction" - Value "printf(\" duringE \");" + Value "" } Parameter { Name "ExitAction" Value "printf(\" exitE \");" } - } - FsmState { - Name ".Junction" - Position [-90, -160] - } - FsmState { - Name ".PointState" - Position [-90, -200] + FsmState { + Name "State" + Position [-130, 30] + Frame [-90, -60; 90, 60] + Parameter { + Name "EnterAction" + Value "/* enter action */" + } + Parameter { + Name "DuringAction" + Value "" + } + Parameter { + Name "ExitAction" + Value "" + } + } + FsmState { + Name ".PointState" + Position [110, -80] + } + FsmState { + Name "State1" + Position [230, 30] + Frame [-90, -60; 90, 60] + Parameter { + Name "EnterAction" + Value "/* enter action */" + } + Parameter { + Name "DuringAction" + Value "" + } + Parameter { + Name "ExitAction" + Value "" + } + } } } FsmState { Name "C" - Position [650, 1050] - Frame [-100, -90; 100, 90] + Position [1100, 1110] + Frame [-550, -150; 550, 150] Parameter { Name "EnterAction" Value "printf(\" enterC \");" } Parameter { Name "DuringAction" - Value "printf(\" duringC \");" + Value "" } Parameter { Name "ExitAction" Value "printf(\" exitC \");" } + FsmState { + Name "D" + Position [-140, 30] + Frame [-100, -90; 100, 90] + Parameter { + Name "EnterAction" + Value "printf(\" enterD \");" + } + Parameter { + Name "DuringAction" + Value "printf(\" duringD \");" + } + Parameter { + Name "ExitAction" + Value "printf(\" exitD \");" + } + } + FsmState { + Name ".PointState" + Position [-10, -100] + } } FsmState { Name ".PointState" @@ -367,6 +426,38 @@ Plecs { Value "1" } } + FsmTransition { + FsmSrcInfo { + StatePath ".PointState" + TerminalLoc right + TerminalCoord 0.5 + External on + } + FsmDstInfo { + StatePath "A" + TerminalLoc top + TerminalCoord 0.507833 + External on + } + SegmentLengths [] + LabelPosition 0.5 + Parameter { + Name "Trigger" + Value "" + } + Parameter { + Name "Condition" + Value "" + } + Parameter { + Name "Action" + Value "" + } + Parameter { + Name "Priority" + Value "1" + } + } FsmTransition { FsmSrcInfo { StatePath "B/D" @@ -529,18 +620,50 @@ Plecs { } FsmTransition { FsmSrcInfo { - StatePath ".PointState" + StatePath "C/.PointState" TerminalLoc bottom TerminalCoord 0.5 External on } FsmDstInfo { - StatePath "A" + StatePath "C/D" TerminalLoc top - TerminalCoord 0.509626 + TerminalCoord 0.414129 External on } - SegmentLengths [63.5] + SegmentLengths [15,-72.90010560019118,-3] + LabelPosition 0.5 + Parameter { + Name "Trigger" + Value "" + } + Parameter { + Name "Condition" + Value "" + } + Parameter { + Name "Action" + Value "" + } + Parameter { + Name "Priority" + Value "1" + } + } + FsmTransition { + FsmSrcInfo { + StatePath "B/E/.PointState" + TerminalLoc bottom + TerminalCoord 0.5 + External on + } + FsmDstInfo { + StatePath "B/E/State" + TerminalLoc top + TerminalCoord 0.490903 + External on + } + SegmentLengths [18.5] LabelPosition 0.5 Parameter { Name "Trigger" @@ -571,7 +694,7 @@ Plecs { LabelPosition south Parameter { Variable "DialogGeometry" - Value "[1296 663 655 313]" + Value "[782 587 655 313]" Show off } Parameter { @@ -683,17 +806,17 @@ Plecs { Direction up Flipped off LabelPosition south - Location [811, 582; 1161, 825] + Location [811, 582; 1161, 833] State "AAAA/wAAAAD9AAAAAgAAAAEAAAAAAAAAAPwCAAAAA/sAAAAQAFoAbwBvA" "G0AQQByAGUAYQAAAAAA/////wAAADQA////+wAAABQAUwBhAHYAZQBkAFYAaQBlAHcAcwAAAAAA//" "///wAAAGYA////+wAAAAwAVAByAGEAYwBlAHMAAAAAAP////8AAABmAP///wAAAAMAAAAAAAAAAPw" -"BAAAAAfsAAAAUAEQAYQB0AGEAVwBpAGQAZwBlAHQAAAAAAP////8AAABQAP///wAAAV4AAADYAAAA" +"BAAAAAfsAAAAUAEQAYQB0AGEAVwBpAGQAZwBlAHQAAAAAAP////8AAABQAP///wAAAV4AAADgAAAA" "BAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAFQAbwBvAGwAQgBhAHIBAAAAAP////8AAAAAA" "AAAAA==" SavedViews "AAAAAgAAAAA=" - HeaderState "AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAL/gMAAAAJAAAAA" -"wAAAGQAAAACAAAAZAAAAAkAAABkAAAACAAAAGQAAAAFAAAAZAAAAAQAAABkAAAABwAAAGQAAAAGAA" -"AAZAAAAAEAAABkAAAAiwAAAAsBAAABAAAAAAAAAAAAAAAAZP////8AAACBAAAAAAAAAAsAAABzAAA" + HeaderState "AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAL/gMAAAAJAAAAB" +"gAAAGQAAAAHAAAAZAAAAAgAAABkAAAACQAAAGQAAAABAAAAZAAAAAIAAABkAAAAAwAAAGQAAAAEAA" +"AAZAAAAAUAAABkAAAAiwAAAAsBAAABAAAAAAAAAAAAAAAAZP////8AAACBAAAAAAAAAAsAAABzAAA" "AAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAA" "AAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAA" "AAYAAAAAQAAAAAAAAPoAAAAABg=" @@ -781,4 +904,4 @@ Plecs { } } } -DemoSignature "C/ZrxOQHJ0OXW30du/vTiFYFVRZZzc0r6Uyc2MRNbyo=" +DemoSignature "3mLOZwvyqmZ1g5qsGftq/0aRPBxKRskpkes5wR/pt1M=" diff --git a/状态机测试.plecs b/状态机测试.plecs new file mode 100644 index 0000000..7bd97dd --- /dev/null +++ b/状态机测试.plecs @@ -0,0 +1,784 @@ +Plecs { + Name base64 "54q25oCB5py65rWL6K+V" + Version "4.7" + CircuitModel "ContStateSpace" + StartTime "0.0" + TimeSpan "2" + Timeout "" + Solver "auto" + MaxStep "1e-3" + InitStep "-1" + FixedStep "1e-3" + Refine "1" + ZCStepSize "1e-9" + RelTol "1e-3" + AbsTol "-1" + TurnOnThreshold "0" + SyncFixedStepTasks "2" + UseSingleCommonBaseRate "2" + LossVariableLimitExceededMsg "3" + NegativeSwitchLossMsg "3" + DivisionByZeroMsg "3" + StiffnessDetectionMsg "2" + MaxConsecutiveZCs "1000" + AlgebraicLoopWithStateMachineMsg "3" + AssertionAction "1" + InitializationCommands "" + InitialState "1" + SystemState "" + TaskingMode "1" + TaskConfigurations "" + CodeGenParameterInlining "2" + CodeGenFloatingPointFormat "2" + CodeGenAbsTimeUsageMsg "3" + CodeGenBaseName "" + CodeGenOutputDir "" + CodeGenExtraOpts "" + CodeGenTarget "Generic" + CodeGenTargetSettings "" + ExtendedMatrixPrecision "1" + MatrixSignificanceCheck "2" + EnableStateSpaceSplitting "2" + DisplayStateSpaceSplitting "1" + DiscretizationMethod "2" + ExternalModeSettings "" + AlgebraicLoopMethod "1" + AlgebraicLoopTolerance "1e-6" + ScriptsDialogGeometry "" + ScriptsDialogSplitterPos "0" + Schematic { + Location [633, 310; 1275, 736] + ZoomFactor 1.71498 + SliderPosition [0, 0] + ShowBrowser off + BrowserWidth 100 + Component { + Type FsmBlock + Name "State Machine" + Show on + Position [260, 100] + Direction up + Flipped off + LabelPosition south + Frame [-40, -15; 40, 15] + Parameter { + Variable "InputVariables" + Value "i,j" + Show off + } + Parameter { + Variable "InputTypes" + Value "1,1" + Show off + } + Parameter { + Variable "InternalConstants" + Value "" + Show off + } + Parameter { + Variable "InternalConstantValues" + Value "" + Show off + } + Parameter { + Variable "InternalVariables" + Value "" + Show off + } + Parameter { + Variable "InternalVariableValues" + Value "" + Show off + } + Parameter { + Variable "OutputVariables" + Value "" + Show off + } + Parameter { + Variable "Declarations" + Value "#include \n" +"\n" +"typedef enum _ParentEvent{\n" +" Parent_Idle_Event,\n" +" Start,\n" +" A2B,\n" +" B2A,\n" +" B2C,\n" +" C2A,\n" +"\n" +" Parent_Count_Event,\n" +"}ParentEvent;\n" +"\n" +"\n" +"typedef enum _ChildEvent{\n" +" Child_Idle_Event,\n" +" Idle2D,\n" +" Idle2E,\n" +" D2E,\n" +" E2D,\n" +"\n" +" Child_Count_Event,\n" +"}ChildEvent;" + Show off + } + Parameter { + Variable "TransitionOrder" + Value "2" + Show off + } + Parameter { + Variable "SampleTime" + Value "0.1" + Show off + } + Parameter { + Variable "Animate" + Value "1" + Show off + } + FSM { + Location [-1, -8; 1919, 979] + ZoomFactor 1.14437 + SliderPosition [0, -1] + FsmState { + Name "A" + Position [360, 480] + Frame [-100, -90; 100, 90] + Parameter { + Name "EnterAction" + Value "printf(\" enterA \");" + } + Parameter { + Name "DuringAction" + Value "printf(\" duringA \");" + } + Parameter { + Name "ExitAction" + Value "printf(\" exitA \");" + } + } + FsmState { + Name "B" + Position [1110, 430] + Frame [-420, -270; 420, 270] + Parameter { + Name "EnterAction" + Value "printf(\" enterB \");" + } + Parameter { + Name "DuringAction" + Value "" + } + Parameter { + Name "ExitAction" + Value "printf(\" exitB \");" + } + FsmState { + Name "D" + Position [-240, -10] + Frame [-100, -90; 100, 90] + Parameter { + Name "EnterAction" + Value "printf(\" enterD \");" + } + Parameter { + Name "DuringAction" + Value "printf(\" duringD \");" + } + Parameter { + Name "ExitAction" + Value "printf(\" exitD \");" + } + } + FsmState { + Name "E" + Position [210, -10] + Frame [-100, -90; 100, 90] + Parameter { + Name "EnterAction" + Value "printf(\" enterE \");" + } + Parameter { + Name "DuringAction" + Value "printf(\" duringE \");" + } + Parameter { + Name "ExitAction" + Value "printf(\" exitE \");" + } + } + FsmState { + Name ".Junction" + Position [-90, -160] + } + FsmState { + Name ".PointState" + Position [-90, -200] + } + } + FsmState { + Name "C" + Position [650, 1050] + Frame [-100, -90; 100, 90] + Parameter { + Name "EnterAction" + Value "printf(\" enterC \");" + } + Parameter { + Name "DuringAction" + Value "printf(\" duringC \");" + } + Parameter { + Name "ExitAction" + Value "printf(\" exitC \");" + } + } + FsmState { + Name ".PointState" + Position [330, 250] + } + FsmTransition { + FsmSrcInfo { + StatePath "A" + TerminalLoc right + TerminalCoord 0.390136 + External on + } + FsmDstInfo { + StatePath "B" + TerminalLoc left + TerminalCoord 0.511449 + External on + } + SegmentLengths [107.3600447694556] + LabelPosition 0.685 + Parameter { + Name "Trigger" + Value "i==A2B" + } + Parameter { + Name "Condition" + Value "" + } + Parameter { + Name "Action" + Value "printf(\" A2B \");" + } + Parameter { + Name "Priority" + Value "1" + } + } + FsmTransition { + FsmSrcInfo { + StatePath "B" + TerminalLoc left + TerminalCoord 0.654101 + External on + } + FsmDstInfo { + StatePath "A" + TerminalLoc right + TerminalCoord 0.641567 + External on + } + SegmentLengths [-110] + LabelPosition 0.5 + Parameter { + Name "Trigger" + Value "i==B2A" + } + Parameter { + Name "Condition" + Value "" + } + Parameter { + Name "Action" + Value "printf(\" B2A \");" + } + Parameter { + Name "Priority" + Value "1" + } + } + FsmTransition { + FsmSrcInfo { + StatePath "B" + TerminalLoc bottom + TerminalCoord 0.491978 + External on + } + FsmDstInfo { + StatePath "C" + TerminalLoc top + TerminalCoord 0.435411 + External on + } + SegmentLengths [] + LabelPosition 0.5 + Parameter { + Name "Trigger" + Value "i==B2C" + } + Parameter { + Name "Condition" + Value "" + } + Parameter { + Name "Action" + Value "printf(\" B2C \");" + } + Parameter { + Name "Priority" + Value "2" + } + } + FsmTransition { + FsmSrcInfo { + StatePath "C" + TerminalLoc left + TerminalCoord 0.480089 + External on + } + FsmDstInfo { + StatePath "A" + TerminalLoc bottom + TerminalCoord 0.531347 + External on + } + SegmentLengths [] + LabelPosition 0.5 + Parameter { + Name "Trigger" + Value "i == C2A" + } + Parameter { + Name "Condition" + Value "" + } + Parameter { + Name "Action" + Value "printf(\" C2A \");" + } + Parameter { + Name "Priority" + Value "1" + } + } + FsmTransition { + FsmSrcInfo { + StatePath "B/D" + TerminalLoc right + TerminalCoord 0.336937 + External on + } + FsmDstInfo { + StatePath "B/E" + TerminalLoc left + TerminalCoord 0.350905 + External on + } + SegmentLengths [] + LabelPosition 0.5 + Parameter { + Name "Trigger" + Value "j==D2E" + } + Parameter { + Name "Condition" + Value "" + } + Parameter { + Name "Action" + Value "printf(\" D2E \");" + } + Parameter { + Name "Priority" + Value "1" + } + } + FsmTransition { + FsmSrcInfo { + StatePath "B/E" + TerminalLoc left + TerminalCoord 0.593025 + External on + } + FsmDstInfo { + StatePath "B/D" + TerminalLoc right + TerminalCoord 0.560432 + External on + } + SegmentLengths [] + LabelPosition 0.5 + Parameter { + Name "Trigger" + Value "j==E2D" + } + Parameter { + Name "Condition" + Value "" + } + Parameter { + Name "Action" + Value "printf(\" E2D \");" + } + Parameter { + Name "Priority" + Value "1" + } + } + FsmTransition { + FsmSrcInfo { + StatePath "B/.PointState" + TerminalLoc bottom + TerminalCoord 0.5 + External on + } + FsmDstInfo { + StatePath "B/.Junction" + TerminalLoc top + TerminalCoord 0.5 + External on + } + SegmentLengths [] + LabelPosition 0.5 + Parameter { + Name "Trigger" + Value "" + } + Parameter { + Name "Condition" + Value "" + } + Parameter { + Name "Action" + Value "" + } + Parameter { + Name "Priority" + Value "1" + } + } + FsmTransition { + FsmSrcInfo { + StatePath "B/.Junction" + TerminalLoc left + TerminalCoord 0.5 + External on + } + FsmDstInfo { + StatePath "B/D" + TerminalLoc top + TerminalCoord 0.606534 + External on + } + SegmentLengths [] + LabelPosition 0.135 + Parameter { + Name "Trigger" + Value "" + } + Parameter { + Name "Condition" + Value "j == Idle2D" + } + Parameter { + Name "Action" + Value "printf(\" Idle2D \");" + } + Parameter { + Name "Priority" + Value "1" + } + } + FsmTransition { + FsmSrcInfo { + StatePath "B/.Junction" + TerminalLoc right + TerminalCoord 0.5 + External on + } + FsmDstInfo { + StatePath "B/E" + TerminalLoc top + TerminalCoord 0.519516 + External on + } + SegmentLengths [] + LabelPosition 0.5 + Parameter { + Name "Trigger" + Value "" + } + Parameter { + Name "Condition" + Value "" + } + Parameter { + Name "Action" + Value "printf(\" Idle2E \");" + } + Parameter { + Name "Priority" + Value "2" + } + } + FsmTransition { + FsmSrcInfo { + StatePath ".PointState" + TerminalLoc bottom + TerminalCoord 0.5 + External on + } + FsmDstInfo { + StatePath "A" + TerminalLoc top + TerminalCoord 0.509626 + External on + } + SegmentLengths [63.5] + LabelPosition 0.5 + Parameter { + Name "Trigger" + Value "" + } + Parameter { + Name "Condition" + Value "" + } + Parameter { + Name "Action" + Value "" + } + Parameter { + Name "Priority" + Value "1" + } + } + } + } + Component { + Type CScript + Name "C-Script" + Show on + Position [75, 70] + Direction up + Flipped off + LabelPosition south + Parameter { + Variable "DialogGeometry" + Value "[1276 398 582 313]" + Show off + } + Parameter { + Variable "NumInputs" + Value "1" + Show off + } + Parameter { + Variable "NumOutputs" + Value "2" + Show off + } + Parameter { + Variable "NumContStates" + Value "0" + Show off + } + Parameter { + Variable "NumDiscStates" + Value "0" + Show off + } + Parameter { + Variable "NumZCSignals" + Value "0" + Show off + } + Parameter { + Variable "DirectFeedthrough" + Value "0" + Show off + } + Parameter { + Variable "Ts" + Value "0.1" + Show off + } + Parameter { + Variable "Parameters" + Value "" + Show off + } + Parameter { + Variable "LangStandard" + Value "2" + Show off + } + Parameter { + Variable "GnuExtensions" + Value "1" + Show off + } + Parameter { + Variable "RuntimeCheck" + Value "2" + Show off + } + Parameter { + Variable "Declarations" + Value "#include \n" +"\n" +"static int index = 0;\n" +"static int pu[20] = {0,1,2,0,0,0,0,0, 4,5,2,3};\n" +"static int cu[20] = {0,0,1,0,0,3,4,3,0,0,0,0};" + Show off + } + Parameter { + Variable "StartFcn" + Value "" + Show off + } + Parameter { + Variable "OutputFcn" + Value base64 "cHJpbnRmKCJcbuesrCVk5qyhIiwgaW5kZXgpOwpPdXRwdXQo" +"MCkgPSBwdVtpbmRleF07Ck91dHB1dCgxKSA9IGN1W2luZGV4XTsKaW5kZXgrKzsKCgo=" + Show off + } + Parameter { + Variable "UpdateFcn" + Value "" + Show off + } + Parameter { + Variable "DerivativeFcn" + Value "" + Show off + } + Parameter { + Variable "TerminateFcn" + Value "" + Show off + } + Parameter { + Variable "StoreCustomStateFcn" + Value "" + Show off + } + Parameter { + Variable "RestoreCustomStateFcn" + Value "" + Show off + } + } + Component { + Type Scope + Name "Scope" + Show on + Position [165, 35] + Direction up + Flipped off + LabelPosition south + Location [811, 582; 1161, 833] + State "AAAA/wAAAAD9AAAAAgAAAAEAAAAAAAAAAPwCAAAAA/sAAAAQAFoAbwBvA" +"G0AQQByAGUAYQAAAAAA/////wAAADQA////+wAAABQAUwBhAHYAZQBkAFYAaQBlAHcAcwAAAAAA//" +"///wAAAGYA////+wAAAAwAVAByAGEAYwBlAHMAAAAAAP////8AAABmAP///wAAAAMAAAAAAAAAAPw" +"BAAAAAfsAAAAUAEQAYQB0AGEAVwBpAGQAZwBlAHQAAAAAAP////8AAABQAP///wAAAV4AAADgAAAA" +"BAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAFQAbwBvAGwAQgBhAHIBAAAAAP////8AAAAAA" +"AAAAA==" + SavedViews "AAAAAgAAAAA=" + HeaderState "AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAL/gMAAAAJAAAAB" +"gAAAGQAAAAHAAAAZAAAAAgAAABkAAAACQAAAGQAAAABAAAAZAAAAAIAAABkAAAAAwAAAGQAAAAEAA" +"AAZAAAAAUAAABkAAAAiwAAAAsBAAABAAAAAAAAAAAAAAAAZP////8AAACBAAAAAAAAAAsAAABzAAA" +"AAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAA" +"AAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAA" +"AAYAAAAAQAAAAAAAAPoAAAAABg=" + PlotPalettes "AAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + Axes "1" + TimeRange "0.0" + ScrollingMode "1" + SingleTimeAxis "1" + Open "0" + Ts "-1" + SampleLimit "0" + XAxisLabel "Time / s" + ShowLegend "1" + Axis { + Name "" + AutoScale 1 + MinValue 0 + MaxValue 1 + Signals {} + SignalTypes [ ] + Untangle 0 + KeepBaseline off + BaselineValue 0 + } + Fourier { + SingleXAxis on + AxisLabel "Frequency / Hz" + Scaling 0 + PhaseDisplay 0 + ShowFourierLegend off + Axis { + Name "" + AutoScale 1 + MinValue 0 + MaxValue 1 + Signals {} + Untangle 0 + KeepBaseline off + BaselineValue 0 + } + } + } + Component { + Type SignalDemux + Name "Demux" + Show off + Position [165, 100] + Direction right + Flipped on + LabelPosition south + Parameter { + Variable "Width" + Value "2" + Show off + } + } + Connection { + Type Signal + SrcComponent "C-Script" + SrcTerminal 2 + Points [135, 70] + Branch { + DstComponent "Scope" + DstTerminal 1 + } + Branch { + Points [135, 100] + DstComponent "Demux" + DstTerminal 1 + } + } + Connection { + Type Signal + SrcComponent "Demux" + SrcTerminal 2 + DstComponent "State Machine" + DstTerminal 1 + } + Connection { + Type Signal + SrcComponent "Demux" + SrcTerminal 3 + DstComponent "State Machine" + DstTerminal 2 + } + } +} +DemoSignature "vzTf+CQbDjWT4Ix1MTz+0HTDihYd6Bo2fAit4HiYDxE="