#ifndef _UDPSERVER_INTERNAL_PROTOCOL_H_
#define _UDPSERVER_INTERNAL_PROTOCOL_H_

#include "stdint.h"

/*UDP SERVER SRAM空间规划*/
#define SRAM_UDP_Server_Data_Start_Address	0x300000 
#define SRAM_UDP_Server_Data_End_Address	0x37FFFF
#define SRAM_UDP_Server_Data_Size			0x080000

//预留256Byte,暂时没用
#define SRAM_UDP_Server_NowTXData_Addr		0x300100	//当前数据地址
#define SRAM_UDP_Server_ReadTXData_Addr		0x300104	//读取数据地址
#define SRAM_UDP_Server_WriteTXData_Addr	0x300108	//写入数据地址
/*数据缓存地址*/
#define SRAM_UDP_Server_DataBuff_Size			0x280   		//640Byte  - 249包数据
#define SRAM_UDP_Server_TXDataBuff_Start_Address	0x301000
#define SRAM_UDP_Server_TXDataBuff_End_Address		0x328000

#define UDP_Server_DataLen_Max		550		//数据最长550Byte
#define UDP_Server_DataRetry_Max 	10		//重发最大次数
#define UDP_Server_DataSendWait_Max 1000		//发送等待应答时间，单位：ms

#define UDP_Server_Head_L	0xAA
#define UDP_Server_Head_H	0x66

#define UDP_Server_CMD_Search				0x0001		//搜索命令
#define UDP_Server_CMD_Register				0x0002		//注册命令
#define UDP_Server_CMD_Heartbeat			0x0003		//心跳命令
#define UDP_Server_CMD_Change_Report		0x0004		//变化上报
#define UDP_Server_CMD_Control_Dev			0x0005		//下发控制
#define UDP_Server_CMD_Starter_Test			0x0006		//启动测试
#define UDP_Server_CMD_Send_Test_Data		0x0007		//发送测试数据
#define UDP_Server_CMD_Read_RCU_Data		0x0008		//读取RCU数据

typedef enum{
	US_Head_L = 0,		//包头
	US_Head_H,
	US_Len_L,			//长度
	US_Len_H,
	US_CRC_L,			//CRC16校验
	US_CRC_H,
	US_Frame_L,			//帧号
	US_Frame_H,
	US_Retry,			//重发次数
	US_Encrption,		//加密标志
	US_MACAddr_1,		//本机MAC地址
	US_MACAddr_2,
	US_MACAddr_3,
	US_MACAddr_4,
	US_MACAddr_5,
	US_MACAddr_6,
	US_CMD_L,			//命令
	US_CMD_H,
	US_Para,
}UDPSERVER_Format;

typedef enum{
	USS_IDLE,
	USS_SEND,
	USS_SENDWAIT,
	USS_RETRY,
	
}UDPSERVER_SEND;

typedef struct{
	uint8_t send_state;		//状态
	uint8_t retry_num;		//当前包重发次数
	uint8_t encrption;		//当前加密标志
	
	uint8_t test_flag;		//测试标志位
	uint16_t test_num;		//测试发送次数 - 由服务器发送觉得
	uint16_t test_sn;		//测试当前序号
	uint32_t test_time;		//
	
	uint16_t frame;			//帧号 - 发送使用
	uint16_t rev_frame;		//接收帧号
	uint32_t send_tick;		//发送时间戳
}__attribute__ ((packed)) UDP_SERVER_Information_t;

void UDP_Server_Info_Init(void);
void UDP_NetServer_Task(void);
void UDP_NetServer_Data_Analysis(UINT8 *data, UINT32 len, uint8_t* ip, uint16_t port);

uint16_t Data_Conver_To_Uint16(uint8_t *data);


#endif
