函数指针
#include <stdio.h>
typedef void (*pActionFun)(void);
typedef enum{
Status1=1,
Status2,
}CurStatus;
typedef enum{
event1=1,
event2
}TriggerEvent;
typedef enum{
status1=1,
status2,
}NextStatus;
typedef struct status
{
CurStatus cur_status; //当前状态
TriggerEvent trigger_event; //触发事件
NextStatus next_status; //触发之后进入下一个状态
pActionFun act_exe; //触发之后执行的函数
}LogicStruct;
void Act_Fun(void)
{
printf("Act_Fun 0x01 ! \r\n");
}
LogicStruct logic_struct = {Status1,event1,status1,Act_Fun};
int main(int argc, char const *argv[])
{
logic_struct.act_exe(); //运行void Act_Fun(void)
printf("status study!\r\n");
return 0;
}
状态机学习
#include <stdio.h>
typedef void (*pActionFun)(void);
typedef enum{
event_1=1,
event_2,
event_3,
event_4,
event_5,
}TriggerEvent;
typedef enum{
status_1=1,
status_2,
status_3,
status_4,
status_5,
}Status;
typedef struct status
{
Status cur_status; //当前状态
TriggerEvent trigger_event; //触发事件
Status next_status; //触发之后进入下一个状态
pActionFun act_exe; //触发之后执行的函数
}LogicStruct;
typedef struct
{
Status status;
int status_num;
LogicStruct* logic_content;
}StatusMachine;
void Act_Fun132(void)
{
printf("Act_Fun 132 ! \r\n");
}
void Act_Fun142(void)
{
printf("Act_Fun 142 ! \r\n");
}
void Act_Fun213(void)
{
printf("Act_Fun 213 ! \r\n");
}
void Act_Fun242(void)
{
printf("Act_Fun 242 ! \r\n");
}
void Act_Fun321(void)
{
printf("Act_Fun 321 ! \r\n");
}
void Act_Fun332(void)
{
printf("Act_Fun 332 ! \r\n");
}
void Act_Fun353(void)
{
printf("Act_Fun 353 ! \r\n");
}
void RunSM(StatusMachine* xSM ,TriggerEvent TrigEveID)
{
for (int i = 0; i < xSM->status_num; i++)
{
if((xSM->logic_content[i].cur_status == xSM->status) && (xSM->logic_content[i].trigger_event == TrigEveID))
{
xSM->status = xSM->logic_content[i].next_status;
xSM->logic_content[i].act_exe(); //运行void Act_Fun(void)
break;
}
}
}
LogicStruct logic_Array[] = {
{status_1,event_3,status_2,Act_Fun132},//初始化为状态1,当事件3来临时,切换至状态2,运行函数Act_Fun132
{status_1,event_4,status_2,Act_Fun142},//当状态为状态1,当事件4来临时,切换至状态2,运行函数Act_Fun142
{status_2,event_1,status_3,Act_Fun213},//当状态为状态2,当事件1来临时,切换至状态3,运行函数Act_Fun213
{status_2,event_4,status_2,Act_Fun242},//当状态为状态2,当事件4来临时,切换至状态2,运行函数Act_Fun242
{status_3,event_2,status_1,Act_Fun321},//当状态为状态3,当事件2来临时,切换至状态1,运行函数Act_Fun321
{status_3,event_3,status_2,Act_Fun332},//当状态为状态3,当事件3来临时,切换至状态2,运行函数Act_Fun332
{status_3,event_5,status_3,Act_Fun353},//当状态为状态3,当事件5来临时,切换至状态3,运行函数Act_Fun353
};
StatusMachine gSM = {status_1,7,logic_Array};
int main(int argc, char const *argv[])
{
StatusMachine* pSM = NULL;
pSM = &gSM;
TriggerEvent TrigEve[15] = {
event_1,event_2,event_3,event_4,event_5,
event_1,event_2,event_3,event_4,event_5,
event_1,event_2,event_3,event_4,event_5
};
for (int j = 0; j < 15; j++)
{
RunSM(pSM ,TrigEve[j]);
}
printf("status study!\r\n");
return 0;
}
网友评论