#ifndef __WHYW_FRAME_H__
#define __WHYW_FRAME_H__

/******************************************************************************
 * Include files
 ******************************************************************************/
#include "sys_config.h"
#if PRODUCT_WHYW
#include "UWater_frame_app.h"
#include "UWater_rtcc_driver.h"
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif

/*******************************EEPROM存储地址划分****************************/
#define STORE_DATA_SIZE_CIRCLE             4  //周期数据单条长度
#define STORE_DATA_COUNT_CIRCLE          240
#define EEP_DATA_LEN_CIRCLE           (STORE_DATA_SIZE_CIRCLE*STORE_DATA_COUNT_CIRCLE)//1200//周期数据存储空间

#define EEP_ADDR_WHYW_STORE_CIRCLE    FRAME_SHENYANG_STORE_ADD //0x7300~0x7C00  周期数据存储地址
#define EEP_ADDR_WHYW_CIRCLE_INDEX_W  (EEP_ADDR_WHYW_STORE_CIRCLE+EEP_DATA_LEN_CIRCLE)//周期数据存储指针
#define EEP_ADDR_WHYW_CIRCLE_INDEX_R  (EEP_ADDR_WHYW_CIRCLE_INDEX_W+2)//周期数据读取指针
#define EEP_ADDR_WHYW_LAST_RTCC  	  (EEP_ADDR_WHYW_CIRCLE_INDEX_R+2)//最后一条记录的时间7字节
//配置参数相关的存储
#define EEP_ADDR_WHYW_NB_ONLINE_KEEP   (EEP_ADDR_WHYW_LAST_RTCC+7) //在线延时时间 1字节
#define EEP_ADDR_WHYW_STORE_INTERVAL   (EEP_ADDR_WHYW_NB_ONLINE_KEEP+1)//表数据采集记录间隔时间 1字节
#define EEP_ADDR_WHYW_BATTERY_PRA      (EEP_ADDR_WHYW_STORE_INTERVAL+1)//电池电压相关参数 4字节
#define EEP_ADDR_WHYW_UPLOAD_SUCCESS   (EEP_ADDR_WHYW_BATTERY_PRA+4)//上报总次数
#define EEP_ADDR_WHYW_UPLOAD_FAIL      (EEP_ADDR_WHYW_UPLOAD_SUCCESS+4)//上报成功总次数

#define UPLOAD_CIRCLE_MAX_COUNT  48 //单帧最多48条记录:48*4=192
#define UPLOAD_CIRCLE_MAX_LEN    (STORE_DATA_SIZE_CIRCLE*UPLOAD_CIRCLE_MAX_COUNT)//单帧最大字节数

#define EE_PRA_SIZE_WHYW  21//EE存储参数总字节数
typedef union 
{
	struct
	{
		UNION_2U8TOU16 u_circle_store_index_w;//周期数据存储的位置
		UNION_2U8TOU16 u_circle_store_index_r;//周期数据读取的位置
		DateTime store_circle_rtcc_end;//最后一条记录的时间7字节
		u8 ee_nb_online_keep_time;//在线延时时间 1字节
		u8 ee_nb_acq_interval;//表数据采集记录间隔时间 1字节 采集间隔30分钟
		u8 ee_battery_pra[4];//电池电压相关参数
		UNION_2U8TOU16 ee_upload_count_success;//上报成功总次数
		UNION_2U8TOU16 ee_upload_count_fail;//上报失败总次数
	}Data;
	u8 data_buf[EE_PRA_SIZE_WHYW];
}WHYW_UNION_EE_STORE;
 /******************************规约解析相关参数*********************************/
#define FRAME_HEAD_MARK            0x68       
#define FRAME_END_MARK             0x16       
#define UP_BUF_SIZE                 512

#define FRAME_LEN_MAX       UP_BUF_SIZE
#define FRAME_LEN_MIN       10

#define FRAME_GUIDE         0xFE       	//引导
#define FRAME_HEAD          0x68       	//帧头
#define FRAME_TAIL          0x16       	//帧尾本号

#define W_METTYPE                  			      0x10        //水表类型
#define LYBK_DATA_UP_NOW                          0x55
#define LYBK_OFFSET_DATA_UP                       0xFF
#define LYBK_DISCRETE_DATA_UP                     0x99


#define READ_CTRL_DOWN                      	0x01   //读控制码下行
#define READ_CTRL_UP                         	0x81   //读控制码上行
#define WRITE_CTRL_DOWN                      	0x04   //写控制码下行
#define WRITE_CTRL_UP                       	0x84   //写控制码上行

//读、写水表在线延时等待时间
#define RW_ONLINE_TIME_D0          0x81   
#define RW_ONLINE_TIME_D1          0x11  

//读、写水表实时时间
#define RW_METER_TIME_D0           0xA0          
#define RW_METER_TIME_D1           0x15  

//读、写水表自动上传数据的时间参数
#define RW_UPLOAD_TIME_ID0         0x81        
#define RW_UPLOAD_TIME_ID1         0x04

//读、写水表数据采集间隔时间
#define RW_INTERVAL_TIME_ID0       0x81            
#define RW_INTERVAL_TIME_ID1       0x05 

//读、写取电池电压相关参数
#define RW_BATTERY_D0              0x81            
#define RW_BATTERY_D1              0x09            

//读、写水表 NB 网络参数
#define RW_NB_PARA_D0              0x81            
#define RW_NB_PARA_D1              0x10

  
//当前计量信息数据标识D0
#define UPLOAD_DATA_D0               0x90          
#define UPLOAD_DATA_D1               0x20           
//////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef union  //强制转化为浮点变量
{
    u32   gp22_u32;
    float gp22_float;
    u8 buf[4];
}U32_To_Float;

typedef struct //存放表计收到的比较重要的数据
{	
	u8 head_site;
	u8 frame_ctrl; 		//下行控制码
	u8 ack_ctrl;        //上行控制码
	u8 mark_DI0;   		//数据标识DI0
	u8 mark_DI1;    	//数据标识DI1
	u8 serial_num; 	//序列号
	mtype16_ len;        	//长度
	u16 chkval;     	//校验和
	u8 frame_sta;   	//规约状态
} STRUCT_FRAME_WHYW;

typedef struct
{
	u16 send_len;
	u8	send_sum_cs;        //校验和
	u8 send_buf[UP_BUF_SIZE];
}OTHER_FRAME_UP_SEND_PARA_;


typedef enum{	
	WHYW_STATE_S0 = 0,
	WHYW_STATE_S1,
	WHYW_STATE_S2,
	WHYW_STATE_S3,
	WHYW_STATE_S4,
	WHYW_STATE_S5,
	WHYW_STATE_S6,
	WHYW_STATE_S7,
	WHYW_STATE_S8,
	WHYW_STATE_S9,
	WHYW_STATE_S10,
	WHYW_STATE_S11,
	WHYW_STATE_S12,
	WHYW_STATE_S13,
	WHYW_STATE_S20,
	WHYW_STATE_S21,
	WHYW_STATE_S22,
	WHYW_STATE_S30,
	WHYW_STATE_S31,
	WHYW_STATE_S32,
}TYP_STATE_WHYW;


u8 crack_frame_WHYW(u16 frame_lenth, u8 *frame_buffer);
u8 up_deal_code_WHYW(void);
void Frame_ack_WHYW(u8* p_send_buf, u16* p_send_len);
void Frame_ResetDealState_WHYW(void);

void GetUploadDataResetState_WHYW(void);
u8 GetUploadDataCheckIdle_WHYW(void);
u8 GetUploadDataCheckTask_WHYW(void);
void GetUploadDataMachine_WHYW(u8 data_step, u8* p_send_buf, u16* p_send_len);

/****************************规约数据存储部分*****************************/
void DataStoreInit(void);
void DataStoreMachine(void);
u8 DataStoreIfIdle(void);
/************************网络连接选择\延时等待时间设置********************/
#define MAIN_CONNECT_TYPE      NBIOT_CONNECT_UDP1
#define MAIN_SEND_TYPE         SEND_TYPE_UDP1
#define SLAVE_CONNECT_TYPE     NBIOT_CONNECT_UDP2
#define SLAVE_SEND_TYPE        SEND_TYPE_UDP2

#define COAP_UPLOAD_WAIT_ACK_TIME  150   //主上报15秒，副上报5秒
#define UDP_UPLOAD_WAIT_ACK_TIME   50 
#define NB_ONLINE_KEEP_TIME  50

#ifdef __cplusplus
}
#endif 

#endif

#endif /* __LYBK_FRAME_H__ */
/******************************************************************************
 * EOF (not truncated)
 ******************************************************************************/










