#include <Wire.h>
#include <ST7032_asukiaaa.h>

ST7032_asukiaaa lcd;

// 🔹 Настройки пинов кнопок
const int PIN_S1 = 5;  // Кнопка для LED 1
const int PIN_S2 = 18; // Кнопка для LED 2

// 🔹 Настройки пинов светодиодов НА ESP32
const int PIN_LED1_ESP32 = 13; 
const int PIN_LED2_ESP32 = 23;

// 🔹 Состояния светодиодов (false = OFF, true = ON)
bool led1_state = false;
bool led2_state = false;

void setup() {
  // Инициализация LCD
  lcd.begin(16, 2);
  lcd.setContrast(60);
  lcd.print("ESP32 Master");
  lcd.setCursor(0, 1);
  lcd.print("Ready...      ");

  // Инициализация I2C Master
  Wire.begin(); 

  // Настройка кнопок (вход с подтяжкой к плюсу)
  pinMode(PIN_S1, INPUT_PULLUP);
  pinMode(PIN_S2, INPUT_PULLUP);

  // Настройка светодиодов на выход
  pinMode(PIN_LED1_ESP32, OUTPUT);
  pinMode(PIN_LED2_ESP32, OUTPUT);
  
  // Выключаем их при старте
  digitalWrite(PIN_LED1_ESP32, LOW);
  digitalWrite(PIN_LED2_ESP32, LOW);
}

// Функция отправки команды на Arduino И управления локальным LED
void sendCommand(const char* message, int ledPin, bool state) {
  // 1. Отправляем данные по I2C на Arduino
  Wire.beginTransmission(8); // Адрес Arduino UNO
  Wire.write((const uint8_t*)message, strlen(message)); 
  Wire.endTransmission();    
  
  // 2. Управляем светодиодом на самом ESP32
  digitalWrite(ledPin, state ? HIGH : LOW);

  // 3. Вывод на LCD
  lcd.setCursor(0, 1);
  lcd.print("                "); // Очистка строки пробелами
  lcd.setCursor(0, 1);
  lcd.print(message);
}

void loop() {
  // 🔹 Обработка кнопки S1 (управляет LED 1)
  // digitalRead возвращает LOW, если кнопка нажата (так как INPUT_PULLUP)
  if (digitalRead(PIN_S1) == LOW) {
    delay(200); // Задержка для устранения дребезга контактов
    
    // Проверяем еще раз, чтобы убедиться, что кнопка действительно нажата
    if (digitalRead(PIN_S1) == LOW) {
      
      // Переключаем состояние
      led1_state = !led1_state;
      
      if (led1_state) {
        sendCommand("LED_1_ON", PIN_LED1_ESP32, true);
      } else {
        sendCommand("LED_1_OFF", PIN_LED1_ESP32, false);
      }
      
      // Ждем, пока кнопку отпустят, чтобы не сработало много раз подряд
      while (digitalRead(PIN_S1) == LOW) {
        delay(10);
      }
    }
  }

  // 🔹 Обработка кнопки S2 (управляет LED 2)
  if (digitalRead(PIN_S2) == LOW) {
    delay(200); // Задержка для устранения дребезга контактов
    
    if (digitalRead(PIN_S2) == LOW) {
      
      // Переключаем состояние
      led2_state = !led2_state;
      
      if (led2_state) {
        sendCommand("LED_2_ON", PIN_LED2_ESP32, true);
      } else {
        sendCommand("LED_2_OFF", PIN_LED2_ESP32, false);
      }
      
      // Ждем отпускания кнопки
      while (digitalRead(PIN_S2) == LOW) {
        delay(10);
      }
    }
  }
}