#include <FastLED.h>

#define LEDpin          1
#define buzzerPin       4
#define topButtonPin    6
#define botButtonPin    7
#define NUM_LEDS       32

CRGB leds[NUM_LEDS];

void setup() { 
  pinMode(buzzerPin, OUTPUT);
  pinMode(topButtonPin, INPUT_PULLDOWN);
  pinMode(botButtonPin, INPUT_PULLDOWN);
  FastLED.addLeds<WS2812B, LEDpin, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(90);
}

void loop()
{
  if((!digitalRead(topButtonPin))&&(!digitalRead(botButtonPin))){
    matrix_eyes();
    FastLED.show();  
    FastLED.delay(40); 
  }
  if(digitalRead(topButtonPin)){
    roll_eyes();
  }

  if(digitalRead(botButtonPin)){
    round_eyes();
  }
}

void round_eyes() { 
  fill_solid(leds, NUM_LEDS, 0);

  leds[1] = CRGB::Purple;
  leds[2] = CRGB::Purple;
  leds[4] = CRGB::Purple;
  leds[7] = CRGB::Purple;
  leds[8] = CRGB::Purple;
  leds[11] = CRGB::Purple;
  leds[13] = CRGB::Purple;
  leds[14] = CRGB::Purple;

  leds[17] = CRGB::Purple;
  leds[18] = CRGB::Purple;
  leds[20] = CRGB::Purple;
  leds[23] = CRGB::Purple;
  leds[24] = CRGB::Purple;
  leds[27] = CRGB::Purple;
  leds[29] = CRGB::Purple;
  leds[30] = CRGB::Purple;

  FastLED.show();
  delay(1200);
}

void roll_eyes() { 
  fill_solid(leds, NUM_LEDS, 0);

  leds[2] = CRGB::Blue;
  leds[3] = CRGB::Blue;
  leds[4] = CRGB::Blue;
  leds[5] = CRGB::Blue;

  leds[18] = CRGB::Blue;
  leds[19] = CRGB::Blue;
  leds[20] = CRGB::Blue;
  leds[21] = CRGB::Blue;

  beep(1500,200);
  FastLED.show();
  delay(300);
  fill_solid(leds, NUM_LEDS, 0);

  leds[10] = CRGB::Blue;
  leds[11] = CRGB::Blue;
  leds[4] = CRGB::Blue;
  leds[5] = CRGB::Blue;

  leds[26] = CRGB::Blue;
  leds[27] = CRGB::Blue;
  leds[20] = CRGB::Blue;
  leds[21] = CRGB::Blue;

  beep(1000,100);
  FastLED.show();
  delay(300);
  fill_solid(leds, NUM_LEDS, 0);

  leds[10] = CRGB::Blue;
  leds[11] = CRGB::Blue;
  leds[12] = CRGB::Blue;
  leds[13] = CRGB::Blue;

  leds[26] = CRGB::Blue;
  leds[27] = CRGB::Blue;
  leds[28] = CRGB::Blue;
  leds[29] = CRGB::Blue;

  beep(1500,200);
  FastLED.show();
  delay(300);
  fill_solid(leds, NUM_LEDS, 0);

  leds[10] = CRGB::Blue;
  leds[11] = CRGB::Blue;
  leds[4] = CRGB::Blue;
  leds[5] = CRGB::Blue;

  leds[26] = CRGB::Blue;
  leds[27] = CRGB::Blue;
  leds[20] = CRGB::Blue;
  leds[21] = CRGB::Blue;

  beep(1000,100);
  FastLED.show();
  delay(300);
  fill_solid(leds, NUM_LEDS, 0);

  leds[2] = CRGB::Blue;
  leds[3] = CRGB::Blue;
  leds[4] = CRGB::Blue;
  leds[5] = CRGB::Blue;

  leds[18] = CRGB::Blue;
  leds[19] = CRGB::Blue;
  leds[20] = CRGB::Blue;
  leds[21] = CRGB::Blue;

  beep(1500,200);
  FastLED.show();
  delay(300);

  delay(400);
}

void matrix_eyes() {
  fadeToBlackBy(leds, NUM_LEDS, 20);
  int pos = random16(NUM_LEDS);
  leds[pos] += CHSV(random8(255), 200, 255);
}

void beep(int tone, int duration)
{
  for (long i = 0; i < duration * 900L; i += tone * 1)
  {
    digitalWrite(buzzerPin, HIGH);
    delayMicroseconds(tone*(.50));
    digitalWrite(buzzerPin, LOW);
    delayMicroseconds(tone*(.50));
  }
  delay(30);
}
