从状态机的onEntry函数

时间:2018-01-15 16:15:47

标签: c state-machine

我正在做一个状态机,它应该在进入新状态时评估一些条件,并且根据这些条件,应该触发适当的新事件。我的第一个想法是从onEntry函数发送事件但是我有间接递归,据我所知(可能我错了),有点危险(因为堆栈溢出错误的可能性)。

以下是示例代码(注意,它只是状态机模式的示例我需要使用):

state_machine.h

typedef enum State
{
    STATE_A,
    STATE_B,
    STATE_C
} State;

typedef enum Event
{
    EVENT_A,
    EVENT_B,
    EVENT_C,
    EVENT_D,
    EVENT_E,
    EVENT_F
} Event;

void handleEvent(Event event);

state_machine.c

#include "state_machine.h"

static void switchState(State newState, Event event);

static void onExit(Event event);

static void onEntry();

static State currentState = STATE_A;

void handleEvent(Event event)
{
    switch (currentState)
    {
    case STATE_A:
        switchState(STATE_B, event);
        break;
    case STATE_B:
        switchState(STATE_C, event);
        break;
    case STATE_C:
        switchState(STATE_A, event);
        break;
    default:
        break;
    }
}

void switchState(State newState, Event event)
{
    onExit(event);
    currentState = newState;
    onEntry();
}

void onExit(Event event)
{
    // ...
}

void onEntry()
{
    switch (currentState)
    {
    case STATE_A:
        if (condition)
        {
            handleEvent(EVENT_C);
        }
        else
        {
            handleEvent(EVENT_D);
        }
        break;
    case STATE_B:
        // ...
        break;
    case STATE_C:
        // ...
        break;
    default:
        break;
    }
}

我对这个问题的第二个解决方案是拥有nextState变量,该变量将在onEntry函数中设置(而不是handleEvent调用)。然后在handleEvent函数的顶部,我会像这样:

if (nextEvent != EVENT_NULL)
{
    event = nextEvent;
    nextEvent = EVENT_NULL;
}

现在,我的问题是:在这种情况下,什么是更好的方法和/或通常做什么?

提前致谢

0 个答案:

没有答案