#ifndef _OILTANK_H_
#define _OILTANK_H_

#define YB_SS160_SOH        0x01		//起始码<SOH> 
#define YB_SS160_EXT        0x03		//结束标志位 

#define YB_SS160_FCN_FLAG			0x2626//"&&"

//波特率 9600，帧格式为：起始位 1，  数据位 8，停止位 1，共 10 位，无校验(N)。
/*
1 i201 读储油罐状态及数据 
		读储油罐状态及数据，包括油罐的温度、水位、油位、水量、油量、标准油量等 信息。
2 i205 读储油罐报警信息 
		读取高低液位报警、水位过高报警、高低温度报警、油品泄漏报警、探针失灵报 警。
3 i20C 读储油罐最近一次进油报告 
4 i501 读取系统时间
5 i602 读取油品数据 
6 i607 读取油罐直径 
7 s501 设置系统时间 
8 i10100 系统状态 
*/

//SS160控制器后台通讯协发送
typedef struct {
    unsigned char                  SOH;              //协议头
    unsigned char                  FCN_CODE[6];      //本机地址
    unsigned char                  EXT;              //功能码或命令字
} BYTE1 RS232_YB_SS160_SEND;

//SS160控制器后台通讯协接收
typedef struct {
    u8                  SOH;               //协议头
    u8                  FCN_CODE[4];       //实时数据命令为i201TT
    u8					FuelTank_No[2];

    //时间, YYMMDDHHmm 日期和时间（年/月/日/时/分）
    u8                  year[2];           //年
    u8                  month[2];          //月
    u8                  date[2];           //日
    u8                  hour[2];           //时
    u8                  minute[2];         //分
} BYTE1 RS232_YB_SS160_RECEIVE_HEAD;

typedef struct {
    u8      TT[2];             //罐号（如果数字为 00，则返回所有油罐数据，如 果未 01 或 02 等油罐编码，则仅返回该油罐的一 组数据）
    u8      P;                 //产品代码(油品) 
    u8      SSSS[4];           //油罐状态 Bit 位。Bit1：正在进油；Bit2：正在漏 油检测；Bit3：无效的高度报警（仅用于测试）； bit4-16：未应用
    u8      NN[2];             //随后的浮点数个数 
    //实际数据，共有7组，每组占8字节
    u8      TankVolume[8];     //1油水体积
    u8      NetVolume[8];      //2油水体积
    u8      CrossVolume[8];    //3剩余体积
    u8      Height[8];         //4油高
    u8      Water[8];          //5水高
    u8      Temp[8];           //6温度
    u8      WaterVolume[8];    //7水体积
} BYTE1 I201_FUELTANK_DATA; //油罐数据

typedef struct {
    u16     FCN_FLAG;       //数据结束标志 固定值&&符号
    u32		CheckCode;      //校验
    u8      EXT;            //功能码或命令字
} BYTE1 RS232_YB_SS160_RECEIVE_TAIL;

#define YB_SS160_SEND_SIZE 		sizeof(RS232_YB_SS160_SEND)
#define YB_SS160_RCV_HEADSIZE 	sizeof(RS232_YB_SS160_RECEIVE_HEAD)
#define YB_SS160_RCV_DATASIZE 	sizeof(I201_FUELTANK_DATA)
#define YB_SS160_RCV_TAILSIZE 	sizeof(RS232_YB_SS160_RECEIVE_TAIL)


typedef struct _oiltank_info {
	u32 id;
	u32 quality;
	u32 volume;
	u32 oil_volume;
	u32 water_volume;
	u32 temperature;
	u32 height;

	/* 监控有效性 */
	u32 valid_num;
} oiltank_info_t ;

#define OILTANK_VALID_COUNT 16
typedef struct _system_oiltank_info {
	uint32_t current;
	uint32_t valid;
	oiltank_info_t oiltank[OILTANK_VALID_COUNT];
} system_oiltank_info_t;
extern system_oiltank_info_t system_oiltank;
typedef struct _gb_oiltank_header {
	uint32_t device_type;
	uint32_t device_id;
	uint8_t device_status;
	uint8_t oiltank_count;
} gb_oiltank_header_t;

#define GB_OILTANK_HEADER_LEN 		10
#define GB_OILTANK_INFO_LEN 		28

#define OILTANK_MSG_PERIOD 10
#define OILTANK_UART	UART4_ID

typedef enum OIL_QUALITY{
	QUALITY_90, //90#汽油
	QUALITY_92,//93#汽油
	QUALITY_95,//95#汽油
	QUALITY_98,//97#汽油
	QUALITY_0,//0#柴油
	QUALITY_10,//10#柴油
	QUALITY_NEG_10,//-10#柴油
	QUALITY_NEG_20,//-20#柴油
	QUALITY_NEG_35,//-35#柴油
	QUALITY_NEG_50,//-50#柴油
} OIL_QUALITY;

void oiltank_polling(void);
int oiltank_init(void);

#endif
