#ifndef _PRO_DATA_H
#define _PRO_DATA_H

#include "stm32f10x.h"

typedef char    BYTE;
typedef uint8_t BOOL;    

#define TRUE	1
#define FALSE	0
#define NULL	0

#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 SEND_HEART_COUNT	(1)		//心跳包发送次数
#define MAX_RETRY_COUNT		(3)
#define MAX_ACK_TIME		(100)
#define HEART_PACK_TIME 	(100)	//心跳包扫描间隔(10ms*100)

#define MULTI_PACK_INTERVAL	(1000)	//处理泛洪间隔,单位10ms(10秒)
#define HEART_LINK_INTERVAL (2000)	//发送心跳间隔,单位10ms(20秒)

enum NODETYPE{NODE,ROUTER};
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
{
	u16 time_count;		 //超时计数
	u8 status;         	 //数据包发送状态
	u8 isBroadcast;		 //是否广播
	u8 send_failed_count;//发送失败次数
	u8 retry_count;		 //当前数据包重发数
//	u8 dst_channel;      //发送信道
//	u8 dst_mac[MAC_LEN]; //发送的目的MAC地址
	HANDLESENDCALLBACK HandleCallBack;//回调
	Payload payload;     //数据包
}DATA_BUF,*LPDATA_BUF;//同步数据包

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

typedef struct
{
	u8 addr;          //路由模式使用 分配的地址
	u8 channel;       //使用的信道
	u8 mac[MAC_LEN];  //mac地址
}LINK_DATA,*LPLINK_DATA;//请求连接发送的数据结构

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

typedef struct 
{
	u32 link_time;
	u8 addr;	//节点地址
}HeartTable;//心跳表

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

typedef struct 
{
	u8 idx;
	u8 addr;
}PathTable;//查找节点最短路径

typedef struct
{
	u8 addr;
	u8 count;	//计数器
}LOST_CONNECTION;//统计掉线次数

#endif
