#include "led.h"
#include "delay.h"
#include "sys.h"
#include "stm32f10x.h"
#include "adc.h"
#include "stdio.h"
#include "key.h"
#include "usart.h"
#include "stdio.h"
#include "string.h"

#define version 2


#define  EN_INTERRUPT  __enable_irq();
#define  DI_INTERRUPT  __disable_irq();

unsigned char LRC_Check(unsigned char* data, int data_len)
{
		int i = 0;
    unsigned char lrc = 0;
    unsigned int sum=0;
    for (i = 0; i < data_len; i++)
    {
        sum+=  data[i];
    }
    lrc = (sum%256);
    lrc = ~lrc+1;
    return lrc;

}

#define KEY_GPIO_PROT   GPIOA
#define KEY1_GPIO_PIN 	GPIO_Pin_7
#define KEY2_GPIO_PIN 	GPIO_Pin_6
#define KEY3_GPIO_PIN 	GPIO_Pin_5

#define KEY1_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY1_GPIO_PIN)
#define KEY2_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY2_GPIO_PIN)
#define KEY3_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY3_GPIO_PIN)
//#define KEY1_IN PCin(1)
//#define KEY2_IN PCin(13)
//#define KEY3_IN PCin(2)

void key_gpio_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
	GPIO_InitStructure.GPIO_Pin  = KEY1_GPIO_PIN|KEY2_GPIO_PIN|KEY3_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //����������
 	GPIO_Init(KEY_GPIO_PROT, &GPIO_InitStructure);
	
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;				 // �˿�����
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //�������
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO���ٶ�Ϊ50MHz
	GPIO_Init(GPIOA, &GPIO_InitStructure);					 //�����趨������ʼ��GPIOC13
	
	GPIO_ResetBits(GPIOA,GPIO_Pin_4);
}


uint32_t get_sys_time=0;


uint16_t NO_val=0;
uint16_t CO2_val=0;

uint8_t no_changeflag=0;
uint8_t co2_changeflag=0;

uint16_t no_changeval=0;
uint16_t co2_changeval=0;

uint16_t no_tempval=0;
uint16_t co2_tempval=0;

long cnt_temp=0;

//ȡ����ָ��  05 30 05 02 01 C3
//NO�� 15%
//CO2 �� 15%
int key_Task(void)
{
   static char key_flag=0;
	 if(KEY1_IN==0||KEY2_IN==0||KEY3_IN==0)
	 {
	    if(key_flag==0)
			{
			   key_flag=1;
				 if(KEY1_IN==0)
				 {
						 //printf("k1\r\n");��ɫ 
					   #if (version==1)
					   no_changeflag=1;
					   no_changeval+=150;
					   #elif (version==2)
					   no_changeflag=1;
					   no_changeval+=15;
						 if(no_changeval>90)no_changeval=90;
					   #endif
					  // 		printf("k1\r\n");
				 }else if(KEY2_IN==0)
				 {
						//	printf("k2\r\n"); ��ɫ
							#if (version==1)
					   co2_changeflag=1;
					   co2_changeval+=15;
					   #elif (version==2)
					   co2_changeflag=1;
					   co2_changeval+=5;
					  if(co2_changeval>90)co2_changeval=90;
					   #endif
						 	//	printf("k2\r\n");	
				 }
				 else if(KEY3_IN==0)
				 {
						//	printf("k3\r\n");//��ɫ
					   no_changeflag=0; 
					   no_changeval=0;
					    co2_changeflag=0;
					   co2_changeval=0;
					    __set_FAULTMASK(1);//�ر����ж�
							NVIC_SystemReset();//����Ƭ������
				 }
			}
	 }else
	 {
	    key_flag=0;
	 }
	return 20;
}
/*
06H-30H-LB-02H-�̶ȼ�����λ-��·ѹ����λ-��·ѹ����λ-���¸�λ
-���µ�λ-ת�ٸ�λ-ת�ٵ�λ-NO��λ-NO��λ-CO2��λ- CO2��λ
-N ֵ��λ-N ֵ��λ-Ns ֵ��λ-Ns ֵ��λ-K ֵ��λ
-K ֵ��λ-�����¶�-У����
*/
void user_data_check(void)
{
		if(user_uart_handle.uart2_sta)
		{
			  if(user_uart_handle.uart2_len>0&&user_uart_handle.uart2_len<Usart2ReadLen)
				{
					if(user_uart_handle.uart2_len==3&&user_uart_handle.uart2_buff[0]==0x88&&user_uart_handle.uart2_buff[1]==0x55&&user_uart_handle.uart2_buff[2]==0x99)
					{
						 user_uart_handle.uart2_buff[0]=no_changeval<<8;
						 user_uart_handle.uart2_buff[1]=no_changeval;
						 user_uart_handle.uart2_buff[2]=co2_changeval<<8;
						 user_uart_handle.uart2_buff[3]=co2_changeval;
					   USART2_String(user_uart_handle.uart2_buff,4);
					}else
					{
				  	USART1_String(user_uart_handle.uart2_buff,user_uart_handle.uart2_len);
					  
					}
					user_uart_handle.uart2_sta=0;
				}
		}
		if(user_uart_handle.uart1_sta)
		{
			  
		  	user_uart_handle.uart1_sta=0;
			
	    if(user_uart_handle.uart1_len>0&&user_uart_handle.uart1_len<Usart1ReadLen)
			{
			  if(user_uart_handle.uart1_buff[0]==0x06
				 &&user_uart_handle.uart1_buff[1]==0x30
				 &&user_uart_handle.uart1_buff[2]==0x16
				 &&user_uart_handle.uart1_buff[3]==0x02
				 &&user_uart_handle.uart1_buff[4]==0x01
				  )
				{
					  if(LRC_Check(user_uart_handle.uart1_buff,user_uart_handle.uart1_len-1)==user_uart_handle.uart1_buff[user_uart_handle.uart1_len-1])
						{
								NO_val = user_uart_handle.uart1_buff[11]<<8|user_uart_handle.uart1_buff[12];
								CO2_val = user_uart_handle.uart1_buff[13]<<8|user_uart_handle.uart1_buff[14];
							  if(no_changeflag)
								{
										#if (version==1)
								    cnt_temp = NO_val - no_changeval;
									  #elif (version==2)
									  cnt_temp = NO_val - (no_changeval*NO_val)/100;
									  #endif
									  if(cnt_temp<1)cnt_temp=1;
									  no_tempval = cnt_temp;
									  user_uart_handle.uart1_buff[11]=no_tempval>>8;
									  user_uart_handle.uart1_buff[12]=no_tempval;
								}
								
								if(co2_changeflag)
								{
									  #if (version==1)
								    cnt_temp = CO2_val + co2_changeval;
								  	#elif (version==2)
										cnt_temp = CO2_val + (co2_changeval*CO2_val)/100;
									  #endif
									  if(cnt_temp>2000)cnt_temp=2000;
									  co2_tempval = cnt_temp;
									  user_uart_handle.uart1_buff[13]=co2_tempval>>8;
									  user_uart_handle.uart1_buff[14]=co2_tempval;
								}
								user_uart_handle.uart1_buff[user_uart_handle.uart1_len-1]=LRC_Check(user_uart_handle.uart1_buff,user_uart_handle.uart1_len-1);
								USART2_String(user_uart_handle.uart1_buff,user_uart_handle.uart1_len);
						}
				}else
				{ 
				  USART2_String(user_uart_handle.uart1_buff,user_uart_handle.uart1_len);
				}
			}
		}
		
}

void TIM4_IRQHandler() //20ms 1��
{					  
  u8 st;
	st=TIM_GetFlagStatus(TIM4, TIM_IT_Update);
	if(st!=0)
	{  
		TIM_ClearFlag(TIM4, TIM_IT_Update);
		get_sys_time++;
	  key_Task();
	}
}


void Timer4_init()	//T4 20msʱ��
{	
//
			TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
				NVIC_InitTypeDef NVIC_InitStructure; 
				
			RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM4,ENABLE);//M

			TIM_TimeBaseStructure.TIM_Period = 20000-1; //��������     //20ms
			TIM_TimeBaseStructure.TIM_Prescaler =72-1;//��Ƶֵ   	    
			TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; 	//�ָ�ʱ��			
			TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //���ϼ���
			 TIM_DeInit(TIM4);
			TIM_TimeBaseInit(TIM4, & TIM_TimeBaseStructure); 
			TIM_Cmd(TIM4, ENABLE); 	 //ʹ�ܶ�ʱ��2

			 /*���¶�ʱ��4�жϳ�ʼ��*/
			TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //���ϼ�����������ж�

			NVIC_InitStructure.NVIC_IRQChannel =TIM4_IRQn;// TIM4_IRQChannel; 
			NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; 
			NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
			NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
			NVIC_Init (&NVIC_InitStructure); 
}

void IWDG_Init(u8 prer,u16 rlr) 
{	
 	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  
	
	IWDG_SetPrescaler(prer);  
	
	IWDG_SetReload(rlr); 
	
	IWDG_ReloadCounter(); 
	
	IWDG_Enable();  
}

void IWDG_Feed(void)
{   
 	IWDG_ReloadCounter();//reload										   
}

//ĸͷuart2�ӵ��� ��ͷuart1����λ�� 
int main(void)
{	 
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//�����ж����ȼ�����Ϊ��2��2λ��ռ���ȼ���2λ��Ӧ���ȼ�
	delay_init();	    	 //��ʱ������ʼ��	  
 	LED_Init();		  			//��ʼ����LED���ӵ�Ӳ���ӿ�
	uart_init(9600);//���ڳ�ʼ��
	uart2_init(9600);
	key_gpio_init();
	Timer4_init();//��ʼ����ʱ��
//	printf("sys_init\r\n");
//	USART2_String((u8*)"sys_init\r\n",10);
	IWDG_Init(4,625);    //Ϊ1s	 
 	while(1)
	{	 
    #if (version==1)		
		if(get_sys_time>50)
		{
		  get_sys_time=0;
			LED_OUT^=1;
			 //USART2_String((u8*)"sys_init\r\n",10);
		  // printf("sys_init\r\n");
		}
		#elif (version==2)		
		if(get_sys_time>100)
		{
		  get_sys_time=0;
			LED_OUT^=1;
			 //USART2_String((u8*)"sys_init\r\n",10);
		  // printf("sys_init\r\n");
		}
		#endif
		user_data_check();
		IWDG_Feed();
	}
	
}