﻿#ifndef MAIN_H_
#define MAIN_H_

#define F_CPU 8000000L

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include "main_init.h"
#include <axlib/lcd.h>


signed char a=0;
signed char b=0;
signed char c=0;
signed char count = 0;
signed char tic = 4;
signed char tic_long = 12;
signed char button_flag = 0;
signed char power = 0;
signed char spark_flag = 0;
unsigned char Hysteresis_EEPROM = 10;
unsigned char T_Oil_EEPROM = 30;
unsigned char T_Water_EEPROM = 80;
unsigned int T_WATER_Actual = 0;
unsigned int Air_Pressure = 0;
unsigned int T_Oil_Actual = 0;
signed char fire_flag=0;
signed char level_flag=0;


unsigned char adc_step=0;
unsigned short temp=0;
signed int channel7[16];
signed int channel6[16];
signed int channel5[16];
float ch7=0.00;
float ch6=0.00;
float ch5=0.00;

void ACP (void)
{
	for (adc_step=0; adc_step<=15; adc_step++)
	{
		ADMUX=0b01000111;//включаем ацп на РА7
		ADCSRA |= (1<<ADSC);//запуск преобразования
		while((ADCSRA &(1 << ADIF)) == 0){}; // Ждём окончания конвертирования
		ADCSRA |= (0 << ADIF); // Сбрасываем флаг записью 1
		((unsigned char*)&temp)[0] = ADCL;
		((unsigned char*)&temp)[1] = ADCH;
		channel7[adc_step]=temp;
		temp=0;

		ADMUX=0b01000110;//выбираем ацп на PA6
		ADCSRA |= (1<<ADSC); //запуск преобразования
		while((ADCSRA &(1 << ADIF)) == 0){}; // Ждём окончания конвертирования
		ADCSRA |= (0 << ADIF); // Сбрасываем флаг записью 1
		((unsigned char*)&temp)[0] = ADCL;
		((unsigned char*)&temp)[1] = ADCH;
		channel6[adc_step]=temp;
		temp=0;
		
		ADMUX=0b01000101;//выбираем ацп на PA5
		ADCSRA |= (1<<ADSC); //запуск преобразования
		while((ADCSRA &(1 << ADIF)) == 0){}; // Ждём окончания конвертирования
		ADCSRA |= (0 << ADIF); // Сбрасываем флаг записью 1
		((unsigned char*)&temp)[0] = ADCL;
		((unsigned char*)&temp)[1] = ADCH;
		channel5[adc_step]=temp;
		temp=0;
	}
	//расчет среднего арифметического по каналу 7
	ch7=0;
	for (adc_step=0; adc_step<=15; adc_step++)
	{
		ch7=ch7+channel7[adc_step];            //суммируем значения массива данных
	}
	ch7 = ch7 / 16;
	//расчет среднего арифметического по каналу 6
	ch6=0;
	for (adc_step=0; adc_step<=15; adc_step++)
	{
		ch6=ch6+channel6[adc_step];            //суммируем значения массива данных
	}
	ch6 = ch6 / 16;
	//расчет среднего арифметического по каналу 5
	for (adc_step=0; adc_step<=15; adc_step++)
	{
		ch5=ch5+channel5[adc_step];            //суммируем значения массива данных
	}
	ch5 = ch5 / 16;
	ch7=(5.0/1024.0*ch7);//преобразование в напряжение
	ch6=(5.0/1024.0*ch6);//преобразование в напряжение
	ch5=(5.0/1024.0*ch5);//преобразование в напряжение
	
	T_WATER_Actual = (int)(((ch7*1000)+0.5)-500)/10;//преобразование в температуру
	Air_Pressure = (int)((ch6*1000)+0.5);
	T_Oil_Actual = (int)(((ch5*1000)+0.5)-500)/10;//преобразование в температуру
}
void solenoid_test (void)
{
	PORTC |= 1<<4;
	_delay_us(5000000);
	PORTC &= ~(1<<4);
}
void compressor_test (void)
{
	PORTC |= 1<<2;
	_delay_us(5000000);
	PORTC &= ~(1<<2);
}
void pump_test (void)
{
	PORTC |= 1<<3;
	_delay_us(5000000);
	PORTC &= ~(1<<3);
}
void spark_test(void)
{
	for (int i = 0; i < 50; i++)
	{
		PORTC |= 1<<7;
		_delay_us(5000);
		PORTC &= ~(1<<7);
		_delay_us(5000);
	}
	spark_flag = 0;
	count = 0;
	lcd_clear();
	for (spark_flag == 0;;)
	{
		lcd_gotoxy(0,0); // Установили курсор на первую строку и пятый символ
		lcd_str_out("Push Long - OK");
		lcd_gotoxy(0,1);
		lcd_str_out("Short - ERROR");
		if ((PINA&(1<<PA2))==0)//нажатие кнопки)
		{
			count++;
			if (count >= tic_long)
			{
				lcd_clear();
				lcd_gotoxy(0,0); // Установили курсор на первую строку и пятый символ
				lcd_str_out(" Spark - OK "); // Вывели текст "Save" // надо выполнить сохраниение данных
				a = 0;
				spark_flag = 1;
				count = 0;
				_delay_us(1000000);
				lcd_clear();
				break;
			}
			
		}
		if (PINA&(1<<PA2))
		{
			if (count > 0  && count < tic_long)
			{
				//короткое нажатие
				lcd_clear();
				lcd_gotoxy(0,0); // Установили курсор на первую строку и пятый символ
				lcd_str_out(" Spark - ERROR "); // Вывели текст "Save" // надо выполнить сохраниение данных
				a = 0;
				spark_flag = 0;
				count = 0;
				_delay_us(1000000);
				lcd_clear();
				break;
			}
		}

	}
}
void menu (void)
{
	switch (a)
	{
		case 0:
		lcd_gotoxy(0,0); // Установили курсор на вторую строку и первый символ
		lcd_str_out("Stand by mode");
		break;
		case 1:
		lcd_gotoxy(0,0);
		lcd_str_out("Solenoid test");
		break;
		case 2:
		lcd_gotoxy(0,0);
		lcd_str_out("Compressor test");
		break;
		case 3:
		lcd_gotoxy(0,0);
		lcd_str_out("Pump test");
		break;
		case 4:
		lcd_gotoxy(0,0);
		lcd_str_out("Spark test");
		break;
		case 5:
		lcd_gotoxy(0,0);
		lcd_str_out("Hysteresis eeprom");
		lcd_gotoxy(0,1); // Установили курсор на первую строку и первый символ
		lcd_char_out(Hysteresis_EEPROM%1000%100/10+48); // Вывели символ Q
		lcd_char_out(Hysteresis_EEPROM%1000%100%10+48);
		break;
		case 6:
		lcd_gotoxy(0,0);
		lcd_str_out("T Oil eeprom");
		lcd_gotoxy(0,1); // Установили курсор на первую строку и первый символ
		lcd_char_out(T_Oil_EEPROM%1000%100/10+48); // Вывели символ Q
		lcd_char_out(T_Oil_EEPROM%1000%100%10+48);
		break;
		case 7:
		lcd_gotoxy(0,0);
		lcd_str_out("T water eeprom");
		lcd_gotoxy(0,1); // Установили курсор на первую строку и первый символ
		lcd_char_out(T_Water_EEPROM%1000%100/10+48); // Вывели символ Q
		lcd_char_out(T_Water_EEPROM%1000%100%10+48);
		break;
		case 8:
		lcd_gotoxy(0,0);
		lcd_str_out("T water actual");
		lcd_gotoxy(0,1); // Установили курсор на первую строку и первый символ
		lcd_char_out(T_WATER_Actual%1000%100/10+48); // Вывели символ Q
		lcd_char_out(T_WATER_Actual%1000%100%10+48);
		break;
		case 9:
		lcd_gotoxy(0,0);
		lcd_str_out("T Oil actual");
		lcd_gotoxy(0,1); // Установили курсор на первую строку и первый символ
		lcd_char_out(T_Oil_Actual%1000%100/10+48); // Вывели символ Q
		lcd_char_out(T_Oil_Actual%1000%100%10+48);
		break;
		case 10:
		lcd_gotoxy(0,0);
		lcd_str_out("Air pressure");
		lcd_gotoxy(0,1);
		lcd_char_out(Air_Pressure/1000 + 0x30); // Вывели символ Q
		lcd_char_out((Air_Pressure%1000)/100+0x30);
		lcd_char_out((Air_Pressure%100)/10+0x30);
		lcd_char_out(Air_Pressure%10+0x30);
		break;
	}
}
void key (void)
{
	if ((PINA&(1<<PA0))==0)//вверх
	{
		count ++;
		if (count >= tic)
		{
			a++;
			lcd_clear();
			if (a > 10)
			{
				a = 0;
				lcd_gotoxy(0,0); // Установили курсор на вторую строку и первый символ				lcd_str_out("Stand by mode");
			}
			count = 0;
		}

	}
	if ((PINA&(1<<PA1))==0)//вниз
	{
		count ++;
		if (count >= tic)
		{
			a--;
			lcd_clear();
			if (a < 0)
			{
				a = 10;
			}
			count = 0;
		}

	}
	if ((PINA&(1<<PA4))==0)//вправо
	{
		count ++;
		if (count >= tic)
		{
			if(a == 5)
			{
				Hysteresis_EEPROM++;
				lcd_clear();
			}
			if(a == 6)
			{
				T_Oil_EEPROM++;
				lcd_clear();
			}
			if(a == 7)
			{
				T_Water_EEPROM++;
				lcd_clear();
			}
			count = 0;
			//здесь выполнить команду сохранения в еепром
		}
	}
	if ((PINA&(1<<PA3))==0)//влево
	{
		count ++;
		if (count >= tic)
		{
			if(a == 5)
			{
				Hysteresis_EEPROM--;
				lcd_clear();
			}
			if(a == 6)
			{
				T_Oil_EEPROM--;
				lcd_clear();
			}
			if(a == 7)
			{
				T_Water_EEPROM--;
				lcd_clear();
			}
			count = 0;
			//здесь выполнить команду сохранения в еепром
		}
	}
	if ((PINA&(1<<PA2))==0)//нажатие кнопки)
	{
		button_flag = 1;
		count++;
		if (count >= tic_long)
		{
			if (a==0 && spark_flag==1)
			{
				b=1;
				
			}
			asm ("nop");//длинное нажатие
		}
		
	}
	if (PINA&(1<<PA2)&&button_flag==1)
	{
		if (count > 0  && count < tic_long)
		{
			//короткое нажатие
			if(a == 1)
			{
				lcd_gotoxy(5,1); // Установили курсор на первую строку и пятый символ
				lcd_str_out(" TEST "); // Вывели текст "Save" // надо выполнить сохраниение данных
				a = 0;
				b = 0;
				solenoid_test();
				lcd_clear();				lcd_gotoxy(0,0); // Установили курсор на вторую строку и первый символ				lcd_str_out("Stand by mode");
			}
			if(a == 2)
			{
				lcd_gotoxy(5,1); // Установили курсор на первую строку и пятый символ
				lcd_str_out(" TEST "); // Вывели текст "Save" // надо выполнить сохраниение данных
				a = 0;
				compressor_test();
				lcd_clear();				lcd_gotoxy(0,0); // Установили курсор на вторую строку и первый символ				lcd_str_out("Stand by mode");
			}
			if(a == 3)
			{
				lcd_gotoxy(5,1); // Установили курсор на первую строку и пятый символ
				lcd_str_out(" TEST "); // Вывели текст "Save" // надо выполнить сохраниение данных
				a = 0;
				pump_test();
				lcd_clear();				lcd_gotoxy(0,0); // Установили курсор на вторую строку и первый символ				lcd_str_out("Stand by mode");
			}
			if(a == 4)
			{
				lcd_gotoxy(5,1); // Установили курсор на первую строку и пятый символ
				lcd_str_out(" TEST "); // Вывели текст "Save" // надо выполнить сохраниение данных
				a = 4;
				spark_test();
				//lcd_clear();
				
			}
			if(a == 5)
			{
				lcd_gotoxy(5,1); // Установили курсор на первую строку и пятый символ
				lcd_str_out(" Save "); // Вывели текст "Save" // надо выполнить сохраниение данных
				a = 0;
				_delay_ms(1000);
				lcd_clear();				lcd_gotoxy(0,0); // Установили курсор на вторую строку и первый символ				lcd_str_out("Stand by mode");
			}
			if(a == 6)
			{
				lcd_gotoxy(5,1); // Установили курсор на первую строку и пятый символ
				lcd_str_out(" Save "); // Вывели текст "Save" // надо выполнить сохраниение данных
				a = 0;
				_delay_ms(1000);
				lcd_clear();				lcd_gotoxy(0,0); // Установили курсор на вторую строку и первый символ				lcd_str_out("Stand by mode");
			}
			if(a == 7)
			{
				lcd_gotoxy(5,1); // Установили курсор на первую строку и пятый символ
				lcd_str_out(" Save "); // Вывели текст "Save" // надо выполнить сохраниение данных
				a = 0;
				_delay_ms(1000);
				lcd_clear();				lcd_gotoxy(0,0); // Установили курсор на вторую строку и первый символ				lcd_str_out("Stand by mode");
			}
			if(a == 8)
			{
				lcd_gotoxy(5,1); // Установили курсор на первую строку и пятый символ
				lcd_str_out(" Ok "); // Вывели текст "Save" // надо выполнить сохраниение данных
				a = 0;
				_delay_ms(1000);
				lcd_clear();				lcd_gotoxy(0,0); // Установили курсор на вторую строку и первый символ				lcd_str_out("Stand by mode");
			}
			if(a == 9)
			{
				lcd_gotoxy(5,1); // Установили курсор на первую строку и пятый символ
				lcd_str_out(" Ok "); // Вывели текст "Save" // надо выполнить сохраниение данных
				a = 0;
				_delay_ms(1000);
				lcd_clear();				lcd_gotoxy(0,0); // Установили курсор на вторую строку и первый символ				lcd_str_out("Stand by mode");
			}
			if(a == 10)
			{
				lcd_gotoxy(5,1); // Установили курсор на первую строку и пятый символ
				lcd_str_out(" Ok "); // Вывели текст "Save" // надо выполнить сохраниение данных
				a = 0;
				_delay_ms(1000);
				lcd_clear();				lcd_gotoxy(0,0); // Установили курсор на вторую строку и первый символ				lcd_str_out("Stand by mode");
			}
		}
		count = 0;
		button_flag = 0;
	}
}
void fire (void)
{
	if ((PINC&(1<<PC0))==0)//вверх
	{
		fire_flag=1;
	}
	else
	{
		fire_flag=0;
	}
}
void level (void)
{
	if ((PINC&(1<<PC1))==0)//вверх
	{
		level_flag=1;
	}
	else
	{
		level_flag=0;
	}
}
void spark (void)
{
	for (int i = 0; i < 150; i++)
	{
		PORTC |= 1<<7;
		_delay_us(5000);
		PORTC &= ~(1<<7);
		_delay_us(5000);
	}
}
void usart_transmit (unsigned char data)
{
	while(!(UCSRA&(1<<UDRE)));// начинаем передавать данные, но только убедившись, что буфер пуст
	UDR = data;
}
ISR(USART_RXC_vect)
{

}


#endif