#include <ezButton.h>
#define BUTTON_1 A0
#define BUTTON_2 A1
#define BUTTON_3 A2
#define BUTTON_4 A3
#define BUTTON_5 A4
ezButton button_1 (BUTTON_1);
ezButton button_2 (BUTTON_2);
ezButton button_3 (BUTTON_3);
ezButton button_4 (BUTTON_4);
ezButton button_5 (BUTTON_5);
#define LED_1 12
#define LED_2 9
#define LED_3 6
#define LED_4 3
typedef enum EVENT {
EVENT_NONE,
EVENT_ENTRY,
EVENT_EXIT,
EVENT_A,
EVENT_B,
EVENT_C,
EVENT_D,
EVENT_E
} event_t;
typedef enum STATE_REPLY {
STATE_TRANSITION,
STATE_HANDELED,
STATE_IGNORED
} state_reply_t;
typedef state_reply_t (state_handler_t)(event_t e);
event_t event; /* the last event */
state_handler_t* current_state; /* pointer to current state function */
state_handler_t* next_state; /* pointer to next state function */
state_reply_t state_A (event_t ev);
state_reply_t state_B (event_t ev);
state_reply_t state_C (event_t ev);
state_reply_t state_D (event_t ev);
state_reply_t state_A (event_t ev)
{
switch (ev)
{
case EVENT_NONE:
//state_A_event_NONE_activities;
return STATE_HANDELED;
case EVENT_ENTRY:
//state_A_entry_activities;
digitalWrite(LED_1, HIGH);
return STATE_HANDELED;
case EVENT_EXIT:
//state_A_exit_activities;
digitalWrite(LED_1, LOW);
return STATE_HANDELED;
case EVENT_A:
//state_A_event_A_activities;
next_state = state_B;
return STATE_TRANSITION;
default:
return STATE_IGNORED;
}
}
state_reply_t state_B (event_t ev)
{
switch (ev)
{
case EVENT_NONE:
//state_B_event_NONE_activities;
return STATE_HANDELED;
case EVENT_ENTRY:
//state_B_entry_activities;
digitalWrite(LED_2, HIGH);
return STATE_HANDELED;
case EVENT_EXIT:
//state_B_exit_activities;
digitalWrite(LED_2, LOW);
return STATE_HANDELED;
case EVENT_B:
//state_B_event_B_activities;
next_state = state_C;
return STATE_TRANSITION;
case EVENT_C:
//state_B_event_C_activities;
next_state = state_D;
return STATE_TRANSITION;
default:
return STATE_IGNORED;
}
}
state_reply_t state_C (event_t ev)
{
switch (ev)
{
case EVENT_NONE:
//state_C_event_NONE_activities;
return STATE_HANDELED;
case EVENT_ENTRY:
//state_C_entry_activities;
digitalWrite(LED_3, HIGH);
return STATE_HANDELED;
case EVENT_EXIT:
//state_C_exit_activities;
digitalWrite(LED_3, LOW);
return STATE_HANDELED;
case EVENT_E:
//state_C_event_E_activities;
next_state = state_A;
return STATE_TRANSITION;
default:
return STATE_IGNORED;
}
}
state_reply_t state_D (event_t ev)
{
switch (ev)
{
case EVENT_NONE:
//state_D_event_NONE_activities;
return STATE_HANDELED;
case EVENT_ENTRY:
//state_D_entry_activities;
digitalWrite(LED_4, HIGH);
return STATE_HANDELED;
case EVENT_EXIT:
//state_D_exit_activities;
digitalWrite(LED_4, LOW);
return STATE_HANDELED;
case EVENT_D:
//state_D_event_D_activities;
next_state = state_C;
return STATE_TRANSITION;
default:
return STATE_IGNORED;
}
}
event_t evalute_inputs (void)
{
if (button_1.isPressed()) return EVENT_A;
if (button_2.isPressed()) return EVENT_B;
if (button_3.isPressed()) return EVENT_C;
if (button_4.isPressed()) return EVENT_D;
if (button_5.isPressed()) return EVENT_E;
return EVENT_NONE;
}
void setup()
{
pinMode(BUTTON_1, INPUT_PULLUP);
pinMode(BUTTON_2, INPUT_PULLUP);
pinMode(BUTTON_3, INPUT_PULLUP);
pinMode(BUTTON_4, INPUT_PULLUP);
pinMode(BUTTON_5, INPUT_PULLUP);
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(LED_3, OUTPUT);
pinMode(LED_4, OUTPUT);
current_state = state_A;
event = EVENT_ENTRY;
current_state(event);
}
void loop()
{
state_reply_t s;
button_1.loop();
button_2.loop();
button_3.loop();
button_4.loop();
button_5.loop();
event = evalute_inputs();
s = current_state(event);
if (s == STATE_TRANSITION)
{
current_state (EVENT_EXIT);
current_state = next_state;
current_state (EVENT_ENTRY);
}
}