Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 25 additions & 24 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Please send email to lijunshi2015@163.com if you have any question.
//#include <windows.h> //windows
#include <unistd.h> //linux

//�������Ƕ�����С��һ���״̬����
//比如我们定义了小明一天的状态如下
enum
{
GET_UP,
Expand All @@ -19,7 +19,7 @@ enum
SLEEP,
};

//���Ƕ�����¼������¼���
//我们定义的事件有以下几个
enum
{
EVENT1 = 1,
Expand All @@ -30,22 +30,22 @@ enum

typedef struct FsmTable_s
{
int event; //�¼�
int CurState; //��ǰ״̬
void (*eventActFun)(); //����ָ��
int NextState; //��һ��״̬
int event; //事件
int CurState; //当前状态
void (*eventActFun)(); //函数指针
int NextState; //下一个状态
}FsmTable_t;


typedef struct FSM_s
{
FsmTable_t* FsmTable; //ָ���״̬��
int curState; //FSM��ǰ������״̬
FsmTable_t* FsmTable; //指向的状态表
int curState; //FSM当前所处的状态

}FSM_t;


int g_max_num; //״̬���ﺬ�е�״̬����
int g_max_num; //状态表里含有的状态个数



Expand Down Expand Up @@ -80,32 +80,32 @@ void Go2Bed()
printf("xiao ming goes to bed!\n");
}

/*״̬��ע��*/
/*状态机注册*/
void FSM_Regist(FSM_t* pFsm, FsmTable_t* pTable)
{
pFsm->FsmTable = pTable;
}

/*״̬Ǩ��*/
/*状态迁移*/
void FSM_StateTransfer(FSM_t* pFsm, int state)
{
pFsm->curState = state;
}


/*�¼�����*/
/*事件处理*/
void FSM_EventHandle(FSM_t* pFsm, int event)
{
FsmTable_t* pActTable = pFsm->FsmTable;
void (*eventActFun)() = NULL; //����ָ���ʼ��Ϊ��
void (*eventActFun)() = NULL; //函数指针初始化为空
int NextState;
int CurState = pFsm->curState;
int flag = 0; //��ʶ�Ƿ���������
int flag = 0; //标识是否满足条件

/*��ȡ��ǰ��������*/
/*获取当前动作函数*/
for (int i = 0; i<g_max_num; i++)
{
//���ҽ�����ǰ״̬������ָ�����¼����Ҳ�ִ����
//当且仅当当前状态下来个指定的事件,我才执行它
if (event == pActTable[i].event && CurState == pActTable[i].CurState)
{
flag = 1;
Expand All @@ -116,15 +116,15 @@ void FSM_EventHandle(FSM_t* pFsm, int event)
}


if (flag) //�������������
if (flag) //如果满足条件了
{
/*����ִ��*/
/*动作执行*/
if (eventActFun)
{
eventActFun();
}

//��ת����һ��״̬
//跳转到下一个状态
FSM_StateTransfer(pFsm, NextState);
}
else
Expand All @@ -135,7 +135,7 @@ void FSM_EventHandle(FSM_t* pFsm, int event)

FsmTable_t XiaoMingTable[] =
{
//{�������¼�����ǰ��״̬����ҪҪִ�еĺ�������һ��״̬}
//{到来的事件,当前的状态,将要要执行的函数,下一个状态}
{ EVENT1, SLEEP, GetUp, GET_UP },
{ EVENT2, GET_UP, Go2School, GO_TO_SCHOOL },
{ EVENT3, GO_TO_SCHOOL, HaveLunch, HAVE_LUNCH },
Expand All @@ -145,7 +145,7 @@ FsmTable_t XiaoMingTable[] =
//add your codes here
};

//��ʼ��FSM
//初始化FSM
void InitFsm(FSM_t* pFsm)
{
g_max_num = sizeof(XiaoMingTable) / sizeof(FsmTable_t);
Expand All @@ -154,7 +154,7 @@ void InitFsm(FSM_t* pFsm)
}


//�����õ�
//测试用的
void test(int *event)
{
if (*event == 3)
Expand All @@ -174,14 +174,15 @@ int main()
FSM_t fsm;
InitFsm(&fsm);
int event = EVENT1;
//С����һ��,�ܶ���ʼ��һ����һ�죬��������ͬ�Ļ
//小明的一天,周而复始的一天又一天,进行着相同的活动
while (1)
{
printf("event %d is coming...\n", event);
FSM_EventHandle(&fsm, event);
printf("fsm current state %d\n", fsm.curState);
test(&event);
Sleep(1); //����1�룬����۲�
//sleep(1); //linux 下使用小写的sleep
Sleep(1); //休眠1秒,方便观察
}

return 0;
Expand Down