#include <EEPROM.h>
#define CONTROL_BYTE 0x50
#define ENTER_BYTE 0x51
#define ICSE012A 0xAB
#define GREEN 0x0D
#define RED 0x0E
#define RELAY3 0x0B
#define YELLOW 0x07
#define OFF 0x0F
#define TEST 0x0A
#define WHITE 0x0C


// константы для удобства
#define STRIP_PIN 2    // пин ленты
#define NUMLEDS  60    // кол-во светодиодов
#define Delay 2      // Задержка обновления
#define BRIG 250       // max яркость
#define MAXTOK 1000     // максимальный ток авто корекцыя яркости
#define COLOR_DEBTH 3  // 1, 2, 3 (цветовая глубина байт на цвет)
#include <microLED.h>  // подключаем библу
// инициализирую ленту (выше был гайд!)
microLED<NUMLEDS, STRIP_PIN, MLED_NO_CLOCK, LED_WS2812, ORDER_GRB, CLI_HIGH> strip;  //LED_WS2815, LED_WS2818, LED_WS6812
#define SYSTEM_LED 13


//_________________________________________________________________________________//
void setup() {
  strip.setMaxCurrent(MAXTOK);
  Serial.begin(9600);
  pinMode(SYSTEM_LED, OUTPUT);
  digitalWrite(SYSTEM_LED, HIGH);
  myTestFunction();
}

void loop() {
  strip.setBrightness(BRIG);  // max яркость);// яркость (0-255)

  while (Serial.available() > 0) {
    byte command = Serial.read();
  delay(2); 
    switch (command) {
      case CONTROL_BYTE:
        Serial.write(ICSE012A);
        break;
      case ENTER_BYTE:
        break;
      case OFF:
        strip.clear();
        strip.show();  // вывод изменений на ленту
        Serial.println("ВЫКЛЮЧЕНО"); 
        delay(Delay);  // между вызовами show должна быть пауза минимум 40 мкс !!!!
        break;
      case RED:
        strip.fill(mWheel8(1, BRIG));  // красным
        strip.show(); 
        Serial.println("КРАСНЫЙ");                // выводим изменения
        delay(Delay);
        break;
      case GREEN:
        strip.fill(mWheel8(90, BRIG));  // заливаем ~зелёным
        strip.show(); 
        Serial.println("ЗЕЛЕНЫЙ");                   // выводим изменения
        delay(Delay);
        break;
      case YELLOW:
        strip.fill(mWheel8(39, BRIG));
        //strip.fill( mYellow);   // заливаем желтым
        strip.show();  // выводим изменения
        Serial.println("ЖЕЛТЫЙ"); 
        delay(Delay);
        break;
      case WHITE:
        strip.setBrightness(BRIG);
        strip.fill(mRGB(BRIG, BRIG, BRIG));  // белый
        strip.show();                        // выводим изменения
        Serial.println("БЕЛЫЙ"); 
        delay(Delay);
        break;

      case TEST:
        Serial.println("ТЕСТ"); 
        myTestFunction();
       
        break;
    }
  }
}
int myTestFunction() {

  for (int i = 0; i < 10; i++) {
    strip.setBrightness(BRIG);
    for (int n = 0; n < 6; n++) {
      strip.fill(0, NUMLEDS / 2-1, mWheel8(1, BRIG));  // красный
      strip.show();                                  // выводим изменения
      delay(Delay);
      strip.clear();
      strip.show();  // вывод изменений на ленту
      delay(Delay);
    }

    for (int m = 0; m < 6; m++) {
      strip.setBrightness(BRIG);
      strip.fill(NUMLEDS / 2, NUMLEDS - 1, mWheel8(167, BRIG));  //синий
      strip.show();                                              // выводим изменения
      delay(Delay);
      strip.clear();
      strip.show();  // вывод изменений на ленту
      delay(Delay);
    }
  }

  strip.setBrightness(BRIG);

  strip.fill(mWheel8(167, BRIG));  // синий
  strip.show();                    // выводим изменения
  delay(Delay * 100);
  strip.setBrightness(BRIG);
  strip.fill(mWheel8(1, BRIG));  // красный
  strip.show();                  // выводим изменения
  delay(Delay * 100);
  strip.setBrightness(BRIG);
  strip.fill(mWheel8(90, BRIG));  //зеленый
  strip.show();                   // выводим изменения
  delay(Delay * 100);
  strip.setBrightness(BRIG);
  strip.fill(mWheel8(39, BRIG));
  // strip.fill( mYellow);   //желтый
  strip.show();  // выводим изменения
  delay(Delay * 100);

  strip.setBrightness(BRIG);
  strip.fill(mRGB(BRIG, BRIG, BRIG));  // белый
  strip.show();                        // выводим изменения
  delay(Delay * 100);
  for (int i = 0; i < NUMLEDS; i++) strip.set(i, mWheel8(i * 255 / NUMLEDS, BRIG));  // полный круг от 0 до 255
  strip.show();
  delay(Delay * 100);

  strip.clear();
  strip.show();
}