doubao_chat/apps/common/net/testbox/fsm.c

105 lines
2.7 KiB
C

#include "system/includes.h"
#include "client.h"
#ifdef CONFIG_WIFIBOX_ENABLE
#ifdef FSM_DEBUG_ENABLE
#define log_info(x, ...) printf("[WB_FSM][INFO] " x " ", ## __VA_ARGS__)
#define log_err(x, ...) printf("[WB_FSM][ERR] " x " ", ## __VA_ARGS__)
#else
#define log_info(...)
#define log_err(...)
#endif
void FSM_StateTransfer(FSM_T *pFsm, u8 state)
{
pFsm->curState = state;
}
void FSM_EventHandle(FSM_T *pFsm, u8 event, void *parm)
{
FsmTable_T *pAcTable = pFsm->FsmTable;
s8(*eventActFun)(void *) = NULL;
u8 NextState;
u8 CurState = pFsm->curState;
u8 flag = 0;
s32 ret = -1;
static s32 timer = -1, reason = 0;
s32 timeout = 0;
for (u8 i = 0; i < pFsm->stuMaxNum; i++) {
if (event == pAcTable[i].event && CurState == pAcTable[i].CurState) {
flag = 1;
timeout = pAcTable[i].timeout;
eventActFun = pAcTable[i].eventActFun;
NextState = pAcTable[i].NextState;
break;
}
}
if (flag) {
log_info("CurState = %d", CurState);
if (CurState == pAcTable[0].CurState) {
reason = -1;
timer = sys_timeout_add(&reason, pFsm->errorFun, timeout);
log_info("add : timer_id = %d, timeout = %d.\n", timer, timeout);
} else {
if (timer) {
sys_timer_modify(timer, timeout);
log_info("modify : timer_id = %d, timeout = %d.\n", timer, timeout);
}
}
if (eventActFun != NULL) {
ret = eventActFun(parm);
}
if (timer && CurState == pAcTable[pFsm->stuMaxNum - 1].CurState && ret != FSM_KEEP_STATE) {
sys_timeout_del(timer);
timer = -1;
log_info("del : timer_id = %d.\n", timer);
}
switch (ret) {
case FSM_NEXT_STATE :
log_info("FSM_NEXT_STATE");
FSM_StateTransfer(pFsm, NextState);
break;
case FSM_KEEP_STATE :
log_info("FSM_KEEP_STATE");
break;
case FSM_ERR :
log_info("FSM_ERR");
reason = -2;
pFsm->errorFun(&reason);
if (timer) {
sys_timeout_del(timer);
log_info("del : timer_id = %d.\n", timer);
timer = -1;
}
break;
default :
break;
}
} else {
// do nothing
log_err("no match status.");
}
}
void FSM_Init(FSM_T *pFsm, FsmTable_T *pTable, u8 stuMaxNum, u8 curState, void (*errorFun)(void *))
{
pFsm->FsmTable = pTable;
pFsm->curState = curState;
pFsm->stuMaxNum = stuMaxNum;
pFsm->errorFun = errorFun;
}
#endif