/*
==============T20��̨������===============
���ߣ�Bibibili ����CaiZi
΢��������STM32F103C8T6
�ⲿʱ�ӣ�8MHz
===================����===================
OLED��ʾ��(7��SPI)��
	OLED_D0  -> PB13
	OLED_D1	 -> PB15
	OLED_RES -> PB15
	OLED_DC -> PB11
	OLED_CS -> PB12
��ת��������
	BM_CLK -> PB0
	BM_DT  -> PB3
	BM_SW  -> PB1
��������
	BEEPER -> PB9
������أ�
	NTC 	-> PA6
	T12_ADC -> PA4
	HEAT 	-> PA0
	SLEEP 	-> PA8
	Vm		-> PA2
//�˰汾�Ĵ���ʵ�ֹ��ܣ�
//-T12����ͷ���¶Ȳ���
//-�������ķֶ�PID����
//-ͨ����ת�����������¶ȿ���
//-�̰���ת���������ؿɽ�������ģʽ
//-������ת���������ص����ò˵�
//-�ֱ��˶���⣨ͨ������񶯿��أ�
//-�����ѹ���
//-ʱ��������˯��/�ػ�ģʽ��ͨ������δʹ���ӵ�ʱ����
//-OLED�ϵ���Ϣ��ʾ
//-������
//-���û����ô洢��FLASH

*/
#include "stm32f10x.h"
#include "main.h"

void menuHandler(void);

extern unsigned char logo[];
char tempStr[10];//��ص�ѹ�ַ���
float volatile VinVolt;//�����ѹ
u16 volatile NTC_temp,last_NTC_temp;//�ֱ��¶�

u16 volatile T12_temp;//����ͷ�¶�
u16 volatile tempArray[TEMPARRLEN];//�¶����飬��ֵ�˲�
u16 NTC_tempArray[NTC_TEMPARRLEN];//�ֱ��¶����飬��ֵ�˲�
u16 count;
u8 err,err_count;
u8 n;
int main()
{
	u8 i;
	u16 sum;
	KEY_Init();//��ʼ������GPIO
	delay_init();//��ʼ����ʱ����
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //����NVIC�жϷ���2��2λ��ռ���ȼ���2λ�����ȼ�
	usart_init(115200);//��ʼ������1��������Ϊ115200
	TIM3_Init(19999,71);//1MHz��ÿ20ms��ⰴ��һ�Σ�
	BEEPER_Init();	//BEEPER��ʼ��
	Adc_Init();		//ADC��ʼ��
	HEAT_Init();//����ͷ���ƶ˳�ʼ��
	OLED_Init();	//��ʼ��OLED
	set_Init();//��ȡ�û���������
	
	PID_Setup();//PID��ʼ��
	TIM4_Counter_Init(99,719);//��ʱ1ms�ж�һ��
	OLED_Clear();
	OLED_DrawPointBMP(0,0,logo,128,64,1);//��ʾlogo
	OLED_Refresh_Gram();//ˢ���Դ�
	delay_ms(1000);
	
	beeperOnce();
	//��ʼ���¶�
	NTC_temp = get_NTC_temp();//��ȡ�ֱ��¶�
	T12_temp = NTC_temp;
	for(n=0; n<TEMPARRLEN; n++)
	{
		tempArray[n]=T12_temp;
	}
	
	OLED_Fill(0,0,127,63,0);
	while (1){
		if(count%100==0)//����һ��
		{
			NTC_temp =  get_NTC_temp();//��ȡһ���ֱ��¶�ֵ
			get_Vin();//��ȡһ�������ѹֵ
			
			if(NTC_temp>=50)
			{
				NTC_temp =last_NTC_temp;
			}
			else
			{
			    last_NTC_temp = NTC_temp;
			}
			sum=0;
			for(i=0;i<NTC_TEMPARRLEN-1;i++)
			{
				NTC_tempArray[i] = NTC_tempArray[i+1];//Ԫ��ǰ��
				sum += NTC_tempArray[i+1];
			}
			NTC_tempArray[NTC_TEMPARRLEN-1] = NTC_temp; 
			sum += NTC_tempArray[NTC_TEMPARRLEN-1];
			NTC_temp = (u16)sum/NTC_TEMPARRLEN;//��ֵ�˲�
			//�ֱ����Ӽ��
			if(NTC_temp>=5&&NTC_temp<=50)
			{
				err_count=0;
				err=0;
			}
			if((NTC_temp<5||NTC_temp>50)&&err==0)
			{
				err_count++;
			}
			if(err_count>=8)
			{
				err=1;//�ֱ�δ����
			}
		}
		if(nowMenuIndex==home && count%800==0)//����һ��home����
		{
			homeWindow();//��ʾ������
			OLED_Refresh_Gram();//ˢ���Դ�
		}
		if(menuEvent[0])
		{
			menuHandler();
			beeperOnce();
			if(menuEvent[1]==KEY_enter && nowMenuIndex == home)
			{
				if(sleepFlag) {sleepFlag=0; sleepCount=0;shutCount = 0;}//�̰������ر�����
				else sleepFlag = 1;
			}
			if(shutFlag) {shutFlag=0;shutCount = 0;}//���ⰴ����������
			lastMenuIndex = nowMenuIndex;
			menuEvent[0] = 0;
			OLED_display();
			STMFLASH_Write(FLASH_SAVE_ADDR,(u16 *)&setData,setDataSize);//�FLASH
		}
		if(setData.sleepTime>0 && sleepCount>setData.sleepTime*600) {sleepFlag=1;}
		if(setData.shutTime>0 && shutCount>setData.shutTime*600) {shutFlag=1;}
		count++;
		delay_us(100);
	}
}
//�˵���������
void menuHandler(void)
{
	if(menuEvent[1]==BM_up)
	{
		switch(nowMenuIndex){
			case home:
				setData.setTemp+=5;
			break;
			case xmsjSet:
				setData.sleepTime++;
			break;
			case gjsjSet:
				setData.shutTime++;
			break;
			case gzmsSet:
				setData.workMode=!setData.workMode;
			break;
			case fmqSet:
				setData.beeperFlag = !setData.beeperFlag;
			break;
			case yyszSet:
				setData.langFlag = !setData.langFlag;
			break;
		}
	}
	else if(menuEvent[1]==BM_down)
	{
		switch(nowMenuIndex){
			case home:
				setData.setTemp-=5;
			break;
			case xmsjSet:
				setData.sleepTime--;
			break;
			case gjsjSet:
				setData.shutTime--;
			break;
			case gzmsSet:
				setData.workMode=!setData.workMode;
			break;
			case fmqSet:
				setData.beeperFlag = !setData.beeperFlag;
			break;
			case yyszSet:
				setData.langFlag = !setData.langFlag;
			break;
		}
	}
	else {}
	if(setData.setTemp>TEMP_MAX) setData.setTemp=TEMP_MAX;
	if(setData.setTemp<TEMP_MIN) setData.setTemp=TEMP_MIN;
	if(setData.sleepTime>60) setData.sleepTime=60;
	if(setData.sleepTime<0) setData.sleepTime=0;
	if(setData.shutTime>60) setData.shutTime=60;
	if(setData.shutTime<0) setData.shutTime=0;
}