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

// Definirea pinilor keypad-ului
const byte ROWS = 4; // numărul de rânduri ale keypad-ului
const byte COLS = 4; // numărul de coloane ale keypad-ului
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; // pinii pentru rândurile keypad-ului
byte colPins[COLS] = {5, 4, 3, 2}; // pinii pentru coloanele keypad-ului
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); // initializarea keypad-ului

String inputString;
long inputInt;

// Definirea LCD-ului I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // adresa I2C și dimensiunea LCD-ului

enum MenuOption {
  MANUAL_INPUT,
  BURST_TEST,
  NUM_MENU_OPTIONS
};

MenuOption currentOption = MANUAL_INPUT; // opțiunea curentă din meniu
bool stopFlag = false; // indicator pentru oprirea execuției

// Declarația funcției pentru scriptul 2
void runScript2();

void setup() {
  lcd.begin(16, 2); // inițializarea LCD-ului
  lcd.backlight(); // activarea iluminării LCD-ului

  // Afisarea optiunilor din meniu
  lcd.setCursor(0, 0);
  lcd.print("1. Manual Input");
  lcd.setCursor(0, 1);
  lcd.print("2. Burst Test");
}

void loop() {
  char key = keypad.getKey(); // citirea valorii introduse prin keypad

  if (key != NO_KEY) {
    switch (key) {
      case 'A': // Navigare sus în meniu
        currentOption = static_cast<MenuOption>((currentOption - 1 + NUM_MENU_OPTIONS) % NUM_MENU_OPTIONS);
        updateMenuDisplay();
        break;

      case 'B': // Navigare jos în meniu
        currentOption = static_cast<MenuOption>((currentOption + 1) % NUM_MENU_OPTIONS);
        updateMenuDisplay();
        break;

      case 'C': // Selectare opțiune
        if (currentOption == MANUAL_INPUT) {
          lcd.clear();
          lcd.print("Input Value:");
          runScript2(); // Apelul către scriptul 2 (funcția runScript2())
        }
        else if (currentOption == BURST_TEST) {
          lcd.clear();
          lcd.print("Selected: Burst");
          // Aici puteți insera codul pentru opțiunea "Burst Test"
        }
        break;

      case 'D': // Stop și întoarcere la meniul anterior
        if (stopFlag) {
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("1. Manual Input");
          lcd.setCursor(0, 1);
          lcd.print("2. Burst Test");
          currentOption = MANUAL_INPUT;
          stopFlag = false;
        } else {
          lcd.clear();
          lcd.print("Test Stopped");
          stopFlag = true;
        }
        break;
    }
  }
}

void updateMenuDisplay() {
  lcd.setCursor(0, 0);
  if (currentOption == MANUAL_INPUT) {
    lcd.print(">");
  } else {
    lcd.print(" ");
  }
  lcd.print("1. Manual Input");

  lcd.setCursor(0, 1);
  if (currentOption == BURST_TEST) {
    lcd.print(">");
  } else {
    lcd.print(" ");
  }
  lcd.print("2. Burst Test");
}

// Implementarea funcției pentru scriptul 2
void runScript2() {
  lcd.clear();
  lcd.print("Input Value:");
  lcd.setCursor(1, 1);
  
  String inputString;
  long inputInt;

  while (true) {
    char key = keypad.getKey();

    if (key) {
      lcd.print(key);

      if (key >= '0' && key <= '9') {     // doar pentru taste numerice
        inputString += key;
      } else if (key == '#') {
        if (inputString.length() > 0) {
          inputInt = inputString.toInt();
          inputString = "";

          lcd.clear();
          lcd.print("Test Started: ");
          lcd.print(inputInt);
          
          // Aici puteți adăuga codul specific pentru scriptul 2,
          // folosind valoarea inputInt pentru a-l utiliza în script

          //delay(2000);
          lcd.clear();
          lcd.print("Test Completed");
          delay(2000);

          break;  // întreruperea buclei while
        }
      } else if (key == '*') {
        inputString = "";
        lcd.clear();
        lcd.print("Test Canceled");
        delay(2000);

        break;  // întreruperea buclei while
      }
    }
  }
}

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
keypad:R1
keypad:R2
keypad:R3
keypad:R4
keypad:C1
keypad:C2
keypad:C3
keypad:C4
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL