#include <util/delay.h>


#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <avr/io.h>
#include <avr/iom8.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include "simple_driver.h"


/*
#define LEDon	PORTD |= (1<<PIND7)
#define LEDoff  PORTD &= ~(1<<PIND7)
*/

uint16_t adc=0; 

				//arany=fesz.oszto a bemeneten
double konvert_u(uint16_t arany, uint16_t adc, double adc_min, double adc_max, double u_min, double u_max);

void InitPORT() {

//           6543210
    DDRC = 0b1001111;
//  PC5,4, ADC5,4 bemenet, többi kimenet
    DDRB = 0xFF;
	//     76543210 
    DDRD=0b10000000;
    PORTD=0xFF;
}

void InitADC() {

//********************************************
//            76543210
    ADMUX = 0b01000000;
//********************************************
//    7  REFS1
//    6  REFS0
//       00 - Referencia az AREF láb, belső referencia lekapcsolva.
//       01 - Referencia az AVCC láb, AREF láb kondenzátorral testre kötve.
//       10 - Foglalt
//       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
    ADCSRA = 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) {

    ch=ch&0b00000111; //Select ADC Channel ch must be 0-7
    ADMUX|=ch;

    ADCSRA|=(1<<ADSC); //Start Single conversion

    while(ADCSRA & (1<<ADSC)); //várok amíg átalakít

    return (ADCL | (ADCH<<8)); //adc kiolvasás

} // ReadADC

//--------------------------------------------
int main() {


char tortresz[10]={0};
char egeszresz[10]={0};
char buffer[10]={0};


uint16_t a=0;
uint16_t b=0;

double m_volt=0.0;


    InitPORT();
    lcd_init ();
    
    InitADC();

    _delay_ms(100);
    
    lcd_control (1, 0, 0);
    lcd_cls ();
    lcd_putstr ("-=Battery monitor=- ", LCD_FIRST_LN_ADDR + 0);
    _delay_ms(200);
    lcd_cls ();

    for (;;) {
		//static display
        //			 01234567890123456789
		lcd_putstr ("-=Battery monitor=- ", LCD_FIRST_LN_ADDR + 0);
		lcd_putstr (" U1=  ,    U2=  ,   ", LCD_SECND_LN_ADDR + 0);
	//	lcd_putstr (" I1=  ,    I2=  ,   ", LCD_FIRST_LN_ADDR + 20); 
	//	lcd_putstr (" Q1=       Q2=      ", LCD_SECND_LN_ADDR + 20);

		        
        adc = ReadADC(5);
		m_volt=konvert_u(4, adc, 0, 1023, 0, 5000);		//visszaadja a mert feszultseget mV-ban

		a=(m_volt/1000);	//int tipus - az egeszresz adodik at
		b=m_volt;

		itoa( a, egeszresz, 10);

		itoa( b, buffer, 10);
		if(m_volt>9999 && m_volt<100000)
		{
			strncpy( tortresz, &buffer[2],2);
			lcd_putstr (egeszresz, LCD_SECND_LN_ADDR + 14);
			lcd_putstr (tortresz, LCD_SECND_LN_ADDR + 17);

		}
	
		if(m_volt>999 && m_volt<10000)
		{
			strncpy( tortresz, &buffer[1],2);
			lcd_putstr (egeszresz, LCD_SECND_LN_ADDR + 15);
			lcd_putstr (tortresz, LCD_SECND_LN_ADDR + 17);
		}

		
		if(m_volt>99 && m_volt<1000)
		{
			strncpy( tortresz, &buffer[0],2);
			lcd_putstr ("0", LCD_SECND_LN_ADDR + 15);
			lcd_putstr (tortresz, LCD_SECND_LN_ADDR + 17);
		}

		if(m_volt<100)
		{
			lcd_putstr (" 0,0x", LCD_SECND_LN_ADDR + 14);
		}



        _delay_ms(500);
        lcd_cls();  
    } // for
} // main



double konvert_u(uint16_t arany, uint16_t adc, double adc_min, double adc_max, double u_min, double u_max)
{
	double u_inp=0.0;	

	u_inp=(((((u_max-u_min)/(adc_max-adc_min))*adc)+adc_min)*arany);
	
	return u_inp;		//bejovo feszultseg*osztasi arany - mV
}
