来分析下有限状态机FSMC的实现和应用
状态机是比较常见的框架结构,有限状态机FSMC使得程序逻辑更清晰易懂
一般状态机的构成 当前状态,迁移条件,执行动作,下一个状态
1.定义状态表的数据类型
typedef struct
{
int event; //事件
int CurState; //当前状态
void (*eventActFun)(); //函数指针
int NextState; //下一个状态
}StateTable;
2.建立状态表
StateTable fTable[] =
{
//{到来的事件,当前的状态,将要要执行的函数,下一个状态}
{ event_1, state_1, f1, event_2 },
{ event_2, state_2, f2, event_3 },
{ event_3, state_3, f3 event_4 },
{ event_4, state_4, f1, event_1 },
}
/*状态机类型*/
typedef struct {
int curState;//当前状态
StateTable * stateTable;//状态表
int size;//表的项数
}fsmType;
/*状态机注册,给它一个状态表*/
void fsmRegist(fsmType* pFsm, StateTable* pTable)
{
pFsm->stateTable = pTable;
}
/*状态迁移*/
void fsmStateTransfer(fsmType* pFsm, int state)
{
pFsm->curState = state;
}
/*事件处理*/
void fsmEventHandle(fsmType* pFsm, int event)
{
StateTable* pActTable = pFsm->stateTable;
void (*eventActFun)() = NULL; //函数指针初始化为空
int NextState;
int CurState = pFsm->curState;
int maxNum = pFsm->size;
int flag = 0; //标识是否满足条件
/*获取当前动作函数*/
for (int i = 0; i<maxNum; i++)
{
//当且仅当当前状态下来个指定的事件,我才执行它
if (event == pActTable[i].event && CurState == pActTable[i].CurState)
{
flag = 1;
eventActFun = pActTable[i].eventActFun;
NextState = pActTable[i].NextState;
break;
}
}
if (flag) //如果满足条件了
{
/*动作执行*/
if (eventActFun)
{
eventActFun();
}
//跳转到下一个状态
fsmStateTransfer(pFsm, NextState);
}
else
{
printf("there is no match\n");
}
}
有限状态机比较依赖状态迁移的关系,状态表一定要建立好
有限状态机可以比较好的用在界面和命令解析中
比如界面:当前状态即当前的界面,迁移的事件是按键按下的事件,执行动作可以是显示界面,下一个状态可以是下一个界面状态