#ifndef _BLV_NET_FUNCTION_H_
#define _BLV_NET_FUNCTION_H_

#include "stdint.h"
#include "CH57x_common.h"		//CH57X 库包含头文件
#include "BLV_Dev_Option.h"

#define RCU_NO_SERVER   		0x00      //RCU无服务器
#define RCU_LOCAL_SERVER   		0x01      //RCU本地服务器
#define RCU_CLOUD_SERVER   		0x02      //RCU云端服务器

#define FRAME_HEADER 	      		2                                    	//帧头
#define FRAME_LEN   	       		2                                  		//帧长
#define SYSTEM_ID     	          	4                                  		//系统ID
#define CMD_CODE     	       		1 										//命令号
#define FLOOR_NUM   	  	   		4                                    	//楼层号
#define FRAME_NO                    2                                    	//帧号

#define CRC_LEN         			2                                      	//校验长度

#define SYSLOCK_LEN                 1                                     	//系统锁
#define CARDTYPE_LEN                1                                   	//卡类型
#define DOOR_LEN                    1                                    	//门磁状态
#define ELE_LEN                     2                                    	//门锁电量
#define HOST_TEM_LEN                1                                    	//主机温度

#define FRAME_HEAD_OFFSET           0     	//头位置    		0
#define FRAME_LEN_OFFSET            2     	//帧长位置     2
#define SYSTEM_ID_OFFSET            4    	//系统ID位置   4
#define CMD_OFFSET                  8 		//命令位置     8     
#define FRAME_NO_OFFSET             9    	//帧号位置      9
#define FLOOR_NUM_OFFSET            11 		//楼层号位置    11
#define HEAD_LEN        			15    	//头报文位置    15

#define UDP_FRAME_MIN_LEN        	(HEAD_LEN + CRC_LEN)	

#define USER_CODE   	            4      	//用户代码
#define SERVER_IF   	            1   	//服务器标志
#define IP_ADDR     	            4   	//IP地址
#define PORT_NUM    	  	      	2    	//端口号
#define CRC_LEN         	      	2      	//校验长度
#define RCU_SUBNET_MASK 	      	4     	//RCU子网掩码
#define RCU_GATEWAY  	  	      	4     	//RCU网关 
#define RCU_PORT     	            2   	//RCU端口号
#define RCU_MAC     	           	6    	//RCUMAC地址
#define RCU_SECRET_LEN              32    	//RCU密钥长度32字节
#define RCU_SoftwareVer             20  	//RCU固件版本
#define RCU_ConfigVer    			3		//RCU配置版本号
#define FTPUSERNAME               	1    	//FTP 用户名的长度占用的字节
#define FTPPASSWORD               	1     	//FTP 密码的长度占用的字节
#define FTPFILENAME           		1     	//FTP 文件名的长度占用的字节

#define FILE_TYPE                   1
#define FILE_MD5                    16     	//文件MD5值长度
#define FILE_SIZE                   4      	//文件大小，字节数
#define BLOCK_NUM                   2  		//块大小
#define STATUS                      1  		//状态

#define DATATYPE_IAP          		0x00 	//固件升级
#define DATATYPE_CONFIG       		0x01  	//配置升级
#define DATATYPE_UNDEFINED    		0x02   	//无效的文件类型

#if (Restart_Address_EN==0x01)		//使用逻辑文件配置 - 使用配置文件的话，需要使用对应新版的Launcher才行，暂时保留之前的升级以便项目维护
#define RUN_MAX_BLOCK               460           //app程序最大块数 	20220611 - 修改APP代码空间为230K
#else 
#define RUN_MAX_BLOCK               432           //app程序最大块数 	
#endif

#define CFG_MAX_BLOCK               850           //配置文件的最大块数
#define HEAD_SOFT_COM              	0xa90ff0      //头和配置软件版本比较

#define IAPSTART        0x01          //升级开始
#define IAPFINISH       0x02          //升级完成
#define IAPTIMEOUT      0x03          //升级超时 

#define IAP_STATE_COMPLETE       			0x01      	//升级状态完成
#define CLOUD_IAP_TFTP_STATE_COMPLETE 		0x02     	//云端升级状态完成
#define CLOUD_IAP_FTP_STATE_COMPLETE 		0x03     	//云端升级状态完成

#define IAPTFTPWRITE      	0x01      	//本地升级tftp推送
#define IAPTFTPREAD      	0x02     	//云端升级tftp得到
#define IAPTFTPLOG			0x03		//云端写LOG

#define TFTPWRITESTART    	0x01
#define TFTPREADSTART    	0x02
#define TFTPWRITEJOURNAL    0X03

#define Search_Cmd          			0x01     //搜索命令
#define Search_Cmd_EnSure_Rev_Len   	(HEAD_LEN+CRC_LEN)
#define Search_Cmd_Rev_Len  			(HEAD_LEN + USER_CODE + SERVER_IF + IP_ADDR + PORT_NUM + CRC_LEN)            //搜索命令接收长度
#define Search_Cmd_Rev_UserCode     	(HEAD_LEN)
#define Search_Cmd_Rev_ClientIf 		(Search_Cmd_Rev_UserCode + USER_CODE)     
#define Search_Cmd_Rev_ClientIp     	(Search_Cmd_Rev_ClientIf + SERVER_IF)
#define Search_Cmd_Rev_ClientPort   	(Search_Cmd_Rev_ClientIp + IP_ADDR)
#define Search_Cmd_Send_Len 			(HEAD_LEN + USER_CODE + RCU_SUBNET_MASK + RCU_GATEWAY + RCU_PORT + RCU_MAC + RCU_SoftwareVer + RCU_ConfigVer + CRC_LEN)
#define Search_Cmd_Send_UserCode    	(HEAD_LEN)
#define Search_Cmd_Send_Subnet  		(Search_Cmd_Rev_UserCode + USER_CODE)
#define Search_Cmd_Send_Gateway 		(Search_Cmd_Send_Subnet + RCU_SUBNET_MASK)
#define Search_Cmd_Send_Port   	 	  	(Search_Cmd_Send_Gateway + RCU_GATEWAY)
#define Search_Cmd_Send_Mac     		(Search_Cmd_Send_Port + RCU_PORT)
#define Search_Cmd_Send_SoftwareVer 	(Search_Cmd_Send_Mac + RCU_MAC)
#define Search_Cmd_Send_ConfigVer   	(Search_Cmd_Send_SoftwareVer + RCU_SoftwareVer)

#define Heart_Cmd 					0x02
#define Heart_Cmd_Send_Len          	(HEAD_LEN + CRC_LEN)


#define IAP_Cmd                     0x0A 																																				 //升级命令

#define IAP_Ready                   0x00 	//升级就绪
#define IAP_Finish                  0x01  	//升级完成
#define IAP_Error                   0x02	//升级失败																																			 //升级错误
#define IAP_Error_Block             0x03  	//升级块错误
#define IAP_Error_File              0x04 	//升级文件错误
#define IAP_Error_MD5               0x05   	//升级MD5值错误

#define IAP_Cmd_Rev_Len       		(HEAD_LEN + IP_ADDR + RCU_PORT + FILE_MD5 + BLOCK_NUM +CRC_LEN)
#define IAP_Cmd_Rev_Ip              (HEAD_LEN)                      	//位置  15
#define IAP_Cmd_Rev_Port            (IAP_Cmd_Rev_Ip + IP_ADDR)       	//位置	19
#define IAP_Cmd_Rev_Md5             (IAP_Cmd_Rev_Port + RCU_PORT)     	//位置	21
#define IAP_Cmd_Rev_Block           (IAP_Cmd_Rev_Md5 + FILE_MD5)      	//位置	37
#define IAP_Cmd_Send_Len            (HEAD_LEN + STATUS + RCU_SoftwareVer + CRC_LEN)
#define IAP_Cmd_Send_State          (HEAD_LEN)
#define IAP_Cmd_Send_SoftwareVer    (IAP_Cmd_Send_State + STATUS)

#define Subgroup_Cmd                0xA2																																					//发布子群命令
#define CONFIG_Ready                0x00 	//发布就绪
#define CONFIG_Finish               0x01 	//发布完成
#define CONFIG_Error                0x02 	//发布错误
#define CONFIG_Error_Block          0x03	//发布块错误
#define CONFIG_Error_File           0x04  	//发布文件错误
#define CONFIG_Error_Md5            0x05  	//发布MD5值错误

#define CONFIG_Cmd_Rev_Len          (HEAD_LEN + IP_ADDR + RCU_PORT + FILE_MD5 + BLOCK_NUM +CRC_LEN)
#define CONFIG_Cmd_Rev_Ip           (HEAD_LEN + FILE_MD5_BLOCK_NUM)
#define CONFIG_Cmd_Rev_Port         (HEAD_LEN + FILE_MD5_BLOCK_NUM + IP_ADDR)
#define CONFIG_Cmd_Send_Len         (HEAD_LEN + STATUS + CRC_LEN)
#define CONFIG_Cmd_Send_State       (HEAD_LEN)

#define CLOUD_IAP_Cmd                     0x68
#define CLOUD_IAP_Ready                   0x00
#define CLOUD_IAP_Finish                  0x01
#define CLOUD_IAP_Error                   0x02
#define CLOUD_IAP_Error_Block             0x03
#define CLOUD_IAP_Error_File              0x04
#define CLOUD_IAP_Error_Md5               0x05

//#define CLOUD_IAP_Cmd_Rev_Len       			(HEAD_LEN + IP_ADDR + RCU_PORT + FILE_MD5 + BLOCK_NUM + FILE_TYPE + FILE_NAME + CRC_LEN)
#define CLOUD_IAP_Cmd_Rev_Ip              (HEAD_LEN)                           		//位置  15
#define CLOUD_IAP_Cmd_Rev_Port            (CLOUD_IAP_Cmd_Rev_Ip + IP_ADDR)    		//位置	19
#define CLOUD_IAP_Cmd_Rev_Md5             (CLOUD_IAP_Cmd_Rev_Port + RCU_PORT)  		//位置	21
#define CLOUD_IAP_Cmd_Rev_Block           (CLOUD_IAP_Cmd_Rev_Md5 + FILE_MD5)  		//位置	37
#define CLOUD_IAP_Cmd_Rev_Filetype        (CLOUD_IAP_Cmd_Rev_Block + BLOCK_NUM) 	//位置	39
#define CLOUD_IAP_Cmd_Rev_Filename        (CLOUD_IAP_Cmd_Rev_Filetype + FILE_TYPE)	//位置 	40
#define CLOUD_IAP_Cmd_Send_Len            (HEAD_LEN + STATUS + RCU_SoftwareVer + FILE_TYPE + CRC_LEN)
#define CLOUD_IAP_Cmd_Send_State          (HEAD_LEN)
#define CLOUD_IAP_Cmd_Send_SoftwareVer    (CLOUD_IAP_Cmd_Send_State + STATUS)
#define CLOUD_IAP_Cmd_Send_Filetype       (CLOUD_IAP_Cmd_Send_SoftwareVer + RCU_SoftwareVer)

#define UDP_PackData			15

#define In_Set_RoomRent_Cmd			0x0C	//设置房态
#define In_QueryTime_Cmd			0x08	//向服务器请求时间
//#define In_SyncTime_Cmf			0x0A	//同步时间
#define In_RoomState_Cmd       		0x0E 	//状态上报命令	2025-09-25 取消
#define In_DevCtr_Cmd          		0x0F	//设备控制命令，包括继电器控制和调光
#define In_SingleAirCtrl_Cmd   		0x13 	//温控器单控命令
#define In_Sys_Key_Cmd         		0x24 	//一键断电命令

#define In_SetSecretKey_Cmd			0x28	//设置MQTT密钥
#define In_ReadSecretKey_Cmd		0x29	//读取MQTT密钥

#define In_ReadRegister_Cmd			0x30	//读取映射寄存器内容 2021-07-13 新增
#define In_WriteRegister_Cmd		0x31	//设置映射寄存器内容 2021-07-13 新增
#define In_Get_RoomRent_Cmd			0x32	//向服务器获取房态信息 	2025-09-09
#define In_Reboot_Reason_Cmd		0x33	//向服务器上报重启原因	2025-09-25 增加
#define In_PeriodicReport_Cmd       0x34	//定期上报命令			2025-09-25 增加
#define In_Power_Change_Cmd			0x35	//取电状态上报  		2025-09-25 增加
#define In_DevState_Cmd				0x36	//设备状态上报			2025-09-25 增加

#define In_Read_MCUSystem_Cmd		0xB1	//读取系统参数信息
#define In_BLVIAP_Cmd				0xB2	//BLV_Cx升级命令，用于区分A系列升级流程，定义的升级命令，通过该升级命令升级文件执行的BLV_Cx系列的升级流程
#define In_BLVIAPCheck_Cmd			0xB3	//BLV_Cx升级校验命令
#define In_BLVIAPJump_Cmd			0xB4	//BLV_Cx跳转命令
#define In_BLVIAPLogic_Cmd			0xB5	//BLV_Cx升级逻辑命令，用于区分A系列升级流程，定义的逻辑升级命令，通过该命令下发BLV_Cx系列的逻辑文件
#define In_BLVIAPPlan_Cmd			0xB6	//BLV_Cx云端升级状态上报
#define In_BLVPCTest_Cmd			0xD1	//BLV-C1 PC测试设备在线状态		 2021-07-13 新增
#define In_BLVConfig_Cmd			0xD2	//BLV-C1配置信息下发 			2025-10-09 取消使用
#define In_BLVPCTestDevice_Cmd		0xD3	//BLV-C1 PC测试设备输入输出		 2021-10-26 新增
#define In_BLVFlashInfoWrite_CMD	0xD4	//BLV-C1 Flash写参数命令		2021-12-01	新增
#define In_BLVFlashInfoRead_CMD		0xD5	//BLV-C1 Flash写参数命令		2021-12-01	新增
#define In_BLVQueryTFTPIP_CMD       0xD6    //从服务器请求TFTP域名解析后的IP
#define In_BLVRpDomainCtrl_Cmd      0xD7    //定期上报域控主机状态
#define In_BLVQueryCommonState_Cmd  0xD8    //询问公共状态

#define In_BLVTFTPDomainName_Cmd    0xD9    //服务器下发设置RCU-TFTP服务器域名
#define In_BLVTFTPDataRead_Cmd      0xDA    //TFTP服务器信息读取
#define In_BLVDayNightTimeSet_Cmd   0xDB    //白天时间范围设置

#define In_SeriaNet_Cmd				0x70	//透传命令下发
#define In_SeriaNetReported_Cmd		0x71	//透传数据上报

#define WriteRegister_Cmd_Send_Len	18		//包头：15Byte+数据：1Byte+CRC：2Byte
#define BLVConfig_Cmd_Send_Len 		18		//包头：15Byte+数据：1Byte+CRC：2Byte
#define SeriaNet_Cmd_Send_Len		19		//包头：15Byte+数据：2Byte+CRC：2Byte

#define IAPPlan_State_Starting		0x01	//升级状态 - 开始下载数据
#define IAPPlan_State_Underway		0x02	//升级状态 - 下载中
#define IAPPlan_State_Checking		0x03	//升级状态 - 数据下载完成，校验中
#define IAPPlan_State_CheckSucc		0x04	//升级状态 - 校验成功,RCU升级中
#define IAPPlan_State_IAPTimeout	0x05	//升级状态 - 升级超时

#define UDP_ActSend_PowerChange_Flag	0x01	//UDP主动上报 - 取电状态变化 标志位
#define UDP_ActSend_DevState_Flag		0x02	//UDP主动上报 - 设备状态变化 标志位
#define UDP_ActSend_Periodic_Flag		0x04	//UDP主动上报 - 定期上报 标志位
#define UDP_ActSend_Reboot_Flag			0x08	//UDP主动上报 - RCU重启原因 标志位
#define UDP_ActSend_RoomState_Flag		0x10	//UDP主动上报 - 获取房态信息 标志位
#define UDP_ActSend_TimeSync_Flag		0x20	//UDP主动上报 - 时间同步 标志位
#define UDP_ActSend_Heart_Flag			0x40	//UDP主动上报 - 心跳包 标志位

/***************************************************************************************************/
//测试规划的地址，划分内存时要保证空间大小是512的倍数
//Flash升级相关存储地址
#define Flash_IAP_FEATURE_ADDRESS			0x00000000		//Flash中存放升级后APP特征区数据地址
//Flash APP存放地址 -- 这只在写入时使用，擦除Flash默认擦除0x05000 ~ 0x3FFFF		2022-06-01修改
#if (Restart_Address_EN==0x01)	//新版配置代码的启动地址为0x05000,暂时保留之前的升级，以便项目维护
#define IAP_RUN_START_PAGE_ADDRESS_FALSH 		0x05000     //程序的起始页地址 - flash	
#else
#define IAP_RUN_START_PAGE_ADDRESS_FALSH 		0x08000     //程序的起始页地址 - flash
#endif
#define IAP_RUN_END_PAGE_ADDRESS_FALSH          0x3E7FF     //程序的终止页地址 - flash
//Flash APP配置地址 -- 设备配置存在 32K 2021-07-13
#define FLASH_CONFIG_DeviceSize				240			//一个设备配置存在数据大小为240Byte
#define FLASH_CONFIG_FILE_ADDRESS			0x80000		//配置数据文件存放地址
#define FLASH_CONFIG_DataSize_ADDRESS		0x80000		//配置数据保存结束地址
#define FLASH_CONFIG_RUN_START_ADDRESS 		0x80100     //配置起始页地址 - flash					
#define FLASH_CONFIG_RUN_END_ADDRESS      	0x87FFF     //配置终止页地址 - flash
#define FLASH_Register_Start_ADDRESS		0x88000		//项目保存寄存器值 - 起始地址
#define FLASH_Register_End_ADDRESS			0x887FF		//项目保存寄存器值 - 结束地址

#define LOGIC_DataFlag						0xCC060001	//逻辑标志
#define FLASH_LOGIC_FILE_ADDRESS			0x090000
#define FLASH_LOGIC_DataFlag_ADDRESS		0x090000	//文件标志位 - 4Byte			
#define FLASH_LOGIC_DataSize_ADDRESS		0x090004	//文件长度 - 4Byte
#define FLASH_LOGIC_DataMD5_ADDRESS			0x090008	//文件MD5校验值 - 16Byte

#define FLASH_LOGIC_DataStart_ADDRESS		0x090200
#define FLASH_LOGIC_DataEnd_ADDRESS			0x0FFFFF

//SRAM升级相关存储地址
#define SRAM_IAP_APP_FILE_ADDRESS         	0x00050000    	//SRAM中存放升级APP文件的地址 - 218K
//#define SRAM_IAP_CONFIG_FILE_ADDRESS      	0x00086600    	//SRAM中存放升级CONFIG文件头的地址 - 32K 工具下发的设备存在数据，与实际的配置无关，而且没有使用，
//#define SRAM_IAP_CONFIG_DataSize_ADDRESS    0x00086600		//SRAM中存放升级CONFIG文件数据长度的地址
//#define SRAM_IAP_CONFIG_START_ADDRESS      	0x00086700    	//SRAM中存放升级CONFIG文件数据存储起始地址
//#define SRAM_IAP_CONFIG_END_ADDRESS      	0x0008E5FF  	//SRAM中存放升级CONFIG文件数据存储结束地址
#define SRAM_IAP_IP_ADDRESS					0x0008E600		//SRAM中存放升级时，所用的IP - 4Byte   	临时的UDP地址存放空间，现在同时用于透传UDP地址保存
#define SRAM_IAP_PORT_ADDRESS				0x0008E604		//SRAM中存放升级时，所用的prot - 2Byte	临时的UDP地址存放空间，现在同时用于透传UDP地址保存
#define SRAM_IAP_NET_UPGRADE_Flag_ADDRESS	0x0008E606		//SRAM中存放升级标志位 - 1Byte
#define SRAM_IAP_UPGRADE_Reply_NUM_ADDRESS	0x0008E607		//SRAM中存放升级回复计数，升级完成后，APP初始化后上报升级完成计数 - 1Byte

//SRAM逻辑配置文件下发相关存储地址 临时存放 448K 2022-04-17 本来规划空间是0x00380000 ~ 0x003FFFFF 512K，但是Flash中没有512K空间，只有448K空间
#define SRAM_IAP_LOGIC_FILE_ADDRESS				0x00390000		//SRAM中逻辑下发存放文件区域首地址

#define SRAM_IAP_LOGIC_DataFlag_ADDRESS			0x00390000	//文件标志位 - 4Byte			
#define SRAM_IAP_LOGIC_DataSize_ADDRESS			0x00390004	//文件块数 - 4Byte
#define SRAM_IAP_LOGIC_DataMD5_ADDRESS			0x00390008	//文件MD5校验值 - 16Byte

#define SRAM_IAP_LOGIC_DataStart_ADDRESS		0x00390200
#define SRAM_IAP_LOGIC_DataEnd_ADDRESS			0x003FFFFF

//项目寄存器相关定义
#define SRAM_Register_Start_ADDRESS				0x0008E900
#define SRAM_Register_End_ADDRESS				0x0008EFFF

#define	Register_OFFSET_LEN						0x0400		//当前寄存器空间长度 - 如果后面这项目寄存器数增加了，这长度也应该变化
//项目寄存器偏移地址
#define Register_NetIP_OFFSET					0x0000		//本机的IP地址 - DHCP分配成功之后，或DHCP失败之后 使用的IP地址 - PC设置MCU默认IP
#define Register_NetPort_OFFSET					0x0004		//网络通讯端口	- PC设置保存
#define Register_NetMask_OFFSET					0x0008		//子网掩码		- PC设置保存
#define Register_NetGateway_OFFSET				0x000C		//网关			- PC设置保存
#define Register_DNSServerIP_OFFSET				0x0010		//DNS服务地址	- PC设置保存
#define Register_NETMACKADDR_OFFSET				0x0014		//本机的网络MACK地址
#define Register_WebServerIP_OFFSET				0x0018		//云端服务器IP地址		- PC设置的云端IP地址
#define Register_WebServerPort_OFFSET			0x001C		//云端服务器通讯端口	- 2025-10-11 启用
#define Register_MandateExpiresTime_OFFSET		0x0020		//MCU授权到期时间 - 授权天数
#define Register_CurrentUsageTime_OFFSET		0x0024		//MCU当前时间计数
#define Register_MandateUTC_OFFSET				0x0028		//授权时间 - 保存授权时的当前UTC时间
#define Register_MandateLock_OFFSET				0x002C		//授权锁定
#define Register_NetInfo_EN_OFFSET				0x0030		//网络参数使能：DHCP使能 - 1Byte：表示DHCP使能 1Byte是否采用设置IP作为默认IP地址 - PC设置保存

#define Register_NetOfflineTime_OFFSET			0x0034		//网络离线判定时间 - 4Byte	单位：ms	2025-10-11
#define Register_ProjectCode_OFFSET				0x0038		//项目编码
#define Register_SoftwareVersion_OFFSET			0x003C		//软件版本号 - 固件版本号
#define Register_ConfigVersion_OFFSET			0x0040		//配置版本号
#define Register_RoomNumber_OFFSET				0x0044		//房号
#define Register_HouseType_OFFSET				0x0048		//房型
#define Register_RoomRent_OFFSET				0x004C		//房态信息 - 出租状态
#define Register_SeasonStatus_OFFSET			0x0050		//季节状态
#define Register_TFTPStatus_OFFSET			    0x0054		//TFTP日志标记   4Byte
#define Register_TFTPUploadTime_OFFSET			0x0058		//TFTP日志上报持续时间   	4Byte
#define Register_BLVServerDmLen_OFFSET			0x005C		//BLV服务器域名长度   		4Byte
#define Register_BLVServerDmName_OFFSET			0x0060		//BLV服务器域名				64Byte
#define Register_UDPPeriodicTime_OFFSET			0x00A0		//UDP通讯 定期上报时间间隔	4Byte	单位:ms		2025-10-11

#define Register_RoomNumNote_OFFSET				0x0100		//房号备注信息存放地址空间 - 16Byte
#define Register_RoomTypeNote_OFFSET			0x0110		//房型备注信息存放地址空间 - 16Byte
#define Register_RoomNote_OFFSET				0x0120		//房间备注信息存放地址空间 - 96Byte
#define Register_TFTPLOGPort_OFFSET             0x0180      //TFTP日志传输端口 - 2Byte				2024-04-08
#define Register_TFTPLOGTime_OFFSET             0x0182      //TFTP日志上传时间 - 2Byte				2024-04-08
#define Register_TFTPDmLens_OFFSET              0x0184      //TFTP日志服务器域名长度 - 1Byte		2024-04-08 
#define Register_TFTPDmName_OFFSET              0x0185      //TFTP日志服务器域名 - 255Byte			2024-04-08


//APP Flag
#define App_Procedure_Ready				0x66	
#define App_Procedure_Not_Ready			0x44
#define App_CRC_Size					2048		//App CRC 校验数据大小


/*APP特征区数据结构 - 512Byte*/
typedef enum{
	F_App_Check = 0x00,					//特征区数据校验和		2Byte
	F_App_Flag = 0x02,					//APP Flag标志 			1Byte
	F_App_Vendor_ID = 0x03,				//厂商编号 Vendor ID 	2Byte
	F_App_Product_ID = 0x05,			//产品编号 Product ID	2Byte
	F_App_Product_Name = 0x07,			//机型名称 				16Byte
	F_App_House_Type = 0x17,			//酒店户型				4Byte
	F_App_Version = 0x1B,				//软件版本号			4byte
	F_App_Start_Addr = 0x1F,			//APP 起始地址			4byte
	F_App_End_Addr = 0x23,				//APP 结束地址 			4Byte
	F_App_CRC_Len = 0x27,				//APP CRC Len			2Byte
	F_App_CRC = 0x29,					//APP Flash CRC 		最多471Byte
}FLASH_FEATURE_E;

/*Config配置数据结构 - 240Byte*/
typedef enum{
	F_Config_Type = 0x00,		//配置类型 0x00:设备存在 0x01:设备动作
	F_Config_DevType,			//设备类型
	F_Config_DevAddr,			//设备地址
	F_Config_DevBaud,			//设备波特率
	F_Config_DevPort,			//设备波特率
	F_Config_DevAgre,			//设备协议
	F_Config_Retain,			//保留字节 - 64Byte
	F_Config_Name = 0x46,		//设备名称 - 16Byte
	F_Config_Alias = 0x56,		//设备别名 - 16Byte
	F_Config_Remark = 0x66,		//备注 - 138Byte
}FLASH_CONFIG_E;

/******************************************************************************************************/
/*TFTP 传输LOG相关定义*/
#define TFTP_Destination_Port	69			//TFTP服务端口 
#define TFTP_LOG_Local_Port		65500		//TFTP LOG传输本地端口
#define DOMAINNAME_MAX          100         //域名最长长度

typedef struct
{
	uint16_t  Port;                        //TFTP LOG传输本地端口
	uint16_t  Time;                        //日志上报时间
	uint8_t   DN_Lens;                     //TFTP日志服务器域名长度 
	char      DomainName[DOMAINNAME_MAX];  //TFTP日志服务器域名
}__attribute__ ((__packed__))TFTP_LOG; 

typedef struct
{
	uint8_t   DN_Lens;                     //RCU 服务器域名长度 
	char      DomainName[DOMAINNAME_MAX];  //RCU 服务器域名
}__attribute__ ((__packed__))RCU_DOMAIN_T; 

/******************************************************************************************************/

#define NET_REV_LEN  530
#define dat_buf_size 128      
#define TFTP_IAP_Timeout	30000

#define TFTP_LOG_Exceed_Size	4096	//日志上报条件1 - 限定大小
#define TFTP_LOG_Exceed_Time	7200	//日志上报条件2 - 限定时间

typedef struct
{
	uint8_t  IapFileType:2;        	//升级文件类型   就两种，0是固件  1是配置 
	uint8_t  TftpStart:2;          	//tftp开始   1写   2读
	uint8_t  IapState:2;          	//升级状态   开始升级  和升级完成
	uint8_t  IapType:2;            	//升级类型
	
	uint8_t  NewIapFlag;			//新升级流程标志位 - 2022-01-05 
	
	uint8_t  IapErrFlag;         	//升级数据传输错误标志
	
	uint8_t  IapPercent;        	//升级占用的百分比   
	
	uint8_t  FtpFileNameLen;        //文件名长度

	uint8_t  FtpFileName[dat_buf_size];      //文件名	
	uint8_t  Md5[16];            	//MD5值
	
	uint16_t TFTP_Port;
	
	uint16_t BlockSize;          	//块大小
	uint16_t Write_Block;			//写入块号
	
	uint32_t FlashWriteAddress;  	//升级写入的地址
	uint32_t TotalCount;         	//文件总大小
	uint32_t WriteCount;			//文件写入大小
	
	uint32_t processing_tick;			//处理时间戳 
}__attribute__ ((__packed__))IAPVarTypeStruct;                  //升级用的一些变量

#define TFTP_DATA_LEN_MAX       517

#define TFTP_OPCODE_LEN         2
#define TFTP_BLKNUM_LEN         2

#define TFTP_DATA_PKT_HDR_LEN   (TFTP_OPCODE_LEN + TFTP_BLKNUM_LEN)
#define TFTP_ERR_PKT_HDR_LEN    (TFTP_OPCODE_LEN + TFTP_ERRCODE_LEN)
#define TFTP_ACK_PKT_LEN        (TFTP_OPCODE_LEN + TFTP_BLKNUM_LEN)
#define TFTP_DATA_PKT_LEN_MAX   (TFTP_DATA_PKT_HDR_LEN + TFTP_DATA_LEN_MAX)
#define TFTP_MAX_RETRIES        3
#define TFTP_TIMEOUT_INTERVAL   5

#define TFTP_READ_PKT_LEN       4


typedef struct
{
  uint8_t op;    /*WRQ */
	
  /* last block read */
  uint8_t data[TFTP_DATA_LEN_MAX];
  unsigned long data_len;
  /* destination ip:port */
  uint8_t to_ip[4];
  int to_port;
  /* next block number */
  int block;
  /* total number of bytes transferred */
  int tot_bytes;
  /* timer interrupt count when last packet was sent */
  /* this should be used to resend packets on timeout */
  unsigned long long last_time;
  uint8_t retry_num;
}tftp_connection_args;


enum UDP_INTERNAL_STA{
	STA_INIT = 0,
	STA_INIT_WAIT = 1,
	STA_INIT_IDLE = 2,
	STA_Realy_Upgrade = 3,
	STA_INIT_CONNECT,
	STA_LOG,
	STA_SEND_WAIT,
	STA_SEND_LOG,
	STA_SEND_RETRY,
	STA_END,
};

typedef enum {
  TFTP_RRQ = 1,
  TFTP_WRQ = 2,
  TFTP_DATA = 3,
  TFTP_ACK = 4,
  TFTP_ERROR = 5,
  TFTP_OPTION = 6,
} tftp_opcode;


extern IAPVarTypeStruct* IAPVarTypeStruct_Ptr;
extern uint8_t TFTP_LOG_sta;
extern uint32_t ProjectCode;
extern UINT8 Versions[4];
extern uint16_t sever_port;

void UDP_ADD_SoftwareVer(uint8_t *data);
void UDP_ADD_ConfigVer(uint8_t *data);
void UDP_Add_Header(uint8_t *data,uint8_t cmd,uint16_t length, uint16_t frame_no);
void UDP_Add_ServerIp(uint8_t *data);
void UDP_Add_Subnet(uint8_t *data);
void UDP_Add_Gateway(uint8_t *data);
void UDP_Add_Mac(uint8_t *data);
void UDP_Add_Model(uint8_t *data);
void UDP_Add_Port(uint8_t *data);

uint8_t Udp_Internal_Subgroup(uint8_t* data, uint16_t DataLen, uint8_t*ip, uint16_t port);
uint8_t Udp_Internal_IAP(uint8_t* data,uint16_t DataLen, uint8_t *ip,uint16_t port);
uint8_t UDP_CLOUD_IAP_Cmd(uint8_t* data,uint16_t DataLen, uint8_t *ip,uint16_t port);
uint8_t Udp_Internal_ReplyIAP(void);
void UDP_Search_Ack(void);
void UDP_Heart_Send(void);
void Udp_Internal_Reboot_Reason_Report_CMD(void);
void Udp_Internal_Power_Change_Report_CMD(void);
void Udp_Internal_GetTime_CMD(void);
void Udp_Internal_GetRoomRent_CMD(void);

uint8_t Udp_Internal_GetTime_Process(uint8_t *data, uint16_t DataLen, uint8_t *ip,uint16_t port);
uint8_t Udp_Internal_Process_Ack(uint8_t cmd,uint16_t frame_no,uint8_t *ip,uint16_t port);
uint8_t Udp_Internal_Search(uint8_t* data, uint16_t DataLen, uint8_t *ip,uint16_t port);

uint8_t Udp_Internal_PC_Testing_Reply(uint8_t *reply_data,uint16_t reply_len,uint16_t pack_frame,uint8_t *ip,uint16_t port);
uint8_t Udp_Internal_PC_Testing_Reported(uint8_t *reply_data,uint16_t reply_len,uint8_t *ip,uint16_t port);
uint8_t Udp_Internal_PC_Testing_DataDeal(uint8_t* data, uint16_t DataLen, uint8_t *ip,uint16_t port);
uint8_t Udp_Internal_BLVPCTestDevice_Process(uint8_t* data, uint16_t DataLen, uint8_t *ip,uint16_t port);


uint32_t UDP_Conversion_Baud(uint8_t data);
uint8_t UDP_Baud_Conversion_Data(uint32_t data);
uint8_t Udp_Internal_SeriaNet_Process(uint8_t* data, uint16_t DataLen, uint8_t *ip,uint16_t port);
uint8_t Udp_Internal_SeriaNet_Uploading(uint8_t port,uint32_t baud,uint32_t data_addr);
uint8_t Udp_Internal_SeriaNet_Uploading2(uint8_t port,uint32_t baud,uint8_t* data, uint16_t DataLen);
uint8_t Udp_Internal_SeriaNet_Response_Timeout(void);
uint8_t Udp_Internal_Set_MQTT_SecretKey_Process(uint8_t* data, uint16_t DataLen, uint8_t *ip,uint16_t port);
uint8_t Udp_Internal_Read_MQTT_SecretKey_Process(uint8_t* data, uint16_t DataLen, uint8_t *ip,uint16_t port);
uint8_t Udp_Internal_Write_FlashInfo_Process(uint8_t* data, uint16_t DataLen, uint8_t *ip,uint16_t port);
uint8_t Udp_Internal_Read_FlashInfo_Process(uint8_t* data, uint16_t DataLen, uint8_t *ip,uint16_t port);

void Udp_Internal_Analysis(UINT8 *data, UINT32 len, uint8_t* ip, uint16_t port);

uint8_t Udp_Internal_BLVIAP(uint8_t* data,uint16_t DataLen, uint8_t *ip,uint16_t port);
uint8_t Udp_Internal_BLVIAPCheck_Process(uint8_t* data,uint16_t DataLen, uint8_t *ip,uint16_t port);
uint8_t Udp_Internal_BLVIAPJUMP_Process(uint8_t* data,uint16_t DataLen, uint8_t *ip,uint16_t port);


void TFTP_CMD_Analysis(UINT8 *data, UINT32 len, uint8_t* ip, uint16_t port);
void TFTP_FILE_Analysis(UINT8 *data, UINT32 len, uint8_t* ip, uint16_t port);
void Udp_Internal_Task(void);

#endif
