/*	mija 2009

	SW pro ATmega8 mereni + regulace teploty
	Fosc = 8192000Hz externi krystal
	
	ver.: 0.0 - start	 
*/

#include 	<avr/io.h>
#include	<avr/interrupt.h>
#include	<util/delay.h>
#include 	<avr/eeprom.h>
#include 	"reflow.h"
#include	"lcd.h"			// musi se definovat PINy LCD
#include 	"key.h"			// musi se definovat PINy Tlacitek
#include 	"clock.h"		// typ promenne Clockt_t
#include	"process.h"		// musi se definovat PIN topeni

//*************************************************************
// delay + interrupt 

void delay_ms(uint16_t time)
{
	while (time --) _delay_ms(1);
}

volatile static uint8_t ClockTik8ms=125;

ISR(TIMER0_OVF_vect)	//tik 8ms
{
	if (ClockTik8ms) ClockTik8ms --; 
}

//*************************************************************
//	gemeral cpu set

void GeneralCpuInit(void)
{
	//***	IO PIN	*** init,setup
	
	//***	TIMER0	*** 
	// 256 prescaler
	// overflow 8ms
	// enable interrupt overflow
	TCCR0 = _BV(CS02);
	TIMSK |= _BV(TOIE0); 
	
	//***	TIMER1	*** 

	//***	TIMER2	*** 

	//***	EXTERNAL INTERRUPT 
		
	//***	USART	*** 
	
	//*** ADC  		*** 
		// input ADC2 (pin25 C2)
		// external reference 2.5V
		// clock adc 128k (div 64)
	ADMUX = _BV(MUX1);
	ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADPS1) | _BV(ADPS2);
}

//*************************************************************
//	analog read

int16_t ReadAdc(void)
{
	int16_t analog;
	uint8_t a;

	analog = 0;
	for (a=0;a<32;a++)
	{
		ADCSR &= ~(_BV(ADIF));
		ADCSR |= _BV(ADSC);
		while (!(ADCSR & _BV(ADIF)));
		analog += ADC;
	}
	return (analog >> 5  );			// prumer = analog/32
}

//*************************************************************
//	main 

int main(void)
{
	uint8_t 	proces = START;
	char 		DisplBuffer[MAXDISPLBUFFER];
	Clockt_t	clock;
	uint16_t 	temp = 0;
	uint8_t 	key = NOKEY;	

	GeneralCpuInit();
	HeatInit();
	HeatOff();
	delay_ms(100);
	LCD_init();
	KeyInit();
	ClockInit(0,0,0,&clock);
	sei();

	for (;;)
	{
		switch(proces)
		{
		case START:		proces = ProcesStart(DisplBuffer,key,temp);break;
		case SOLDER:	proces = ProcesSolder(DisplBuffer,key,temp,&clock);break;
		case POSITIV:	proces = ProcesPositiv(DisplBuffer,key,temp,&clock);break;
		case DRY:		proces = ProcesDry(DisplBuffer,key,temp,&clock); break;
		default: 		proces = START;
		}

		if (DisplBuffer[0]) ProcesDispl(DisplBuffer);
		
		ProcesKey(&key);
		ProcesClock((uint8_t *)&ClockTik8ms,&clock);
		ProcesTemp(ReadAdc(),&temp);
	}
	return 0;
}
