// -------------- ВНУТР. КОНСТАНТЫ ---------------
#define GL_ADC_NONE 1
#define GL_ADC_BRI 2
#define GL_ADC_MIC 3
#define GL_ADC_BOTH 4
#define GL_TYPE_STRIP 1
#define GL_TYPE_ZIG 2
#define GL_TYPE_PARAL 3
#define GL_MUS_NONE 1
#define GL_MUS_VOL 2
#define GL_MUS_LOW 3
#define GL_MUS_HIGH 4
#define GL_REACT_BRI 1
#define GL_REACT_SCL 2
#define GL_REACT_LEN 3
#define GL_SLAVE 0
#define GL_MASTER 1

// ------------------- МАКРО --------------------
#ifdef DEBUG_SERIAL
#define DEBUGLN(x) Serial.println(x)
#define DEBUG(x) Serial.print(x)
#else
#define DEBUGLN(x)
#define DEBUG(x)
#endif

#define FOR_i(x,y)  for (int i = (x); i < (y); i++)
#define FOR_j(x,y)  for (int j = (x); j < (y); j++)
#define CUR_PRES preset[cfg.curPreset]

byte scaleFF(byte x, byte b) {
  return ((uint16_t)x * (b + 1)) >> 8;
}
int mapFF(byte x, byte min, byte max) {
  return (((max - min) * x + (min << 8) + 1) >> 8);
}

const char OTAhost[] = "http://ota.alexgyver.ru/GL2_latest.bin";

const char *NTPservers[] = {
  "pool.ntp.org",
  "europe.pool.ntp.org",
  "ntp1.stratum2.ru",
  "ntp2.stratum2.ru",
  "ntp.msk-ix.ru",
};

#define CFG_SIZE 13
struct Config {
  byte GMT = 3;           // часовой пояс +13
  byte NTP = 1;           // 1..5 ВЫЧЕСТЬ 1
  byte bright = 100;      // яркость
  byte adcMode = 1;       // режим ацп (1 выкл, 2 ярк, 3 муз)
  byte minBright = 0;     // мин яркость
  byte maxBright = 255;   // макс яркость
  byte rotation = 0;      // смена режимов: 0 ручная, 1 авто
  byte rotRnd = 0;        // тип автосмены: 0 в порядке, 1 рандом
  byte rotPeriod = 1;     // период смены (1,5..)
  byte deviceType = 1;    // 1 лента, 2 зигзаг, 3 параллел
  byte maxCur = 5;        // макс ток (мА/100)
  byte workFrom = 0;      // часы работы (0,1.. 23)
  byte workTo = 0;        // часы работы (0,1.. 23)

  int length = 100;       // длина ленты
  int width = 1;          // ширина матрицы

  byte state = 1;         // состояние 0 выкл, 1 вкл
  byte group = 1;         // группа девайса (1-10)
  byte role = 0;          // 0 slave, 1 master
  byte WiFimode = 0;      // 0 AP, 1 local
  byte presetAmount = 1;  // количество режимов
  byte manualOff = 0;     // выключали вручную?
  int8_t curPreset = 0;   // текущий режим
  int minLight = 0;       // мин освещённость
  int maxLight = 1023;    // макс освещённость
  char ssid[16];          // логин wifi
  char pass[16];          // пароль wifi
};

#define PRES_SIZE 13
struct Preset {
  byte effect = 1;        // тип эффекта (1,2...) ВЫЧЕСТЬ 1
  byte fadeBright = 0;    // флаг на свою яркость (0/1)
  byte bright = 100;      // своя яркость (0.. 255)
  byte soundMode = 1;     // тип звука (1,2...) ВЫЧЕСТЬ 1
  byte soundReact = 1;    // реакция на звук (1,2...) ВЫЧЕСТЬ 1
  byte min = 0;           // мин сигнал светомузыки (0.. 255)
  byte max = 0;           // макс сигнал светомузыки (0.. 255)
  byte speed = 10;        // скорость (0.. 255)
  byte palette = 1;       // палитра (1,2...) ВЫЧЕСТЬ 1
  byte scale = 1;         // масштаб (0.. 255)
  byte fromCenter = 0;    // эффект из центра (0/1)
  byte color = 0;         // цвет (0.. 255)
  byte rnd = 0;           // случайный (0/1)
};

struct Dawn {
  byte state[7] = {0, 0, 0, 0, 0, 0, 0};  // (1/0)
  byte hour[7] = {0, 0, 0, 0, 0, 0, 0};   // (0.. 59)
  byte minute[7] = {0, 0, 0, 0, 0, 0, 0}; // (0.. 59)
  byte bright = 100;      // (0.. 255)
  byte time = 1;          // (5,10,15,20..)
};
