#include "UWater_frame_app.h"
#include "UWater_eeprom_driver.h"
#include "UWater_rtcc_app.h"
#include "UWater_lcd_app.h"	
#include "UWater_gp22_app.h"
#include "UWater_DataTools_App.h"
#include "UWater_pt_app.h"
#include "UWater_QZ_Store_App.h"
#include "sys_processor.h"

/**********公用变量************************************************************/
DateTime tempRtccTime_BCD; 
u8 tempMsg_EE=0;
MET_STATE temp_MetState; //状态字
UNION_QZ_STORE_INDEX uStoreIndex_QZ;
TYP_STATE_QZ step_QuanzhouStoreInit = QZ_STATE_S0;
TYP_STATE_QZ step_QuanzhouStoreMachine = QZ_STATE_S0;
DateTime protl_rtcc_time;
/**********日冻结信息存储相关变量***********************************************/
UNION_QZ_STORE_DAY temp_daily_data;
u8 *pBuf_DailyHalfHourFlow;
u8 *pBuf_DailyHighestFlow;
TYP_STATE_QZ step_DailyDataStore = QZ_STATE_S0;

/**********月冻结数据存储相关变量***********************************************/
UNION_QZ_STORE_MONTH  temp_month_data;
TYP_STATE_QZ step_MonthDataStore = QZ_STATE_S0;

static float s_daily_temprature[3];
static u16 s_daily_temprature_min_max[2];

//间隔流量缓存
static u8 temp_IntervalDataBuf[96];
static u8 temp_interval_flow_addr;//间隔流量缓存地址
static RTCC_To_Float old_jiange_total_flow;
static RTCC_To_Float new_jiange_total_flow;
static RTCC_UNION_2U8TOU16 jiange_data;
/********************************************************************************
函数名：Quanzhou_Store_InitApp
说  明：泉州数据存储初始化
********************************************************************************/	
void Quanzhou_Store_InitApp(void)
{
    TYP_STATE_QZ tmp_init_stat = QZ_STATE_S0;
	if(Sys_data_object.P3.FirstPowerOnFlag == FIRST_POWER_ON_FLAG)
	{
		tmp_init_stat = QZ_STATE_S10;
	}
	else
	{
		tmp_init_stat = QZ_STATE_S20;
	}
    while (tmp_init_stat)
    {
      switch (tmp_init_stat)
      {
        case QZ_STATE_S0:
        {
			if (TASK_IDLE == EepIfIdle())
            {
                tmp_init_stat = QZ_STATE_S0;
            }
            break;
        }
        case QZ_STATE_S10://第一次上电流程
        {
            if(TASK_IDLE == EepIfIdle())
            {
				uStoreIndex_QZ.Data.DailyStore = 0;
				uStoreIndex_QZ.Data.MonthStore = 0;
                EepWrite(&uStoreIndex_QZ.data_buf[0], EEP_ADDR_QZ_STORE_INDEX_WRITE, 2, &tempMsg_EE);
                tmp_init_stat = QZ_STATE_S1;
            }
            break;
        }
		case QZ_STATE_S20://非第一次上电
        {
            if (TASK_IDLE == EepIfIdle())
            {
                EepRead(EEP_ADDR_QZ_STORE_INDEX_WRITE, &uStoreIndex_QZ.data_buf[0], 2, &tempMsg_EE);
                tmp_init_stat = QZ_STATE_S1;				
            }
            break;			
        }
		case QZ_STATE_S1:
		{
			if (TASK_IDLE == EepIfIdle())
            {
                tmp_init_stat = QZ_STATE_S0;				
            }
			break;
		}
		default:
		{
			tmp_init_stat  =QZ_STATE_S0;
		    break;
		}
      }
      EepMachineDriver();
    }
	new_jiange_total_flow.gp22_u32 = Gp30CheckDataApp(2);
	old_jiange_total_flow.gp22_u32 = new_jiange_total_flow.gp22_u32;
	for(int i=0;i<96;i++)
	{
		temp_IntervalDataBuf[i] = 0;
	}
}

//日最高最低水温
static void SysCheckTempratureMinMax(DateTime alarm_time)  
{	
	if((0 == alarm_time.s.hour) && (0 == alarm_time.s.minute)) 
	{
		//每天0点重新记录温度
		if(s_daily_temprature[0]<0)//高温小于0
		{
			s_daily_temprature_min_max[0] = -((u16)(s_daily_temprature[0]*10));
			s_daily_temprature_min_max[0] = 0x8000|s_daily_temprature_min_max[0];
		}
		else//高温大于0
		{
			s_daily_temprature_min_max[0] = (u16)(s_daily_temprature[0]*10);//强转优先级大于乘，要先乘
		}
		if(s_daily_temprature[1]<0)//低温小于0
		{
			s_daily_temprature_min_max[1] = -((u16)(s_daily_temprature[1]*10));
			s_daily_temprature_min_max[1] = 0x8000|s_daily_temprature_min_max[1];
		}
		else//低温大于0
		{
			s_daily_temprature_min_max[1] = (u16)(s_daily_temprature[1]*10);
		}
		s_daily_temprature[2] = TempCheckValueApp();
		s_daily_temprature[0] = s_daily_temprature[2];
		s_daily_temprature[1] = s_daily_temprature[2];
	}
	else
	{
		//计算温度最大最小值
		s_daily_temprature[2] = TempCheckValueApp();
		if(s_daily_temprature[2]>s_daily_temprature[0])
		{
			s_daily_temprature[0] = s_daily_temprature[2];//高温
		}
		if(s_daily_temprature[2]<s_daily_temprature[1])
		{
			s_daily_temprature[1] = s_daily_temprature[2];//低温
		}
	}	
}

/********************************************************************************
函数名：QuanZhou_DailyDataStore_proc
说  明：日冻结数据存储,
        0点存储日冻结数据\
		半小时的间隔流量\
		日最高流速\
		日最高水温\
		日最低水温\
        报警状态字\
		时间年月日
********************************************************************************/
static int QuanZhou_DailyDataStore_proc(void)
{
	switch(step_DailyDataStore)
	{
		case QZ_STATE_S0:
		{
			u8 temp_index = 0;
			temp_daily_data.Data.Head = 0x5A;
            QZ_U32_To_Float  temp_float_dadta;
			//获取当前流量
            temp_float_dadta.gp22_u32 =  Gp30CheckDataApp(2);
            temp_daily_data.Data.DailyFlowData.gp22_u32  = (u32)temp_float_dadta.gp22_float;
            

			//获取间隔流量:2B(间隔流量)X2(次/h)X24h=96B
			for(temp_index = 0; temp_index <96 ;temp_index++)
			{
				temp_daily_data.Data.StepFlowDataBuf[temp_index] = temp_IntervalDataBuf[temp_index];
			}
			for(temp_index = 0; temp_index <96 ;temp_index++)
			{
				temp_IntervalDataBuf[temp_index] = 0;
			}

			//获取日最高流速
			RtccCheck_Hight_Flow(&pBuf_DailyHighestFlow);			
			for(temp_index = 0; temp_index <14 ;temp_index++)
			{
				temp_daily_data.Data.HighestFlowDataBuf[temp_index] = *(pBuf_DailyHighestFlow+temp_index);
			}

			//获取日最高和最低水温
			temp_daily_data.Data.HighestTemp = s_daily_temprature_min_max[0];
			temp_daily_data.Data.LowestTemp = s_daily_temprature_min_max[1];
			//获取报警信息
			//状态字
			temp_MetState = FrameGetByte();
			temp_daily_data.Data.MetState[0] = temp_MetState.stat0;
			temp_daily_data.Data.MetState[1] = temp_MetState.stat1;
			temp_daily_data.Data.MetState[2] = temp_MetState.stat3;
			
			//获取当前时间
			RtccGetDateTime(&tempRtccTime_BCD);
			temp_daily_data.Data.Year = tempRtccTime_BCD.s.year;
			temp_daily_data.Data.Month = tempRtccTime_BCD.s.month;
			temp_daily_data.Data.Day = tempRtccTime_BCD.s.day;
			//校验和
			temp_daily_data.Data.CheckSum=0;
			for(temp_index = 0; temp_index<(STORE_SIZE_DATA_DAILY-2); temp_index++)
			{
				temp_daily_data.Data.CheckSum += temp_daily_data.data_buf[temp_index];
			}
            //预留字节
			temp_daily_data.Data.End = 0xA5;
			
			step_DailyDataStore = QZ_STATE_S1;
			break;
		}
		case QZ_STATE_S1://存储数据
		{
			if(TASK_IDLE == EepIfIdle())
			{
				if(uStoreIndex_QZ.Data.DailyStore>=100)
				{
					uStoreIndex_QZ.Data.DailyStore = 0;
				}
				EepWrite(temp_daily_data.data_buf, EEP_ADDR_QZ_STORE_DAY + uStoreIndex_QZ.Data.DailyStore*128, 128, &tempMsg_EE);
				step_DailyDataStore = QZ_STATE_S2;
			}  
			break;
		}
		case QZ_STATE_S2: //存储指针
		{
			if(TASK_IDLE == EepIfIdle())
			{
				uStoreIndex_QZ.Data.DailyStore++;
				if(uStoreIndex_QZ.Data.DailyStore>=100)
				{
					uStoreIndex_QZ.Data.DailyStore = 0;
				}
				EepWrite(&uStoreIndex_QZ.data_buf[0], EEP_ADDR_QZ_STORE_INDEX_WRITE, 2, &tempMsg_EE);
				step_DailyDataStore = QZ_STATE_S3;
			}  
			break;
		}
		case QZ_STATE_S3:
		{
			if(TASK_IDLE == EepIfIdle())
			{
				step_DailyDataStore = QZ_STATE_S0;
				return SUCCESS;
			}  
			break;
		}
		default:
		{
			step_DailyDataStore = QZ_STATE_S0;
			break;
		}
	}
	return ERROR;
}

/********************************************************************************
函数名：month_store_proc
说  明：月冻结数据存储,存储24个月的冻结数据。
        每月1号0点1分存储,时间记录为上一个月的月份
********************************************************************************/
static int QuanZhou_MonthDataStore_proc(void)
{
	switch(step_MonthDataStore)
	{
		case QZ_STATE_S0://月冻结数据
		{
            QZ_U32_To_Float  temp_float_dadta;
			//清消息
			RtccGetDateTime(&tempRtccTime_BCD);
            temp_float_dadta.gp22_u32 =  Gp30CheckDataApp(2);
            temp_month_data.Data.FlowData.gp22_u32 = (u32)temp_float_dadta.gp22_float;
            temp_month_data.Data.Month = tempRtccTime_BCD.s.month;
            temp_month_data.Data.Year = tempRtccTime_BCD.s.year;
			if(tempRtccTime_BCD.s.month>1)
			{
				temp_month_data.Data.Month = BCD2HEX(tempRtccTime_BCD.s.month) -1; 
				temp_month_data.Data.Month = HEX2BCD(temp_month_data.Data.Month);
			}
			else
			{
				temp_month_data.Data.Year = BCD2HEX(tempRtccTime_BCD.s.year) -1;
				temp_month_data.Data.Year = HEX2BCD(temp_month_data.Data.Year);
				temp_month_data.Data.Month = 0x12;
			}
			step_MonthDataStore = QZ_STATE_S1;
			break;
		}
		case QZ_STATE_S1://存储数据
		{
			if(TASK_IDLE == EepIfIdle())
			{
                if(uStoreIndex_QZ.Data.MonthStore>=24)
				{
					uStoreIndex_QZ.Data.MonthStore = 0;
				}
				EepWrite(temp_month_data.data_buf, EEP_ADDR_QZ_STORE_MONTH + uStoreIndex_QZ.Data.MonthStore*6, 6, &tempMsg_EE);
                step_MonthDataStore = QZ_STATE_S2;
			}  
			break;
		}
		case QZ_STATE_S2: //存储指针
		{
			if(TASK_IDLE == EepIfIdle())
			{
				uStoreIndex_QZ.Data.MonthStore++;
				if(uStoreIndex_QZ.Data.MonthStore>=24)
				{
					uStoreIndex_QZ.Data.MonthStore = 0;
				}
				EepWrite(&uStoreIndex_QZ.data_buf[0], EEP_ADDR_QZ_STORE_INDEX_WRITE, 2, &tempMsg_EE);
				step_MonthDataStore = QZ_STATE_S3;
			}  
			break;
		}
		case QZ_STATE_S3:
		{
			if(TASK_IDLE == EepIfIdle())
			{
				step_MonthDataStore = QZ_STATE_S0;
				return SUCCESS;
			}  
			break;
		}
		default:
		{
			step_MonthDataStore = QZ_STATE_S0;
			break;
		}
	}
	return ERROR;
}


/********************************************************************************
函数名：Quanzhou_Store_Machine
说  明：泉州数据存储状态机
********************************************************************************/
void Quanzhou_Store_Machine(void)
{
	switch(step_QuanzhouStoreMachine)
	{
		case QZ_STATE_S0://数据存储消息判断
		{
			if (FrameCheckMsgApp(Msg_FrozenStore))
			{
				FrameClearMsgApp(Msg_FrozenStore);
				RtccGetDateTime(&protl_rtcc_time);
				SysCheckTempratureMinMax(protl_rtcc_time);//计算日最高最低水温
				if((protl_rtcc_time.s.minute==0x00)||(protl_rtcc_time.s.minute==0x30))//半小时间隔流量存储
				{
					//计算间隔流量
					new_jiange_total_flow.gp22_u32 = Gp30CheckDataApp(2);
					jiange_data.datas = (u16)((new_jiange_total_flow.gp22_float - old_jiange_total_flow.gp22_float)*10);
					old_jiange_total_flow.gp22_u32 = new_jiange_total_flow.gp22_u32;
					//计算本时刻间隔流量存储位置
					temp_interval_flow_addr =  BCD2HEX(protl_rtcc_time.s.hour)*4 + (BCD2HEX(protl_rtcc_time.s.minute)/30)*2;
					temp_IntervalDataBuf[temp_interval_flow_addr] = jiange_data.datas_map.data0;
					temp_IntervalDataBuf[temp_interval_flow_addr+1] = jiange_data.datas_map.data1;
				}
				if((protl_rtcc_time.s.hour==0)&&(protl_rtcc_time.s.minute==0))//日冻结数据存储	
                {
                    FrameSetMsgApp(MsgQuanzhou_DailySave);
					if(protl_rtcc_time.s.day == 1)//每月1号0点0分存储月冻结数据
					{
						FrameSetMsgApp(MsgQuanzhou_MonthSave);
					}
                }
			}
			if(FrameCheckMsgApp(MsgQuanzhou_DailySave))//日冻结消息
			{
				FrameClearMsgApp(MsgQuanzhou_DailySave);	//清消息
				step_QuanzhouStoreMachine = QZ_STATE_S1;
			}
			else if(FrameCheckMsgApp(MsgQuanzhou_MonthSave))//月冻结消息
			{
				FrameClearMsgApp(MsgQuanzhou_MonthSave);	//清消息
				step_QuanzhouStoreMachine = QZ_STATE_S2;
			}
			break;
		}
		case QZ_STATE_S1://日冻结数据存储
		{
			if(QuanZhou_DailyDataStore_proc() == SUCCESS)
			{
				step_QuanzhouStoreMachine = QZ_STATE_S0;
			}
			break;
		}
		case QZ_STATE_S2://月冻结数据存储
		{
			if(QuanZhou_MonthDataStore_proc() == SUCCESS)
			{
				step_QuanzhouStoreMachine = QZ_STATE_S0;
			}
			break;
		}
		default:
		{
			step_QuanzhouStoreMachine = QZ_STATE_S0;
			break;
		}
	}
}
/********************************************************************************
函数名：get_QZ_StorePara
说  明：获取泉州数据存储当前指针
********************************************************************************/
u8 get_QZ_StorePara(QZ_ParaTypeDef paraType)
{
    switch(paraType)
	{
	    case QZ_StoreCurIndex_Daily://日冻结存储指针
		{
			if(uStoreIndex_QZ.Data.DailyStore>=100)
			{
				uStoreIndex_QZ.Data.DailyStore = 0;
			}
			return uStoreIndex_QZ.Data.DailyStore;
		}
		case QZ_StoreCurIndex_Month://月冻结存储指针
		{
			if(uStoreIndex_QZ.Data.MonthStore>=24)
			{
				uStoreIndex_QZ.Data.MonthStore = 0;
			}
			return uStoreIndex_QZ.Data.MonthStore;
		}
		default:
			break;
	}
	return 0;
}
/********************************************************************************
函数名：QuanzhouStore_IfSleep
说  明：泉州数据存储状态机空闲判断
********************************************************************************/
u8 QuanzhouStore_IfSleep(void)
{
    if(step_QuanzhouStoreMachine == 0)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}



