//********************************************
//
// JLT02 forrasztóállomás
// verzió: 5.3
// panel verzió: 2.001
// MCU: ATTINY 26
// CLK: 1 MHz (internal)
//
//********************************************

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>

//
//Szegmensek          Dgfedcba
#define NO_0		0b00111111
#define NO_1		0b00000110
#define NO_2		0b01011011
#define NO_3		0b01001111
#define NO_4		0b01100110
#define NO_5		0b01101101
#define NO_6		0b01111101
#define NO_7		0b00000111
#define NO_8		0b01111111
#define NO_9		0b01101111

//pont
//#define NO_dp_ON	PORTD = PORTD |  (1<<PIND7);
//#define NO_dp_OFF	PORTD = PORTD & ~(1<<PIND7);

//digitek
#define DIGIT_1_ON	PORTB = PORTB |  (1<<PINB0);
#define DIGIT_1_OFF	PORTB = PORTB & ~(1<<PINB0);

#define DIGIT_2_ON	PORTB = PORTB |  (1<<PINB1);
#define DIGIT_2_OFF	PORTB = PORTB & ~(1<<PINB1);

#define DIGIT_3_ON	PORTB = PORTB |  (1<<PINB2);
#define DIGIT_3_OFF	PORTB = PORTB & ~(1<<PINB2);



volatile uint16_t temp = 123;
volatile uint16_t setTemp = 300;

volatile uint16_t change  = 2000;

//volatile uint8_t mode  = 1;

//-------------------------------------
void Display(uint8_t a, uint8_t b, uint8_t c) {
//-------------------------------------

uint8_t tomb[10] = {NO_0,NO_1,NO_2,NO_3,NO_4,NO_5,NO_6,NO_7,NO_8,NO_9};

	//PORTA|= tomb[a]; 
    PORTA = (PORTA & 0b10000000) | tomb[a]; 
		DIGIT_1_ON;
		_delay_us(50);
		DIGIT_1_OFF;

	//PORTA|= tomb[b]; 
    PORTA = (PORTA & 0b10000000) | tomb[b]; 


		DIGIT_2_ON;
		_delay_us(50);
		DIGIT_2_OFF;

	//PORTA|= tomb[c];
    PORTA = (PORTA & 0b10000000) | tomb[c]; 
 
		DIGIT_3_ON;
		_delay_us(50);
		DIGIT_3_OFF;

} //display

/*
//-------------------------------------
ISR(TIMER1_COMPA_vect) {  //1843200Hz/64/28800 = 1Hz -es megszakítás
//-------------------------------------
}	
*/


//-------------------------------------
ISR(INT0_vect) {
//-------------------------------------
       
    change=2000;

    // megszakítás ideiglenes kikapcsolása
    GIMSK= 0b00000000;
        
    // jobbra tekerés
    if( PINB & (1<<PINB5) )  {
        if(setTemp<450) {
            if( PINA&(1<<PINA7) ) {setTemp=setTemp+9;}
            setTemp++;
        } // if(fok
    } // if(PINB
        
    // balra tekerés
    else {
        if(setTemp>150) {
            if( PINA&(1<<PINA7) ) {setTemp=setTemp-9;}
            setTemp--;
        } // if(fok
    } // else
     
}

//-------------------------------------
void InitPORT(){
//-------------------------------------
    //       76543210
	DDRA = 0b01111111; // PORTA 0-6 kimeent, PORTA 7 bemenet.
	 //      76543210	
    PORTA =0b10000000;

	//       6543210	
	DDRB = 0b0011111; // 0-bemenet, 1-kimeent
     //      6543210	
    PORTB =0b1100000;

    GIMSK|= (1<<INT0);
    sei();
} // InitPort

/*
//-------------------------------------
void InitTIMER(){
//-------------------------------------
// Setup timer1 16bites
    TCCR1B |= (1<<WGM12)|(1<<CS11)|(1<<CS10);  // CTC mode,  preselect ratio : 64	

	TCNT1 = 0;            // timer1 szamlaloja legyen 0
    //OCR1A = 28799;       // timer1 Compare A (31250) 1Hz ! 0...31249 az pont 31250
    OCR1A = 287;       // timer1 Compare A (31250) 1Hz ! 0...31249 az pont 31250
	
	TIMSK |= (1<<OCIE1A); // timer1 Compare Match A megszakitas bekapcsolas
    	
	sei();    //megszakítás bekapcsolás  
} // InitTimer
*/

//-------------------------------------
void InitADC() {
//-------------------------------------
//********************************************
//            76543210
    ADMUX = 0b00000000;
//********************************************
//    7  REFS1
//    6  REFS0
//       00 - Referencia az AVCC láb, AREF láb kondenzátorral testre kötve.
//       01 - Referencia az AREF láb, belső referencia lekapcsolva.
//       10 - Belső 2.56 Voltos referencia, AREF láb kondenzátorral testre kötve.
//       11 - Belső 2.56 Voltos referencia, AREF láb kondenzátorral testre kötve.
//--------------------------------------------
//    5  ADLAR
//--------------------------------------------
//    4  nem használt
//--------------------------------------------
//    3  MUX3
//    2  MUX2
//    1  MUX1
//    0  MUX0
//       ADC port választás.

//********************************************
//           76543210
    ADCSR = 0b10000111;
//********************************************
//    7  ADEN
//       ADC engedélyezve ha értéke 1, kikapcsolva ha 0.
//--------------------------------------------
//    6  ADSC
//       Egyszeri mérésnél 1-re kell állítani, hogy megtörténjen a mérés.
//       Folyamatos mérésné ha 1-re állítjuk elindul a mérés,
//       ami utánna folyamatosan fut.
//--------------------------------------------
//    5  ADFR
//       Ha 1 akkor folyamatos mérés fut, ha 0 akkor egyszeri.
//--------------------------------------------
//    4  ADIF
//       Interrupt Flag - nem kell piszkálni :)
//       Ha 1 akkor a megszakítás jött létre.
//--------------------------------------------
//    3  ADIE
//       Ha 1 akkor a mérés végén megszakítás jön létre.
//       Ha 0 akkor a megszakítás kikapcsolva.
//--------------------------------------------
//    2  ADSP2
//    1  ADSP1
//    0  ADSP0
//       Előosztás
//       000 - 1
//       001 - 2
//       010 - 4
//       011 - 8
//       100 - 16
//       101 - 32
//       110 - 64
//       111 - 128

} // InitADC


//-------------------------------------
uint16_t ReadADC(uint8_t ch) {
//-------------------------------------
    
    ADMUX = (ADMUX & 0b11110000) | ch;

    ADCSR|=(1<<ADSC);          // konverzió elindítás

    while(ADCSR & (1<<ADSC));  // várás az átalakításra

    return (ADCL | (ADCH<<8));  // adc érték visszaadása
    
} // ReadADC

//-------------------------------------
void Counter() {
//-------------------------------------
   
} // counter()


//-------------------------------------
void Results() {
//-------------------------------------
    
} // results()





//-------------------------------------
int main(void) {
//-------------------------------------
	InitPORT();
    //InitTIMER();
    InitADC();
       
    temp = ReadADC(7); 
      
    if( !(PINA&(1<<PINA7)) )  {  
 
    
        eeprom_busy_wait();
        eeprom_write_word((uint16_t*)0,300);
        eeprom_busy_wait();
    }
       
    //eeprom beolvasás
    eeprom_busy_wait();
    setTemp = eeprom_read_word((uint16_t*)0);
    eeprom_busy_wait();  
        
    //unsigned int adc, delay;

    //adc = ReadADC(6);


    //adc = ((adc*246)/100);
	//for(delay=0;delay<20000;delay++){
    //    Display(adc/1000, adc%1000/100, adc%1000%100/10, adc%1000%100%10, 70, 2);
    //}
    //mode = ReadBtn(mode);	

    for(;;) {
        if( PINB & (1<<PINB6) )  {
            //encoder = 0;
            GIMSK|= (1<<INT0);
        }
	    
        /*
        if(change==1) {
            eeprom_busy_wait();
            eeprom_write_word((uint16_t*)0,setTemp);
            eeprom_busy_wait();
        }
*/
        if(change>0) {
            Display(setTemp/100, setTemp%100/10, setTemp%100%10); 
            change--;
            if(change==1) {
                eeprom_busy_wait();
                eeprom_write_word((uint16_t*)0,setTemp);
                eeprom_busy_wait();
            }
        }
        
        

        else {Display(temp/100, temp%100/10, temp%100%10);}
        
        
	} //for
} //main()



    //if( !( PINC & (1<<PINC0) ) ) {team = 3;}
    //if( !( PINC & (1<<PINC1) ) ) {team = 2;}
    //if( !( PINC & (1<<PINC2) ) ) {team = 1;}

    //eeprom beolvasás
    //eeprom_busy_wait();
    //team1 = eeprom_read_word((uint16_t*)0);
    //eeprom_busy_wait();

