简单fsm状态机

typedef enum {
    state_1 = 1,
    state_2,
    state_3
}
State;

typedef enum {
    event_1 = 1,
    event_2,
    event_3,
    event_4,
    event_5
}EventID;

typedef void (*Action)(const EventID *);


typedef struct {
    State curState;//当前状态
    EventID eventId;//事件ID
    State nextState;//下个状态
    Action action;//具体表现
}StateTransform;

typedef struct {
    State state;
    int transNum;
    StateTransform* transform;
}StateMachine;


void runStateMachine(StateMachine* pSM, const EventID evt);
StateTransform* findTranss(StateMachine* pSM, const EventID evt)
{
    int i;
    for (i = 0; i < pSM->transNum; i++) {
        if ((pSM->transform[i].curState == pSM->state) && (pSM->transform[i].eventId == evt)) {
            return &pSM->transform[i];
        }
    }
    return NULL;
}

void runStateMachine(StateMachine* pSM, EventID evt) {
    StateTransform* pTrans;
    pTrans = findTranss(pSM, evt);
    if (pTrans == NULL)
    {
        printf("CurState= %s Do not process enent: %s\r\n", pSM->state, evt);
        return;
    }
    pSM->state = pTrans->nextState;
    Action act = pTrans->action;
    if (act == NULL) {
        printf("change state to %s. No action\r\n", pSM->state);
        return;
    }
    act(&evt);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值