/*

    RGB Fill Lights
    Author: tobychui

    This is the firmware for tobychui's
    Programmable RGB Fill Light

    Recommend compiling with following board profiles
    - Wemos D1 Mini


*/
#include <Adafruit_NeoPixel.h>

// Hardware Configs
#define PIN D2
#define NUM_LEDS 50
#define BUTTON_MODE D7
#define BUTTON_ADD D0
#define BUTTON_COLOR D5
#define BUTTON_MINUS D6

#define BUTTON_AUTOINC_DELAY 300 //Delay before auto increments
#define BUTTON_HOLD_DELAY 50 //Auto-increment delays
#define BUTTON_DEBOUNCE 50 //Naive debounce delay in ms
#define MAX_BRIGHTNESS 256 //Make sure the battery you using can output the current required by LEDs
#define MAX_CTRLBRIGHTNESS 32 //Max brightness for signaling LED (the one above the button)
//Runtimes
/*
   Current Mode
   0 = White Mode (+/- Change the K value of the light)
   1 = RGB Mode (+/C/- Change the RGB values of the light)
   2 = Pure Color Mode (C Change the default color palletes, +- change brightness offset)
*/
int currentMode = 0;

/*
   Adjusting Catergory

   [White Mode]
   0 = Color Temperature (K)
   1 = Brightness

   [RGB Mode]
   0 = Red
   1 = Green
   2 = Blue

   [Pallete Mode]
   0 = Color Pallete
   1 = Brightness

*/
int adjustingCatergory = 0;

/*
   Color Values
   [White Mode]
   TEMP, Brightness, (un-used)

   [RGB Mode]
   R, G, B

   [Pallete Mode]
   PalleteID, Brightness, (unused)

*/
int values[] = {0, 0, 0};
int currentCtrlLedRgb[] = {0,0,0};

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

//Set the current control LED color
void setControlLEDColor(int r, int g, int b){
  currentCtrlLedRgb[0] = r;
  currentCtrlLedRgb[1] = g;
  currentCtrlLedRgb[2] = b;
  strip.setPixelColor(0, strip.Color(r, g, b));
  strip.show();
}

//Set the current LED light color by given RGB values
void setLightColor(int r, int g, int b) {
  for (int i = 1; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, strip.Color(r, g, b));
  }
  strip.show();
}
void setup() {
  Serial.begin(115200);

  //Set the buttons to input pin
  pinMode(BUTTON_MODE, INPUT);
  pinMode(BUTTON_ADD, INPUT);
  pinMode(BUTTON_COLOR, INPUT);
  pinMode(BUTTON_MINUS, INPUT);
  strip.begin();

  // Initialize all pixels to natural warm white light
  loadWhiteModeDefault();
}

void loop() {
  handleButtonLogic();
}
