#define     F_CPU 8000000


#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <avr/io.h>
#include <stdlib.h>
#include <string.h>
#include "logo.h"

#include "i2c.h"
#include "pcd8544.h"

#define LM75_ADDRIN 0b1001000
#define LM75_ADDROUT 0b1001111
#define LM75_REG_TEMP		0x00



unsigned char i,j,x,c,t;
int32_t voltread,v;
unsigned int temp;
char temp_H,temp_L,dst[2]; //I2C stuff buffer.

//////////////////////////////////////////////////////////////////////////////////////////



int i2c_write(char i2c_addr, char reg_addr, unsigned char *dat, char len) //Write data to I2C
{
	unsigned char tmp[len+1];
	tmp[0] = reg_addr & 0x1F;
	memcpy(&tmp[1], dat, len);
	return i2c_transaction(i2c_addr, len + 1, tmp, 0, NULL);
}

int i2c_read(char i2c_addr, char reg_addr, unsigned char *dst, char len) //Read data from I2C
{
	unsigned char tmp;
	tmp = reg_addr & 0x1F;
	return i2c_transaction(i2c_addr, 1, &tmp, len, dst);
}




void error(void)
{
	LcdStr(1,"ERROR");
	_delay_ms(4);
	LcdClear();

}



void clearscreen(void)
{
	LcdClear();
}



void LcdNumber(unsigned int font_size, char c) {
	char str[100];
	int a;
	itoa(c, (char *)str, 10);
	for(a=0; a<strlen(str); a++)
	{
		LcdChr(1, str[a] );
	}
}



void initHW(void)
{
	LcdInit();
	i2c_init();
	// ADC config
	//REFS1 REFS0 ADLAR – MUX3 MUX2 MUX1 MUX0
	ADMUX = 0b01000000; //AVCC with external capacitor at AREF pin, ADC0= iejimas
	//ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0
	ADCSRA = 0b10000111; //ADC Enable, Free Running Select,Prescaler 128
	DDRD=225;


	MCUCR = 8; //ExtInterrupt0 triggered with external falling edge on INT0
	GICR = 128; //Enable ExtInterrupt0 "interruption"

}


int adcread(void)                       // ADC nuskaitymo funkcija
{
	ADCSRA |= (1 << ADSC);                 // Daroma pirmas nuskaitymas bet neisvedamas
	while (ADCSRA & (1 << ADSC));          // Laukiama kol nuskaitys
	ADCSRA |= (1 << ADSC);                 // Daromas nuskaitymas
	while (ADCSRA & (1 << ADSC));          // Laukiama kol nuskaitys
	return ADC;     			            // Grazinama ADC reiksme (10 bit) nuo 0 iki 1024
}



void showlogo(void)
{
	LcdClear();
	LcdImage(waitImage);
	LcdUpdate();
}

void color(unsigned char color)
{
	switch(color)
	{
		case 0:PORTD=192; break; //Raudona
		case 1:PORTD=128; break; //Geltona
		case 2:PORTD=160; break; //Zalia
		case 3:PORTD=32;  break; //Zydra
		case 4:PORTD=96;  break; //Melyna
		case 5:PORTD=64;  break; //Violetine
		case 6:PORTD=0;   break; //Balta
		case 7:PORTD=224; break; //OFF
	}
}

void drawframe(void)
{
	for(i=0;i<9;i++)
	{
		for(j=0;j<83;j++)
		{
			LcdPixel(j,i,2);
		}
	}

	for(i=24;i<33;i++)
	{
		for(j=0;j<83;j++)
		{
			LcdPixel(j,i,2);
			LcdPixel(j,47,2);
		}
	}

	for(i=0;i<48;i++)
	{
		LcdPixel(0,i,1);
		LcdPixel(83,i,1);
	}
}


int main(void)
{
	initHW();
	color(2);
	showlogo();
	_delay_ms(200);
	clearscreen();

	sei();


	while(1)
	{
		dst[0]=0;
		dst[1]=0;
		x = i2c_read(LM75_ADDRIN, LM75_REG_TEMP, &dst[0], 2);
		if (x==0)
		{
			temp_H = dst[0];
			temp_L = dst[1];
			temp = (temp_H<<8)|temp_L;
			temp = temp>>7;
			LcdGotoXYFont(1,1);
			LcdFStr(1, PSTR(" TEMPERATURE  "));
			LcdGotoXYFont(1,2);
			LcdFStr(1, PSTR("  IN:"));
			if(temp&0x100)               //tikrinam ar neigiama temp
			{
				temp=(512-temp)>>1;
				LcdFStr(1, PSTR("-"));
				LcdNumber(1,temp);
				if(temp_L&0x80)          //tikrinam kas po kablelio
				{
					LcdFStr(1, PSTR("."));
					LcdNumber(1,5);
					LcdChr(1, 0x7B);
					LcdFStr(1, PSTR("C"));
				}
				else
				{
					LcdFStr(1, PSTR("."));
					LcdNumber(1,0);
					LcdChr(1, 0x7B);
					LcdFStr(1, PSTR("C"));
				}
			}
			else
			{
				LcdNumber(1,temp_H);
				if(temp_L & 0x80)
				{
					LcdFStr(1, PSTR("."));
					LcdNumber(1,5);
					LcdChr(1, 0x7B);
					LcdFStr(1, PSTR("C"));
				}
				else
				{
					LcdFStr(1, PSTR("."));
					LcdNumber(1,0);
					LcdChr(1, 0x7B);
					LcdFStr(1, PSTR("C"));
				}
			}
		}
		else
		{
			LcdFStr(FONT_1X, PSTR("ERROR"));
		}
		for (x=0;x<10;x++)
		{
			_delay_ms(20);
		}


		x = i2c_read(LM75_ADDROUT, LM75_REG_TEMP, &dst[0], 2);
		if (x==0)
		{
			LcdGotoXYFont(1,3);
			LcdFStr(FONT_1X, PSTR(" OUT:"));
			temp_H = dst[0];
			temp_L = dst[1];
			temp = (temp_H<<8)|temp_L;
			temp = temp>>7;
			if(temp&0x100)
			{
				temp=(512-temp)>>1;
				LcdFStr(1, PSTR("-"));
				LcdNumber(1,temp);
				if(temp_L&0x80)
				{
					LcdFStr(1, PSTR("."));
					LcdNumber(1,5);
					LcdChr(1, 0x7B);
					LcdFStr(1, PSTR("C"));
				}
				else
				{
					LcdFStr(1, PSTR("."));
					LcdNumber(1,0);
					LcdChr(1, 0x7B);
					LcdFStr(1, PSTR("C"));
				}
			}
			else
			{
				LcdNumber(1,temp_H);
				if(temp_L & 0x80)
				{
					LcdFStr(1, PSTR("."));
					LcdNumber(1,5);
					LcdChr(1, 0x7B);
					LcdFStr(1, PSTR("C"));
				}
				else
				{
					LcdFStr(1, PSTR("."));
					LcdNumber(1,0);
					LcdChr(1, 0x7B);
					LcdFStr(1, PSTR("C"));
				}
			}
		}
		else
		{
			LcdFStr(FONT_1X, PSTR("i2c_error"));
		}
		for (x=0;x<10;x++)
		{
			_delay_ms(20);
		}
		LcdGotoXYFont(1,4);
		LcdFStr(FONT_1X, PSTR("   BATTERY    "));

		voltread = adcread();
		voltread = (voltread*2000)/1023;


		if(voltread<1000)
		{
			LcdGotoXYFont(2,5);
			LcdNumber(1,voltread/100);
			LcdFStr(FONT_1X, PSTR("."));
			LcdNumber(1,voltread/10%10);
			LcdNumber(1,voltread%10);
			LcdFStr(FONT_1X, PSTR("V"));
		}
		else
		{
			LcdGotoXYFont(2,5);
			LcdNumber(1,voltread/1000);
			LcdNumber(1,voltread/100%10);
			LcdFStr(FONT_1X, PSTR("."));
			LcdNumber(1,voltread/10%10);
			LcdNumber(1,voltread%10);
			LcdFStr(FONT_1X, PSTR("V"));
		}
		//LcdGotoXYFont(2,5);
		//LcdNumber(1,voltread/100);
		//LcdFStr(FONT_1X, PSTR("."));
		//LcdNumber(1,voltread/10%10);
		//LcdNumber(1,voltread%10);
		//LcdFStr(FONT_1X, PSTR("V"));

		drawframe();
		LcdUpdate();
		_delay_ms(50);
		clearscreen();
	}
	return 0;
}


ISR(INT1_vect)
{
	cli();
	_delay_ms(50);
while(!(PIND&PD5)){}
color(c);
c++;
c %= 8;
sei();
}

