编程逻辑之状态机学习

函数指针

  • 状态机学习之前先来了解下>>函数指针学习:
#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;
}
posted @ 2020-11-20 10:36  火红色祥云  阅读(32)  评论(0编辑  收藏  举报