#define T0_BUTTON_GPIO 2 // Button
#define T1_BUTTON_GPIO 3 // Button
#define P0_LED_GPIO 4 // LED
#define P1_LED_GPIO 5 // LED
class Grafcet
{
public:
Grafcet()
{
initGPIO();
resetStates();
}
void resetStates()
{
// Activation des etapes initiales.
// Desactivation des autres etapes.
etapes[0] = true; // Etape P0
etapes[1] = false; // Etape P1
}
void update()
{
// Do actions (set outputs)
outputs[0] = false;
outputs[1] = false;
if (etapes[0])
{
outputs[0] = true;
}
if (etapes[1])
{
outputs[1] = true;
}
digitalWrite(P0_LED_GPIO, outputs[0]);
digitalWrite(P1_LED_GPIO, outputs[1]);
// Get sensor values (read inputs)
inputs[0] = !digitalRead(T0_BUTTON_GPIO);
inputs[1] = !digitalRead(T1_BUTTON_GPIO);
// Update transitions
transitions[0] = etapes[0] && T0();
transitions[1] = etapes[1] && T1();
// Update states
if (transitions[0])
{
etapes[0] = false;
etapes[1] = true;
}
if (transitions[1])
{
etapes[1] = false;
etapes[0] = true;
}
}
private:
void initGPIO()
{
// Initialisation des entrees
pinMode(T0_BUTTON_GPIO, INPUT_PULLUP);
pinMode(T1_BUTTON_GPIO, INPUT_PULLUP);
// Initialisation des sorties
pinMode(P0_LED_GPIO, OUTPUT);
pinMode(P1_LED_GPIO, OUTPUT);
}
inline bool T0() { return inputs[0]; } const;
inline bool T1() { return inputs[1] && (!inputs[0]); } const;
private:
bool etapes[2];
bool transitions[2];
bool inputs[2];
bool outputs[2];
};
static Grafcet g;
void setup()
{
}
void loop()
{
g.update();
}