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

#ifndef  USER_UART_BDMODULE_PRESENT
#define  USER_UART_BDMODULE_PRESENT

#include "type.h"

extern const uint8_t BD_APP;
extern const uint8_t BD_PROTOCOL_VER;	

// 初始化
void BD_Init();
void BD_Open();

// 模块上电，设置硬件参数
void BD_PowerOn();
void BD_PowerOff();

#define BD_RF_MIN_FRAME_LEN	(18)
#define BD_RF_MAX_FRAME_LEN	(78)	// 北斗短信最大长度
#define BD_RF_MIN_PAYLOAD_LEN	(0)
#define BD_RF_MAX_PAYLOAD_LEN	(BD_RF_MAX_FRAME_LEN - BD_RF_MIN_FRAME_LEN)

#define RF_PROTOCOL_VER_2	(2)

#define BD_FRAME_SOF		('$')
#define BD_XTZJ				("XTZJ")
#define BD_ZJXX				("ZJXX")
#define BD_TXSQ				("TXSQ")
#define BD_FKXX				("FKXX")
#define BD_TXXX				("TXXX")

#define BD_MIN_FRAME_LEN	(11)
#define BD_MAX_FRAME_LEN	(230)	// 通信信息帧最大长度
#define BD_MIN_PAYLOAD_LEN	(0)
#define BD_MAX_PAYLOAD_LEN	(BD_MAX_FRAME_LEN - BD_MIN_FRAME_LEN)

// 北斗初始化状态
extern uint8_t BD_initStatus;

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

// 北斗系统自检帧
typedef struct
{
	uint16_t frequency;			// 自检频度（秒），0-单次自检
} bd_xtzj_t;

// 北斗自检信息帧
typedef struct
{
	union
	{
		struct
		{
			unsigned icType : 1;	// 0-保密模块，1-智能卡
			unsigned cardErr : 1;	// 0-智能卡正常，1-智能卡异常
			unsigned idErr : 1;		// 0-ID号正常，1-ID号异常
			unsigned chkErr : 1;	// 0-校验正常，1-校验异常
			unsigned snErr : 1;		// 0-序列号正常，1-序列号异常
			unsigned adminCard : 1;	// 0-用户卡，1-管理卡
			unsigned dataErr : 1;	// 0-数据正常，1-数据异常
			unsigned phyErr : 1;	// 0-物理正常，1-物理缺损
		};
		uint8_t icStatus;			// 智能卡状态
	};
	union
	{
		struct
		{
			unsigned antennaErr : 1;	// 0-天线状态正常，1-异常
			unsigned channelErr : 1;	// 0-通道正常，1-异常
			unsigned boardErr : 1;		// 0-主板正常，1-异常
			unsigned : 5;
		};
		uint8_t hardStatus;			// 硬件状态
	};
	uint8_t batPct;					// 电量百分比
	union
	{
		struct
		{
			unsigned suppress : 1;		// 0-非抑制，1-抑制
			unsigned notSilence : 1;	// 0-静默，1-正常
			unsigned : 6;
		};
		uint8_t inStatus;				// 入站状态
	};
	uint8_t power[6];					// 波束功率
} bd_zjxx_t;

// 北斗通信申请帧
typedef struct
{
	union
	{
		struct
		{
			unsigned tx : 3;		// 010-报文通信，011-查询通信
			unsigned key : 1;		// 密钥，填0
			unsigned type : 2;		// 00-特快，01-普通
			unsigned code : 1;		// 0-汉字，1-代码
			unsigned identity : 1;	// 0-通信，1-口令识别
		};
		uint8_t xxlb;				// 信息类别
	};
	uint8_t dstAddr[3];		// 收信方地址
	uint16_t bitLen;		// 电文长度（bit数）
	uint8_t needAnswer;		// 是否应答
	uint8_t bytes[78];		// 电文内容（最大624bit）
} bd_txsq_t;

// 北斗反馈信息帧
typedef struct
{
	uint8_t fkbz;	// 反馈标志
	char fjxx[4];	// 附加信息
} bd_fkxx_t;

// 北斗通信信息帧
typedef struct
{
	union
	{
		struct
		{
			unsigned tx : 2;		// 01-通信
			unsigned code : 1;		// 0-汉字，1-代码
			unsigned receipt : 1;	// 0-不要回执
			unsigned type : 1;		// 0-通信，1-查询
			unsigned key : 1;		// 0-无秘钥
			unsigned : 2;			// 00
		};
		uint8_t xxlb;				// 信息类别
	};
	uint8_t srcAddr[3];		// 发信方地址
	uint8_t hour;			// 发信时间
	uint8_t minute;
	uint16_t bitLen;		// 电文长度（bit数）
	uint8_t bytes[210];		// 电文内容（最大1680bit）
	uint8_t crcErr;			// 0-crc正确，1-crc错误
} bd_txxx_t;

// 北斗协议帧
typedef struct	// size = BD_RF_MAX_FRAME_LEN
{
	uint8_t		sof;				// BD_FRMAE_SOF
	char		cmd[4];				// XTZJ, ZJXX, TXSQ, FKXX, TXXX 
	uint16_t	len;				// bytes from sof to cs
	uint8_t		selfAddr[3];		// 自身地址，可全填0
	union
	{
		bd_xtzj_t xtzj;				// 系统自检
		bd_zjxx_t zjxx;				// 自检信息
		bd_txsq_t txsq;				// 通信申请
		bd_fkxx_t fkxx;				// 反馈信息
		bd_txxx_t txxx;				// 通信信息
		uint8_t bd_payload[sizeof(bd_txxx_t)];
	};
	uint8_t		cs;					// 校验和（占位置，实际cs可能更靠前）
} bd_frame_t;

typedef struct	// size = BD_RF_MAX_FRAME_LEN
{
	uint8_t		sof;				// RF_FRMAE_SOF
	uint8_t		len;				// bytes from sof to crc（BD_RF_MIN_FRAME_LEN~BD_RF_MAX_FRAME_LEN）
	uint16_t	vendor_id;			// RF_MARK_LS
	uint8_t		app_id;				// RF_APP_AJH or RF_APP_PRAX or RF_APP_LANSHI
	uint8_t		protocol_ver;		// RF_PROTOCOL
	unsigned	dir : 1;			// RF_DIR_UP or RF_DIR_DOWN
	unsigned	mac_type : 2;  		// RF_MAC_TYPE_DATA or RF_MAC_TYPE_ACK
	unsigned	mac_ack_req : 1;	// is ack requested?
	unsigned 	net_type : 2;		// RF_NET_TYPE_DATA or RF_NET_TYPE_FIND_RELAY or RF_NET_TYPE_RESP_RELAY
	unsigned	: 2;				// reserved
	uint8_t		mac_fn;				// mac frame number
	uint8_t		srcPSN[6];
	uint8_t		app_pn;				// package number
	unsigned	app_idx : 7;		// frame number in package
	unsigned	app_tbc : 1;		// to be continue?
	uint8_t		app_payload[BD_RF_MAX_PAYLOAD_LEN];
	uint16_t	crc;				// 占位置，实际crc可能更靠前
} bd_rf_frame_t;

typedef struct	// size = 50
{
	uint16_t diff;
	uint16_t	volumePct;		// 容积百分比
	uint32_t	volume;			// 容积
	uint32_t	weight;			// 重量
	uint16_t press;
	int16_t tempr;
	uint16_t debug;				// 调试信息
	rf_sensor_t Sensor;
	uint32_t longitude;
	uint32_t latitude;
	uint16_t voltage;
	uint8_t batPct;
	int8_t batCurrent;
	uint32_t relative_time;
	uint8_t hardVer;
	uint8_t softVer;
	uint32_t volumeTotal;		// 储罐容积
	uint32_t L;
	uint32_t d;
} bd_rf_app_data_t;

// 应用层发送：数据
uint8_t bd_rf_app_send_data(uint8_t payload_len, uint8_t *payload);

#pragma pack(pop)

#endif
