我正在尝试发布一种在我的项目中经常使用的技术,作为一个开源库。在Arduino项目中快速生成状态机的方法。
为状态机创建一个类,该类继承自状态机超类。然后,围绕在主循环中调用的状态对象包装状态函数,每个状态在结束时通知下一个状态。这很难解释,但很容易出现。
#include "StateMachine.h"
class Blink : public StateMachine{
private:
int port;
int waitTime;
CREATE_STATE(Blink, low);
CREATE_STATE(Blink, high);
void low() {
digitalWrite(port, LOW);
*this << &STATE(high) + waitTime;
}
void high() {
digitalWrite(port, HIGH);
*this << &STATE(low) + waitTime;
}
public:
Blink(int port, int waitTime) :
StateMachine(&STATE(low)),
port(port),
waitTime(waitTime),
INIT_STATE(Blink, low),
INIT_STATE(Blink, high)
{
pinMode(port, OUTPUT);
}
};
Blink led1(13, 1000);
Blink led2(14, 2000);
Blink led3(15, 3000);
void setup() {}
void loop() {
led1();
led2();
led3();
}
最复杂的部分抽象在宏CREATE_STATE()、STATE和INIT_STATE中。
对代码中包装器的状态引用。
#define CREATE_STATE(statemachine, state) State<statemachine> state_##state
#define INIT_STATE(statemachine, state) state_##state(this, &statemachine::state)
#define STATE(state) state_##state