#include "keyboard.h"
#include "alarm.h"
#include "globals.h"
#include "lcd.h"
#include "RTClib.h"


void initialStartParametr() {
rangeTimeNight[0] = subMenuNightLight[0].data.substring(0, 5);
rangeTimeNight[1] = subMenuNightLight[0].data.substring(8,13); 
rangeTimeDay[0] = subMenuDayLight[0].data.substring(0, 5);
rangeTimeDay[1] = subMenuDayLight[0].data.substring(8,13);

timeDelayPirNight = subMenuNightLight[1].data.toInt()*10;
timeDelayPirDay = subMenuDayLight[1].data.toInt()*10;
timeDelayAlarm = subMenuBuzzer[1].data.toInt()*10;
controlLCD.setApplyDataMenu(false);
}


void updateTime() {
  DateTime now = rtc.now(); // Получаем врем с модуля RTC

  lcd.setCursor(0, 2);
  lcd.print(String(now.year()) + "/");
  lcd.print(String(now.month()) + "/");
  lcd.print(String(now.day()) + " ");
  // Формат HH:MM:SS
  lcd.print(String(now.hour()) + ":");
  if (now.minute() < 10) lcd.print("0");
  lcd.print(String(now.minute()) + ":");
  if (now.second() < 10) lcd.print("0");
  lcd.print(now.second());
}

//****************************************************
void setup() {
  //джостик
  pinMode(Y_PIN, INPUT);
  pinMode(X_PIN, INPUT);
  buttonJostik.begin();
  //lcd
  Wire.begin();// Start I2C communication
  lcd.backlight();//включить подстветку
  lcd.init();
  lcd.clear();
  lcd.home();
  lcd.print("********************");
  Serial.begin(115200);
  lcd.setCursor(0, 1);
  lcd.print("Hello!");
  lcd.setCursor(0, 3);
  lcd.print("Press the joystick");


  //RTC модуль
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }
  //кнопки
  button1.begin();
  button2.begin();


  //LCD
  digitalWrite(ledDay, LOW);
  digitalWrite(ledNight, LOW);
  pinMode(ledDay, OUTPUT); //дневная подсветка
  pinMode(ledNight, OUTPUT); //ночная подстветка

  //датчик движения
  pirSensorNight.begin();
  pirSensorDay.begin();
  //Будильник
  alarmClock.begin();

  initialStartParametr();
}
//******************************************************
void loop() {
  
if(controlLCD.getApplyDataMenu()){ // проверка на изменение данных для дальнейших иницилизации
initialStartParametr();
}


  if (!startmenu) {
    updateTime(); //отображение времени и даты на экране
  }
  //*******логика кнопок***********************
  button1.setResetButton();
  button2.setResetButton();
  buttonJostik.setResetButton();
  if (button1.handleButton()) {
    ledOn = !ledOn;
    digitalWrite(32, ledOn);
  }
  if (button2.handleButton()) {
    ledOn = !ledOn;
    digitalWrite(32, ledOn);
  }
  //*********логика LCD и управления меню*****************
  char keypressed = kpd.getKey();
  unsigned long currentMillis = millis();
  if (controlLCD.timeOfWork() || controlLCD.periodOfWork()
      || controlLCD.timeM() || controlLCD.dateM()) {
    timeDelayError(previousMillis, currentMillis); //задержка для отображения ошибки
  }
  if (controlLCD.getenterMenu() && controlLCD.keyboardEnabled()) {
    if (keypressed != NO_KEY) {
      processKeyInput(keypressed);
    }
  }

  //джостик
  int x = analogRead(X_PIN);  // считываем значение оси X
  int y = analogRead(Y_PIN);  // считываем значение оси Y
  if (x != lastX) { // если значение оси X изменилось
    delay(200);
    controlLCD.moveCursor(x);
  }
  if (y != lastY) { // если значение оси Y изменилось
    delay(200);
    controlLCD.moveLine(y); // проверка нажатия и смещение
  }
  //кнопка джостика
  if (buttonJostik.handleButton()) {
    //первый старт меню
    if (!startmenu) {
      controlLCD.displayMenu();// отображение меню
      controlLCD.changeCursor();// курсор выбора
      startmenu = true;
    }
    else {
      controlLCD.selectMenuItem();
    }
  }

  // датчик движения ночью
      if(subMenuNightLight[2].data == "on"){
    pirSensorNight.enabled();
    }
  else if(subMenuNightLight[2].data == "off"){
pirSensorNight.disabled();
  }
  pirSensorNight.setTimeWork(rangeTimeNight[0], rangeTimeNight[1]);//время работы
  pirSensorNight.setTimeDelay(timeDelayPirNight); //времы задержки освещения
  if (pirSensorNight.timeControl(rtc)) {
    digitalWrite(ledNight, HIGH);
  }
  else {
    digitalWrite(ledNight, LOW);
  }

  // датчик движения днем
    if(subMenuDayLight[2].data == "on"){
    pirSensorDay.enabled();
    }
  else if(subMenuDayLight[2].data == "off"){
pirSensorDay.disabled();
  }
  pirSensorDay.setTimeWork("rangeTimeDay[0]", rangeTimeDay[1]);//время работы
  pirSensorDay.setTimeDelay(timeDelayPirDay); //времы задержки освещения
if (pirSensorDay.timeControl(rtc)) {
    if (!condition) { // проверка, не было ли условие выполнено ранее
      digitalWrite(ledDay, HIGH);
      condition = true; // установить флаг в true
    }
  } else {
    if (condition) { // проверка, было ли условие выполнено ранее
      digitalWrite(ledDay, LOW);
      condition = false; // сбросить флаг
    }
  }

//Serial.println(rangeTimeNight[0]);
//Serial.println(rangeTimeNight[1]);
//Serial.println(rangeTimeDay[0]);
//Serial.println(rangeTimeDay[1]);
//Serial.println(timeDelayPirNight);
//Serial.println(timeDelayPirDay);
//Serial.println(timeDelayAlarm );

  //будильникcurrentMenu[_currentMenuItem].data = inputBuffer;
  Serial.println(subMenuClock[0].data);
  Serial.println(subMenuClock[1].data);
  if(subMenuBuzzer[2].data == "On"){
    alarmClock.enabled();
    }
  else if(subMenuBuzzer[2].data == "Off"){
alarmClock.disabled();
  }
  alarmClock.setTimeDelay(timeDelayAlarm);
  alarmClock.setTimeAlarm(subMenuBuzzer[1].data);
  alarmClock.timeControl(rtc);

}
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
GND5VSDASCLSQWRTCDS1307+
Основной свет
Ночная подсветка
Доп нагрузка