#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

int upButton = 2;
int downButton = 3;
int selectButton = 4;
int backButton = 5;
int analogPin = A3;
int val = 0;
int menu = 1;
int stop = 0;
int Led_1 = 12;
int Led_2 = 13;
int Led_3 = 8;

// debounce variables
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

int lastUpButtonState = HIGH;
int lastDownButtonState = HIGH;
int lastSelectButtonState = HIGH;
int lastBackButtonState = HIGH;

void setup() {
  pinMode(Led_1, OUTPUT);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(3,0);
  lcd.print(" Pressure ");
  lcd.setCursor(3,1);
  lcd.print("Controller");
  delay(1500);
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(selectButton, INPUT_PULLUP);
  pinMode(backButton, INPUT_PULLUP);
  updateMenu();
}

void loop() {
  //val = analogRead(analogPin); 
  //Serial.println(val);
  int upButtonState = digitalRead(upButton);
  int downButtonState = digitalRead(downButton);
  int selectButtonState = digitalRead(selectButton);
  int backButtonState = digitalRead(backButton);

  // debounce the buttons
  if (millis() - lastDebounceTime > debounceDelay) {
    // update the last button states
    lastUpButtonState = upButtonState;
    lastDownButtonState = downButtonState;
    lastSelectButtonState = selectButtonState;
    lastBackButtonState = backButtonState;

    if (!lastDownButtonState){
      menu++;
      updateMenu();
      while (!digitalRead(downButton));
    }
    if (!lastUpButtonState){
      menu--;
      updateMenu();
      while(!digitalRead(upButton));
    }
    if (!lastSelectButtonState){
      executeAction();
      delay(100);
      while (!digitalRead(selectButton));
    }
    if (!lastBackButtonState){
      if (stop==1) {
        lcd.clear();
        lcd.setCursor(1,0);
        lcd.print("Test Stopped");
        digitalWrite(Led_1, LOW);
        digitalWrite(Led_2, LOW);
        digitalWrite(Led_3, LOW);
        lcd.setCursor(1,1);
        lcd.print("Last Read:");
        stop=0;
      }
      else
      {
        updateMenu();
      }
      delay(100);
      while (!digitalRead(backButton));
    }
    // reset the debounce timer
    lastDebounceTime = millis();
  }
}

void updateMenu() {
  switch (menu) {
    case 0:
      menu = 1;
      break;
    case 1:
      lcd.clear();
      lcd.print("->25 mBar Test");
      lcd.setCursor(0, 1);
      lcd.print("  50 mBar Test");
      break;
    case 2:
      lcd.clear();
      lcd.print("  25 mBar Test");
      lcd.setCursor(0, 1);
      lcd.print("->50 mBar Test");
      break;
    case 3:
      lcd.clear();
      lcd.print("->100 mBar Test");
      lcd.setCursor(0, 1);
      lcd.print("  Burst Test");
      break;
    case 4:
      lcd.clear();
      lcd.print("  100 mBar Test");
      lcd.setCursor(0, 1);
      lcd.print("->Burst Test");
      break;
    case 5:
      menu = 4;
      break;
  }
}

void executeAction() {
  switch (menu) {
    case 1:
      action1();
      break;
    case 2:
      action2();
      break;
    case 3:
      action3();
      break;
    case 4:
      action4();
      break;
  }
}

void action1() {
  lcd.clear();
  lcd.print("25mBar Test Run");
  val = analogRead(A3);
  digitalWrite(Led_1, HIGH);
    // read the input pin
            // debug value
  lcd.setCursor(1,1);
  lcd.print("P:");
  lcd.print(val) and lcd.print("mBar");
  stop=1;
  
}
void action2() {
  lcd.clear();
  digitalWrite(Led_2, HIGH);
  lcd.print("Executing #2");
  stop=1;
 
}
void action3() {
  lcd.clear();
  digitalWrite(Led_3, HIGH);
  lcd.print("Executing #3");
  stop=1; 
}
void action4() {
  lcd.clear();
  digitalWrite(Led_1, HIGH);
  digitalWrite(Led_2, HIGH);
  digitalWrite(Led_3, HIGH);
  lcd.print("Executing #4");
  stop=1;
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
btn4:1.l
btn4:2.l
btn4:1.r
btn4:2.r
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C