//	Forrasztópáka-állomás
//
#ifndef F_CPU
#define F_CPU 8000000
#endif

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
/***********************************************************************************/

#define ENC_1 100	// *0.002048sec tekerés ideje
#define START_TEMP 280	// kezdő/alap hőmérséklet
#define MIN_TEMP 50		//minimális és
#define MAX_TEMP 500	//maximális beállítható hőmérséklet.

/***********************************************************************************/
volatile uint16_t count=0, set_temp=START_TEMP, homerseklet;
volatile uint32_t ido_2ms=0; // indulástól kezdve a timer növeli az értékét, ezt nézve mérhető az encoder sebessége (olyan mint az arduino millis*2)
volatile uint8_t encoder_ido; 
volatile uint16_t elozo_ido; //"encoder sebessége"
volatile uint8_t digit=1; // 1-3, melyiket jeleníti meg a timer a következő interruptig
volatile uint8_t digits[3];

/***********************************************************************************/
void initTimer0()
{
	TCCR0|=(0<<CS02)|(1<<CS01)|(1<<CS00);// Prescaler = FCPU/64
	TIMSK|=(1<<TOIE0);//Enable Overflow Interrupt Enable
	TCNT0=0;//Initialize Counter
	sei();	//Enable Global Interrupts
}//timer

void initEXTint1()
{
	MCUCR|=0b00001100;	// int1, felfutó él
	GICR|=0b10000000;	// enable int1
	DDRD&=~(1<<PD3);	// bemenet
	sei();
}//ext.int.1

void initSPI()
{
	SPCR=(1<<SPE)|(1<<MSTR)|(0<<CPHA)|(1<<SPR1)|(1<<SPR0);	//spi engedélyezve, mester mód, spi 1-es mód, ??-es előosztás
}

uint16_t get_temperature() //hőmérsékletet adja vissza, HA 0 AKKOR NINCS HŐELEM CSATLAKOZTATVA !!!
{
	uint16_t temp=0;
	
	PORTB&=~(1<<PB2);	// max6675 kiválasztva
	_delay_us(1);
	SPDR=0x00; //valami küldése
	while(!(SPSR & (1<<SPIF)))
	temp|=SPDR<<8;
	SPDR=0x00; //valami küldése
	while(!(SPSR & (1<<SPIF)))
	temp|=SPDR;
	PORTB|=(1<<PB2);	// SS felhúzva

//	if(!(temp & 0b00000100))	// ha van a hőelemmel kapcsolat
//	{
//		temp=(temp>>5)&(0b1111111111);
//	}//if
//	else {temp=0;}

	return temp=SPDR;
}//hőmérséklet lekérdezése

void set_segment(uint16_t num) // FUNCTION TO DISPLAY VALUES ON SSD
{
    PORTC&=~0b00111111; // aktív szegmensek kikapcsolása
	PORTD&=~0b00000001;
    switch(num)			// új szegmensek bekapcsolása
    {
        case 0:
        PORTC|=0b00110111;
		PORTD|=0b00000001;
        break;
        case 1:
        PORTC|=0b00010100;
        break;
        case 2:
        PORTC|=0b00101101;
		PORTD|=0b00000001;
        break;
        case 3:
        PORTC|=0b00111101;
        break;
        case 4:
        PORTC|=0b00011110;
        break;
        case 5:
        PORTC|=0b00111011;
        break;
        case 6:
        PORTC|=0b00111011;
		PORTD|=0b00000001;
        break;
        case 7:
        PORTC|=0b00010101;
        break;
        case 8:
        PORTC|=0b00111111;
		PORTD|=0b00000001;
        break;
        case 9:
        PORTC|=0b00111111;
        break;
		case 10:	//E
        PORTC|=0b00101011;
		PORTD|=0b00000001;
        break;
		case 11:	//r
        PORTC|=0b00001000;
		PORTD|=0b00000001;
        break;
        default:
        PORTC&=~0b00111111; // sötét
		PORTD&=~0b00000001;
    }
}

void breakup(uint8_t val)
{
	//ha val=0->aktuális; val=1->beállított; val=2->Error
	if(val==0)
	{
		digits[0]=(homerseklet/100)%10;	//SAJÁT, JÓ !!!
		digits[1]=(homerseklet/10)%10;
		digits[2]=homerseklet%10;
	}
	else if(val==1)
	{
		digits[0]=(set_temp/100)%10;	//SAJÁT, JÓ !!!
		digits[1]=(set_temp/10)%10;
		digits[2]=set_temp%10;
	}
	else if(val==2)
	{
		digits[0]=10;	//SAJÁT, JÓ !!!
		digits[1]=11; //10=E
		digits[2]=11; //11=r
	}
}//brake up

void display_digit(uint8_t digit_num)
{
		PORTD|=0b11100000; //kikapcsolva minden digit.
		set_segment(digits[digit_num-1]);
		switch(digit_num)
		{
			case 1:
        	PORTD&=~0b00100000;
        	break;
			case 2:
        	PORTD&=~0b01000000;
        	break;
			case 3:
        	PORTD&=~0b10000000;
        	break;
        	default:
        	PORTD|=0b11100000; //kikapcsolva minden digit.
		}
}//display

/***********************************************************************************/
int main(void)
{
	DDRB=0b00101110;	//5:sck, 4:miso, 3:mosi, 2:SS, 1:optotriak
	DDRC=0b00111111;	//seg6-seg1
	DDRD=0b11100111;	//7:dig3, 6:dig2, 5:dig1, 2:led_r, 1:led_g 0:seg7 kimenetek.
						//4:encoder, 3:encoder_int1
	PORTD|=0b11100000;	//kikapcsolva minden digit
	PORTB|=0b00000100;	// SS felhúzva

	initTimer0();
	initEXTint1();
	initSPI();
	
	while(1)
	{	
		//breakup(1);
		//if(homerseklet) {breakup(0);}
		//else {breakup(2);}
		breakup(0);
		_delay_ms(100);

	}//while
}//main

/***********************************************************************************/

ISR(TIMER0_OVF_vect)
{
	ido_2ms++;
	count++;
	
	switch(digit)
	{
		case 1:	display_digit(1); digit++; break;
		case 2:	display_digit(2); digit++; break;
		case 3: display_digit(3); digit=1; break;
	}//switch

	if(count==488)	// ~1sec
	{
		count=0;
		homerseklet=get_temperature();
	}//if
}//isr

ISR(INT1_vect)
{	
	encoder_ido=ido_2ms - elozo_ido;
	elozo_ido=ido_2ms;
	_delay_us(100);
	if(!(PIND & _BV(PD4)))
	{
		if(encoder_ido>ENC_1)
		{set_temp++;}
		else {set_temp+=5;}
	}//if
	else
	{
		if(encoder_ido>ENC_1)
		{set_temp--;}
		else {set_temp-=5;}
	}//else
	if(set_temp>MAX_TEMP){set_temp=MAX_TEMP;}
	else if(set_temp<MIN_TEMP){set_temp=MIN_TEMP;}

}//isr

