// **** DRIVE to LED strips connected to an Attiny with three-button control ****.

// **** Attiny connections ****.
// 1 - D5 - N.C. (RESET)
// 2 - D3 - LEDs - Strip 2
// 3 - D4 - Button 2
// 4 - GND
// 5 - D0 - Button 3
// 6 - D1 - LEDs - Strip 1
// 7 - D2 - Button 1
// 8 - VCC

// **** Required libraries ****.
#include <Adafruit_NeoPixel.h>

// **** Configuration****.
#define BUTTON_1             2
#define BUTTON_2             4  
#define BUTTON_3             0 
#define LED_PIN_1            1   
#define LED_PIN_2            3   
#define LED_COUNT           32
#define LED_BRIGHTNESS     255
#define MAKE_RAINBOW_WAVE  false

Adafruit_NeoPixel pixels1 = Adafruit_NeoPixel(LED_COUNT, LED_PIN_1, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(LED_COUNT, LED_PIN_2, NEO_GRB + NEO_KHZ800);

unsigned int hue;
bool justStarted;
int R, G, B;

// **** Initialization. 
void setup(){
  int i;
  pinMode(BUTTON_1, INPUT_PULLUP);
  pinMode(BUTTON_2, INPUT_PULLUP);
  pinMode(BUTTON_3, INPUT_PULLUP);
  hue = 0;
  R = 0;
  G = 0;
  B = 0;
  pixels1.begin();
  pixels2.begin();
  justStarted = true;
}

// **** Loop. 
void loop(){
  int i;
  bool hasUpdate = false;
  char textBuffer[128];
  unsigned long color, colorR, colorG, colorB;
  if(!digitalRead(BUTTON_1)){
    R = (R+1)%5;  
    hasUpdate = true;
    justStarted = false;
    while(!digitalRead(BUTTON_1)){
      // Wait for button 1 to be released.
      if(!digitalRead(BUTTON_2)){
        // Button 1 & 2 are pressed together --> "Reset".  
        justStarted = true; 
        // Wait for button 2 to be released.
        while(!digitalRead(BUTTON_2)){
          delay(10);
        }
      }
      delay(10);
    }
  }
  if(!digitalRead(BUTTON_2)){
    G = (G+1)%5;  
    hasUpdate = true;
    justStarted = false;
    while(!digitalRead(BUTTON_2)){
      delay(10);
    }
  }
  if(!digitalRead(BUTTON_3)){
    B = (B+1)%5;  
    hasUpdate = true;
    justStarted = false;
    while(!digitalRead(BUTTON_3)){
      delay(10);
    }
  }
  if(!hasUpdate){
    if(justStarted){
      hue += 0x50;
      for(i = 0; i < LED_COUNT; i++){
#if MAKE_RAINBOW_WAVE
        // Assign different color to each LED.
        pixels1.setPixelColor(i, pixels1.gamma32(pixels1.ColorHSV(hue+i*0x750, 255, LED_BRIGHTNESS)));
        pixels2.setPixelColor(i, pixels2.gamma32(pixels2.ColorHSV(hue+i*0x750, 255, LED_BRIGHTNESS)));
#else
        // Assign the same color to each LED.
        pixels1.setPixelColor(i, pixels1.gamma32(pixels1.ColorHSV(hue, 255, LED_BRIGHTNESS)));
        pixels2.setPixelColor(i, pixels2.gamma32(pixels2.ColorHSV(hue, 255, LED_BRIGHTNESS)));
#endif
      }
      pixels1.show(); 
      pixels2.show(); 
    }
    delay(10);
    return;  
  }
  colorR = 0;
  colorG = 0;
  colorB = 0;
  if(R != 0){
    colorR = R*64-1;
  }
  if(G != 0){
    colorG = G*64-1;
  }
  if(B != 0){
    colorB = B*64-1;
  }
  color = (colorR<<16) + (colorG<<8) + colorB;
  for(i = 0; i < LED_COUNT; i++){
    pixels1.setPixelColor(i, color);
    pixels2.setPixelColor(i, color);
  }
  pixels1.show(); 
  pixels2.show(); 
  delay(10);
}
