#include "led.h"
#include "delay.h"
#include "sys.h"
#include "stm32f10x.h"
#include "stdio.h"
#include "key.h"
#include "usart.h"
#include "drive_dht11.h"
#include "bh1750.h"
#include "ds1302.h"
#include "oled.h"
#include "sk9822.h"
#include "string.h"

u8 humi=0;//ʪ��ֵ
u8 temp=0;//�¶�ֵ
u8 buffer[10]={0}; 
u16 GzVal=0;  //ʵ�ʹ���ֵ
char ShowBuf[16]={0};
char DateShowBuf[30]={0};
char SendBuff[50]={0};
short TEMP = 0;
u16 cj_val=0;//���ֵ

u8 openflag=0;//�ֶ�ģʽ���ذ�ť
u8 mode_flag=0;

#define YP1 PCout(13)
#define YP2 PCout(14)
#define YP3 PCout(15)

u8 warning_cnt=0;

u16 GetTimer=0;//�ɼ�ʱ������� 
u8 dw_val=0;//��λ//����ֵ
u8 sc_val=0;//ɫ��
int set_s1=7,set_f1=0; //���� ʱ��1 
int cnt_s1=2,cnt_f1=0,cnt_m1=0;//ѧϰʱ�� ʱ����
#define RT_INPUT PBin(8)//��������Ӧ

#define KEY_GPIO_PROT   GPIOA 
#define KEY1_GPIO_PIN 	GPIO_Pin_0
#define KEY2_GPIO_PIN 	GPIO_Pin_1
#define KEY3_GPIO_PIN 	GPIO_Pin_2
#define KEY4_GPIO_PIN 	GPIO_Pin_3
#define KEY5_GPIO_PIN 	GPIO_Pin_4

#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 KEY4_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY4_GPIO_PIN)
#define KEY5_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY5_GPIO_PIN)

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|KEY4_GPIO_PIN|KEY5_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 
 	GPIO_Init(KEY_GPIO_PROT, &GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}


#define Trig PBout(10) // ���������
#define CW_ECHO1 PBin(11)

u16 Distance=0;
//�������˿ڳ�ʼ��
void Wave_IO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
//	NVIC_InitTypeDef NVIC_InitStructure; 

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB , ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;					       //PB0��TRIG
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		     //��Ϊ�������ģʽ
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	         
	GPIO_Init(GPIOB, &GPIO_InitStructure);	                 //��ʼ������GPIO 
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;				         //��ECH0
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;		 //������
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
    TIM_DeInit(TIM2);
    TIM_TimeBaseStructure.TIM_Period=65535;		 								/* �Զ���װ�ؼĴ������ڵ�ֵ(����ֵ) */
    /* �ۼ� TIM_Period��Ƶ�ʺ����һ�����»����ж� */
    TIM_TimeBaseStructure.TIM_Prescaler= (360 - 1);				                /* ʱ��Ԥ��Ƶ�� 72M/360 */
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 		                /* ������Ƶ */
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;                   /* ���ϼ���ģʽ */
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);							    		/* �������жϱ�־ */
		
		
  //  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  													
//    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;	  
//    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;	
//    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//    NVIC_Init(&NVIC_InitStructure);
//	
	//TIM2_NVIC_Configuration();//��ʱ����ʼ��
	//TIM2_Configuration();			
}


//void TIM2_IRQHandler() 
//{					  
//	static  u8 st;
//	st=TIM_GetFlagStatus(TIM2, TIM_IT_Update);
//	if(st!=0)
//	{  
//		TIM_ClearFlag(TIM2, TIM_IT_Update);
//	}
//}
//���
//��ʼ��࣬����һ��>10us�����壬Ȼ��������صĸߵ�ƽʱ��
u16 Wave_Start(void)
{
	u32  Distance;
	u32  timeout=0;
  Trig=1;
  delay_us(20);              //����һ��10us�ĸߵ�ƽ
  Trig=0;
	TIM_SetCounter(TIM2,0);	
	timeout=0;
	while(!CW_ECHO1)	             //�ȴ��ߵ�ƽ
	{
	    if(++timeout>60000)break;
			delay_us(1); 
	}
  TIM_Cmd(TIM2, ENABLE);             //����ʱ��
	timeout=0;
  while(CW_ECHO1)             //�ȴ��͵�ƽ
	{
			if(++timeout>600000)break;
			delay_us(1); 
	}
  TIM_Cmd(TIM2, DISABLE);			                             //��ʱ��2ʧ��
  Distance=TIM_GetCounter(TIM2)*5*34/2000;								 //�������	����cm
  TIM_SetCounter(TIM2,0);	
	if(Distance>200)Distance=200;
  return Distance;
}


void TIMER3_Int_Init(u16 arr,u16 psc)
{
	 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
 	 NVIC_InitTypeDef NVIC_InitStructure;

	 TIM_TimeBaseInitStrue.TIM_Period=arr;
	 TIM_TimeBaseInitStrue.TIM_Prescaler=psc;
	 TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;
	 TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CounterMode_Up;
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
   TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);
   
   TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//ʹ��TIM3�����ж� 

	//�ж����ȼ�NVIC����
		NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3�ж�
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //��ռ���ȼ�0��
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //�����ȼ�3��
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨ����ʹ��
		NVIC_Init(&NVIC_InitStructure);  //��ʼ��NVIC�Ĵ���
	
		TIM_Cmd(TIM3, ENABLE);  //ʹ��TIMx	

}



int key_Task(void)
{
   static char key_flag=0;
	 if(KEY1_IN==0|KEY2_IN==0|KEY3_IN==0|KEY4_IN==0|KEY5_IN==0)
	 {
	    if(key_flag==0)
			{
			   key_flag=1;
				 if(KEY1_IN==0)
				 {
						 mode_flag^=1;
				 }
				 else if(KEY2_IN==0)
				 {
						 if(mode_flag==0)
						 {
						   if(++dw_val>2)dw_val=0;
						 }else
						 {
						 
						 }
				 }
				 else if(KEY3_IN==0)
				 {
						 if(mode_flag==0)
						 {
						    if(++sc_val>2)sc_val=0;
						 }else
						 {
						 
						 }
				 }
				 else if(KEY4_IN==0)
				 {
						 if(mode_flag==0)
						 {
						   openflag^=1;//���ذ�ť
						 }else
						 {
						 
						 }
				 }
				 else if(KEY5_IN==0)
				 {
				    
				 }
			}
	 }else
	 {
			key_flag=0;
	 }
	 return 20;
}
u16 DataUpTime=0;//ʱ����ʾ������
u8 rt_flag=0;//���������־λ
u16 rt_cnt=0;
u8 seccnt=0;

void TIM3_IRQHandler(void)//�жϷ������ 
{
   if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)//SETΪ1 
	 {
		     GetTimer++;//�ɼ�������
         TIM_ClearITPendingBit(TIM3,TIM_IT_Update);		//���TIM3�ĸ����жϱ�־
				 key_Task();
		     DataUpTime++;
				 if(RT_INPUT==1) //��������Ӧ
				 {
				     rt_flag=1;
					   rt_cnt=0;
				 }else
				 {
				     if(rt_cnt++>50*15)//15sû����
						 {
						    rt_cnt=0;rt_flag=0;
						 }
				 }
				 if(rt_flag) //���� ��ʼ��ʱ����ѧϰʱ��
				 {
				   if(++seccnt>50)
					 {
					    seccnt=0;
						  if(++cnt_m1>59) 
							{
							   cnt_m1=0;
								 if(++cnt_f1>59)
								 {
								    cnt_f1=0;
									  if(++cnt_s1>23)
										{
										   cnt_s1=0;
										}
								 }
							}
					 }
				 }
	 }
}



u8 GetFlag=0;


uint8_t  sendBuff[16]={0};
void ShowTo(char* Pdat,char len)//�ַ����еĿո� 0 
{
  char  ixd=0;
	for(ixd=0;ixd<len;ixd++)
	{
	   if(Pdat[ixd]==' ')
		 {
		   Pdat[ixd]='0';
		 }
	}
}
#define IO_TX_GPIO_Port PAout(7)

void uartX_sendByte(uint8_t val)
{
	int i = 0;
    IO_TX_GPIO_Port=0;
    delay_us(104);
	
    for (i = 0; i < 8; i++)
    {
        if (val & 0x01)
        {
           IO_TX_GPIO_Port=1;
        } else {
           IO_TX_GPIO_Port=0;
        }
        delay_us(104);
        val >>= 1;
    }
   IO_TX_GPIO_Port=1;
    delay_us(104);
}
/*********************************************************************************************
//������:Next_Play()
//
//����˵��:�趨����
//
//��ڲ���:
//
//���ڲ���:NO
***********************************************************************************************/
void Next_Play()
{
	uartX_sendByte(0x7E); 
	uartX_sendByte(0x02);
	uartX_sendByte(0x01);
	uartX_sendByte(0xEF); 
}

/*********************************************************************************************
//������:Last_Play()
//
//����˵��:
//
//��ڲ���:
//
//���ڲ���:NO
***********************************************************************************************/
void Last_Play()
{
	uartX_sendByte(0x7E); 
	uartX_sendByte(0x02);
	uartX_sendByte(0x02);
	uartX_sendByte(0xEF); 
}
/*********************************************************************************************
//������:Specify_Musi_Play()
//
//����˵��:ָ����Ŀ����
//
//��ڲ���:
//
//���ڲ���:NO
***********************************************************************************************/
void Specify_Musi_Play(u8 num)
{
	uartX_sendByte(0x7E); 
	uartX_sendByte(0x04);
	uartX_sendByte(0x03);
	uartX_sendByte(0x00);
	uartX_sendByte(num);
	uartX_sendByte(0xEF); 
}

/*********************************************************************************************
//������:Volume_add()
//
//����˵��:������
//
//��ڲ���:
//
//���ڲ���:NO
***********************************************************************************************/
void Volume_add()
{
	uartX_sendByte(0x7E); 
	uartX_sendByte(0x02);
	uartX_sendByte(0x04);
	uartX_sendByte(0xEF); 
}
/*********************************************************************************************
//������:Volume_nec()
//
//����˵��:������
//
//��ڲ���:
//
//���ڲ���:NO
***********************************************************************************************/
void Volume_nec()
{
	uartX_sendByte(0x7E); 
	uartX_sendByte(0x02);
	uartX_sendByte(0x05);
	uartX_sendByte(0xEF); 
}
/*********************************************************************************************
//������:Specify_Volume()
//
//����˵��:ָ������
//
//��ڲ���:
//
//���ڲ���:NO
***********************************************************************************************/
void Specify_Volume(u8 num)
{
	uartX_sendByte(0x7E); 
	uartX_sendByte(0x03);
	uartX_sendByte(0x06);
	uartX_sendByte(num);
	uartX_sendByte(0xEF); 
}


/*********************************************************************************************
//������:Music_play()
//
//����˵��:����
//
//��ڲ���:
//
//���ڲ���:NO
***********************************************************************************************/
void Music_play()
{
	uartX_sendByte(0x7E); 
	uartX_sendByte(0x02);
	uartX_sendByte(0x0D);
	uartX_sendByte(0xEF); 
}
/*********************************************************************************************
//������:Music_pause()
//
//����˵��:��ͣ
//
//��ڲ���:
//
//���ڲ���:NO
***********************************************************************************************/
void Music_pause()
{
	uartX_sendByte(0x7E); 
	uartX_sendByte(0x02);
	uartX_sendByte(0x0E);
	uartX_sendByte(0xEF); 
}
/*********************************************************************************************
//������:Music_stop()
//
//����˵��:ֹͣ
//
//��ڲ���:
//
//���ڲ���:NO
***********************************************************************************************/
void Music_stop()
{
	uartX_sendByte(0x7E); 
	uartX_sendByte(0x02);
	uartX_sendByte(0x10);
	uartX_sendByte(0xEF); 
}
/*********************************************************************************************
//������:Switch_play_Device()
//
//����˵��:U/TF/AUX/SLEEP/FLASH(0/1/2/3/4)�л�
//
//��ڲ���:
//
//���ڲ���:NO
***********************************************************************************************/
void Switch_play_Device(u8 num)
{
	uartX_sendByte(0x7E); 
	uartX_sendByte(0x03);
	uartX_sendByte(0x09);
	uartX_sendByte(num);
	uartX_sendByte(0xEF); 
}
/*********************************************************************************************
//������:Cycle_play()
//
//����˵��:1:ȫ��ѭ�� 0:����ѭ��
//
//��ڲ���:
//
//���ڲ���:NO
***********************************************************************************************/
void Cycle_play(u8 num)
{
	uartX_sendByte(0x7E); 
	uartX_sendByte(0x03);
	uartX_sendByte(0x11);
	uartX_sendByte(num);
	uartX_sendByte(0xEF); 
}
u8 test=0;

int main(void)
{	 

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//�����ж����ȼ�����Ϊ��2��2λ��ռ���ȼ���2λ��Ӧ���ȼ�
	delay_init();	    	 //��ʱ������ʼ��	  
 	LED_Init();		  			//��ʼ�������ӵ�Ӳ���ӿ�
	YP1=1;YP2=1;YP3=1;
	uart_init(9600);
	delay_ms(1000);
	key_gpio_init();
	
	TIMER3_Int_Init(20000,71);//��ʱ����ʼ�� //10ms��һ���ж�
	
	BH1750_Init();
	OLED_Init();//Һ����ʼ��
	OLED_Clear();//Һ������
	delay_ms(10);//�ϵ���ʱһ�� 
	
	Ds1302_Gpio_Init();
	SK9822_Intit();
	Wave_IO_Init();
	SK9822_Write_Data(0xff,0,0,0);
	Ds1302_Write_Time_All(1);
//	Next_Play();
	delay_ms(10);
	Cycle_play(1);
	delay_ms(10);
		Cycle_play(1);
	delay_ms(10);
	Specify_Musi_Play(2);
	delay_ms(10);
		Cycle_play(1);
	delay_ms(10);
 	while(1)
	{	 	
      
		if(GetTimer>50)//1S
     {  		
			        GetTimer=0;
			if(openflag)
			{
			 switch(dw_val)
			 {
				 case 0:
					  switch(sc_val)
						{
							case 0:
							YP1=0;YP2=1;YP3=1;
								SK9822_Write_Data(0xff,0xff,0xff,0xff);
							break;
							
							case 1:
								YP1=1;YP2=0;YP3=1;
								SK9822_Write_Data(0xff,255,255,0);
							break ;
							
							case 2:
								YP1=1;YP2=1;YP3=0;
								SK9822_Write_Data(0xff,60,255,60);
							break;
						}
					 	
				 break;
				 
				 case 1:
					  switch(sc_val)
						{
							case 0:
								SK9822_Write_Data(0xff,125,125,125);
							break;
							
							case 1:
								SK9822_Write_Data(0xff,125,125,0);
							break ;
							
							case 2:
								SK9822_Write_Data(0xff,30,125,30);
							break;
						}
					 	
				 break;
				 
				 case 2:
					   switch(sc_val)
						{
							case 0:
								SK9822_Write_Data(0xff,30,30,30);
							break;
							
							case 1:
								SK9822_Write_Data(0xff,40,40,0);
							break ;
							
							case 2:
								SK9822_Write_Data(0xff,10,50,10);
							break;
						}
					 	
				 break;
			 }
		 }else{
		   SK9822_Write_Data(0xff,0,0,0);//Ϩ��
		 }
		 if(mode_flag)
		 {
		   OLED_ShowString(90,6,"A",16);
		 }else{
		   OLED_ShowString(90,6,"M",16);
		 }
						
	          if(dht11_read_data(buffer) == 0)//��ȡ��ʪ��
						{
									humi = buffer[0] + buffer[1] / 10;//ȡʪ��ֵ
									temp = buffer[2] + buffer[3] / 10;//ȡ�¶�ֵ
						}		
						GzVal = Dispose();//��ȡ����		
						cj_val=Wave_Start();
						if(cj_val>15)
						{
						  OLED_ShowText(0,6,"����:�쳣",0);
							warning_cnt|=0x01;
						}else
						{
							warning_cnt&=~0x01;
						   OLED_ShowText(0,6,"����:����",0);
						}
						
					 if(rt_flag) //����
					 {
					    OLED_ShowString(103,6,"1",16); 
					 }
					 else  //û��
					 {
					   OLED_ShowString(103,6,"0",16); 
					 }
					  printf("drv_X%dH%dD%dZ%d\r\n",temp,humi,GzVal,cj_val);//���͵���λ��app
									
					if(mode_flag)//�Զ�ģʽ
				{

				}else{   //�ֶ�ģʽ
				
				}
			}
		 
				if(DataUpTime>20) //400msˢ��һ������  
				 {
								DataUpTime=0;// 
								Ds1302_Readtime();
								sprintf((char*)DateShowBuf,"ʱ��:%2d:%2d:%2d", (int)ds1302Data.hour, (int)ds1302Data.min, (int)ds1302Data.sec);
								ShowTo(DateShowBuf,strlen(DateShowBuf));
								OLED_ShowText(0,0,DateShowBuf,0);
								sprintf((char*)DateShowBuf,"����:%2d:%2d:00", (int)set_s1, (int)set_f1);
								ShowTo(DateShowBuf,strlen(DateShowBuf));
								OLED_ShowText(0,2,DateShowBuf,0);
					 
								sprintf((char*)DateShowBuf,"ѧϰ:%2d:%2d:%2d", (int)cnt_s1, (int)cnt_f1,cnt_m1);
								ShowTo(DateShowBuf,strlen(DateShowBuf));
								OLED_ShowText(0,4,DateShowBuf,0);
								if((ds1302Data.hour==set_s1)&&(ds1302Data.min==set_f1)) //��������ʱ��
								{
								  warning_cnt|=0x02;
								}								
							  else
								{
								  warning_cnt&=~0x02;
								}
								
								if(cnt_s1>=2)
								{
								  warning_cnt|=0x04;
								}else{
								  warning_cnt&=~0x04;
								}
							
//							if((warning_cnt&0x01)==0x01) //�����쳣
//							{
//							  YP1=0;delay_us(10);YP2=1;delay_us(10);YP3=1;delay_us(10);
//							}
//							else if((warning_cnt&0x02)==0x02)//����
//							{
//							  YP1=1;delay_us(10);YP2=0;delay_us(10);YP3=1;delay_us(10);
//							} 
//							else if((warning_cnt&0x04)==0x04)//ѧϰʱ�����
//							{
//							  YP1=1;delay_us(10);YP2=1;delay_us(10);YP3=0;delay_us(10);
//							}
//							else{
//							 YP1=1;YP2=1;YP3=1;delay_us(10);
//							}
					}
				
			
	} 
}