#ifndef UWATER_FRAME_APP_H
#define	UWATER_FRAME_APP_H

#ifdef	__cplusplus
extern "C" {
#endif
	
#include "type.h"
#include "UWater_gp22_driver.h"
#include "UWater_uart_driver.h"
#include "UWater_rtcc_driver.h"
#pragma pack(1) //1字节对齐

/**
硬件版本号命名规则:最高位表示是否带温度板

软件版本号命名规则:高4位表示地区
bit31    bit30    bit29    bit28    
         [地区:深水3-江水4----]  		 
**/
#define BOOTLOADER_VERSION  0x3030314E   //远程升级版本号（N1.00ASCALL
#define FM_HEAD_MARK        0x68                    //帧头
#define MET_TYPE            0x10                    //表计类型 0x10：水表
#define MET_TYPE_TCP        0x20                    //表计类型 
#define MET_TYPE_SY         0x02                    //表计类型 沈阳规约定义为规约版本为02H 20211025
#define FM_END_MARK         0x16                    //帧尾
#define MAX_NB              500                     //NB接收数据缓冲区最大值
#define FM_MAX_BUF_NUM      500                     //发送缓冲区最大值

/*流量系数部分2020-07-08*/
//流量系数部分宏定义
#define FLOW_COEFFICIENT_BUF_NUM      18  //流量系数的个数
#define LOW_TYPE        0x77
#define MIDDLE_TYPE     0x88
#define LARGE_TYPE      0x99
#define ALL_TYPE        0xAA
#define FLOW_COEFFICIENT_MAX  72089
#define FLOW_COEFFICIENT_MIN  58982
//第一次上电标志
#define FIRST_POWER_ON_FLAG  0X55




#define EEP_FRAME_BASE_ADDR                     0x00
#define EEP_FRAME_FIRST_POWER_ADDR              (EEP_FRAME_BASE_ADDR + 0)                     //1byte     //第一次上电标志地址
#define EEP_FRAME_STARTUSING_ADDR               (EEP_FRAME_FIRST_POWER_ADDR + 1)              //1byte     //出厂启用标志1字节
#define FRAME_NBIot_FREQVAL		                (EEP_FRAME_STARTUSING_ADDR  + 1)	            //设置上报频率5字节  add by wm 2017.07.19
#define FRAME_NBIot_IP                          (FRAME_NBIot_FREQVAL+5)                       //设置ip 4字节 
#define FRAME_NBIot_PORT                        (FRAME_NBIot_IP+4)                            //设置端口 2字节 
#define FRAME_NBIot_REPORTSTART                 (FRAME_NBIot_PORT+2)                          //设置周期上报起始时间 6字节 
#define FRAME_NBIot_REPORTEND                   (FRAME_NBIot_REPORTSTART+6)                   //设置周期上报结束时间 6字节 
#define FRAME_NBIot_LENGTH                      (FRAME_NBIot_REPORTEND+6)                     //设置周期上报最小估值长度2字节
#define EEP_RETRY_TIMES_ADDR                    (FRAME_NBIot_LENGTH + 2)                      //重试次数1字节
#define FRAME_NBIot_STARTTIME                   (EEP_RETRY_TIMES_ADDR+1)                      //设置密集上报时间 9字节
#define FRAME_NBIot_HIGHFLOW                    (FRAME_NBIot_STARTTIME+9)                     //设置最大流量报警阈值 4字节
#define FRAME_VALVE_PRA                         (FRAME_NBIot_HIGHFLOW+4)                      //阀控相关参数 4字节
#define FRAME_VALVE_EMERGENCY_FLOW              (FRAME_VALVE_PRA +4)                          //应急开阀用水量设置  2字节
#define FRAME_NBIot_fre                         (FRAME_VALVE_EMERGENCY_FLOW+2)                //频点2个字节
#define FRAME_NBIot_APN                         (FRAME_NBIot_fre+2)                           //APN 20字节
#define FRAME_NBIot_KEY                         (FRAME_NBIot_APN+20)                          //普通密钥, 16字节
#define EEP_FRAME_MAC_ADDR                      (FRAME_NBIot_KEY + 16)                        //7bytes    //物理地址首地址
#define EEP_FRAME_SER_NUM_ADDR                  (EEP_FRAME_MAC_ADDR + 7)                      //7bytes    //序列号首地址
#define EEP_FRAME_MET_ADDR                      (EEP_FRAME_SER_NUM_ADDR + 7)                  //7bytes    //通讯地址首地址
#define EEP_FRAME_SOLIDIFY_MAC_ADDR             (EEP_FRAME_MET_ADDR + 7)                      //1byte     //固化物理地址标志地址
#define EEP_FRAME_BOOTLOADER_INFO_ADDR          (EEP_FRAME_SOLIDIFY_MAC_ADDR + 1)             //5bytes    //远程升级信息首地址
#define EEP_FRAME_ENABLE_BAK_KEY_ADDR           (EEP_FRAME_BOOTLOADER_INFO_ADDR + 5)          //1bytes    //启用备份密钥标志地址
#define EEP_FRAME_LAST_KEY_NUM                  (EEP_FRAME_ENABLE_BAK_KEY_ADDR + 1)           //1byte     //最新num，即下次通讯密钥num
#define EEP_FRAME_TEMPERATURE_COEFFICIENT_ADDR  (EEP_FRAME_LAST_KEY_NUM + 1)                  //8bytes    //温度系数首地址
#define EEP_FRAME_FLOW_COEFFICIENT_ADDR         (EEP_FRAME_TEMPERATURE_COEFFICIENT_ADDR + 8)  //24bytes   //流量系数首地址
#define EEP_FRAME_VERIFICATION_FUNCTION_ADDR    (EEP_FRAME_FLOW_COEFFICIENT_ADDR + 24)        //1byte     //启用检定功能地址
#define EEP_FRAME_INFRARED_FUNCTION_ADDR        (EEP_FRAME_VERIFICATION_FUNCTION_ADDR + 1)    //1byte     //启用红外功能地址
#define EEP_FRAME_FUNCCFGBYTES_ADDR             (EEP_FRAME_INFRARED_FUNCTION_ADDR + 1)        //32bytes   //配置字节 
#define EEP_FRAME_START_FLOW_ADDR               (EEP_FRAME_FUNCCFGBYTES_ADDR + 32)            //2byte     //使动流量2字节---20191111改善项目
#define EEP_FRAME_COUNTER_CURRENT_FLOW_ADDR     (EEP_FRAME_START_FLOW_ADDR + 2)               //2byte     //逆流开关2字节---20191111改善项目
#define EEP_FRAME_SAMPLING_FREQUENCY_ADDR       (EEP_FRAME_COUNTER_CURRENT_FLOW_ADDR + 2)     //1byte     //采样频率1字节---20191113改善项目
#define EEP_FRAME_SAMPLING_BUF_LEN_ADDR         (EEP_FRAME_SAMPLING_FREQUENCY_ADDR + 1)       //1byte     //采样缓冲区大小1字节---20191113改善项目
#define EEP_FRAME_STORAGE_FREQUENCY             (EEP_FRAME_SAMPLING_BUF_LEN_ADDR + 1)         //1byte     //密集存储间隔(0:30s,1:1min,2:2min,3:3min...)
#define EEP_FRAME_JX_SAMPLING_FREQUENCY_ADDR    (EEP_FRAME_STORAGE_FREQUENCY + 1)             //2byte     //江西规约采样频率(byte1,最低采样频率;byte2,最高采样频率)
#define EEP_FRAME_JX_PSM_PWDOWN_ADDR            (EEP_FRAME_JX_SAMPLING_FREQUENCY_ADDR +2)     //1byte     //江西规约NB模组PSM或断电模式选择(0,psm;1,power down)
#define EEP_FRAME_NB_PARA_ADDR                  (EEP_FRAME_JX_PSM_PWDOWN_ADDR + 1)            //4byte     //设置NB重试间隔时间和符网等待时间
#define FRAME_NBIot_BUBAO_FLAG                  (EEP_FRAME_NB_PARA_ADDR+4)                    //6byte //记录需要补包的数据“条数”，一个位对应一个数据包;以及读写历史数据指针 6字节 
#define FRMAE_REMAIN_EMERGENCY_FLOW             (FRAME_NBIot_BUBAO_FLAG+6)                    //4byte 剩余应急用水量
#define EEP_BLE_PARA_VOLTAGE                    (FRMAE_REMAIN_EMERGENCY_FLOW+4)               //4byte 欠压阈值4字节
#define EEP_FRMAE_BATTERY_ENERGY                (EEP_BLE_PARA_VOLTAGE+4)                      //18byte 电池电量参数 


////以上要和 FRAME_MET_INFO 对应起来

#define EEP_GP30_BASE_ADDR                   0X100
/*#define	DIFTOF_CALIBRATION_FLAG_ADDR			  0X150 //2021,04,增加换能器零流量校准标志，如果是0xA1B2C3D4E5F6A7B8表示校准过
#define	DIFTOF_CALIBRATION_VALUE_ADDR			  DIFTOF_CALIBRATION_FLAG_ADDR +8 //2021,04,增加换能器零流量校准值4字节*/
#define EEP_RTCC_APP_USE_ADDR                0X180

#define FRAME_FLOW_COEFFICIENT_ADDR       	 0x200               //多项式建模系数五条曲线共5*11*4字节

#define EEP_BOOTLOAD_START              0X300
#define EEP_MCU_TYPE                    EEP_BOOTLOAD_START  //mcu平台类型
#define EEP_MCU_MODEL                   (EEP_MCU_TYPE+1)            //mcu型号,1 字节   
#define EEP_PRODUCT_MODEL               (EEP_MCU_MODEL+1)           //产品型号,1字节 
#define EEP_HARDWARE_VERSION            (EEP_PRODUCT_MODEL+1)       //硬件版本,1字节 
#define EEP_SOFT_VERSION                (EEP_HARDWARE_VERSION+1)    //软件版本,4字节 
#define EEP_UPDATE_NUM                  (EEP_SOFT_VERSION+4)        //升级总字节数,4字节 
#define EEP_UPDATE_CHECK                (EEP_UPDATE_NUM+4)          //升级校验码,2字节 
#define EEP_UPDATE_VER                  (EEP_UPDATE_CHECK+2)        //升级版本,2字节 
#define EEP_UPDATE_FLAG                 (EEP_UPDATE_VER+2)          //是否升级标志,1字节 
#define EEP_UPDATE_SOURSE               (EEP_UPDATE_FLAG+1)         //升级来源,1字节 
#define EEP_UPDATE_PKNUM                (EEP_UPDATE_SOURSE+1)       //包号,2字节 
#define EEP_UPDATE_RSSI                 (EEP_UPDATE_PKNUM+2)        //信号强度,1字节 
#define EEP_UPDATE_UDP_IP               (EEP_UPDATE_RSSI+1)         //4bytes,UDP升级IP地址
#define EEP_UPDATE_UDP_PORT             (EEP_UPDATE_UDP_IP+4)       //2bytes,UDP升级端口号

#define EEP_BASE_VALVE                  (EEP_BOOTLOAD_START+40)    //阀门控制,2字节 20180903

#define FRAME_FLOW_LOW_COEFFICIENT_ADDR            0x340 //72字节,流量系数基地址  2020-07-08
#define FRAME_FLOW_MIDDLE_COEFFICIENT_ADDR         (FRAME_FLOW_LOW_COEFFICIENT_ADDR + 24)//流量系数LOW地址向后偏移24个字节用于存储20~35℃数值
#define FRAME_FLOW_HIGH_COEFFICIENT_ADDR           (FRAME_FLOW_MIDDLE_COEFFICIENT_ADDR + 24)//流量系数MIDDLE地址向后偏移24个字节用于存储35℃及以上数值

#define EEP_RTCC_APP_HISTORY_ADDR            0x440  //0x440~0x823
#define EEP_SOE_ADDR                        0x1000 //SOE存储基地址

#define FRAME_NBIot_HISTORY_READ_ADD            0x2000 //存储历史数据基地址  
#define FRAME_QUANZHOU_STORE_ADD                0x4000 //泉州项目数据存储地址
#define FRAME_SHENYANG_STORE_ADD                0x7300 //沈阳项目数据存储地址

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//多项式建模部分宏定义
#define MULT_COEFFICIENT_BUF_NUM      	55				//多项式建模系数的个数
#define COEFFICIENT_MAX      			(float)1000 				//多项式建模系数的合法最大值
#define COEFFICIENT_MIN      			(float)-1000 				//多项式建模系数的合法最小值


typedef union 
{
	UNION_4U8TOU32 float_storage_format;
	float float_datas;
} UNION_FLOAT_STORAGE;


typedef union
{
	uint8_t value[4];
	uint32_t value_u32;
	float  flt;
} TYP_FLOW_COEFFICIENT;

typedef union {
	struct 
	{
		u8  type;     //天数/月份区分位，无符号整数（HEX）。0：表示按天来发送1：表示按月来发送
		u8  period;   //无符号整数（HEX）。周期值，如果配置为按天传，则该字段表示几天。如果配置为按月传，则该字段表示每月的几号
		bcd hour;     //上传时间，BCD码，表示时。
		bcd minute;   //上传时间，BCD码，表示分。
		bcd second;
	}s;
    u8 buf[5];
} Time_upload;//定时上传参数

typedef union
{
	struct
	{
		u8 valve_state;          			//阀门状态
		u8 valve_err;        				//阀门异常
		u8 valve_total_time;				//最大控阀时间
		u8 valve_AD;						//堵转AD值
	};
	u8 byte[4];
} IES_VALVE_PARAS;	//阀控参数

typedef union
{
	struct
	{
		u8 valve_up_times_pre;       		//规约设定的频率-关阀上报
		u8 valve_up_times_total;     		//规约设定的次数-关阀上报
		u8 valve_up_times_realtime;   		//实时上报的次数-关阀上报
		u8 valve_auto_check;				//每月阀门自检功能是否开启，AA表示开启
		u8 reserv;//预留字节
	};
	u8 byte[5];
} IES_VALVE_UP_TIMES;						//关阀后，上报参数

extern TYP_FLOW_COEFFICIENT  cal_coefficient[MULT_COEFFICIENT_BUF_NUM];
extern const float default_coefficient[MULT_COEFFICIENT_BUF_NUM];
extern UNION_4U8TOU32  cal_flow_coefficient[FLOW_COEFFICIENT_BUF_NUM];//多项式流量系数
extern const u32 default_flow_coefficient[FLOW_COEFFICIENT_BUF_NUM];//

typedef struct 
{
	u8 ble_tx_power; 
	u8 ble_adv_fre; 
	u8 ble_con_para; 
	u8 ble_scan_times;
	u8 password_enable;
} BLE_FUNC_SW; 
typedef struct
{
	mtype32_ total_use_sum_times_sec;
	mtype32_ bat_surplus;
	mtype32_ use_sum_times_sec;
	mtype32_ nb_use_sum_times_sec;
	u16 nb_upload_happen_num;
	u16 valve_use_sum_times_sec;
	float ee_remain_para_energy_life;
}STR_RUN_INFO;

typedef struct 
{
	u8 first_power_flg;              //第一次上电标志---------------------1
	u8 start_using_flg;              //出厂启用标志-----------------------1	
	Time_upload Time_upload_2006; //定时上传参数//上报频率5--------------------------5第无字节秒不用			        
	u8 server_ip[4];		             //ip地址4----------------------------4
	UNION_2U8TOU16 server_port;		   //端口号2----------------------------2
	u8 report_period_start[6];	     //周期上报起始时间，月日时？6----------6
	u8 report_period_end[6];	       //周期上报结束时间，月日时？6----------6
	UNION_2U8TOU16 report_step_len; //UNION_2U8TOU16 report_step_len;//周期上报最小估长值2-----------------2// 错峰间隔时间 单位秒，范围15~43.定时上传错峰方案：定时上传时间 + 表号后3位 ×错峰时间间隔 + 60秒。	    
	u8 report_retry_times;        //u8 report_retry_times;		  //重试次数	1  		--------------------1
	u8 report_start_time[9];	       //密集上报开始时间，月日时?9-----------9
	UNION_4U8TOU32 high_flow_alarm;	 //大流量报警门限值4-------------------4
	IES_VALVE_PARAS ies_valve_paras;//阀控参数 u8 ss_bak[6];//预留6个字节------------------------4
	UNION_2U8TOU16 ies_pulse_emergency; //应急用水量----------------------2
	UNION_2U8TOU16 report_fre;       //频点2-------------------------------2
	u8 apn[20];			                  //APN,	20	------------------------20
	u8 key[16];                       //普通密钥---------------------------16
	u8 mac_addr[7];                   //物理地址----------------------------7                   
	u8 ser_num[7];                    //序列号------------------------------7                     
	u8 met_addr[7];                   //通讯地址----------------------------7  
	u8 solidify_mac_addr_flg;         //固化物理地址标识---------------------1 
	IES_VALVE_UP_TIMES ies_valve_up_times;//关阀后，上报参数-----------------5 
	u8 enable_bak_key;                //启用备份密钥--------------------------1
	u8 last_key_num;                  //下次通讯的密钥num---------------------1 
	UNION_4U8TOU32 temperature_coefficient0; //温度系数0---------------------4 
	UNION_4U8TOU32 temperature_coefficient1; //温度系数1---------------------4
	UNION_4U8TOU32 flow_coefficient_small; //小流量系数----------------------4//0x00010000
	UNION_4U8TOU32 flow_coefficient_middle0; //中流量系数0-------------------4//0x00010000
	UNION_4U8TOU32 flow_coefficient_middle1; //中流量系数1-------------------4//0x00010000
	UNION_4U8TOU32 flow_coefficient_middle2; //中流量系数2-------------------4//0x00010000
	UNION_4U8TOU32 flow_coefficient_middle3; //中流量系数3-------------------4//0x00010000    //20161021
	UNION_4U8TOU32 flow_coefficient_large; //大流量系数----------------------4//0x00010000
	u8 enable_verification_function; //启用检定功能--------------------------1//0x5A
	u8 enable_infrared_function; //启用红外功能------------------------------1//0x5A		
	u8 func_cfg_bytes[32];      //功能配置字节------------------------------32
	//改善项目-20191108-增加始动流量和逆向流量开关，共4字节，
	UNION_2U8TOU16 start_flow;//使动流量2字节--------------------------------2
	UNION_2U8TOU16 counter_current_flow; //逆向流量开关----------------------2
	u8 sampling_frequency; //采样频率----------------------------------------1                              
	u8 buf_length; // BUFF--------------------------------------------------1
	u8 storage_frequency;//密集存储间隔--------------------------------------1 
	u8 jx_sampling_frequency[2];//江西规约采样频率---------------------------2
	u8 jx_psm_pwdown;//江西规约NB模组PSM或断电模式选择------------------------1
	UNION_2U8TOU16 Upload_again_interval_time;//UNION_2U8TOU16 nb_para_retry_delay;           //重试时间
	UNION_2U8TOU16 nb_para_login_ask_times;   //增加附网时长(查询cereg次数)
	UNION_4U8TOU32 Supplemental_send_flag;           //补包标志记录，每天的周期上报不成功则记录一个bit最多补包30天记录。   
    u8 histroy_r;//历史数据的读指针 历史数据存储指针   
    u8 histroy_w;//历史数据的写指针 补包用数据指针
	UNION_4U8TOU32 ies_pulse_remain; //应急用水量应达到的值，4	
	u8 voltage_low[4];//欠压阈值
	STR_RUN_INFO run_information_object;
}FRAME_MET_INFO;

typedef struct 
{
	union 
	{
		struct 
		{
			u8 transducer_aging : 1; //换能器老化
			u8 flow_err : 1; //当前流量>Q4或者<Q1					
			u8 rtcc_time_err : 1; //RTCC时间异常
			u8 nbsend_err : 1; //GPxx异常
			u8 nbrec_err  :1;
			u8 water_overheating : 1; //水温超出温度等级范围
			u8 gp22_commun_fail:1;//GP22通信失败
			u8 nouse1 : 1;
		} stat0bits;
		u8 stat0;
	};
	union 
	{
		struct 
		{
			u8 reverse : 1; //倒转
			u8 low_flow_rate : 1; //超低流量报警
			u8 none_water : 1; //管道无水
			u8 diftof_calibration_switch : 1; //零流量校准开关标志
			u8 transducer_check_abnormal : 1; //换能器可能存在异常的标志
			u8 low_battery_voltage : 1; //电池欠压
			u8 valve_state : 2; //阀门状态
		} stat1bits;
		u8 stat1;
	};
	union 
	{
		struct 
		{
			u8 met_type: 1;//表计类型（1超声波、0普通）
			u8 nouse : 7;
		} stat2bits;
		u8 stat2;
	};
	union 
	{
		struct 
		{
			u8 met_type : 1; 													
			u8 nbrec_err  :1;			
			u8 gp22_commun_fail:1;//GP22通信失败
			u8 rtcc_time_err : 1; //RTCC时间异常
			u8 nbsend_err : 1; //GPxx异常
			u8 water_overheating : 1; //水温超出温度等级范围
			u8 flow_err : 1; //当前流量>Q4或者<Q1	
			u8 transducer_aging : 1;//换能器老化
		} stat3bits;
		u8 stat3;
	};
	union 
	{
		struct 
		{
			u8 nouse : 8;
		} stat4bits;
		u8 stat4;
	};
} MET_STATE; //状态字
typedef struct 
{
	union 
	{
		struct 
		{
			u8 reverse : 1; //倒转
			u8 low_flow_rate : 1; //超低流量报警
			u8 valve_state : 2; //阀门状态
			u8 remain_warning:1;//余量报警
			u8 release : 2; //空闲
			u8 ntc_state:1; //NTC异常标志
		} statTcp1bits;
		u8 statTCP1;
	};
	union 
	{
		struct 
		{
			u8 remain_state : 1; //余量为负数
			u8 low_power : 1; //电池欠压报警
			u8 release : 2; //空闲
			u8 amplitude : 4;//换能器幅值档位
		} statTcp2bits;
		u8 statTCP2;
	};
} TCP_STATE; //状态字
	
 typedef union            //强制转化为浮点变量
{
    u32   gp22_u32;
    float gp22_float;
} Fram_To_Float;
typedef struct 
{
	u8 data_sourse; //信息源（0：uart ； 1：rf）
	u8 enc_reply_flg; //加密应答标志，置1有效
	u8 enc_tmp_addr[7]; //请求帧加密地址暂存，用于应答。
	u8 rev_key_num; //上位机给的num值
} STRUCT_FLAG; //内部标志位
/************************************************规约消息管理相关**********************************/
typedef struct 
{
	u8 set_verification_msg; //进检定0
	u8 clear_realtime_data_msg; //清实时数据1
	u8 clear_work_time_msg; //清累计工作时间2
	u8 bootloader_msg; //远程升级3
	u8 measure_hydrostatic_jet_lag_msg; //测净水时差4----------没用
	u8 clear_history_data_msg; //清历史数据5
	u8 channel_change_msg; //信道切换6-------------------------没用
	u8 start_188fm_route_msg;//188规约发起递传7----------------没用
	u8 change_link_addr_msg;    //更新链路地址8----------------没用
	u8 change_route_mettype_msg;    //表类型变9----------------没用
	u8 check_active_time_msg;   //需要立即查活跃期msg（上电或者递传时间、抄表时段变）10
	u8 calibrate_time_rfapp_msg;  //校时msg（用于rtapp复位状态、标志）11
	u8 calibrate_rtc_msg;           //RTC校准msg 12
	u8 valve_ctrl_msg;          //阀控msg  13------------------没用
	u8 static_measure_init_msg; //静水测量初始化msg 14----------没用
	u8 low_power_msg;           //表计低功耗msg  15
	u8 out_verification_msg;    //出检定msg  16
	u8 lcd_display_all_msg;    //全显  17
	u8 initial_data_msg;     //下初值标志 18
	u8 model_change_msg;//切换逆流计量使用 19
	u8 valve_open_msg;//开阀20
	u8 valve_close_msg;//关阀21
	u8 valve_half_msg;//半开阀22
	//NB上报相关的
	u8 msg_nb_UploadFreqChange;//上报频率改变
	u8 msg_nb_IpPort_change;//IP Port改变  
	u8 msg_nb_StartEnd_change;//周期上报起始和结束时间改变
	u8 msg_nb_StepLength_change;//估长值改变
	u8 msg_nb_RetryTimes_change;//重试次数改变
	u8 msg_nb_IntensiveTime;//密集上报
	u8 msg_nb_FlowAlarm;//报警阈值
	u8 msg_nb_UartSend;//串口发起上传
	u8 msg_nb_SoftUpdate;//软件升级消息
	u8 msg_nb_Apn_change;//APN更改
	u8 msg_updatesoft_version_ok;//判断升级版本号正确
	u8 msg_rtcc_adjust_time;//RTC校时消息
	u8 msg_nb_upload_ack_ok;//NB上传应答成功
	u8 msg_nb_uoload_faild;//NB上传失败
    u8 msg_caliberate;//表计单程时间校准标志
} STRUCT_MSG; //对外msg

typedef enum
{
    SetVerificationMsg = 0, //进检定0
	ClearRealtimeDataMsg = 1,   //清实时数据1 
	ClearWorkTimeMsg = 2,       //清累计工作时间2
	BootloaderMsg = 3,          //远程升级3 
	MeasureHydrostaticJetLagMsg = 4, //测净水时差4
	ClearHistoryDataMsg = 5,//清历史数据5 
	ChannelChangeMsg = 6,//信道切换6  
	Start188FmRouteMsg = 7,//188规约发起递传7 
	ChangeLinkAddrMsg = 8,//更新链路地址8
	ChangeRouteMettypeMsg = 9,//表类型变9 
	CalibrateRtcMsg = 12,//RTC校准msg 12
	ValveCtrlMsg = 13,//阀控msg  13
	StaticMeasureInitMsg = 14,//静水测量初始化msg 14
	LowPowerMsg = 15,//表计低功耗msg  15 
	OutVerificationMsg = 16,//出检定msg  16   
	LcdDisplayAllMsg = 17,//全显  17  
	InitialDataMsg = 18,//下初值标志 18  
	ModelChangeMsg = 19,//切换逆流计量使用 19 
	ValveOpenMsg = 20,//开阀20 
	ValveCloseMsg= 21,//关阀21
	ValveHalfMsg = 22,//半开阀22
	//NB上报相关的
	MsgNbUploadFreqChange=23,//上传数据
	MsgNbIpPortChange=24,//IP Port改变
	MsgNbStartEndChange=25,//周期上报起始和结束时间改变
	MsgNbStepLengthChange=26,//估长值改变
	MsgNbRetryTimesChange=27,//重试次数改变
	MsgNbIntensiveTime=28,//密集上报
	MsgNbFlowAlarm=29,//报警阈值
	MsgNbUartSend=30,//串口发起上传
	MsgNbSoftUpdate=31,//软件升级消息
	MsgNbApnChange=32,//APN更改
	MsgUpdateSoftVersionCheckOk=33,//判断升级版本号正确
	MsgRtccAdjustTime=34,//RTC校时消息
	MsgNbUplaod_AckOk=35,//NB上传应答成功
	MsgNbUploadFailed=36,//NB上传失败
	MsgNbUploadRetryMsg=37,//NB上传开始
	MsgSaveHisIndex=38,//保存读写指针
	MsgSaveBubaoFlag=39,//保存补报标志 
	MsgClearNbDebugFlag=40,//关闭红外打印
	MsgOpenIr=41,//打开红外通信
	MsgRtccEvenHour=42,//偶数整点时间到
	MsgValve_EmergencyFlowStore=43,//应急用水量保存消息
	MsgTouchKeyReset = 44,
	MsgNbUplaod_AckLoginOk=45,//NB上传应答成功
	MsgCaliberate = 46,//表计单程时间校准标志
	///////////////////泉州
	MsgQuanzhou_DailySave=47,//日冻结数据存储消息
	MsgQuanzhou_MonthSave=48,//月冻结数据存储消息
	///////////////////长沙
	MsgChangcha_ValveUploadCnts=49,//关阀上报次数增加消息
	MsgTchKey_ClearKeyLimit=50,//清除触摸按键次数消息
	//////////////////阀门状态切换时发起上报
	MsgNbUploadByValveStateChange = 51,
	MsgNb_SaveHis=52,//记录补报消息
	MsgNbUpload_OffLine = 53,//立即下线
	MsgValveCloseSaveFlow = 54,//关阀到位保持当前流量
	MsgValveCloseSuccess  = 55,//关阀到位
	MsgValveOpenSuccess  =56,//开阀到位
	//////////////////沈阳
	MsgShenYang_DailySave=57,//日冻结数据存储
	MsgShenYang_MonthSave=58,//月冻结数据存储
	MsgShenYang_YearSave=59,//年冻结数据存储
	MsgShenYang_CircleSave=60,//周期数据存储
	MsgShenYang_FrozenClear=61,//冻结数据清除
	MsgShenYang_CircleClear=62,//周期数据清除
	MsgShenYang_WarningClear=63,//报警数据清除
	MsgShenYang_FactorySettingAndReset=64,//恢复出厂设置并重启
	MsgShenYang_SysReset=65,
	MsgShenYang_WarningCheck=66,//检查报警状态
	MsgShenYang_WarningStoreReset=67,
	MsgShenYang_NbUploadWarning = 68,//报警触发上报
	MsgShenYang_NbUploadWarningWithCircle = 69,//报警随周期数据上报
	MsgShenYang_NbUplaod_AckOk=70,//NB上传应答成功
	MsgShenYang_UdpIpPortChange=71,//UDP IP Port改变
	/////////////////////////
	MsgNb_FlagRcvNbFrame=72,//收到指令
	MsgSS_JianGeStore=73,//间隔流量存储
	Msg_FrozenStore=74,//间隔流量存储
	Msg_ClearHisOther=75,//清表数据给其他规约消息
	Msg_ValveOpenEmergency=76,//按键应急开阀
	Msg_WdtReset=77,//看门狗复位消息
	Msg_Por5VReset=78,//欠压或硬复位
	MsgSS_HisIndexStore=79,//冻结数据指针存储
	MsgBLE_AdvChange=80,//广播数据修改
	MsgBLE_ReadData=81,//抄读表数据消息
	MsgBLE_RevData=82,//收到指令消息
	MsgAddr_Change=83,//表地址变化
	MsgBLE_ConfigChange=84,//蓝牙上电初始化
	MsgBLE_Clktrim=85,//时钟校准
	MsgBLE_OtaEnter=86,//进入OTA升级
	MsgBLE_OtaExit=87,//退出OTA升级
	Msg_PsmPowerCheck=88,//PSM电源检查
	Msg_FactoryUpload=89,//厂区上报消息
	Msg_FactoryBleActive=90,//厂区唤醒蓝牙
	
	Msg_AllCount=91
} Frame_MsgTypeDef;

#define FRAME_MSG_TYPE_CNT  Msg_AllCount

typedef union 
{
    STRUCT_MSG MsgStruct;
    u8 MsgBuf[FRAME_MSG_TYPE_CNT];
} UNION_MSG;  

void FrameSetMsgApp(Frame_MsgTypeDef msgType);
u8 FrameCheckMsgApp(Frame_MsgTypeDef msgType);
u8 FrameClearMsgApp(Frame_MsgTypeDef msgType);
/***************************************************************************************************/
/************************************************规约参数管理相关**********************************/
typedef enum
{
  FramePara_DNx = 0, //管段口径
	FramePara_Tc0 = 1, //温度系数0
	FramePara_Tc1 = 2, //温度系数1
	FramePara_FcSmall = 3, //流量系数small
	FramePara_FcMiddle0 = 4, //流量系数Middle0
	FramePara_FcMiddle1 = 5, //流量系数Middle1
	FramePara_FcMiddle2 = 6, //流量系数Middle2
	FramePara_FcLarge = 7, //流量系数Large
	FramePara_ReportStartDMY = 8, //密集上报开始时间日月年bcd
	FramePara_ReportStartSMH = 9, //密集上报开始时间秒分时bcd
	FramePara_ProgVersion = 10,      //软件版本号
	FramePara_MetAddr0_3 = 11, //通信地址低4字节
	FramePara_MetAddr4 = 12, //通信地址高1字节
	FramePara_FuncCfg0_3 = 13,//功能控制字
	FramePara_FuncCfg4_7 = 14,//功能控制字
	FramePara_FuncCfg8_11 = 15,//功能控制字
	FramePara_FuncCfg12_15 = 16,//功能控制字
	FramePara_ReportEndSMH = 17,//密集上报结束时间日月年bcd
	FramePara_FcMiddle3 = 18, //流量系数Middle3
	FramePara_Sta1_2 = 21,//状态字
	FramePara_CCFlow = 22,//逆流开关
	FramePara_StartFlow = 23,//始动流量
	FramePara_GP30Freq = 24,//采样频率
	FramePara_GP30BufLen = 25,//采样缓存字节数
	FramePara_ReportFreq = 30,//上报频率
	FramePara_EnableTestFunc = 31,//检定功能开关
	FramePara_EnableInfrareFunc = 32,//红外功能开关
	FramePara_StartUsingFunc = 33,//出厂启用
	FramePara_StoreFrequency = 34,//密集存储间隔时间
	FramePara_SamplingFrequency = 35,//江西规约采样频率
    FramePara_PsmOrPwDown = 36, //江西规约NB模组PSM或断电模式选择	
	FramePara_NbParaRetryDelay = 37, //NB模组上报重试时间和符网等待时间参数配置
	FramePara_NbParaLoginAckTimes=38,
	FramePara_BootVersion = 39,//boot版本号
	//
	FramePara_End = 40
} Frame_CheckParaTypeDef;
#define FRAME_PARA_BUF_LEN  (FramePara_End+1)
u32 FrameCheckParaApp(Frame_CheckParaTypeDef parameter);
void Frame_Para_Init(void);
/***************************************************************************************************/
typedef struct
{        
    u8 en_code;//是否加密，1为加密
    u8 add_num;//加密补位的数字
    u16 data_len;//收到的数据区的长度
}ENCODE_VERIFY;

typedef struct
{
	u8 mcu;                //平台类型
	u8 mcu_model;          //MCU型号
	u8 product_model;      //产品型号
	u8 hardware_version;   //硬件版本号
	u8 soft_version[4];    //软件版本号
	UNION_4U8TOU32 update_num;        //升级总字节数
	UNION_2U8TOU16 update_check;      //升级校验码
	UNION_2U8TOU16 bootloader_ver;//升级版本
	u8 bootloader_update_flg;//是否升级标志
	u8 bootloader_datas_sourse;//升级来源//0x01--串口	0x02--GPRS	0x03--小无线
	UNION_2U8TOU16 bootloader_paknum;//包号 
	//以下不通过上位机发送
	//注意，boot判断到端口号在8081~8090之间，会自动启用UDP升级方式;规约设置IP地址时，判断到该范围，会保存到UDP IP的EE地址
	u8 bootloader_RSSI; //信号强度
	u8 server_ip[4];		           //udp升级，ip地址4
	UNION_2U8TOU16 server_port;		 //udp升级，端口号2
	//表计地址和以上信息在EE中不连续
	u8 bootloader_addr[7];//表计地址
}U_UPGRADE_INFO; //34字节

typedef struct
{
	u8 FirstPowerOnFlag;
	u8 ProductUpoadFailFlag;
	u8 ProductUploadFlag;
	BLE_FUNC_SW function_switch;//蓝牙功能开关
	u8 NBSleepMode;
	u8 LCD_NoTestFlag;
}U_TEMP_INFO; 

typedef struct
{
	u8 Point_SOE_write; //SOE记录指针
}U_SIGAL_DATA;

typedef union {

    struct {
        u8 first_flag; //第一次上电标志位
        u32 work_hour; //累计工作时间
        DateTime start_time_up; //出厂时间
        u16 day_history_addr;  //历史日数据存储指针
        u32 day_data;  //结算日累积流量
    }data;
    u8 byte[18];
} RTCC_EE_DATA; //RTCC永久性数据

typedef struct
{
	FRAME_MET_INFO P1;//系统参数缓存
	U_UPGRADE_INFO P2;//升级和UDP地址相关
	U_TEMP_INFO P3;//不存EE的全局参数
	U_SIGAL_DATA P4;
	RTCC_EE_DATA ee_data; 
	//GP30_DIFTOF_CAL_DATA P5;
} Data_object;//定义数据对象

//#define FLOW_ 0x2B1A

extern Data_object Sys_data_object;
//20211204
#if PF_TYPE_METER || EN_TYPE_METER || MID_TYPE_METER
extern float default_error_cruve[15][16];
#else
extern float default_error_cruve[12][16];
#endif 
extern float default_error_DXS[MULT_COEFFICIENT_BUF_NUM];

void FrameInitApp(void);
void FrameMachineApp(void);
//江西水务规约使用
void FrameSetSupplementalPack_Flag(u8 tempData);


u16 FrameCheckByte(void);
u8 FrameIfSleepApp(void);
MET_STATE FrameGetByte(void);
 u8 Save_histroy_ss_flag(u8 flag);
 u8 Clear_histroy_ss_flag(u8 ss_NO);
///////////////////////////////////		
u32 HexToBcd32(u32 value);
u32 Gp30DataToBcd(u32 data, u32 times);
/*************NB*************************/
TYP_FLOW_COEFFICIENT* ReadCofficientApp(void);
UNION_4U8TOU32* Read_Flow_CofficientApp(void);//2020-07-08 用来传递流量系数的首地址
u32 Read_Flow_CofficientApp_For_LCD(u8 index);//2020-08-13 //用来传输常温流量系数给A2屏幕
void fram_tools_writeU32ByBuf(u8 *pU32Buf, u8 *pSrc, u8 dir);
u8 frame_get_datasource(void);
void frame_set_key(void);

float Get_Temperature_Caliberate(void);//获取活塞台子校准温度
void SetCaliberateTemperature(u16 temp_value);//更新标准温度
u8 GetNbiotRevHandleOverFlag(void);
void UWMetPtlPackApp(void);

#define UP_DEAL_S0      0
#define UP_DEAL_S1      1
#define UP_DEAL_S2      2
#define UP_DEAL_S3      3
#define UP_DEAL_S4      4
#define UP_DEAL_S5      5
#define UP_DEAL_S6      6
#define UP_DEAL_S7      7
#define UP_DEAL_S8      8
#define UP_DEAL_S9      9
#define UP_DEAL_S10     10
#define UP_DEAL_S11     11
#define UP_DEAL_S12     12
#define UP_DEAL_S13     13
#define UP_DEAL_S14     14
#define UP_DEAL_S15     15
#define UP_DEAL_S16     16
#define UP_DEAL_S17     17
#define UP_DEAL_S18     18
#define UP_DEAL_S19     19
#define UP_DEAL_S20     20
#define UP_DEAL_S21     21
#define UP_DEAL_S30     30
#define UP_DEAL_S31     31
#define UP_DEAL_S32     32
#define UP_DEAL_S33     33

#define UP_DEAL_S_OVER  99

//解规约状态机
typedef enum{
	UW_MET_PTL_IDLE=0,        //空闲
	UW_MET_PTL_EXP,   	      //解规约，区分规约类型
	UW_MET_IES_PTL_PACK_S1,   //MBUS规约组应答帧
	UW_MET_MBUS_PTL_PACK_S1,  //积成NB规约组应答帧
	UW_MET_SHTCP_PTL_PACK_S1, //商河TCP规约组应答帧
	UW_MET_SYNB_PTL_PACK_S1, //沈阳NB规约组应答帧
	UW_MET_OTHER_PTL_PACK_S1,
	UW_MET_PTL_PACK_S2,  //根据通道发送数据
    UW_MET_PTL_PACK_S3,	//根据通道判断数据发送完成
}TYP_STATE_MET_PTL_PACK;

/*********************************************************缓存队列*********************/
#define QUEUE_BUF_SIZE    10     //缓存队列深度
typedef struct 
{
	u8 type;
    u16 length;
	u8 buffer[128];
} ONE_PACK_DATA;

typedef struct 
{
	u8 handled_count;
	u8 total_count;
	ONE_PACK_DATA queue[QUEUE_BUF_SIZE];
} NBIOT_REV_QUEUE;

//规约数据通道类型
#define UP_SOURCE_IR                0
#define UP_SOURCE_NB                1
#define UP_SOURCE_MBUS              2
#define UP_SOURCE_BLE               3
//规约类型
#define IES_PTL                     1
#define MBUS_PTL                    2
//#define SHTCP_PTL                   3
//#define SYNB_PTL                    4  
#define OTHER_PTL                   5 
//规约组帧状态
#define PTL_PACK_BUSY               0 
#define PTL_PACK_SUCCESS            1
#define PTL_PACK_FAIL               2

#ifdef	__cplusplus
}
#endif

#endif	/* GP30W_FRAME_APP_NEW_H */

