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

LiquidCrystal_I2C lcd(0x27, 16, 2);

const int buttonDotPin = 2;
const int buttonDashPin = 3;
const int buttonSpacePin = 4;
const int buttonEnterPin = 5;

char morseBuffer[6];
String displayText = "";

// Define a dictionary for Morse code mappings
const char* morseMap[36] = {
  ".-",   // A
  "-...", // B
  "-.-.", // C
  "-..",  // D
  ".",    // E
  "..-.", // F
  "--.",  // G
  "....", // H
  "..",   // I
  ".---", // J
  "-.-",  // K
  ".-..", // L
  "--",   // M
  "-.",   // N
  "---",  // O
  ".--.", // P
  "--.-", // Q
  ".-.",  // R
  "...",  // S
  "-",    // T
  "..-",  // U
  "...-", // V
  ".--",  // W
  "-..-", // X
  "-.--", // Y
  "--..", // Z
  "-----", // 0
  ".----", // 1
  "..---", // 2
  "...--", // 3
  "....-", // 4
  ".....", // 5
  "-....", // 6
  "--...", // 7
  "---..", // 8
  "----."  // 9
};

bool isTranslationInProgress = false;

void setup() {
  lcd.init();
  lcd.backlight();
  pinMode(buttonDotPin, INPUT_PULLUP);
  pinMode(buttonDashPin, INPUT_PULLUP);
  pinMode(buttonSpacePin, INPUT_PULLUP);
  pinMode(buttonEnterPin, INPUT_PULLUP);
  Serial.begin(9600);
  resetMorseBuffer();
}

void loop() {
  if (digitalRead(buttonDotPin) == LOW) {
    appendMorseBuffer('.');
    delay(250);
  }
  
  if (digitalRead(buttonDashPin) == LOW) {
    appendMorseBuffer('-');
    delay(250);
  }

  if (digitalRead(buttonSpacePin) == LOW) {
    appendSpace();
  }
  
  if (digitalRead(buttonEnterPin) == LOW) {
    if (!isTranslationInProgress) {
      char morseChar = translateMorse();
      if (morseChar != '?') {
        displayText += morseChar;
        updateLCD();
      }
      resetMorseBuffer();
      isTranslationInProgress = true;
    }
  } else {
    isTranslationInProgress = false;
  }
}

void appendMorseBuffer(char dotOrDash) {
  int len = strlen(morseBuffer);
  if (len < 5) {
    morseBuffer[len] = dotOrDash;
    morseBuffer[len + 1] = '\0';
  }
}

void appendSpace() {
  displayText += ' ';
  updateLCD();
  delay(1000); // Pause for a moment to separate words
}

char translateMorse() {
  for (int i = 0; i < 36; i++) {
    if (strcmp(morseBuffer, morseMap[i]) == 0) {
      if (i < 26) {
        return 'A' + i;
      } else {
        return '0' + (i - 26);
      }
    }
  }
  return '?';
}

void resetMorseBuffer() {
  morseBuffer[0] = '\0';
}

void updateLCD() {
  lcd.clear();
  lcd.setCursor(0, 0);
  if (displayText.length() > 16) {
    lcd.print(displayText.substring(0, 16));
    lcd.setCursor(0, 1);
    lcd.print(displayText.substring(16));
  } else {
    lcd.print(displayText);
  }
}
$abcdeabcde151015202530fghijfghij