#include "fsm.h"
#include "timeout.h"

typedef EFSM<Timeout> timeFSM;


// Button handling.
void startState(FSM& fsm) {
  Serial.println("Press button A to start.");
  fsm.newState(waitState);
}

void waitState(FSM& fsm) {
  if (digitalRead(2) == LOW) {
    Serial.println("Entering run state, press B to restart, press C to stop.");
    fsm.newState(runState);
  }
}

void runState(FSM& fsm) {
  if (digitalRead(3) == LOW) {
    Serial.println("Restarting.");
    fsm.newState(startState);
  }
  if (digitalRead(4) == LOW) {
    Serial.println("Entering stop state.");
    fsm.newState(stopState);
  }
}

void stopState(FSM&) {}


// LED handling.
void ledOn(timeFSM& fsm) {
  if (fsm.data.timeout()) {
    digitalWrite(LED_BUILTIN, HIGH);
    fsm.data.reset();
    fsm.newState(ledOff);
  }
}

void ledOff(timeFSM& fsm) {
  if (fsm.data.timeout()) {
    digitalWrite(LED_BUILTIN, LOW);
    fsm.data.reset();
    fsm.newState(ledOn);
  }
}


void setup() {
  Serial.begin(9600);

  for (size_t i = 2; i <= 4; i++) {
    pinMode(i, INPUT_PULLUP);
  }
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  static Timeout timeout(600);
  static timeFSM ledFsm(ledOn, timeout);
  ledFsm.loop();

  static FSM btnFsm(startState);
  btnFsm.loop();
}