#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include "ds3231.h"


#define PIN 12
#define NPIXELS 60
#define JMP_OUT A0
#define JMP_IN A1

#define BUFF_MAX 128





// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int h=0,m=0,s=0;

void setup() {
  Wire.begin();

  pinMode(17,OUTPUT);
  pinMode(16,OUTPUT);
  pinMode(JMP_OUT,OUTPUT);
  pinMode(JMP_IN,INPUT_PULLUP);
  digitalWrite(17,HIGH);
  digitalWrite(16,LOW); 
    DS3231_init(DS3231_INTCN);  
  
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'

}


void loop() {
  byte hpos[3];
  getTime();
  hpos[0] = (h*5+m/12)%60;
  hpos[1] = (hpos[0]-1 < 0) ? 59 : hpos[0]-1;  
  hpos[2] = (hpos[0]+1 > 59) ? 0 : hpos[0]+1;
  
  for (int i=0;i<NPIXELS;i++) {
    if (s==i)
      strip.setPixelColor(s,strip.Color(0,255,255));
    else if (i == hpos[0])
      strip.setPixelColor( i,Wheel((i+128)&255,0));  
    else if ((i == hpos[1]) || (i == hpos[2]))
      strip.setPixelColor( i,Wheel((hpos[0]+128)&255,2));        
    else if (i < m)
      strip.setPixelColor(i, Wheel((i+32) & 255,0));
    else
      strip.setPixelColor(i, strip.Color(0,0,0));    
  }
  strip.show();
}


void getTime() {
  struct ts t;
  DS3231_get(&t);
  
  //h = t.hour + 1; // ora legale
  h = t.hour; // ora solare
  if (digitalRead(JMP_IN) == LOW)
    h = h + 1;
  if (h>11)
    h -= 12;
  Serial.println(h);
  m = t.min;
  /*if (m<0)
    m=59;*/
  s = t.sec;
  delay(200);
  
  
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos, byte divider) {
  if(WheelPos < 85) {
   return strip.Color((WheelPos * 3>>divider), (255 - WheelPos * 3)>>divider, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return strip.Color((255 - WheelPos * 3)>>divider, 0, (WheelPos * 3)>>divider);
  } else {
   WheelPos -= 170;
   return strip.Color(0, (WheelPos * 3)>>divider, (255 - WheelPos * 3)>>divider);
  }
}
