/*************************** (C) COPYRIGHT 2017 YNHB ****************************
 * 文件名  ：main.c
 * 描  述  ：主函数    
 * 版  本  ：V1.0
 * 作  者  ：XuZhongPing
 * 日  期  ：2017/03/05 
*********************************************************************************/
#include "stm32f10x.h"
#include "wdg.h"
#include "delay.h"
#include "usart1.h"
#include "usart2.h"
#include "usart3.h"
#include "usart4.h"
#include "usart5.h"
#include "timer.h"

#include "gsm_gprs.h"
#include "data_typedef.h"
#include "message.h"
#include "device.h" 
#include "lcd.h"
#include "display.h"
#include "tcp_protocol.h"
#include "user_app.h"

#include "bsp_WM8978.h"
#include "sound.h"
#include "spi.h"
#include "flash.h" 

#include "pc_protocol.h"
#include "IR_Distancer.h"
#include "deviceSet.h"

#include "m_s_comm.h"
#include "netwer_appcall.h"

void NVIC_Configuration(void);
void RegularUploadTask(void);

int main(void)
{
	static timer waitingTimer_1s;
	timer_set(&waitingTimer_1s, CLOCK_SECOND*120);
	
	delay_init();	    	 							//延时函数初始化	  
	NVIC_Configuration(); 	 					//设置NVIC中断分组
	
	USART1_Init(9600);	 							//串口初始化为115200（用于RFID_IC卡及二维码数据读取）
	USART2_Init(38400);								//主从MCU通信接口
	USART4_Init(9600);								//外接通信串口
	USART5_Init(115200);							//调试信息输出串口
	
	TIM2_Int_Init(1000, 7200-1);			//10Khz的计数频率，计数到1000为100ms （即每个周期为0.1ms）
	TIM3_Int_Init(100, 7200-1);				//10Khz的计数频率（每个周期为0.1ms），定时10ms用于限位开关和按钮扫描
	TIM4_Int_Init(5000, 7200-1);			//10Khz的计数频率（每个周期为0.1ms），计数到5000为500ms
	TIM5_Int_Init(100, 7200-1);				//通用定时器5，用于二维码读头数据接收完成判断
	
	printf("\r\n***************System Running***************\r\n");
	DeviceInit();											//硬件设备初始化
	DeviceTest();											//硬件测试
	
	printf("\r\n设置IC卡模块参数 -->\r\n");
	SetRFID_Param();									//设置IC卡模块参数
	
	Audio_Play(1);
	
	IWDG_Init(5, 625);    						//看门狗初始化，分频数为128,重载值为625,溢出时间为2s	
	PC_ProCommandSend(0x90);					//向上位机发送正在开机
	
	while(1)
	{	
		LED_Task();											//LED灯指示任务
		BeepTask();											//蜂鸣器控制任务
// 		DataUploadPollingTask();
		GSM_GPRS_Task();								//GSM_GPRS通讯任务
		DeviceScanning();								//设备扫描监测（扫描刷IC卡和二维码）
		UserIdentificationTask();				//用户身份识别
		PutInOpenDoorTask();						//用户开门投放请求		
		OpenDoorRequestTask();					//开门请求任务（监听是否有开门按键按下）
		DeviceControlTask();						//设备开关门运转控制任务
		OpenDoorControlTask();					//投口开关门控制任务
		GetTemperatureTask();						//取得温度任务
		DispalyTask();									//显示任务
		PC_ProDecodeTask();							//上位机通讯任务
		M_S_DataDecodeTask();
		Audio_PlayTask();								//语音输出任务
		BoxOpenTask();									//箱体收运门控制任务
		CollectorLockCtrlTask();				//箱体收运锁控制任务
		RecycleClearDoorCheckTask();		//收运门监测任务
		
//		DistanceDataUpdata();
		if(putInProgress == 0)					//投放过程中不进行测距和开门按键检测
		{
			OverflowDetectionTask();			//满溢检测任务
			DeviceEnableTask();						//设备启用/禁用控制任务
			KeysSendTask();								//触摸按键转发任务
		}
		
		TimerTask();										//时钟任务
		RegularUploadTask();						//定时上传任务
		ParamSetTask();									//设备相关参数设置任务
		TimingSprayTask();							//定时喷淋消毒任务
		TimingUVTask();									//定时紫外线消毒任务
		FillLightTask();								//补光灯控制任务
		CoolingFanCtrlTask();						//散热风扇控制任务
		SprayCtrlTask();								//灭火喷淋控制任务
// 		SprayDisinfectingTask();				//喷淋消毒任务
// 		DisinfectingTask();							//UV消毒处理任务
// 		SystemExceptionTask();					//系统异常处理任务
		IWDG_FeedTask();								//看门狗喂狗任务
		
		if(timer_expired(&waitingTimer_1s))
		{
			timer_restart(&waitingTimer_1s);
			
// 			gpsStatus = 1;
// 			gpsLon = 114223476;
// 			gpsLat = 22687142;
		}
		
		//当接收到服务器下发的数据时提示
		if(TCP_recreceiveStatus == 1)
		{
			TCP_recreceiveStatus = 0;
			printf("\r\nTCP <-- %d \r\n", recreceiveOrderCode);
		}
		
		if(getMcu2SensorDataMark == 1)
		{
			getMcu2SensorDataMark = 0;
			
// 			printf("\r\nSensor:"
// 							"\r\nW1 = %2.2f Kg, W2 = %2.2f Kg, W3 = %2.2f Kg, W4 = %2.2f Kg"\
// 							"\r\nD1 = %3.1f cm, D2 = %3.1f cm, D3 = %3.1f cm, D4 = %3.1f cm"\
// 							"\r\nT = %2.1f ℃, SW = %d, T2 = %2.1f ℃, SW1 = %d, SW2 = %d\r\n", 
// 				(float)(weight1)/100, 
// 				(float)(weight2)/100, 
// 				(float)(weight3)/100, 
// 				(float)(weight4)/100,
// 				(float)getDistance1,
// 				(float)getDistance2,
// 				(float)getDistance3,
// 				(float)getDistance4,
// 				(float)temperature,
// 				optoSwitchStatus,
// 				(float)temperature_A,
// 				switchKey1Status,
// 				switchKey2Status
// 				);
		}
		
		if(getGpsStatus == 1)
		{
			getGpsStatus = 0;
			
//			printf("GPS连接状态：%d\r\n", gpsConnectSta);
//			printf("定位状态：%d\r\n", gpsStatus);
//			printf("经度：%.6f %d\r\n", (double)gpsLon/1000000, gpsEW);
//			printf("纬度：%.6f %d\r\n", (double)gpsLat/1000000, gpsNS);
		}
	}
}


/*
***********************************************************************
*	函 数 名: RegularUploadTask
*	功能说明: 定时上传任务
*	形    参：无        
*	返 回 值: 无
***********************************************************************
*/
void RegularUploadTask(void)
{
	static timer sendDevStaTimer;			//上传设备运行状态信息（温度、信号、测距）
	static timer heartbeatTimer;
	static timer gpsSendTimer;
	
	static uint8_t initDataSendFalg = 0;			//开机后的初始数据发送标志
	static uint8_t gpsInitDataSendFalg = 0;
	
	static uint8_t timer_ok = 0;
	if(timer_ok == 0)
	{
		timer_ok = 1;
		
		timer_set(&sendDevStaTimer, CLOCK_SECOND*30);		//设备状态上传间隔时间
		timer_set(&heartbeatTimer, CLOCK_SECOND*120);			//心跳上传时间
		timer_set(&gpsSendTimer, CLOCK_SECOND*60);
	}
	
	if(gsm_msg.Running == 1)
	{
		if(initDataSendFalg == 0)				//首次开机后发送初始数据
		{
			initDataSendFalg = 1;
			
			PC_ProCommandSend(0x31);
		}
	}
	
	if(gpsInitDataSendFalg == 0)		//首次定位信息发送
	{
		if((gpsConnectSta == 1) && (gpsStatus == 1))
		{
			gpsInitDataSendFalg = 1;
			
			printf("\r\n首次GPS信息发送！\r\n");
			PC_ProCommandSend(0x67);
		}
	}
	
	//心跳上传
	if(timer_expired(&heartbeatTimer))
	{
		timer_restart(&heartbeatTimer);
		
		if(gsm_msg.Running == 1)
		{
			PC_ProCommandSend(0x31);
		}
	}
	
	//设备运行状态信息上传
	if(timer_expired(&sendDevStaTimer))
	{
		timer_restart(&sendDevStaTimer);
		
		if(putInProgress == 0)
		{
			PC_ProCommandSend(0x62);													//向上位机发送设备状态信息
		}
	}
	
	//设备GPS定位信息上传
	if(timer_expired(&gpsSendTimer))
	{
		timer_restart(&gpsSendTimer);
		
		PC_ProCommandSend(0x67);
	}
}

/*
***********************************************************************
*	函 数 名: RegularUploadTask
*	功能说明: 定时上传任务
*	形    参：无        
*	返 回 值: 无
***********************************************************************
*/
void NVIC_Configuration(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);		//设置NVIC中断分组2:2位抢占优先级，2位响应优先级
}

/******************** (C) COPYRIGHT 2017 YNHB *****END OF FILE*******************/ 
