// By Ian Cumming found on arduino project hub
//https://create.arduino.cc/projecthub/ianabcumming/a-simple-arduino-menu-with-an-lcd-254080

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // ARDUINO UNO
byte buttons[] = {6,7,8}; //10 for additional pin
const byte nrButtons = 3; // change to 4 if additional button added
int menusize = 16;
String menu[] = {
  " Menu",                         //0           // hoofdtekst
  " Menu> LED one",                //1           // menu van de 3D Printer
  " Menu> LED one> Off",           //2           //optie voor menu 3D Printer
  " Menu> LED one> On",            //3           //optie voor menu 3D Printer
  " Menu> LED two",                //4           // menu van de Sticker machine
  " Menu> LED two> Off",           //5           //optie voor menu Sticker machine
  " Menu> LED two> On",            //6           //optie voor menu Sticker machine
  " Menu> LED three", 
  " Menu> LED three> Off", 
  " Menu> LED three> On",
  " Menu> LED four", 
  " Menu> LED four> Off", 
  " Menu> LED four> On",
  " Menu> Nothing1",               //7           //menu van nix1  
  " Menu> Nothing2",               //8           //menu van nix2
  " Menu> Nothing3",                //9           //menu van nix3
  
};

int t;
byte pressedButton, currentPos,currentPosParent, possiblePos[20], possiblePosCount, possiblePosScroll = 0;
String parent = "";

int brightness;
int LCDtoggle = 0;
int fadeAmount = 5;

unsigned long timer = (millis() / 10);
int LEDone = 0;
int LEDtwo = 0;
int LEDthree = 0;
int LEDfour = 0;

void updateMenu () {
  possiblePosCount = 0;
  while (possiblePosCount == 0) {
    
    for (t = 1; t < menusize;t++) {
      if (mid(menu[t],1,inStrRev(menu[t],">")-1).equals(menu[currentPos])) {
        possiblePos[possiblePosCount]  =  t;
        possiblePosCount = possiblePosCount + 1;
      }
    }
    
    //find the current parent for the current menu
    parent = mid(menu[currentPos],1,inStrRev(menu[currentPos],">")-1);
    currentPosParent = 0;
    for (t = 0; t < menusize; t++) {
       if (parent == menu[t]) {currentPosParent = t;}
    }

    // reached the end of the Menu line
    if (possiblePosCount == 0) {
      //Menu Option Items
      switch (currentPos) {
        case 2:
        case 3:
        case 5:
        case 6:
        case 8:
        case 9:
        case 11:
        case 12:
          for (t = 2; t < 13; t++) {
            if (mid(menu[t], len(menu[t]), 1) == "*") {
              menu[t] = mid(menu[t], 1, len(menu[t]) - 1);
            }
          }
          menu[currentPos] = menu[currentPos] + "*";
        break;
      }

      //Set Variables
      switch (currentPos) {
        case 2:
          LEDone = 0;
          break;
        case 3:
          LEDone = 1;
          break;
        case 5:
          LEDtwo = 0;
          break;
        case 6:
          LEDtwo = 1;
          break;
        case 8:
          LEDthree = 0;
          break;
        case 9:
          LEDthree = 1;
          break;
        case 11:
          LEDfour = 0;
          break;
        case 12:
          LEDfour = 1;
          break;
      }


      // go to the parent
      currentPos = currentPosParent;
    }
  }
    lcd.clear();
   // Serial.println(currentPos); //lahko zavzame 0 ali 1
   //Serial.println(menu[currentPos]);// Menu ali Menu> LED one
   //Serial.println(inStrRev(menu[currentPos],">")); // lahko zavzame 0 ali 6
   // Serial.println(len(menu[currentPos])); // lahko zavzame 5 ali 14
   //Serial.println(inStrRev(menu[currentPos],">")); //lahko zavzame 0 ali 6
  //Serial.println(len(menu[currentPos])-inStrRev(menu[currentPos],">")); // lahko zavzame 5 ali 8
    lcd.setCursor(0,0); lcd.print(mid(menu[currentPos],inStrRev(menu[currentPos],">")+1,len(menu[currentPos])-inStrRev(menu[currentPos],">")));
    
    
    lcd.setCursor(0,1); lcd.print(mid(menu[possiblePos[possiblePosScroll]],inStrRev(menu[possiblePos[possiblePosScroll]],">")+1,len(menu[possiblePos[possiblePosScroll]])-inStrRev(menu[possiblePos[possiblePosScroll]],">")));

}

// Look for a button press
byte checkButtonPress() {
  byte buttonPressed = 0;
  byte lastPressedButton = 0;
  for (t = 0; t<nrButtons;t++) {
    if (digitalRead(buttons[t]) == 0) {buttonPressed = (t + 1);
    }
  }
  lastPressedButton = buttonPressed;
  while (buttonPressed != 0) { // wait while the button is still down
    buttonPressed = 0;
    for (t = 0; t<nrButtons;t++) {
     if (digitalRead(buttons[t]) == 0) {buttonPressed = (t + 1);}
    }
  }
  return lastPressedButton;
}

void setup() {
  Serial.begin(115200);
  lcd.begin(16,2); 
  lcd.clear();
  
  for (t=0;t<nrButtons;t++) {
    pinMode(buttons[t],INPUT_PULLUP); 
  }
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9,OUTPUT);
  lcd.setCursor(0,0); lcd.print(" Hello");
  delay(1000);
  updateMenu();
}

void loop() {
  
  switch (LEDone) {
    case 0:
      digitalWrite(9, LOW);
    break;
    case 1:
      digitalWrite(9, HIGH);
    break;
  }
  switch (LEDtwo) {
    case 0:
      digitalWrite(10, LOW);
    break;
    case 1:
      digitalWrite(10, HIGH);
    break;
  }
  switch (LEDthree) {
    case 0:
      digitalWrite(11, LOW);
    break;
    case 1:
      digitalWrite(11, HIGH);
    break;
  }
  switch (LEDfour) {
    case 0:
      digitalWrite(12, LOW);
    break;
    case 1:
      digitalWrite(12, HIGH);
    break;
  }
  pressedButton = checkButtonPress();
   if (pressedButton != 0) {
   switch (pressedButton) {
     case 1:
       possiblePosScroll = (possiblePosScroll + 1) % possiblePosCount; // Scroll
       break;
     case 2:
       currentPos = possiblePos[possiblePosScroll]; // Okay
       break;
     case 3:
       currentPos = currentPosParent; // Back
       possiblePosScroll = 0;
       break;
   }
    updateMenu();
  }
  delay(200);
}
String mid(String str, int start, int len) { //izpis substringa
   int t = 0;
   String u = ""; 
   for (t = 0; t < len;t++) {
    u = u + str.charAt(t+start-1);
   }
   return u;
}

int inStrRev(String str,String chr) {
  int t = str.length()-1;
  int u = 0;
   while (t>-1) {
    if (str.charAt(t)==chr.charAt(0)) {
      u = t+1;t = -1;
    }
    t = t - 1;
   }
  return u;
}

int len(String str) {
  return str.length();
}
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
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
led1:A
led1:C
r2:1
r2:2
r1:1
r1:2
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
led2:A
led2:C
led3:A
led3:C
led4:A
led4:C
r3:1
r3:2
r4:1
r4:2
r5:1
r5:2