#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define RED_PIN 1
#define GREEN_PIN 0
#define BLUE_PIN 2

/* Variables */
unsigned char 	R=0;
unsigned char	G=0;
unsigned char	B=0;

unsigned char	PWMRef=0;

unsigned int	Temperature=0;
unsigned int	Light=0;
unsigned int	AvgLight=0;
unsigned char	Measures=0;

unsigned char	Pattern=0;
unsigned char	Off=0;

/* Interrupts */
SIGNAL(SIG_OVERFLOW0)
{
	if(PWMRef>R) PORTB |= 1<<RED_PIN;
	else PORTB &= (~(1<<RED_PIN));
	if(PWMRef>G) PORTB |= 1<<GREEN_PIN;
	else PORTB &=(~(1<<GREEN_PIN));
	if(PWMRef>B) PORTB |= 1<<BLUE_PIN;
	else PORTB &=(~(1<<BLUE_PIN));
}

SIGNAL(SIG_ADC)
{
	if(ADMUX & (1<<MUX0) )	/* ADC3 */
	{
		Light = (ADCH*0xff) + ADCL;
		ADMUX &= (~(1<<MUX0));
		ADCSRA |= 1<<ADSC;
	}
	else	/* ADC2 */
	{
		Temperature = (ADCH*0xff) + ADCL;
		if(Temperature>350)Temperature=350;
		else if(Temperature<100)Temperature=100;
		ADMUX |= 1<<MUX0;
		ADCSRA |= 1<<ADSC;
	}
}

int main(void)
{
	DDRB=0x07;	/* 0-2 = Wyjścia */
	TIMSK0 = 1<<TOIE0;
	
	ADMUX = 1<<REFS0 || 1<<MUX1;	/* Wewnetrzna referencja i kanal ADC2 */
	ADCSRA = 1<<ADEN || 1<<ADSC || 1<<ADIE || 1<<ADPS2 || 1<<ADPS1 || 1<<ADPS0; /* Wlaczenie, wystartowanie, przerwanie, preskaler 1/128 */
	
	sei();
	
	/* Tutaj miejsce na intro, splash screen i inne reklamy */
	
	while(1)
	{
		_delay_ms(20);
		if(Off==0)
		{
			if(Pattern==0)
			{
				B++;
				if( Temperature + B > 320 ) Pattern = 1;
			}
			else if(Pattern==1)
			{
				if(R<6) Pattern = 2;
				else R--;
			}
			else if(Pattern==2)
			{
				R++;
				if(G>=150) Pattern=3;
			}
			else if(Pattern==3)
			{
				if(B<6) Pattern=4;
				else B--;
			}
			else if(Pattern==4)
			{
				R++;
				if((Temperature - 1000 + R)>900) Pattern=5;
			}
			else if(Pattern==5)
			{
				if(G<6) Pattern=0;
				else G--;
			}
		}
		else
		{
			if(R)R--;
			if(G)G--;
			if(B)B--;
		}
		
		AvgLight=AvgLight*Measures+Light;
		if(Measures<31)
		{
			Measures+=1;
			AvgLight = AvgLight/Measures;
		}
		else
		{
			AvgLight = AvgLight/32;
		}
		
		if( ((AvgLight*10)>(12*Light)) || ((AvgLight*12)<(10*Light)) )
		{
			if(Light>AvgLight)Off=1;
			else Off=0;
		}
		/*
		if(Temperature>300 || Temperature <250) Off=0;
		else Off=1;
		*/
		
	}
}