去掉了step函数里所有的if,NULL函数用一个空函数代替,这样代码运行速度提升不少,最快178,最慢255

This commit is contained in:
godcreator02 2024-06-22 20:49:23 +08:00
parent 0cff421be5
commit 04c8c07b8f
9 changed files with 1001 additions and 78 deletions

View File

@ -6,7 +6,7 @@ include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM)
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP) aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP)
set(keytest 789) # set(keytest 789)
# set(child_parent 789) # set(child_parent 789)
if(DEFINED keytest) if(DEFINED keytest)
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest) include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest)

View File

@ -29,21 +29,13 @@
*/ */
static inline void setNextState(FSM* pFSM){ static inline void setNextState(FSM* pFSM){
int curState = pFSM->privateVars->curState; int curState = pFSM->privateVars->curState;
if(curState != 0){ if(curState == 0)
return;
pFSM->signals.lastTriggeredSignal = Idle_Signal; pFSM->signals.lastTriggeredSignal = Idle_Signal;
pFSM->privateVars->nextState = pFSM->privateVars->fcns.selectNextState[curState](pFSM->data, &pFSM->signals); pFSM->privateVars->nextState = pFSM->privateVars->fcns.selectNextState[curState](pFSM->data, &pFSM->signals);
pFSM->privateVars->index = pFSM->privateVars->curState * pFSM->privateVars->numState + pFSM->privateVars->nextState; pFSM->privateVars->index = pFSM->privateVars->curState * pFSM->privateVars->numState + pFSM->privateVars->nextState;
}
if(0 == pFSM->privateVars->numChild)
return;
for (int i = 0; i < pFSM->privateVars->numChild; i++)
{
FSM *cFSM = pFSM->privateVars->childFSM[i];
setNextState(cFSM);
}
} }
/** /**
@ -81,37 +73,28 @@ void stepBaseFSM(FSM *pFSM)
int index = pFSM->privateVars->index; int index = pFSM->privateVars->index;
int nextState = pFSM->privateVars->nextState; int nextState = pFSM->privateVars->nextState;
if(nextState && curState != nextState){ // 状态切换 if(nextState && curState != nextState){ // 状态切换
if (fcns->exitActionTable[curState] != NULL)
fcns->exitActionTable[curState](data, childFSM); fcns->exitActionTable[curState](data, childFSM);
fcns->transitionTable[index](data); // 有特定的状态转移函数
if (fcns->transitionTable[index] != NULL) // 有特定的状态转移函数
(*fcns->transitionTable[index])(data);
if(fcns->transitionGeneralAction != NULL)
fcns->transitionGeneralAction(data); // 通用状态转移函数 fcns->transitionGeneralAction(data); // 通用状态转移函数
if (fcns->enterActionTable[nextState] != NULL)
fcns->enterActionTable[nextState](data, childFSM); fcns->enterActionTable[nextState](data, childFSM);
pFSM->privateVars->curState = nextState; pFSM->privateVars->curState = nextState;
} }
else if(curState == 0){ // 处理刚运行进入的默认状态 else if(curState == 0){ // 处理刚运行进入的默认状态
nextState = pFSM->privateVars->defaultState; nextState = pFSM->privateVars->defaultState;
if (fcns->enterActionTable[nextState] != NULL)
fcns->enterActionTable[nextState](data, childFSM); fcns->enterActionTable[nextState](data, childFSM);
pFSM->privateVars->curState = nextState; pFSM->privateVars->curState = nextState;
} }
else // 状态机没动 else // 状态机没动
{ {
if (fcns->duringActionTable[curState] != NULL)
fcns->duringActionTable[curState](data, childFSM); fcns->duringActionTable[curState](data, childFSM);
} }
} }
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* public 函数 */ /* public 函数 */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
@ -127,7 +110,6 @@ void _stepFSM(FSM *pFSM){
pFSM->publicFcns.step(pFSM); pFSM->publicFcns.step(pFSM);
} }
int getFSMCurState(FSM *pFSM){ int getFSMCurState(FSM *pFSM){
return pFSM->privateVars->curState; 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){ const void *_getData(FSM* pFSM){
return (const void *)pFSM->data; return (const void *)pFSM->data;
@ -153,6 +138,9 @@ void _setSignal(FSM *pFSM, Uint16 signalFlag){
pFSM->signals.all |= (1 << signalFlag); pFSM->signals.all |= (1 << signalFlag);
} }
/** /**
* @brief * @brief
* @deprecated * @deprecated
@ -231,6 +219,8 @@ void constructFSM(FSM* pFSM){
assert(pFSM->pureVtbl.initData); assert(pFSM->pureVtbl.initData);
assert(pFSM->pureVtbl.initDataLoader); assert(pFSM->pureVtbl.initDataLoader);
pFSM->pureVtbl.setupHandler(&pFSM->privateVars->fcns); pFSM->pureVtbl.setupHandler(&pFSM->privateVars->fcns);
pFSM->pureVtbl.initData(pFSM); pFSM->pureVtbl.initData(pFSM);
pFSM->pureVtbl.initDataLoader(pFSM); pFSM->pureVtbl.initDataLoader(pFSM);

View File

@ -53,14 +53,16 @@ typedef struct FSMPrivateVars
FSMHandler fcns; /**< 状态函数表 */ FSMHandler fcns; /**< 状态函数表 */
int numChild; /**< @deprecated 和子状态机相关的暂时弃用 */ FSM *childFSM; /**< 限定只能有一个子状态机 */
FSM **childFSM; /**< @deprecated 和子状态机相关的暂时弃用 */
FSMDataLoader preloader; /**< @deprecated 弃用 */ FSMDataLoader preloader; /**< @deprecated 弃用 */
}FSMPrivateVars; }FSMPrivateVars;
static void empty_func(){
}
/** /**
* @brief FSM.c中调用 * @brief FSM.c中调用
@ -80,7 +82,7 @@ FSMPrivateVars* newFMSPrivateVars(int numState, int defaultState){
privateVars->defaultState = defaultState; privateVars->defaultState = defaultState;
privateVars->curState = 0; privateVars->curState = 0;
privateVars->nextState = 0; privateVars->nextState = 0;
privateVars->numChild = 0; privateVars->childFSM = NULL;
privateVars->preloader.isReady = 0; privateVars->preloader.isReady = 0;
@ -88,13 +90,33 @@ FSMPrivateVars* newFMSPrivateVars(int numState, int defaultState){
privateVars->fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr)); privateVars->fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr));
privateVars->fcns.exitActionTable = 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.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr));
privateVars->fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr)); 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 = calloc(1, sizeof(StateFuncPtr));
privateVars->fcns.transitionGeneralAction = empty_func;
privateVars->fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr)); privateVars->fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr));
return privateVars; return privateVars;
} }
static int hasChildFSM(FSM *pFSM){
return (pFSM->privateVars->childFSM != NULL);
}
#endif #endif

View File

@ -68,7 +68,7 @@ typedef struct FSMHandler{
int (**selectNextState)(void *data, FSMSignals* signals); /**< 每个状态配置的状态选择函数 */ int (**selectNextState)(void *data, FSMSignals* signals); /**< 每个状态配置的状态选择函数 */
void (**transitionTable)(void *data); /**< 状态转移函数表 */ void (**transitionTable)(void *data); /**< 状态转移函数表 */
void (*transitionGeneralAction)(void *data); /**< 通用状态转移函数,不论有没有独立的状态转移函数都会执行 */ void (*transitionGeneralAction)(void *data); /**< 通用状态转移函数,不论有没有独立的状态转移函数都会执行。常用来清空内部变量 */
void (**enterActionTable)(void *data, FSM **cFSM); /**< 进入状态时运行的函数和plecs对标 */ void (**enterActionTable)(void *data, FSM **cFSM); /**< 进入状态时运行的函数和plecs对标 */
void (**duringActionTable)(void *data, FSM **cFSM); /**< 状态不变时运行的函数和plecs对标 */ void (**duringActionTable)(void *data, FSM **cFSM); /**< 状态不变时运行的函数和plecs对标 */
@ -151,4 +151,6 @@ static inline void clearAllSignals(FSMSignals *signals){
} }
#endif #endif

View File

@ -41,8 +41,6 @@ void _stepFSM(FSM *pFSM);
/* --------------------------------- 状态机信息获取 -------------------------------- */ /* --------------------------------- 状态机信息获取 -------------------------------- */
int getFSMCurState(FSM *pFSM); int getFSMCurState(FSM *pFSM);
int getFSMNextState(FSM *pFSM); int getFSMNextState(FSM *pFSM);
void setChildNum(FSM *pFSM, int num);
void registerChildFSM(FSM *parent, FSM *child, int index);
/* ------------------------------ Data和Signals ------------------------------ */ /* ------------------------------ Data和Signals ------------------------------ */
const void *_getData(FSM* pFSM); const void *_getData(FSM* pFSM);
@ -54,6 +52,7 @@ void _preloaderGetReady(FSM *pFSM);
int _getPreloaderOverFlag(FSM *pFSM); int _getPreloaderOverFlag(FSM *pFSM);
void _clearPreloaderOverFlag(FSM *pFSM); void _clearPreloaderOverFlag(FSM *pFSM);
/* ---------------------------------- 子状态机 ---------------------------------- */
void registerChildFSM(FSM *parent, FSM *child);
#endif #endif

View File

@ -1,4 +1,5 @@
#include <stdio.h> #include <stdio.h>
#include "assert.h"
#include "keyFSM.h" #include "keyFSM.h"
#include "FSM_public.h" #include "FSM_public.h"
@ -23,6 +24,7 @@ KeyIn keystat;
int main(){ int main(){
KeyFSM* keyFSM = createKeyFSM(); KeyFSM* keyFSM = createKeyFSM();
for (int i = 0; i < NUM; i++) for (int i = 0; i < NUM; i++)

View File

@ -1,4 +1,5 @@
#include <stdio.h> #include <stdio.h>
#include <assert.h>
#include "templateFSM.h" #include "templateFSM.h"
#include "FSM_public.h" #include "FSM_public.h"

View File

@ -1,5 +1,5 @@
Plecs { Plecs {
Name base64 "54q25oCB5py65rWL6K+V" Name base64 "54i25a2Q54q25oCB5py65rWL6K+V"
Version "4.7" Version "4.7"
CircuitModel "ContStateSpace" CircuitModel "ContStateSpace"
StartTime "0.0" StartTime "0.0"
@ -47,7 +47,7 @@ Plecs {
ScriptsDialogGeometry "" ScriptsDialogGeometry ""
ScriptsDialogSplitterPos "0" ScriptsDialogSplitterPos "0"
Schematic { Schematic {
Location [1734, 301; 2376, 730] Location [818, 291; 1460, 717]
ZoomFactor 1.71498 ZoomFactor 1.71498
SliderPosition [0, 0] SliderPosition [0, 0]
ShowBrowser off ShowBrowser off
@ -139,9 +139,9 @@ Plecs {
Show off Show off
} }
FSM { FSM {
Location [-1, -8; 2559, 1309] Location [0, 0; 1918, 923]
ZoomFactor 1.14437 ZoomFactor 0.76361
SliderPosition [0, 0] SliderPosition [0, 44]
FsmState { FsmState {
Name "A" Name "A"
Position [360, 480] Position [360, 480]
@ -161,8 +161,8 @@ Plecs {
} }
FsmState { FsmState {
Name "B" Name "B"
Position [1110, 430] Position [1400, 420]
Frame [-420, -270; 420, 270] Frame [-710, -260; 710, 260]
Parameter { Parameter {
Name "EnterAction" Name "EnterAction"
Value "printf(\" enterB \");" Value "printf(\" enterB \");"
@ -177,7 +177,7 @@ Plecs {
} }
FsmState { FsmState {
Name "D" Name "D"
Position [-240, -10] Position [-530, 0]
Frame [-100, -90; 100, 90] Frame [-100, -90; 100, 90]
Parameter { Parameter {
Name "EnterAction" Name "EnterAction"
@ -192,48 +192,107 @@ Plecs {
Value "printf(\" exitD \");" Value "printf(\" exitD \");"
} }
} }
FsmState {
Name ".Junction"
Position [-380, -150]
}
FsmState {
Name ".PointState"
Position [-380, -190]
}
FsmState { FsmState {
Name "E" Name "E"
Position [210, -10] Position [220, 40]
Frame [-100, -90; 100, 90] Frame [-400, -130; 400, 130]
Parameter { Parameter {
Name "EnterAction" Name "EnterAction"
Value "printf(\" enterE \");" Value "printf(\" enterE \");"
} }
Parameter { Parameter {
Name "DuringAction" Name "DuringAction"
Value "printf(\" duringE \");" Value ""
} }
Parameter { Parameter {
Name "ExitAction" Name "ExitAction"
Value "printf(\" exitE \");" Value "printf(\" exitE \");"
} }
}
FsmState { FsmState {
Name ".Junction" Name "State"
Position [-90, -160] Position [-130, 30]
Frame [-90, -60; 90, 60]
Parameter {
Name "EnterAction"
Value "/* enter action */"
}
Parameter {
Name "DuringAction"
Value ""
}
Parameter {
Name "ExitAction"
Value ""
}
} }
FsmState { FsmState {
Name ".PointState" Name ".PointState"
Position [-90, -200] 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 { FsmState {
Name "C" Name "C"
Position [650, 1050] Position [1100, 1110]
Frame [-100, -90; 100, 90] Frame [-550, -150; 550, 150]
Parameter { Parameter {
Name "EnterAction" Name "EnterAction"
Value "printf(\" enterC \");" Value "printf(\" enterC \");"
} }
Parameter { Parameter {
Name "DuringAction" Name "DuringAction"
Value "printf(\" duringC \");" Value ""
} }
Parameter { Parameter {
Name "ExitAction" Name "ExitAction"
Value "printf(\" exitC \");" 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 { FsmState {
Name ".PointState" Name ".PointState"
@ -367,6 +426,38 @@ Plecs {
Value "1" 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 { FsmTransition {
FsmSrcInfo { FsmSrcInfo {
StatePath "B/D" StatePath "B/D"
@ -529,18 +620,50 @@ Plecs {
} }
FsmTransition { FsmTransition {
FsmSrcInfo { FsmSrcInfo {
StatePath ".PointState" StatePath "C/.PointState"
TerminalLoc bottom TerminalLoc bottom
TerminalCoord 0.5 TerminalCoord 0.5
External on External on
} }
FsmDstInfo { FsmDstInfo {
StatePath "A" StatePath "C/D"
TerminalLoc top TerminalLoc top
TerminalCoord 0.509626 TerminalCoord 0.414129
External on 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 LabelPosition 0.5
Parameter { Parameter {
Name "Trigger" Name "Trigger"
@ -571,7 +694,7 @@ Plecs {
LabelPosition south LabelPosition south
Parameter { Parameter {
Variable "DialogGeometry" Variable "DialogGeometry"
Value "[1296 663 655 313]" Value "[782 587 655 313]"
Show off Show off
} }
Parameter { Parameter {
@ -683,17 +806,17 @@ Plecs {
Direction up Direction up
Flipped off Flipped off
LabelPosition south LabelPosition south
Location [811, 582; 1161, 825] Location [811, 582; 1161, 833]
State "AAAA/wAAAAD9AAAAAgAAAAEAAAAAAAAAAPwCAAAAA/sAAAAQAFoAbwBvA" State "AAAA/wAAAAD9AAAAAgAAAAEAAAAAAAAAAPwCAAAAA/sAAAAQAFoAbwBvA"
"G0AQQByAGUAYQAAAAAA/////wAAADQA////+wAAABQAUwBhAHYAZQBkAFYAaQBlAHcAcwAAAAAA//" "G0AQQByAGUAYQAAAAAA/////wAAADQA////+wAAABQAUwBhAHYAZQBkAFYAaQBlAHcAcwAAAAAA//"
"///wAAAGYA////+wAAAAwAVAByAGEAYwBlAHMAAAAAAP////8AAABmAP///wAAAAMAAAAAAAAAAPw" "///wAAAGYA////+wAAAAwAVAByAGEAYwBlAHMAAAAAAP////8AAABmAP///wAAAAMAAAAAAAAAAPw"
"BAAAAAfsAAAAUAEQAYQB0AGEAVwBpAGQAZwBlAHQAAAAAAP////8AAABQAP///wAAAV4AAADYAAAA" "BAAAAAfsAAAAUAEQAYQB0AGEAVwBpAGQAZwBlAHQAAAAAAP////8AAABQAP///wAAAV4AAADgAAAA"
"BAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAFQAbwBvAGwAQgBhAHIBAAAAAP////8AAAAAA" "BAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAFQAbwBvAGwAQgBhAHIBAAAAAP////8AAAAAA"
"AAAAA==" "AAAAA=="
SavedViews "AAAAAgAAAAA=" SavedViews "AAAAAgAAAAA="
HeaderState "AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAL/gMAAAAJAAAAA" HeaderState "AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAL/gMAAAAJAAAAB"
"wAAAGQAAAACAAAAZAAAAAkAAABkAAAACAAAAGQAAAAFAAAAZAAAAAQAAABkAAAABwAAAGQAAAAGAA" "gAAAGQAAAAHAAAAZAAAAAgAAABkAAAACQAAAGQAAAABAAAAZAAAAAIAAABkAAAAAwAAAGQAAAAEAA"
"AAZAAAAAEAAABkAAAAiwAAAAsBAAABAAAAAAAAAAAAAAAAZP////8AAACBAAAAAAAAAAsAAABzAAA" "AAZAAAAAUAAABkAAAAiwAAAAsBAAABAAAAAAAAAAAAAAAAZP////8AAACBAAAAAAAAAAsAAABzAAA"
"AAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAA" "AAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAA"
"AAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAA" "AAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAA"
"AAYAAAAAQAAAAAAAAPoAAAAABg=" "AAYAAAAAQAAAAAAAAPoAAAAABg="
@ -781,4 +904,4 @@ Plecs {
} }
} }
} }
DemoSignature "C/ZrxOQHJ0OXW30du/vTiFYFVRZZzc0r6Uyc2MRNbyo=" DemoSignature "3mLOZwvyqmZ1g5qsGftq/0aRPBxKRskpkes5wR/pt1M="

784
状态机测试.plecs Normal file
View File

@ -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 <stdio.h>\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 <stdio.h>\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="