#ifndef _NRF_DATA_H_
#define _NRF_DATA_H_

#include "stm32f10x.h"

typedef char    BYTE;
typedef uint8_t BOOL;   

#define MAC_LEN					(5)
#define PAYLOAD_LEN				(32)
#define PALYOAD_HEADER_LEN		(sizeof(PayloadHeader))
#define PAYLOAD_DATA_LEN		(PAYLOAD_LEN-PALYOAD_HEADER_LEN)

#define DATA_BUF_COUNT			(50)
#define MAX_NODE_NUM			(32)	//节点数
#define MAX_HOP_NUM				(MAX_NODE_NUM)

#define MAX_FAILED_COUNT		(3)     //发送失败次数
#define MAX_RETRY_COUNT			(3)
#define SEND_HEART_COUNT		(1)		//心跳包发送次数
#define MAX_ACK_TIME			(300)
#define HEART_PACK_TIME			(100)	//心跳包扫描间隔(10ms*100)

#define MULTI_PACK_INTERVAL		(1000)  //处理泛洪间隔,单位10ms(10秒)
#define HEART_LINK_INTERVAL		(2500)  //等待心跳间隔,单位10ms(25秒)
#define WAIT_CONNECT_INTERVAL	(2000)  //等待连接间隔,单位10ms(20秒)

enum NODESTATUS{INVALID,VALID};
enum LINKSTATUS{DISCONNECT,WAIT_CONNECT,CONNECTED,WAIT_CHANGE};
enum PAYLOADSTATUS{IDLE,WAIT_USE,WAIT_SEND,WAIT_RETRY,WAIT_SEND_RETRY,SEND_FAILED,SEND_SUCCESS,WAIT_ACK,WAIT_RECV,RECV_FAILED,WAIT_HANDLER};
enum PACKAGETYPE{DEL_NODE,ASSIGN_ADDR,START_LINK,BUILD_LINK,BUILD_LINK_ACK,CHECK_LINK,CHECK_LINK_ACK,ONE_DATA,ONE_DATA_ACK,NODE_KEY_DATA,NODE_KEY_DATA_ACK,WAY_KEY_DATA,WAY_KEY_DATA_ACK};

#define PACKAGE_SUCCESS   0x01
#define PACKAGE_FAILED    0x00

typedef void (*HANDLESENDCALLBACK)(u8 src_addr,u8 dst_addr,u8 pack_type,u16 num,u8 *buf,u8 status);
typedef void (*HANDLERECECALLBACK)(u8 src_addr,u8 dst_addr,u8 pack_type,u8 *buf);

#pragma pack(1)
typedef struct 
{
	u32 PID;     //网络ID
	u32 SID;     //发送payload ID
	u8 the_addr; //本次发送地址
	u8 src_addr; //源发送地址
	u8 dst_addr; //目的地址
	u8 ass_addr; //待分配地址
	u8 hop_addr; //上一跳地址
	u8 hop_count;//跳跃序号
	u8 pack_type;//数据包类型
	u8 data;     //备用
}PayloadHeader,*LPayloadHeader;//payload头结构,长度为16

typedef struct
{
	PayloadHeader header;    //payload头
	u8 buf[PAYLOAD_DATA_LEN];//数据缓冲区
}Payload,*LPayload;//payload结构 
#pragma pack()

typedef struct
{
	u8 status;         	 //数据包发送状态
	u8 isBroadcast;		 //是否广播
	u8 send_failed_count;//发送失败次数
	u8 retry_count;		 //当前数据包重发数
	u16 time_count;		 //超时计数
//	u8 dst_channel;      //发送信道
//	u8 dst_mac[MAC_LEN]; //发送的目的MAC地址
	HANDLESENDCALLBACK HandleCallBack;//回调函数
	Payload payload;     //数据包
}DATA_BUF,*LPDATA_BUF;//同步数据包

typedef struct
{
	u32 pwd;
	u8 addr;		   		//节点地址
	u8 local_mac[MAC_LEN];	//节点的mac
}NRFSTOREDATA,*LPNRFSTOREDATA;

#pragma pack(1)
typedef struct
{
	u32 shift_failed_count; //切换失败计数
	u32 shift_count;        //切换成功计数器
	u32 recv_count;         //接收数据包数
	u32 pwd;
	u8 addr;           		//当前地址
	u8 route_addr;
	u8 channel;             //当前信道
	u8 link_status;    		//连接状态
	u8 send_failed_count;
	u8 node_mac[MAC_LEN];
}NODESTATUS;//节点状态结构
#pragma pack()

typedef struct 
{
	u8 addr;	//节点地址
	u8 path[MAX_HOP_NUM];
}RoutrTable,*LRoutrTable;

typedef struct
{
	u32 time;  
	u16 RID;
	u8 src_addr;
	u8 dst_addr;
	u8 pack_type;
}HANDLEMULTIPACK;//处理重复的包

typedef struct 
{
	u8 idx;
	u8 addr;
}PathTable;

#endif
