#include <Arduino.h>
#include <WiFi.h>
#include <ESPping.h>
#include <mdns.h>
#include <WiFiUdp.h>
#include <U8g2lib.h>
#include "graphics.h"

//#include <ArduinoOTA.h>

#define FUNCTION_3 0x38 // Only for wokwi.com
//U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 3, /* data=*/ 1, /* reset=*/ U8X8_PIN_NONE);    //Low spped I2C

// const char* ssid     = "ZTE_721EFD"; // подставить название своей сети WiFi
// const char* password = "6S24V4Q63K"; //подставить пароль свой сети WiFi

const char* ssid     = "Wokwi-GUEST"; // подставить название своей сети WiFi
const char* password = ""; //подставить пароль свой сети WiFi


//IPAddress ip(192, 168, 1, 70); //Node static IP
//IPAddress gateway(192, 168, 0, 1);
//IPAddress subnet(255, 255, 255, 0);

//const char* remote_host = "www.ya.ru"; //адрес для пинга
const IPAddress remote_ip(8, 8, 8, 8); // адрес для пинга
unsigned long previousMillis = 0;
// const long interval = 30;     //интервал между пингами в сек
const long T_ROUTER = 60;     // время ожидания загрузки роутера в сек
const long T_RELAY = 5;       // задержка от выключения реле до включения в сек

int PIN_RELAY =   12;
int PIN_LED  =   13;
int PIN_BUTTON  =   0;
int COUNT_PING = 0;         //количество попыток при отсутствия пинга (не задается)
int COUNT_PING_MAX = 2;     //максимальное количество отсутствия пинга до перезагрузки роутера
int COUNT_WIFI = 0;         //счетчик попыток подключения к WiFi
int COUNT_WIFI_MAX = 60; //300;   // Таймаут до перезагрузки роутера при отсутствии WiFi в сек


void IRAM_ATTR Click() // Обязательно объявить IRAM_ATTR для правильного распределения памяти
{ // иначе постоянно ребут по WDT
  digitalWrite(PIN_RELAY, LOW);  // <===  отключаем питание на розетке

  //Serial.println("Реле выключено кнопкой");
}

// Основной модуль реле
void Relay()
{
  if (digitalRead(PIN_RELAY) == HIGH) // <===
  {
    //   Serial.println("Реле выключено");
  }
  delay(T_RELAY * 1000);
  digitalWrite(PIN_RELAY, HIGH); //<===
  // Serial.println("Реле включено, ждем загрузки роутера");
  delay(T_ROUTER * 1000); // ждем загрузки роутера
  COUNT_PING = 0;   // сбрасываем счетчик неуспешных пингов
  COUNT_WIFI = 0; // сбрасываем счетчик попыток подключения к WiFi
  previousMillis = 0;
}

void ConnectWIFI()
{
  // Serial.println("Подключение к WiFi");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  // WiFi.config(ip, gateway, subnet);
  while (WiFi.status() != WL_CONNECTED)
  {
    if (COUNT_WIFI <= COUNT_WIFI_MAX)
    {
      COUNT_WIFI++;
    }
    else
    {
      //     Serial.println();
      Relay();  //перезагружаемся так как нет подключения к WiFi
      //     Serial.println("Подключение к WiFi");
    }
    //Serial.println(WiFi.status());
    //  digitalWrite(PIN_LED, !digitalRead(PIN_LED)); //моргаем зеленым светодиодом
    delay(1000);
    //   Serial.print(".");
  }
  COUNT_WIFI = 0; // сбрасываем счетчик попыток подключения к WiFi
  // Serial.println();
  // Serial.print("WiFi подключен, ip : ");
  // Serial.println(WiFi.localIP());
  //Serial.println(WiFi.status());
  // digitalWrite(PIN_LED, LOW); // зажигаем зеленый светодиод
  COUNT_PING = 0;   // сбрасываем счетчик неуспешных пингов
}

void setup()
{
  pinMode(1, FUNCTION_3); //GPIO 1 swap the pin to a GPIO. #define FUNCTION_3 0x38
  pinMode(3, FUNCTION_3); //GPIO 3 swap the pin to a GPIO. #define FUNCTION_3 0x38
  //  pinMode(1, OUTPUT);
  //  pinMode(3, OUTPUT);
  //Wire.begin(1, 3);

  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_RELAY, OUTPUT);
  pinMode(PIN_BUTTON, INPUT);
  digitalWrite(PIN_RELAY, HIGH); //<===
  digitalWrite(PIN_LED, LOW);
  //  Serial.begin(74880);

  u8g2.begin();
  //u8g2.enableUTF8Print();
  //u8g2.setFont(u8g2_font_6x12_tr);

  delay(10);

  attachInterrupt(PIN_BUTTON, Click, FALLING);

  // ArduinoOTA.setHostname("ESP-164D8");
  // ArduinoOTA.begin();
  // Serial.println("OTA ready");
}

void loop()
{
  if (WiFi.status() != WL_CONNECTED)  // нет подключения к WiFi
  {
    ConnectWIFI(); //подключаемся к WiFi
  }

  u8g2.firstPage();
  do {
    int val = WiFi.RSSI();
    u8g2.drawXBM(113, 0, 15, 16, net_allArray[map(val, 0, -100, 0, 5)]);
    u8g2.setFont(u8g2_font_3x5im_mr);
    u8g2.setCursor(109, 5);
    u8g2.print(val);
  } while ( u8g2.nextPage() );

  unsigned long currentMillis = millis(); //                                | <===
  if (((currentMillis - previousMillis) >= 30000) && (digitalRead(PIN_RELAY) == HIGH) && (WiFi.status() == WL_CONNECTED))
  {
    previousMillis = currentMillis;
    //  Serial.print("Пинг? ==> ");
    //Serial.println(remote_host);
    //  Serial.println(remote_ip);
    //if(Ping.ping(remote_host))
    if (Ping.ping(remote_ip))
    { //пинг есть
      //  Serial.print(remote_ip);
      //  Serial.println(" ==> Понг!");
      COUNT_PING = 0;// сбрасываем счетчик неуспешных пингов
    } else
    { // пинга нет
      // Serial.print("Пинг отсутствует :( ");
      COUNT_PING ++;
      // Serial.println(COUNT_PING);
    }
  }
  if (COUNT_PING >= COUNT_PING_MAX) // если превышено количество попыток пинга перезагружаем роутер
  {
    Relay();
  }


  if (digitalRead(PIN_RELAY) == LOW) // <===  нажата кнопка, перезагружаем роутер
  {
    Relay();
  }

  // ArduinoOTA.handle();

}
NOCOMNCVCCGNDINLED1PWRRelay Module