/*
*********************************************************************************************************
*                                       IAR Development Kits
*                                              on the
*
*                                    Nano130
*
* Filename      : def_data.h
* Version       : V1.00
* Programmer(s) : Qian Xianghong
*********************************************************************************************************
*/

#ifndef  USER_DEF_DATA_PRESENT
#define  USER_DEF_DATA_PRESENT

#include "type.h"

// 允许匿名结构
#pragma anon_unions
#pragma pack(push, 1)

// 电容版本用Pcap04测量
#define _USE_PCAP04_CHIP_

////////////////////////////////////////////////////////////////////////////////////////
// 以下版本定义必须且只能选择一个
//#define _PRAXAIR_TTS_VER_		// 普莱克斯
//#define _PRAXAIR_DOL_VER_		// 普莱克斯改造
//#define _YINGDE_TTS_VER_ 		// 盈德
//#define _YINGDE_DOL_VER_ 		// 盈德改造
//#define _LINDE_HTTPS_CHARGE_VER_	// 林德充电
//#define _LINDE_HTTPS_VER_			// 林德TTS
//#define _MESSER_TTS_VER_		// 梅塞尔
//#define _FAYEKONG_TTS_VER_	// 法液空
//#define _BAOGANG_TTS_VER_		// 宝钢
//#define _FUSHIKANG_TTS_VER_	// 富士康
//#define _ZHONGHAIYOU_BOX_VER_	// 中海油罐箱-PT1000-3线
//#define _BOX_500_2_VER_		// 罐箱-PT500-2线
//#define _BOX_1000_2_VER_		// 罐箱-PT1000-2线
//#define _BOX_1000_3_VER_		// 罐箱-PT1000-3线
//#define _CAOCHE_VER_			// 槽车
#define _LANSHI_TTS_VER_		// 兰石
//#define _CHATE_TTS_VER_		// 查特（散户）
////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////
// 以下定义不要修改，由上面选择的唯一版本决定
#if defined(_PRAXAIR_TTS_VER_) || defined(_PRAXAIR_DOL_VER_)
	#define _DISP_MMWC_ONLY_		// 只显示差压（mmWC）
	#define _PRAXAIR_SERVER_		// 普莱克斯服务器
#endif
#if defined(_LINDE_HTTPS_CHARGE_VER_) || defined(_LINDE_HTTPS_VER_)
	#define _DISP_MMWC_ONLY_		// 只显示差压（mmWC）
	#define _LINDE_SERVER_			// 林德服务器（https）
#endif
#if defined(_CHATE_TTS_VER_)
	#define _DISP_MMWC_ONLY_		// 只显示差压（mmWC）
#endif
#ifdef _FUSHIKANG_TTS_VER_
	#define _FUSHIKANG_SERVER_		// 富士康服务器
#endif
#ifdef _ZHONGHAIYOU_BOX_VER_
	#define _ZHONGHAIYOU_SERVER_	// 中海油服务器（mqtt）
#endif
#ifdef _LANSHI_TTS_VER_
	#define _LANSHI_SERVER_			// 兰石服务器
#endif
#if defined(_PRAXAIR_DOL_VER_) || defined(_YINGDE_DOL_VER_)
	#define _DOL_VER_				// 改造版
#endif
#if defined(_BOX_500_2_VER_) || defined(_BOX_1000_2_VER_) || defined(_BOX_1000_3_VER_) || defined(_ZHONGHAIYOU_BOX_VER_)
	#define _BOX_VER_				// 罐箱
	#define _CELL_LOCATION_			// 基站定位（在GPS定位失败的情况下）
#endif
#if !defined(_DOL_VER_) && !defined(_BOX_VER_) && !defined(_CAOCHE_VER_) && !defined(_LANSHI_CAOCHE_VER_) && !defined(_LANSHI_TTS_VER_) && !defined(_LINDE_HTTPS_CHARGE_VER_) && !defined(_CHATE_TTS_VER_)
	#define _LEVEL_SENSOR_ONLY_ 	// 只有差压传感器
#endif
#define _USE_PT100_SENSOR_		// 用PT100温度传感器（相对4~20mA温度传感器）
#ifdef _BOX_500_2_VER_
	#define _PT100_MULTI_	5		// 电阻放大倍数（PT100/PT500/PT1000)
#else
	#define _PT100_MULTI_	10		// 电阻放大倍数（PT100/PT500/PT1000)
#endif
#if defined(_USE_PT100_SENSOR_) && !defined(_BOX_500_2_VER_) && !defined(_BOX_1000_2_VER_)
	#define _PT100_3LINE_			// 三线制电阻测量
	#define _DIFF_RESIST_			// 差分测量电阻
#endif
#ifdef _CAOCHE_VER_
	#define _SEND_GPS_DATA_			// 发送轨迹数据
#endif
// MQTT/HTTPS/HTTP服务器列表
extern const char SERVER_URLs[][200];
////////////////////////////////////////////////////////////////////////////////////////

// 本机主板号
extern const uint8_t CONFIG_BOARD_SELF;

// 存储标识="LS"
#define CONFIG_MARK_LS 		(('S' << 8) | 'L')
// 产品标识="CY"
#define CONFIG_PRODUCT_CY	(('Y' << 8) | 'C')

// 初始化标识
#define CONFIG_FLAG_NOT_INITED	0
#define CONFIG_FLAG_INITED		1

// 主板标识
#define CONFIG_BOARD_SINGLE		0	// 一体式
#define CONFIG_BOARD_SAMPLE		1
#define CONFIG_BOARD_POWER		2
#define CONFIG_BOARD_DISPLAY	3
#define CONFIG_BOARD_BLUETOOTH	4

// 数据编码（DC）
#define CAN_DC_NONE					0
#define CAN_DC_BOTTLE_CONFIG		1
#define CAN_DC_SENSOR_CONFIG		2
#define CAN_DC_DATA_CONFIG			3
#define CAN_DC_DISPLAY_CONFIG		4
#define CAN_DC_SAMPLE_SYSINFO		5
#define CAN_DC_POWER_SYSINFO		6
#define CAN_DC_DISPLAY_SYSINFO		7
#define CAN_DC_BLUETOOTH_SYSINFO	8
#define	CAN_DC_DTU_DATA				9
#define	CAN_DC_SAMPLE_DATA			10
#define	CAN_DC_ADC_DATA				11

// 通知命令
#define CAN_NOTIFY_RESET		0
#define CAN_NOTIFY_UPGRADE		1
#define CAN_NOTIFY_UPDATE		2
#define CAN_NOTIFY_SLEEP		3
#define CAN_NOTIFY_PING			4
#define CAN_NOTIFY_SAMPLE		5

// 储罐类型
#define	BOTTLE_TYPE_STAND		0	// 立式
#define BOTTLE_TYPE_LYING		1	// 卧式
#define BOTTLE_TYPE_SPHERICAL	2	// 球型

#define SENSOR_STATUS_NORMAL	0x00	// 正常状态
#define SENSOR_STATUS_NOCONNECT	0x01	// BIT0
#define SENSOR_STATUS_UNDERFLOW	0x02	// BIT1
#define SENSOR_STATUS_OVERFLOW	0x04	// BIT2
#define SENSOR_STATUS_FULL		0x80	// BIT7

// 测量方式
#define MEASURE_DPRESS		0
#define MEASURE_WEIGHT		1

// 显示单位
#define DISP_UNIT_METRIC	0	// 公制单位
#define DISP_UNIT_ENGLISH	1	// 英制单位

// 显示模式
#define DISP_MODE_DPRESS	0	// 不显示容积和重量
#define DISP_MODE_ALL		1	// 显示容积和重量
#define DISP_MODE_L			2	// 显示容积, 不显示重量
#define DISP_MODE_KG		3	// 显示重量, 不显示容积

// 奇偶校验方式
#define PARITY_NONE			'n'
#define PARITY_SPACE		's'
#define PARITY_MARK			'm'
#define PARITY_ODD			'o'
#define PARITY_EVEN			'e'

// 运营商网络类型
#define NET_TYPE_2G		'2'
#define NET_TYPE_3G		'3'
#define NET_TYPE_4G		'4'
#define NET_TYPE_GPRS	'G'
#define NET_TYPE_CDMA	'C'
#define NET_TYPE_EDGE	'E'

// 真空传感器状态
#define VACUUM_STATUS_FAULT			0	// 故障
#define VACUUM_STATUS_OK			1	// 正常
#define VACUUM_STATUS_COMM_FAULT	255 // 通讯故障

// 泄露报警器状态
#define LEAK_STATUS_OK				0	// 正常
#define LEAK_STATUS_FAULT			1	// 故障
#define LEAK_STATUS_A1_ALARM		2	// 低限报警
#define LEAK_STATUS_A2_ALARM		3	// 高限报警
#define LEAK_STATUS_COMM_FAULT		255 // 通讯故障

// 泄漏报警器类型（按位掩码）
#define LEAK_TYPE_SWITCH			1	// 开关型
#define LEAK_TYPE_CURRENT			2	// 电流型
#define LEAK_TYPE_MODBUS			4	// Modubs总线型

// 服务器类型
#define SERVER_PROTOCOL_TCP			0	// TCP上传	
#define SERVER_PROTOCOL_MQTT		1	// MQTT上传
#define SERVER_PROTOCOL_HTTPS		2	// HTTPS上传
#define SERVER_PROTOCOL_HTTP		3	// HTTP上传
#define SERVER_PROTOCOL_TRAIN		4	// 铁路罐箱上传
#define SERVER_PROTOCOL_AOYANG		5	// 奥扬协议上传
#define SERVER_PROTOCOL_BRASIL		6	// 巴西协议上传
#define SERVER_PROTOCOL_FURUI		7	// 富瑞协议上传
#define SERVER_PROTOCOL_HUIDA		8	// 汇达协议上传
#define SERVER_PROTOCOL_CHAOYANG	9	// 重庆朝阳（正略公司）上传
#define SERVER_PROTOCOL_PAKISTAN	10	// 巴基斯坦上传

// 产品类别
#define PRODUCT_CLASS_LEVEL			0	// 液位计	
#define PRODUCT_CLASS_H2PRESS		1	// 氢压力

// 最大缓冲区大小
#define DATA_BUFF_SIZE	128

// 称重传感器参数
typedef struct
{
	uint32_t	lowRange;	// 下量程
	uint32_t	highRange;	// 上量程
	uint32_t	zeroValue;	// 校零值
	uint32_t	fullValue;	// 校满值
} weight_param_t;

// 差压/压力传感器参数
typedef struct
{
	uint16_t	lowRange;	// 下量程
	union
	{
		uint16_t	highRange;	// 上量程
		struct
		{
			unsigned highRangeX10 : 15;		// 放大了10倍的量程
			unsigned ishighRangeX10 : 1;	// 量程是否放大了10倍
		};
	};
	uint16_t	zeroValue;	// 校零值
	uint16_t	fullValue;	// 校满值
} press_param_t;

// 电容K值（校准变送器的测量系统），及传感器参数（底电容，满电容）
typedef struct
{
	uint16_t	c1ADC;		// 电容c1标定ADC值
	uint16_t	c2ADC;		// 电容c2标定ADC值
	uint16_t	baseC;		// 底电容(pF) * 10
	uint16_t	refC;		// 增长电容(pF) * 10
} capacity_param_t;

// 温度传感器参数
typedef struct
{
	int16_t		lowRange;	// 下量程
	int16_t		highRange;	// 上量程
	uint16_t	zeroValue;	// 校零值
	uint16_t	fullValue;	// 校满值
} tempr_param_t;

// PT100铂电阻温度传感器参数
typedef struct
{
	int16_t		calibrateT;		// 校准温度，放大10倍
	int16_t		calibrateR;		// 校准电阻，放大10倍
	uint16_t	zeroValue;		// 校零值（-200℃的ADC值）(PT100由校准值计算理论值）
	uint16_t	fullValue;		// 校满值（80℃的ADC值）  (PT100由校准值计算理论值）
} pt100_param_t;

// 真空计数据
typedef struct
{
	uint8_t		staVacuum;	// 真空计状态
	unsigned	: 8;
	uint16_t	lifeVacuum;	// 真空计使用年限
	float		vacuum;		// 真空度
	float		rateVacuum;	// 漏放气速率
	float		tempr;		// 温度
} vacuum_data_t;

// 泄露报警器数据
typedef struct // size = 4
{
	uint8_t		typeLeak;		// 泄露报警器类型
	uint8_t		staLeak;		// 泄露报警器状态
	uint16_t	concentrations;	// 气体浓度
} leak_data_t;

// 流量计数据
typedef struct // size = 22
{
	uint8_t		nM3[6];			// 标况体积总量（BCD码，放大100倍）
	uint8_t		nM3_h[4];		// 标况流量（BCD码，放大100倍）
	uint8_t		M3_h[4];		// 工况流量（BCD码，放大100倍）
	uint8_t		tempr[4];		// 温度（BCD码，放大100倍，第一字节为符号： 80H 为负，00H 为正）
	uint8_t		pressure[4];	// 压力（BCD码，放大100倍）
} flow_data_t;

typedef union
{
	uint8_t	status;
	struct
	{
		unsigned	notConnect : 1;	// 连接状态
		unsigned	underFlow : 1;	// 是否下溢出
		unsigned	overFlow : 1;	// 是否上溢出
		unsigned	: 4;
		unsigned	full : 1;		// 是否满
	};
} sensor_status_t;

// 版本号
typedef struct
{
	uint8_t	major;			// 主版本号
	uint8_t minor;			// 次版本号
} version_t;

// 日期
typedef struct
{
	uint8_t		year;
	uint8_t		month;
	uint8_t		day;
} date_t;

// 时间
typedef struct
{
	uint8_t		hour;
	uint8_t		minute;
	uint8_t		second;
} time_t;

// 日期时间
typedef struct
{
	uint8_t		year;
	uint8_t		month;
	uint8_t		day;
	uint8_t		hour;
	uint8_t		minute;
	uint8_t		second;
} date_time_t;

// 配置区头信息
typedef struct
{
	uint16_t	mark;		//="LS"，存储标识
	uint16_t	product;	//="CY"，产品标识
	uint8_t		DC;			// 数据编码
	unsigned	: 8;
	version_t	ver;		// 存储格式版本号
} config_header_t;

// 配置区1-储罐参数
typedef struct
{
	config_header_t header;	// 头信息
	uint16_t	serverVer;	// 服务器参数版本号
	uint8_t		updateFlag;	// 参数更新标志
	uint8_t		addr;		// 通信地址
	uint8_t		PSN[6];		// PSN
	uint8_t		type;		// 储罐类型
	uint8_t		source;		// 液源
	uint16_t	len;		// 圆柱体长度
	uint16_t	diameter;	// 内径
	uint16_t	lenExtra;	// 直边封头长度
	float		density[5];	// 各液源的比重, 单位g/cm3
	uint8_t		chargePct;	// 充装比
	uint8_t		measureType;// 测量方式
	uint16_t	fullPct;	// 满液位百分比
	uint16_t	priPct;		// 关键液位百分比
	uint16_t	orderPct;	// 订货液位百分比
	uint16_t	emptyPct;	// 空液位百分比
	uint32_t	planMount;	// 每日计划用量
	uint32_t	predictMount;	// 每日预测用量
	uint16_t	warnVolt;		// 电压报警低点: 10mV
	uint16_t	warnVoltH;		// 电压报警高点: 10mV
	uint16_t	warnPress;		// 压力报警低点: KPa
	uint16_t	warnPressH;		// 压力报警高点: KPa
	uint32_t	options;		// 参数开关
	uint32_t	ts;				// 参数时间戳
	unsigned	dispMode : 2;		// 显示模式
	unsigned	hideVacu : 1;		// 隐藏真空显示
	unsigned	: 5;
	unsigned : 8;				
	union // size = 6
	{
		struct // Praxair
		{
			uint16_t floorLevel;	// praxair: 液量报警下限
			uint16_t span;			// praxair: 液量变化报警门限
			uint16_t spanPeriod;	// praxair: 液量变化报警时间
		};
		struct // Others
		{
			uint16_t warnVacuumH;	// 温度报警上限
			int16_t warnTempr;		// 温度报警下限
			int16_t warnTemprH;		// 温度报警上限
		};
	};
	uint16_t	warnPress2;		//apex 压力报警低点: KPa
	uint16_t	warnPressH2;		// 压力报警高点: KPa
	uint8_t	trainReserved[14];
	union
	{
		uint8_t		reserved[20];	
		uint16_t	densityExt[8];	// 各液源的比重（新增介质, 单位kg/m3）
	};
	uint16_t	crc;
} config_bottle_t;

// 配置区2-传感器参数
typedef struct
{
	config_header_t header;			// 头信息
	unsigned : 8;
	unsigned : 8;
	weight_param_t	sensorWeight;	// 称重传感器
	
	union
	{
		press_param_t	sensorDPress;	// 差压传感器
		capacity_param_t sensorCap;		// 电容传感器参数
	};
	press_param_t	sensorPress;	// 压力传感器
	press_param_t	sensorEPress[3];// 扩展压力传感器
	union
	{
		tempr_param_t	sensorMTempr[3];// 扩展温度传感器-4~20mA
		pt100_param_t	sensorPTempr[3];// 扩展温度传感器-PT100
	};	
	uint16_t	levelOutMMWC;			// 4~20mA液位输出高度（该功能无实际客户使用）
	uint8_t		reserved[34];
	uint16_t	crc;
} config_sensor_t;

// 配置区3-数据参数
typedef struct
{
	config_header_t header;			// 头信息
	unsigned : 8;
	unsigned : 8;
	char		reserved[8];		
	char		server[30];			// 数据服务器
	int16_t		port;				// 数据端口
	char		gpsServer[30];		// 轨迹服务器
	int16_t		gpsPort;			// 轨迹端口
	uint16_t	intervalSample;		// 数据采集周期
	uint32_t	intervalTrans;		// 数据上报周期
	uint16_t	intervalGPS;		// 位置采集周期
	uint16_t	intervalGPSTrans;	// 位置上报周期
	int8_t		timeLag;			// 时差，默认为+8
	unsigned	: 8;
	char		upgServer[30];		// 升级服务器
	int16_t		upgPort;			// 升级端口
	uint16_t	crc;
} config_data_t;

// 配置区4-显示屏参数
typedef struct
{
	config_header_t header;		// 头信息
	unsigned : 8;
	unsigned : 8;
	uint16_t	lightDelay;		// 背光延时
	uint16_t	dispDelay;		// 显示屏延时
	uint8_t		unit;			// 显示单位(公制、英制）
	uint8_t		L_Unit;			// 显示单位（UNIT_KPA, UNIT_KG, UNIT_L, UNIT_PCT, UNIT_MMH2O）
	char		pwd1[6];		// 储罐参数修改密码
	char		pwd2[6];		// 传感器标定密码
	char		APN[24];		// 运营商APN
	struct
	{
		uint8_t		op_HARDWARE_VER_MAJOR;	// 硬件配置（不同客户和选项的组合）
		uint8_t		op_DISP_MMWC_ONLY;
		uint8_t		op_DOL_VER;
		uint8_t		op_BOX_VER;
		unsigned	op_CELL_LOCATION : 1;	// 基站定位
		unsigned	op_NO_LOCATION : 1;		// 不定位
		unsigned : 6;			
		uint8_t		op_LEVEL_SENSOR_ONLY;
		uint8_t		op_USE_PT100_SENSOR;
		uint8_t		op_PT100_MULTI;
		uint8_t		op_PT100_3LINE;
		uint8_t		op_DIFF_RESIST;
		unsigned	op_SEND_GPS_DATA : 1;
		unsigned	: 6;
		unsigned	op_ANTI_NORM_OPEN : 1;		// 防过充常开泵（气动关闭）
		
		unsigned	op_USE_CAPACITY_SENSOR : 1;
		unsigned 	op_LOW_ALARM_OUTPUT : 1;		// 低液位声光报警功能
		unsigned	op_PRESS_ALARM_OUTPUT : 1;		// 压力声光报警
		unsigned	op_LOW_PRESS_ALARM_OUTPUT : 1;	// 低压力声光报警
		unsigned	op_ANTI_SINGLE_CTRL : 1;		// 防过充单头电磁阀
		unsigned : 2;
		unsigned	op_LOCAL_DISP_1S : 1;			// 本地显示1秒采集
			
		unsigned : 1;							// 保留，不要占用
		unsigned	op_USE_R0SEMOUNT : 1;		// 罗斯蒙特传感器
		unsigned 	op_USE_SOLAR : 1;			// 有太阳能
		unsigned 	op_USE_O2_LEAK : 1;			// 氧传感器
		unsigned 	op_LEAK_ALARM_OUTPUT : 1;	// 泄露报警输出
		unsigned	op_USE_DOL_TTL : 1;			// DOL数字输出传感器
		unsigned	op_USE_HEIGHT_LEVEL : 1;// 直接测液位高度
		unsigned	op_USE_PCT_LEVEL: 1;	// 直接测液位百分比
		
		uint8_t		op_SERVER_PROTOCOL;	// 服务器协议：0-TCP; 1-MQTT; 2-HTTPS; 3-HTTP; 4-TRAIN; 5-AOYANG
		uint8_t		op_SERVER_INDEX;	// 服务器地址索引
		
		unsigned 	op_UNIDIR_COMM : 1;		// 不支持双向通信
		unsigned	op_LOCAL_DISP : 1;		// 只有本地显示
		unsigned	op_ANTI_OVERFILL : 1;	// 防过充功能
		unsigned	op_ALARM_OUTPUT : 1;	// 高液位声光报警功能
		unsigned 	op_DIFF_420MA : 1;		// 差压传感器为4~20mA
		unsigned	op_PRESS_420MA : 1;		// 压力传感器为4~20mA
		unsigned	op_2ND_420MA_OUT_LEVEL : 1; // 第2路4~20mA输出液位
		unsigned	op_420MA_OUT_PCT : 1;	// 4-20mA按液位百分比输出
		
		uint8_t		op_PRODUCT_CLASS;	// 0-差压计版本，1-氢压力版本
		unsigned	op_TRAIN : 1;			// 铁路罐箱版本
		unsigned	op_TIGER : 1;			// 老虎燃气版本
		unsigned : 2;
		unsigned 	op_LNG_LORA: 1;			// LNG-LORA版本
		unsigned : 3;

		unsigned : 8;
		unsigned : 8;
		unsigned : 8;
		unsigned : 8;
	};
	uint32_t	bdCommander;	// 北斗指挥机卡号
	char		User[10];		// APN-User
	char		Pwd[10];		// APN-Pwd
	uint8_t		reserved[28];

	uint16_t	crc;
} config_display_t;

// 采集板系统信息
typedef struct
{
	uint8_t		boardFlag;		// 主板标识
	unsigned	: 8;
	version_t	hardVer;
	version_t	softVer;
	date_t		softDate;
	unsigned	: 8;
} sysinfo_sample_t;

// 电源板系统信息
typedef struct
{
	uint8_t		boardFlag;		// 主板标识
	unsigned	: 8;
	version_t	hardVer;
	version_t	softVer;
	date_t		softDate;
	char		parity;			// 奇偶校验方式
	uint32_t	baudrate;		// DTU波特率
	version_t	protocolVer;	// 远传协议版本号
	char 		simNumber[24];	// sim卡号
	uint32_t		gprsSendCount;	// GPRS发送次数
	uint32_t		gprsSuccCount;	// GPRS成功次数
	char			gprsFailCode[6]; // GPRS失败代码
	uint32_t 		bdNumber;	// 北斗卡号
} sysinfo_power_t;

// 显示板系统信息
typedef struct
{
	uint8_t		boardFlag;		// 主板标识
	unsigned	: 8;
	version_t	hardVer;
	version_t	softVer;
	date_t		softDate;
	unsigned	: 8;
} sysinfo_display_t;

// 蓝牙板系统信息
typedef struct
{
	uint8_t		boardFlag;		// 主板标识
	unsigned	: 8;
	version_t	hardVer;
	version_t	softVer;
	date_t		softDate;
	char		parity;			// 奇偶校验方式
	uint32_t	baudrate;		// 蓝牙模块波特率
	version_t	protocolVer;		// 蓝牙协议版本
	char 		moduleName[20];	// 蓝牙模块名称
} sysinfo_bluetooth_t;

// DTU采集数据
typedef struct // size = 36
{
	date_time_t		sysTime;	// 系统时间, size = 6
	int32_t			longitude;	// 经度
	int32_t			latitude;	// 维度
	uint16_t		speed;		// 速度
	uint8_t			rssi;		// GPRS信号强度
	uint8_t			networked;	// 是否入网
	uint8_t			connected;	// 是否连上服务器
	uint8_t			netType;	// 网络类型
	unsigned		posState : 1;			// GPS定位状态：只要复位以来定位成功过，就为1
	unsigned		recentPosState : 1;		// 最近一次主动定位状态
	unsigned	: 6;
	uint8_t			sateCount;	// GPS卫星数量
	uint8_t			batPct;		// 电池电量百分比
	uint8_t			batLow;		// 低电量标志
	int16_t			batVoltage;	// 电池电压
	uint16_t		batMaxCapa;	// 电池总容量
	uint16_t		batCapa;	// 电池容量
	int16_t			batCurrent;	// 电池充/放电流
	int16_t			batTempr;	// 电池温度
	int16_t			sunLevel;	// 光照强度
} data_dtu_t;

// 采集板采集数据
typedef struct // size = 118
{
	uint32_t		volumeTotal;	// 储罐容积
	sensor_status_t	staWeight;		// 称重传感器状态， size  = 1
	sensor_status_t	staDPress;		// 差压/电容传感器状态
	sensor_status_t staPress;		// 压力传感器状态
	sensor_status_t staExtPress[3];	// 扩展压力传感器状态
	sensor_status_t staExtTempr[3];	// 扩展温度传感器状态
	unsigned	: 8;
	float		diff;			// 差压/电容
	float		height;			// 液位高度
	uint32_t	volume;			// 容积
	uint32_t	weight;			// 重量
	uint16_t	volumePct;		// 容积百分比
	uint16_t	pressure;		// 压力
	uint16_t	extPressure[3];	// 扩展压力
	int16_t		extTempr[3];	// 扩展温度
	vacuum_data_t	vacuum[1];	// 真空传感器数据（A、B），size = 16 x 1
	uint16_t		ccsRemainDay;// 船级社维持时间（天）
	uint32_t		ccsVer;		 // 船级社维持时间算法版本
	uint8_t			reserved[2]; // 保留（真空计增加了温度字段，由2路改为1路，保持原24个字节大小）
	leak_data_t		leak;		// 泄露报警器数据， size = 4
	flow_data_t		flow;		// 流量计数据，size = 22
	uint32_t		adWeight;	// 称重传感器AD转换值
	uint16_t		adDPress;	// 差压传感器AD转换值
	uint16_t		adPress;	// 压力传感器AD转换值
	uint16_t		adExtPress[3];	// 扩展压力传感器AD转换值
	uint16_t		adExtTempr[3];	// 扩展温度传感器AD转换值
	uint8_t			charging;		// 充装标志
	uint8_t			warnning;		// 报警标志
} data_sample_t;

// adc值
typedef struct
{
	uint16_t	adcDiff;		// 差压ADC值
	uint16_t	adcPress;		// 压力ADC值
	uint16_t	adcEPress[3];	// 扩展压力ADC值
	uint16_t	adcETempr[3];	// 扩展温度ADC值
	uint32_t	adcWeight;		// 称重ADC值
} adc_sample_t;

// 定义缓冲区，用于CAN通讯或Flash读写
typedef union
{
	// 字节缓冲，用于通信过程中读写
	uint8_t				buff[DATA_BUFF_SIZE];
	// 字缓冲
	uint16_t			buff16[DATA_BUFF_SIZE / sizeof(uint16_t)];
	// 双字缓冲，用于读写Flash
	uint32_t			buff32[DATA_BUFF_SIZE / sizeof(uint32_t)];
	// 用于检查配置是否有效
	config_header_t header;	// 头信息
	
	// 数据结构，用于字段解析
	config_bottle_t		configBottle;
	config_sensor_t		configSensor;
	config_data_t		configData;
	config_display_t	configDisplay;
	sysinfo_sample_t	sampleInfo;
	sysinfo_power_t		powerInfo;
	sysinfo_display_t	displayInfo;
	sysinfo_bluetooth_t bluetoothInfo;
	data_dtu_t			dtuData;
	data_sample_t		sampleDdata;
	adc_sample_t		adcData;
} rd_buff_t;

// 用于存储数据
typedef struct
{
	config_bottle_t		configBottle;
	config_sensor_t		configSensor;
	config_data_t		configData;
	config_display_t	configDisplay;
	sysinfo_sample_t	sampleInfo;
	sysinfo_power_t		powerInfo;
	sysinfo_display_t	displayInfo;
	sysinfo_bluetooth_t bluetoothInfo;
	data_dtu_t			dtuData;
	data_sample_t		sampleData;
	adc_sample_t		adcData;	
} data_buff_t;

#pragma pack(pop)

// 各个数据块的长度
#define CONFIG_DATA_LEN(DC)	Config_DataLen[(DC) - 1]
#define CONFIG_DATA_PTR(DC) Config_DataPtr[(DC) - 1]
extern const uint8_t	Config_DataLen[];
extern const void*	Config_DataPtr[];

// 各个配置区的内存
extern data_buff_t dcBuff;

uint32_t Config_CheckValid(rd_buff_t *dataBuff, uint8_t DC);
void Config_ForceValid(rd_buff_t *dataBuff, uint8_t DC);

// 检查参数修改标志
uint32_t Config_CheckUpdate(data_buff_t *dataBuff);

// 设置储罐参数的默认值
void Config_setBottleDefParam(data_buff_t *dataBuff);
// 设置传感器参数的默认值
void Config_setSensorDefParam(data_buff_t *dataBuff);
// 设置数据参数的默认值
void Config_setDataDefParam(data_buff_t *dataBuff);
// 设置显示参数的默认值
void Config_setDisplayDefParam(data_buff_t *dataBuff);

// 填充采集板系统信息
void Config_fillSampleInfo(data_buff_t *dataBuff);
// 填充电源板系统信息
void Config_fillPowerInfo(data_buff_t *dataBuff);
// 填充显示板系统信息
void Config_fillDisplayInfo(data_buff_t *dataBuff);
// 填充蓝牙板系统信息
void Config_fillBluetoothInfo(data_buff_t *dataBuff);

// 设置和获取介质密度
void Config_SetDensity(uint8_t source, float density);
float Config_GetDensity(uint8_t source);

// 多项式为x16+x15+x2+1,LSB顺序
uint16_t do_crc_16(unsigned short crc_reg, uint8_t *message, int16_t len);

#endif
