#include <MsTimer2.h>
#include <FreqCounter.h>

const int latchPin = 8;
const int clockPin = 3;
const int dataPin = 9;

byte dec[] = {
	0b11000000,0b11111001,
	0b10100100,0b10110000,
	0b10011001,0b10010010,
	0b10000011,0b11111000,
	0b10000000,0b10011000,}
;

unsigned long long k, s, m, h;

void setup()
{
	pinMode(latchPin, OUTPUT);
	pinMode(clockPin, OUTPUT);
	pinMode(dataPin, OUTPUT);
	Serial.begin(9600);        // connect to the serial port

	MsTimer2::set(10*10, countup);
	MsTimer2::start();
}

void countup()
{
	interrupts();
	k++;
}


void loop()
{
	static char c[128];
	static char *p = c;
	unsigned int ls,lm;

	if (Serial.available() > 0) {
		*p = Serial.read();
		Serial.write(*p);

		switch(*p)
		{
		case '.':
			*p = '\0';
			p = c;
			Serial.write("set ") ;
			Serial.write(c) ;
			k+=200;  
			return;              
			break;
		case '\n':
			*p = '\0';
			p = c;
			Serial.write("set ") ;
			Serial.write(c) ;
			if(sscanf(c, "%d:%d", &h, &m) == 2)
			{
				k=h*60*60*10+m*60*10;
			}
			return;    
			break;
		default:
			*p++;
		}

	}


	s = k /10;
	m = s / 60;
	h = m / 60;
	s =s % 60;
	m =m % 60;

	digitalWrite(latchPin, LOW);

	if(h<100) shiftOut(dataPin, clockPin, MSBFIRST, dec[(analogRead(0)/1)%10]);
	if(h<1000) shiftOut(dataPin, clockPin, MSBFIRST, dec[(k/1)%10]);

	shiftOut(dataPin, clockPin, MSBFIRST, dec[s%10]  & 0b01111111);
	shiftOut(dataPin, clockPin, MSBFIRST, dec[(s/10)%10]);

	shiftOut(dataPin, clockPin, MSBFIRST, dec[m%10] & 0b01111111);
	shiftOut(dataPin, clockPin, MSBFIRST, dec[(m/10)%10]);

	shiftOut(dataPin, clockPin, MSBFIRST, dec[(h/1)%10] & 0b01111111);
	shiftOut(dataPin, clockPin, MSBFIRST, dec[(h/10)%10]);
	if(h>=100) shiftOut(dataPin, clockPin, MSBFIRST, dec[(h/100)%10]);
	if(h>=1000) shiftOut(dataPin, clockPin, MSBFIRST, dec[(h/1000)%10]);

	digitalWrite(latchPin, HIGH);

	delay(50);
}