/*
 * File:   __GP22LoRa_RTCC_APP_C
 * Author:
 *
 * Created on：2017-7-24
 */

#ifdef	__cplusplus
extern "C"
{
#endif

#include "type.h"
#include "UWater_rtcc_driver.h"
#include "UWater_power_app.h"
#include "UWater_eeprom_driver.h"
#include "UWater_valve_driver.h"
#include "UWater_timer1uS_driver.h"

#include "UWater_rtcc_app.h"
#include "UWater_frame_app.h"
#include "UWater_lcd_app.h"
#include "UWater_gp22_app.h"
#include "UWater_valve_app.h"
#include "UWater_DataTools_App.h"
//#include "sys_processor.h"
#include "UWater_pt_app.h"
	
	

//static RTCC_EE_DATA ee_data; //RTCC永久性数据
 RTCC_HISTORY_DATA ee_history_data; //历史数据单元

 u8 miji_collect_buf[384];//密集采集流量暂存寄存器
static u8 miji_collect_send_buf[192];//密集采集流量对外接口
RTCC_To_Float old_total_flow;//5min累积量初值
RTCC_To_Float new_total_flow;//5min累计量终值
RTCC_UNION_2U8TOU16 miji_date;
static u16 date_remember = 0;
RTCC_To_Float temp_to_gloat;//数据转换专用
RTCC_UNION_2U8TOU16 jiange_date;
//static u16 pulse_day_max_flow_time_temp;
//static u32 old_total_speed = 0;
//static u32 new_total_speed = 0;
//static u8 date_flag = 0;
static u8 s_g_rtcc_is_error = 0; //2015-6-3 默认正常
static u8 s_g_rtcc_msg = 0; //2015-6-3
//static float s_daily_temprature[3];
//static u16 s_daily_temprature_min_max[2];

/*****************************/
u8 RtccIsError()
{
	if((RTC_ClkSource()==1)||(s_g_rtcc_is_error == 1))
	{
		return 1;
	}
	return 0;
}

void RtccClearError(void)
{
    s_g_rtcc_is_error = 0;
}
/*************************************************
Function：void RtccInitApp()
Description：RTCC INIT
Input：void
Output：void
Return：void
Others:
 *************************************************/


/*************************************************
Function：u8 RtccCheckMsgApp(void)
Description：查询当前是否在活跃状态（每一小时判断一次的接口）、递传
Input：
Output：bit0：无线活跃状态（每一小时判断一次的接口）
bit1：递传活跃状态（每一小时判断一次的接口）
bit2：连续定时时间到MSG查询接口 1：定时时间到，0：未到
bit3：自动递传时间到MSG
bit4: 校时后不在递传活跃期msg
bit5: 退出域信道MSG

Return：void
Others:
 *************************************************/
u8 RtccCheckMsgApp(Rtcc_MsgTypeDef msg_bit)
{
    return (s_g_rtcc_msg & (1 << msg_bit));
}
/*************************************************
Function：u8 RtccClearMsgApp()
Description：清MSG：当前是否在活跃状态（每一小时判断一次的接口）、递传
Input：clear_bit：
 * 0：状态，不能清，缺省
 * 1：状态，不能清，缺省
 * 2：清连续定时时间到MSG
 * 3：清自动递传时间到MSG
 * 4：清校时后不在递传活跃期msg
 * 5：清退出域信道MSG
 * 输入 ：0,1,2,3,4,5
Output：
Return：void
Others:
 *************************************************/
void RtccClearMsgApp(Rtcc_MsgTypeDef clear_bit)
{
    s_g_rtcc_msg &= ~(1 << clear_bit);
}

void RtccSetMsgApp(Rtcc_MsgTypeDef set_bit)
{
    s_g_rtcc_msg |= (1 << set_bit); 
}

/****************************************************************
Function:    void RtccAppCheckMiJi(DateTime alarm_time)
Description:  查询密集上报，每5min查一次
Input:
Return:
Others:

 *****************************************************************/
void RtccAppCheckMiJi(DateTime alarm_time)  //每5min查一次
{
	To_u32_Rtcc  miji_begin_date, miji_begin_time, miji_end_date;
	u8 miji_now_time , miji_begin_time_hex; u32 temp_value = 0;
	
	miji_begin_date.rtcc_u32 = FrameCheckParaApp(FramePara_ReportStartDMY);  //密集上报开始时间日月年bcd
	miji_begin_time.rtcc_u32 = FrameCheckParaApp(FramePara_ReportStartSMH);  //密集上报开始时间秒分时bcd
	miji_end_date.rtcc_u32 = FrameCheckParaApp(FramePara_ReportEndSMH);   //密集上报结束时间日月年bcd
	temp_value = (alarm_time.s.year<<16) | (alarm_time.s.month<<8) | (alarm_time.s.day) ;
	
	if((miji_begin_date.rtcc_u32 <= temp_value) && (miji_end_date.rtcc_u32 >= temp_value))  //在开始日期和结束日期之内（年月日）
	{
		u16 tmpi =0;	
		if(miji_begin_time.rtcc_u8[0] <= alarm_time.s.hour) //只判断到小时，固定是00分。
		{	
			if((miji_begin_time.rtcc_u8[0] == alarm_time.s.hour) && (0 == alarm_time.s.minute))  //刚开始存，清除buf
			{
				//清存储buf			
				for (tmpi = 0;tmpi < 384;tmpi++)
				{
					miji_collect_buf[tmpi] = 0;
					date_remember = 0;
				}
				old_total_flow.gp22_u32 = Gp30CheckDataApp(2);	//更新密集采集初始值			
			}
			else
			{
				miji_now_time = (alarm_time.s.hour >> 4)*10 + (alarm_time.s.hour & 0x0F);//转化为16进制比较
				miji_begin_time_hex = (miji_begin_time.rtcc_u8[0] >> 4)*10 + (miji_begin_time.rtcc_u8[0] & 0x0F);
				if((miji_begin_time_hex + 4) >= miji_now_time)  //密集上报时间内
				{
					//密集上报存储				
					new_total_flow.gp22_u32 = Gp30CheckDataApp(2);
					miji_date.datas = (u16)((new_total_flow.gp22_float - old_total_flow.gp22_float)*10);
					miji_collect_buf[date_remember] = miji_date.datas_map.data0;
					miji_collect_buf[date_remember+1] = miji_date.datas_map.data1;
					miji_collect_buf[date_remember+2] = 0;
					miji_collect_buf[date_remember+3] = 0;
					old_total_flow.gp22_u32 = new_total_flow.gp22_u32;
					date_remember = date_remember +4;
					if(384 == date_remember )
					{
						date_remember = 384;
					}
				}
				if(((miji_begin_time_hex + 4) == miji_now_time) && (0 == alarm_time.s.minute)) //密集上报结束时刻
				{
					if(date_remember >192)
					{
						date_remember = date_remember -192; 
					}
					else
					{
						date_remember =0;
					}
					for (tmpi = 0;tmpi < 192;tmpi++)
					{
						miji_collect_send_buf[tmpi] = miji_collect_buf[date_remember+tmpi];
					}	
					for (tmpi = 0;tmpi < 384;tmpi++)
					{
						miji_collect_buf[tmpi] = 0;//清接收数据BUF
					}	
					date_remember = 0;				
				}
		    }
		}
	    RtccSetMsgApp(RtccMsg_MiJiCaiJi);//s_g_rtcc_msg |= BIT1; //密集采集时间段内（开始年月日-结束年月日），4h采集完成MSG
	}
	else
	{
	    RtccClearMsgApp(RtccMsg_MiJiCaiJi);//s_g_rtcc_msg &= ~BIT1;
	}
}
/*************************************************
Function：u32 RtccGetWorkHourApp()
Description：获取工作累计时间
Input：void
Output：void
Return：void
Others:
 *************************************************/
u32 RtccGetWorkHourApp(void)
{
    return Sys_data_object.ee_data.data.work_hour;
}
/*************************************************
Functionp30CheckJianGeDataApp(u8 *addr)
Description：获取最新的密集流量
Input：void
Output：void
Return：void
Others:
 *************************************************/
void Gp30CheckMiJiDataApp(u8 **addr)
{    
    *addr = miji_collect_send_buf;
}
/*************************************************
Functionp30CheckJianGeDataApp(u8 *addr)
Description：获取最新的间隔流量
Input：void
Output：void
Return：void
Others:
 *************************************************/
void Gp30CheckJianGeDataApp(u8 **addr)
{
    *addr = 0;//jiange_collect_send_buf;
}


#ifdef	__cplusplus
}
#endif


