//****main.c****//

#define F_CPU 16000000UL
#include <math.h>
#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"
#include "systemtimer.h"

float messen(void)
{
	// Lese Eingang ADC1 mit VCC als Referenz
	ADMUX=(1<<REFS0)+1;
	// Starte Messung mit Prescaler 128
	ADCSRA=(1<<ADEN)+(1<<ADSC)+(1<<ADPS0)+(1<<ADPS1)+(1<<ADPS2);
	// Warte, solange die Messung läuft
	while (ADCSRA & (1<<ADSC)) {};
	// Ergebnis in Grad Celsius umrechnen
	return ADC / 10.77 - 25.09;
}
void thread_messen(void)
{
	static enum {SENSOR_EIN,WARTEN,MESSEN,SENSOR_AUS,PAUSE} //später soll hier noch erweitert werden für die RTC Ausgabe
	status=SENSOR_EIN;
	static timer_t warteSeit=0;
	uint8_t grad;
	char Buffer[20];

	switch (status)
	{
		case SENSOR_EIN: //Temperaturmessung wird gestartet
		DDRC |= (1<<PC0);
		PORTC |= (1<<PC0);
		status=WARTEN;
		warteSeit=milliseconds();
		break;
		
		case WARTEN:
		if (milliseconds()-warteSeit >= 10)
		{
			status=MESSEN;
		}
		break;
		
		case MESSEN:
		grad=messen();				 //Messwergebnis vom ADC1 wird übergeben
		itoa( grad, Buffer, 10 );	 //Messwert vom ADC in String wandeln
		lcd_gotoxy(0,2);		     //set cursor to first column at line 3
		lcd_puts(Buffer);		     //Messwert am Display ausgeben->funktioniert nicht
		status=SENSOR_AUS;
		warteSeit=milliseconds();
		break;
		
		case SENSOR_AUS:			// Sensor (NTC10K) wird abgeschalten, dass dieser sich nicht unnötig erwärmt
		PORTC &= ~(1<<PC0);
		warteSeit=milliseconds();
		status=PAUSE;
		break;
		
		case PAUSE:
		if (milliseconds()-warteSeit >= 1000)
		{
			status=SENSOR_EIN;
		}
		break;
	}
}


int main(void)
{
	lcd_init(LCD_DISP_ON);    // init lcd and turn on
	
	while (1)
	{
		thread_messen();
	}
}