#include "sm.h"
#include "sm-pop.h"

void build_machine() {
  declare_event("panelClosed", "PNCL");
  declare_event("lightOn", "L1ON");
  declare_event("doorOpened", "D1OP");
  declare_event("drawOpened", "D2OP");
  declare_event("doorClosed", "D1CL");

  declare_command("lockDoor", "D1LK");
  declare_command("unlockDoor", "D1UL");
  declare_command("unlockPanel", "PNUL");
  declare_command("lockPanel", "PNLK");

  declare_state("idle");
  declare_state("active");
  declare_state("waitingForDraw");
  declare_state("unlockedPanel");
  declare_state("waitingForLight");

  /* body for idle state */
  declare_action("idle", "unlockDoor");
  declare_action("idle", "lockPanel");
  declare_transition("idle", "doorClosed", "active");

  /* body for active state */
  declare_transition("active", "lightOn", "waitingForDraw");
  declare_transition("active", "drawOpened", "waitingForLight");

  /* body for waitingForDraw state */
  declare_transition("waitingForDraw", "drawOpened", "unlockedPanel");

  /* body for unlockedPanel state */
  declare_action("unlockedPanel", "lockDoor");
  declare_action("unlockedPanel", "unlockPanel");
  declare_transition("unlockedPanel", "panelClosed", "idle");

  /* body for waitingForLight state */
  declare_transition("waitingForLight", "lightOn", "unlockedPanel");

  /* reset event transitions */
  declare_transition("idle", "doorOpened, "idle");
  declare_transition("active", "doorOpened, "idle");
  declare_transition("waitingForDraw", "doorOpened, "idle");
  declare_transition("unlockedPanel", "doorOpened, "idle");
  declare_transition("waitingForLight", "doorOpened, "idle");
}