//LCD Library
#include <LiquidCrystal.h>
//Stepper Motor Library
//#include <AccelStepper.h>

//LCD Pins
const int rs = 25, en = 5, d4 = 6, d5 = 26, d6 = 7, d7 = 27;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
//Custom Characters for LCD
byte Heart[] = {
  B00000,
  B01010,
  B11111,
  B11111,
  B01110,
  B00100,
  B00000,
  B00000
};
byte amongi[] = {
  B00110,
  B01111,
  B11000,
  B11111,
  B11111,
  B11111,
  B10001,
  B10001
};

//PUSHBUTTONS
//Button 1
const int verticalScroll = 28;
int verticalScrollState = HIGH;
//Button 2
const int enter = 30;
int enterState = HIGH;
//Button 3
const int horizontalScroll = 31;
int horizontalScrollState = HIGH;

//Cursor Positions
int cursorPosition = -1;
int profile = 1;

//Menu Names
const char menu1[] = "Menu 1:";
const char menu2[] = "Menu 2:";

void setup() {
  Serial.begin(9600);
  //LCD Setup
  lcd.begin(16, 2);
  lcd.print("Welcome: Press");
  lcd.setCursor(0, 1);
  lcd.print("down to start");
  //Custom Character
  lcd.createChar(0, Heart);
  lcd.createChar(1, amongi);
  //Button
  pinMode(verticalScroll, INPUT_PULLUP);
  pinMode(enter, INPUT_PULLUP);
  pinMode(horizontalScroll, INPUT_PULLUP);
  //Homing Switches

  //Pneumatics Position Check Switch

  //Stepper Motor Homing

}

void loop() {
  verticalScrollState = digitalRead(verticalScroll);
  if (verticalScrollState == LOW) {
    cursorPosition = (cursorPosition + 1) % 3;
    switch (cursorPosition) {
      case 0:
        delay(100);
        homeMenu();
        break;
      case 1:
        delay(100);
        menu(menu1);
        break;
      case 2:
        delay(100);
        menu(menu2);
        break;
    }
  } else {
    Serial.println("No Update");
  }
}

void homeMenu() {
  lcd.setCursor(0, 0);
  lcd.print("Home Menu      ");
  lcd.setCursor(0, 1);
  lcd.print(">Home all Axes  ");
  delay(100);
  verticalScrollState = digitalRead(verticalScroll);
  while (verticalScrollState == HIGH) {
    enterState = digitalRead(enter);
    if (enterState == LOW) {
      //Homing Axes
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Homing...");
      delay(5000);
      homeMenu();
    }
    verticalScrollState = digitalRead(verticalScroll);
  }
}

void menu(char menuName[]) {
  lcd.setCursor(0, 0);
  lcd.print("                 ");
  lcd.setCursor(0, 0);
  lcd.print(menuName);
  lcd.setCursor(0, 1);
  lcd.print(">Start        ");
  delay(100);
  verticalScrollState = digitalRead(verticalScroll);
  while (verticalScrollState == HIGH) {
    enterState = digitalRead(enter);
    if (enterState == LOW) {
      profile = cursorPosition;
      cursorPosition = 0;
      start();
    }
    verticalScrollState = digitalRead(verticalScroll);
  }
}

void start() {
  lcd.setCursor(0, 0);
  lcd.print("Start Job?");
  lcd.setCursor(0, 1);
  lcd.print(">NO   YES");
  delay(100);
  while (true) {
    horizontalScrollState = digitalRead(horizontalScroll);
    if (horizontalScrollState == LOW) {
      if (cursorPosition == 0) {
        lcd.setCursor(0, 1);
        lcd.print(" NO  >YES");
      } else {
        lcd.setCursor(0, 1);
        lcd.print(">NO   YES");
      }
      cursorPosition = (cursorPosition + 1) % 2;
      delay(200);
    }
    enterState = digitalRead(enter);
    if (enterState == LOW) {
      if (cursorPosition == 0) {
        lcd.clear();
        cursorPosition = 0;
        break;
      } else {
        weldingProfile();
        break;
      }
    }
  }
  cursorPosition = 0;
  homeMenu();
}

void weldingProfile() {
  switch(profile) {
    case 1:
      Serial.println("case1");
      delay(2000);
      break;
    case 2:
      Serial.println("case2");
      delay(2000);
      break;    
  }
}
mega:SCL
mega:SDA
mega:AREF
mega:GND.1
mega:13
mega:12
mega:11
mega:10
mega:9
mega:8
mega:7
mega:6
mega:5
mega:4
mega:3
mega:2
mega:1
mega:0
mega:14
mega:15
mega:16
mega:17
mega:18
mega:19
mega:20
mega:21
mega:5V.1
mega:5V.2
mega:22
mega:23
mega:24
mega:25
mega:26
mega:27
mega:28
mega:29
mega:30
mega:31
mega:32
mega:33
mega:34
mega:35
mega:36
mega:37
mega:38
mega:39
mega:40
mega:41
mega:42
mega:43
mega:44
mega:45
mega:46
mega:47
mega:48
mega:49
mega:50
mega:51
mega:52
mega:53
mega:GND.4
mega:GND.5
mega:IOREF
mega:RESET
mega:3.3V
mega:5V
mega:GND.2
mega:GND.3
mega:VIN
mega:A0
mega:A1
mega:A2
mega:A3
mega:A4
mega:A5
mega:A6
mega:A7
mega:A8
mega:A9
mega:A10
mega:A11
mega:A12
mega:A13
mega:A14
mega:A15
stepper1:A-
stepper1:A+
stepper1:B+
stepper1:B-
lcd1:VSS
lcd1:VDD
lcd1:V0
lcd1:RS
lcd1:RW
lcd1:E
lcd1:D0
lcd1:D1
lcd1:D2
lcd1:D3
lcd1:D4
lcd1:D5
lcd1:D6
lcd1:D7
lcd1:A
lcd1:K
A4988
drv1:ENABLE
drv1:MS1
drv1:MS2
drv1:MS3
drv1:RESET
drv1:SLEEP
drv1:STEP
drv1:DIR
drv1:GND.1
drv1:VDD
drv1:1B
drv1:1A
drv1:2A
drv1:2B
drv1:GND.2
drv1:VMOT
stepper2:A-
stepper2:A+
stepper2:B+
stepper2:B-
A4988
drv2:ENABLE
drv2:MS1
drv2:MS2
drv2:MS3
drv2:RESET
drv2:SLEEP
drv2:STEP
drv2:DIR
drv2:GND.1
drv2:VDD
drv2:1B
drv2:1A
drv2:2A
drv2:2B
drv2:GND.2
drv2:VMOT
stepper3:A-
stepper3:A+
stepper3:B+
stepper3:B-
A4988
drv3:ENABLE
drv3:MS1
drv3:MS2
drv3:MS3
drv3:RESET
drv3:SLEEP
drv3:STEP
drv3:DIR
drv3:GND.1
drv3:VDD
drv3:1B
drv3:1A
drv3:2A
drv3:2B
drv3:GND.2
drv3:VMOT
vcc1:VCC
gnd1:GND
r2:1
r2:2
r1:1
r1:2
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r