//определение поддерживаемых плат
#define T_DONGLE 1
#define ESP32S3 2
#define ESP32 3
#include "INI.h"


// используем T_DONGLE по умолчанию
#if not defined(BOARD)
#define BOARD T_DONGLE
#endif

    #define LCD_PIXEL_WIDTH   160
    #define LCD_PIXEL_HEIGHT  80

// Распиновка ESP32S3
  #if BOARD == ESP32S3  
    #ifndef BOOT_PIN
    #define BOOT_PIN        0
    #endif
    #define SD_MMC_D0_PIN   14
    #define SD_MMC_D1_PIN   17
    #define SD_MMC_D2_PIN   21
    #define SD_MMC_D3_PIN   18
    #define SD_MMC_CLK_PIN  12
    #define SD_MMC_CMD_PIN  16

    #define LED_DI_PIN      40
    #define LED_CI_PIN      39

    #define LCD_SDA         43
    #define LCD_SCL         44


// Распиновка T_DONGLE
  #elif BOARD == T_DONGLE

    #ifndef BOOT_PIN
    #define BOOT_PIN        0
    #endif

    #define LED_DI_PIN      40
    #define LED_CI_PIN      39

    #define TFT_CS_PIN      4
    #define TFT_SDA_PIN     3
    #define TFT_SCL_PIN     5
    #define TFT_DC_PIN      2
    #define TFT_RES_PIN     1
    #define TFT_LEDA_PIN    38

    #define SD_MMC_D0_PIN   14
    #define SD_MMC_D1_PIN   17
    #define SD_MMC_D2_PIN   21
    #define SD_MMC_D3_PIN   18
    #define SD_MMC_CLK_PIN  12
    #define SD_MMC_CMD_PIN  16

    #define LCD_SDA         43
    #define LCD_SCL         44
  #else
  #pragma message ("PLATFORM NOT DEFINED")
  #error
  #endif
//**************************************************************************************************************
  #include <Arduino.h>
  #include "WiFi.h"
  #include "TimeLib.h"
  #include <NTPClient.h>
  #include <LittleFS.h>
  #include <WiFiUdp.h>
  #include "TFT_eSPI.h"
  #include <FastLED.h>
  #include "OneButton.h"
  #include <WiFiClient.h>
  #include <WebServer.h>
  #include <ESPmDNS.h>
  #include <SD_MMC.h>
  #include <FS.h>
  #include <esp_partition.h>
  #include <ArduinoOTA.h>
  #include <ASOLED_ESP8266.h>     
  #include <LiquidCrystal_I2C.h>  
  #include <Preferences.h>
  #include <nvs.h>


//**************************************************************************************************************
// Описание переменных
//**************************************************************************************************************
  Preferences prefs;
  LiquidCrystal_I2C LQ(0x27, 20, 4);
  WiFiUDP ntpUDP;
  NTPClient NTP(ntpUDP);
  OneButton button(BOOT_PIN, true);
  uint32_t rgb_change_interval = 0; // milliseconds
  uint8_t  rgb_hue = 0;
  CRGB leds;
  bool sdEnable = false;
  TFT_eSPI tft = TFT_eSPI();
  bool dispRotate = false;
  // UDP broadcast для обнаружения устройства
  WiFiUDP udp;
  const char* udpMessage = "SamovarichLogger";
  const unsigned long udpInterval = 5000; // 5 секунд

  // Состояние USB Mass Storage
  bool usbMassStorageActive = false;
  bool sdMounted = true; // SD примонтирована для веб-сервера

  // IP подсеть для broadcast
  IPAddress broadcastIp;

  WebServer server(80);
  File fsUploadFile;


  bool is_reboot = false;                                         // Признак перезагрузки

  bool BrokenFS = false;                                          // Признак поврежденной файловой системы

  String jsonstr2;

  struct SetupNVS {
      uint8_t flag;                                               // Флаг для инициализации настроек
      uint8_t disp;                                               // Дисплей 0-нет, 1-Tdongle, 2-LiquidCristal, 3-OLED
      char TpColor[20];                                        // Цвет температуры пара
      char TcColor[20];                                         // Цвет температуры царги
      char TwColor[20];                                        // Цвет температуры воды
      char TbColor[20];                                         // Цвет температуры куба
      char TtColor[20];                                          // Цвет температуры ТСА

      char PaColor[20];                                          // Цвет Атмосферное давление
      char NColor[20];                                          // Цвет № строки программы
      char VColor[20];                                          // Цвет Скорость отбора
      char DwColor[20];                                          // Цвет Мощность
      char PColor[20];                                          // Цвет Расход воды
      char AbColor[20];                                          // Цвет Спиртуозность куба
      char ApColor[20];                                          // Цвет Спиртуозность пара
      char PbColor[20];                                          // Цвет Давление в кубе
      
      char SavedSSID[33];                                         // SSID WiFi
      char SavedPASS[33];                                         // Пароль WiFi
      bool UseMQTT;                                               // Использование MQTT
      uint8_t TimeZone;                                           // Часовой пояс
      uint16_t LogPeriod;                                          //  период записи логов, не чаще
      bool dbg;                                                   // Отладочные сообщения
      uint16_t MQTT_Port;                                         // MQTT порт
      uint16_t udpLPort = 48899;                                  // Стандартный порт для обнаружения
      bool OTA;                                                   // OTA обновление
      uint16_t Session_timeout = 600;                             // таймаут сессии, сек
  };
  SetupNVS RegSetup;