#include <Adafruit_NeoPixel.h>
#define PIN 0
#define PIN2 2
bool pressed, pulse, reverse = false;
uint8_t rit = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(48, PIN, NEO_GRB + NEO_KHZ800);


void setup() {
  strip.begin();
  strip.show(); 
  pinMode(PIN2, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  if(pulse) breath();
  else demo_rotate();
}

void buttonPress(){
  pressed = digitalRead(PIN2);
  if (pressed == 1) {
    while (pressed == 1) {
      delay(5);
      pressed = digitalRead(PIN2);
      Serial.println("cazzo");
    }
    if (pulse) pulse = false;
    else  pulse = true;
    Serial.println(pressed);
  }
   /*if(pressed==HIGH){
    pulse = true;
    if(pressed==HIGH) {
      delay(10);
      pressed=digitalRead(PIN2);
      if(pressed==HIGH){
        pulse = false;
      }
    }
  }*/
}

void breath(){  
  static uint8_t massimo = 24;                //massimo numero di pixel della striscia grande
  
  static uint16_t hue = 0; // 0-359           //rotazione del colore
  static uint8_t saturation = 100; // 0-100
 static uint8_t lightness = 0; // 0-100
  
  uint32_t color;
  uint8_t i, num = 0, tempo = 30; 
  
  for(i=0; i < massimo; i++) {
    color = hsl(hue+=3, saturation, lightness);
    for(i=0; i < massimo; i++) {
      color = hsl(hue, saturation, lightness+=10);   //creazione del colore tramite funzione di conversione da rgb a hsl
      strip.setPixelColor(i, color);                //impostazione del colore sulla strip
      if(i%3==0) num++;                             //se il numero è divisibile per 3 aggiungo 1 a num per poi sottrarlo al numero della striscia principale
      strip.setPixelColor(24+i-num, color);         //imposto il pixel di partenza della seconda striscia
      strip.show();                                 //aggiorno i pixel
    delay(10);
    }
    for(i=0; i < massimo; i++) {
      color = hsl(hue, saturation, lightness-=10);   //creazione del colore tramite funzione di conversione da rgb a hsl
      strip.setPixelColor(i, color);                //impostazione del colore sulla strip
      if(i%3==0) num++;                             //se il numero è divisibile per 3 aggiungo 1 a num per poi sottrarlo al numero della striscia principale
      strip.setPixelColor(24+i-num, color);         //imposto il pixel di partenza della seconda striscia
      strip.show();                                 //aggiorno i pixel
    delay(10);
    }
  }

  hue %= 360;
}

void demo_rotate() { 
  static uint8_t massimo = 24;                //massimo numero di pixel della striscia grande
  
  static uint16_t hue = 0; // 0-359           //rotazione del colore
  static uint8_t saturation = 100; // 0-100
 static uint8_t lightness = 50; // 0-100
  
  uint32_t color;
  uint8_t i, num = 0, tempo = 30; 
  
  if(!reverse) {
    rit+=3; 
    if(rit >= 15) reverse = true;             //finchè rit è inferiore a 11 continua a sommare
  }
  else if(reverse) {
    rit-=3; 
    if(rit <= 0) reverse = false;             //finchè rit è maggiore di 11 continua a sottrarre
  }

  for(i=0; i < massimo; i++) {
    buttonPress();
    Serial.println(pressed);
    Serial.println(pulse);
    color = hsl(hue+=3, saturation, lightness);   //creazione del colore tramite funzione di conversione da rgb a hsl
    strip.setPixelColor(i, color);                //impostazione del colore sulla strip
    if(i%3==0) num++;                             //se il numero è divisibile per 3 aggiungo 1 a num per poi sottrarlo al numero della striscia principale
    strip.setPixelColor(24+i-num, color);         //imposto il pixel di partenza della seconda striscia
    strip.show();                                 //aggiorno i pixel
    delay(5+(rit));
  }

  hue %= 360;
}

uint32_t hsl(uint16_t ih, uint8_t is, uint8_t il) {

  float h, s, l, t1, t2, tr, tg, tb;
  uint8_t r, g, b;

  h = (ih % 360) / 360.0;
  s = constrain(is, 0, 100) / 100.0;
  l = constrain(il, 0, 100) / 100.0;

  if ( s == 0 ) { 
    r = g = b = 255 * l;
    return ((uint32_t)r << 16) | ((uint32_t)g <<  8) | b;
  } 
  
  if ( l < 0.5 ) t1 = l * (1.0 + s);
  else t1 = l + s - l * s;
  
  t2 = 2 * l - t1;
  tr = h + 1/3.0;
  tg = h;
  tb = h - 1/3.0;

  r = hsl_convert(tr, t1, t2);
  g = hsl_convert(tg, t1, t2);
  b = hsl_convert(tb, t1, t2);

  return ((uint32_t)r << 16) | ((uint32_t)g <<  8) | b;
}

uint8_t hsl_convert(float c, float t1, float t2) {

  if ( c < 0 ) c+=1; 
  else if ( c > 1 ) c-=1;

  if ( 6 * c < 1 ) c = t2 + ( t1 - t2 ) * 6 * c;
  else if ( 2 * c < 1 ) c = t1;
  else if ( 3 * c < 2 ) c = t2 + ( t1 - t2 ) * ( 2/3.0 - c ) * 6;
  else c = t2;
  
  return (uint8_t)(c*255); 
}