#ifndef _PC_DEVICE_TEST_FUN_H_
#define _PC_DEVICE_TEST_FUN_H_

#include "stdint.h"

#define PCTESTTYPE			0xF2			//设备协议 - 这设备类型只用与通讯协议使用
#define DEV_PCTEST_TYPE		0xF2			//用于设备列表中的设备类型
#define DEV_PCTEST_Addr		0xFC			//用于设备列表中的设备地址

#define BLV_PC_TEST_SearchMCU_CMD			0x01		//搜索主机
#define BLV_PC_TEST_SyncTime_CMD			0x02		//同步主机时间
#define BLV_PC_TEST_QueryTime_CMD			0x03		//查询主机时间
#define BLV_PC_TEST_ConfigInfo_CMD			0x04		//配置信息下发 - 下发设备存在信息
#define BLV_PC_TEST_ReadRegister_CMD		0x05		//读取映射寄存器内容
#define BLV_PC_TEST_WriteRegister_CMD		0x06		//写映射寄存器内容
#define BLV_PC_TEST_StartTesting_CMD		0x07		//开启设备测试
#define BLV_PC_TEST_SetBaud_CMD				0x08		//设置PC端口进入
#define BLV_PC_SET_DEBUG_CMD				0x09		//设置串口0 - Debug调试输出信息
#define BLV_PC_TEST_GPIO_CMD				0x0A		//设置GPIO输出
#define	BLV_PC_SET_MCU_Revision_CMD			0x0B		//设置MCU版本号保存在Flash中
#define BLV_PC_READ_MCU_Revision_CMD		0x0C		//读取MCU版本号
#define BLV_PC_SET_MQTT_CMD		            0x0D		//设置MQTT参数
#define BLV_PC_READ_MQTT_CMD		        0x0E		//读取MQTT参数
#define BLV_PC_CORE_TEST_CMD				0x0F		//开启模块测试
#define BLV_PC_READ_RCU_Data_CMD			0x10		//读取RCU数据 - 2022-06-06 新增
#define BLV_PC_READ_Device_Data_CMD         0x21        //读取设备信息
#define BLV_PC_READ_RCU_VERSION_CMD         0x22        //读取主机版本信息（固件，laucher，配置）

#define BLV_PC_TEST_SearchMCU_Relay			0x11		//回复搜索主机
#define BLV_PC_TEST_SyncTime_Relay			0x12		//回复同步主机时间
#define BLV_PC_TEST_QueryTime_Relay			0x13		//回复查询主机时间
#define BLV_PC_TEST_ConfigInfo_Relay		0x14		//回复配置信息下发 - 下发设备存在信息
#define BLV_PC_TEST_ReadRegister_Relay		0x15		//回复读取映射寄存器内容
#define BLV_PC_TEST_WriteRegister_Relay		0x16		//回复写映射寄存器内容
#define BLV_PC_TEST_StartTesting_Relay		0x17		//回复开启设备测试
#define BLV_PC_TEST_SetBaud_Relay			0x18		//回复设置PC端口波特率，进入配置模式+
#define BLV_PC_SET_DEBUG_Relay				0x19		//设置串口0 - Debug调试输出信息
#define BLV_PC_TEST_GPIO_Relay				0x1A		//设置GPIO输出
#define	BLV_PC_SET_MCU_Revision_Relay		0x1B		//设置MCU版本号保存在Flash中
#define BLV_PC_READ_MCU_Revision_Relay		0x1C		//读取MCU版本号
#define BLV_PC_SET_MQTT_Relay		        0x1D		//设置MQTT参数回复
#define BLV_PC_READ_MQTT_Relay		        0x1E		//读取MQTT参数回复
#define BLV_PC_CORE_TEST_Relay				0x1F		//开启模块测试回复
#define BLV_PC_READ_RCU_Data_Relay			0x20		//读取RCU数据回复 - 2022-06-06 新增
#define BLV_PC_READ_Device_Data_Relay       0x31        //读取设备信息回复 - 2024-05-22 增加
#define BLV_PC_READ_RCU_VERSION_Relay       0x32        //读取主机版本信息（固件，laucher，配置） - 2025-07-05 增加

typedef enum
{
	PRODUCTKEY_CMD = 1,    //0x01: productKey   //产品密钥				
	DEVICE_NAME_CMD,        // 0x02: deviceName   //设备名
	DEVICE_SECRET_CMD,      // 0x03: deviceSecret  //设备秘钥
	ALIYUN_PUBLISH_CMD,			//0x04: aLiYun_publish    //阿里云发布会话
	ALIYUN_SUBLISH_CMD,			//0x05: aLiYun_sublish    //阿里云订阅会话
	KEEPALIVE_CMD,          // 0x06: keepAlive    //保持在线时间
	PUBLISH_CMD,            // 0x07: publish      //发布会话
	SUBLISH_CMD,            // 0x08: sublish      //订阅会话
	DOMAINNAME_CMD,         // 0x09: domainName   //域名
	CLIENT_ID_CMD,          // 0x0A: clientId    //客户端ID
	USERNAME_CMD,           // 0x0B: userName    //用户名
	PASSWORD_CMD,           // 0x0C: password    //密码
	CMD_END,                //结束
}MQTT_CMD;

/*
Flash中保存的MCU版本以及主板版本，UDP网络升级使用
	主要功能：PC端升级使用用于与HEX文件型号进行对比，只能通过串口设置，UDP只能查询
*/
#define FLASH_MCU_Model_Revision_ADDRESS		0x8A000		//MCU版本型号		64Byte
#define FLASH_MCU_Control_Revision_ADDRESS		0x8A040		//MCU中控版本型号	64Byte
#define FLASH_MCU_MQTT_START_ADDRESS	      	0x8A080		//MCU中MQTT参数 12+65+33+65+65+2+65+65+65+65+65+65=632
//#define FLASH_MCU_BLE_START_ADDRESS	        	0x8A2C0		//MCU中BLE参数 

/*MQTT Flash中存储偏移地址*/
#define FLASH_MQTTINFO_ProductKey_OFFSET		0x0000	//阿里云产品密钥 - 12Byte
#define FLASH_MQTTINFO_DeviceName_OFFSET		0x000C	//阿里云设备名	 - 65Byte	
#define FLASH_MQTTINFO_DeviceSecret_OFFSET		0x004D	//阿里云设备密钥 - 33Byte
#define FLASH_MQTTINFO_ALiYunPublish_OFFSET		0x006E	//阿里云发布会话 - 65Byte
#define FLASH_MQTTINFO_ALiYunSublish_OFFSET		0x00AF	//阿里云订阅会话 - 65Byte
#define FLASH_MQTTINFO_KeepAlive_OFFSET			0x00F0	//保存在线时间	 - 2Byte
#define FLASH_MQTTINFO_Publish_OFFSET			0x00F2	//发布会话		 - 65Byte
#define FLASH_MQTTINFO_Sublish_OFFSET			0x0133	//订阅会话		 - 65Byte
#define FLASH_MQTTINFO_DomainName_OFFSET		0x0174	//域名			 - 65Byte
#define FLASH_MQTTINFO_ClientId_OFFSET			0x01B5	//客户端ID		 - 65Byte
#define FLASH_MQTTINFO_UserName_OFFSET			0x01F6	//用户名		 - 65Byte
#define FLASH_MQTTINFO_PassWord_OFFSET			0x0237	//密码			 - 65Byte
#define FLASH_MQTTINFO_END_OFFSET				0x0280	//结束地址

#define FLASH_MCU_ProductKey_ADDRESS			0x8A300		//MCU中产品密钥 - 64Byte UDP服务器使用,通过网络下发命令设置该参数 2022/04/06


typedef struct{
	
	uint8_t 	DevSendSN;		//发送SN号
	uint8_t 	link_port;		//PC 连接端口
	uint8_t 	link_flag;		//PC 连接标志位
	uint8_t 	test_flag;		//PC 测试标志位 - 0x01输入测试，0x02输出测试,0x03巡回测试
	uint8_t 	test_dev;		//PC 测试设备
	uint8_t 	test_addr;		//PC 测试设备地址
	
	uint8_t 	tour_num;		//巡回次数
	uint8_t		tour_succ;		//巡回成功次数
	
	uint8_t 	pc_ip[4];		//PC的IP地址
	uint16_t	pc_port;		//PC的端口
	
	uint32_t 	tour_tick;		//巡回测试时间戳
	uint32_t 	core_tick;		//模块测试时间戳
	uint32_t 	link_baud;		//PC 通讯波特率

	
}__attribute__ ((packed)) PC_TEST_FLAG_G;


typedef struct
{
	uint8_t		DevSendCnt;		//设备发送计数   计数达到重发次数都没有回复，判为离线
	uint8_t 	DevOffline;     //设备离线标志 1，设备离线   0，设备在线
	uint8_t 	DevSendSN;		//发送SN号
	
	uint8_t 	test_flag;		//PC 测试标志位 - 0x01输入测试，0x02输出测试
	uint32_t 	test_time;		//PC 输入检测时间
	uint32_t	test_tick;		//PC 输入检测时间戳
	uint8_t 	send_flag;
	
	
}__attribute__ ((packed)) PC_TEST_DEVICE_INFO;

extern PC_TEST_FLAG_G g_pc_test;

void BLV_PC_DEVICE_TEST_Init(void);
uint8_t BLV_PC_DEVICE_TEST_Cycle_Call(uint32_t dev_addr);
uint8_t BLV_PC_DEVICE_TEST_Data_Processing(uint32_t dev_addr,uint32_t data_addr,uint16_t len);
uint8_t BLV_PC_ReadRegister_DataDeal(uint32_t data_addr,uint16_t len);
uint8_t BLV_PC_WriteRegister_DataDeal(uint32_t data_addr,uint16_t len);
uint8_t BLV_PC_Testing_DataDeal(uint32_t data_addr,uint16_t len);
uint8_t BLV_PC_Testing_Data_Reported(uint8_t type,uint8_t dev_type,uint8_t dev_addr,uint32_t data_addr,uint8_t data_len);
uint8_t BLV_PC_Testing_Data_Reported2(uint8_t type,uint8_t dev_type,uint8_t dev_addr,uint8_t *data_buff,uint8_t data_len);
uint8_t BLV_PC_TEST_TOUR_DATASEND(void);
uint8_t BLV_PC_TEST_TOUR_DATASEND2(void);
uint8_t BLV_PC_TEST_TOUR_DATACheck(uint32_t data_addr,uint16_t len);
uint8_t BLV_PC_TEST_TOUR_ACKSend(uint8_t ack_data);
uint8_t BLV_PC_SET_MCU_Revision_Data_Reported(uint32_t data_addr,uint8_t data_len);
uint8_t BLV_PC_READ_MCU_Revision_Data_Reported(uint32_t data_addr,uint8_t data_len);
uint8_t BLV_PC_CORE_TEST_Data_Reported(void);
uint8_t BLV_PC_READ_RCU_Data_Reported(uint32_t data_addr,uint8_t data_len);

uint8_t BLV_PC_SET_MQTT_Reported(uint32_t data_addr,uint8_t data_len);
uint8_t BLV_PC_READ_MQTT_Reported(uint32_t data_addr,uint8_t data_len);

void BLV_CORE_TEST_Process(void);
uint8_t BLV_C1_TestData_Process(void);
uint8_t BLV_C1F_TestData_Process(void);
uint8_t BLV_C1_TEST_DATA_Processing(uint32_t data_addr,uint16_t len);

uint8_t SyncTime_DATA_Processing(uint32_t data_addr,uint16_t data_len);
uint16_t QueryTime_Relay_DATA_Packaging(uint32_t data_addr,uint16_t data_len);
uint8_t TEST_GPIO_DATA_Processing(uint32_t data_addr,uint16_t data_len);
uint8_t TEST_GPIO_Relay_Fail(void);
//uint8_t TEST_C12Dimming_Relay(uint8_t state, uint8_t reason);
void Test_GPIO_Init(void);
uint8_t Test_Gpio_Control(uint8_t pin,uint8_t status);
uint8_t C1F_Test_Gpio_Control(uint8_t pin,uint8_t status);

uint8_t BLV_PC_READ_Device_Data_Reported(uint32_t data_addr,uint8_t data_len);
uint8_t BLV_PC_READ_RCU_VERSION_Reported(uint32_t data_addr,uint8_t data_len);

#endif
