1518 lines
59 KiB
C
1518 lines
59 KiB
C
/*
|
||
* BLV_NETCOMM_Function.c
|
||
*
|
||
* Created on: Nov 3, 2025
|
||
* Author: cc
|
||
*/
|
||
#include "includes.h"
|
||
#include <string.h>
|
||
|
||
uint8_t Global_Large_Buff[1100] = {0}; //用于套接字通讯组包、读写外部SRAM映射寄存器
|
||
uint32_t ProjectCode = 1001; //模拟项目编码
|
||
uint8_t Versions[4] = {0,0,0,0}; //模拟配置版本
|
||
|
||
/*******************************************************************************
|
||
* Function Name : UDP_Add_Header
|
||
* Description : 添加宝来威 - 通讯协议头
|
||
* Input :
|
||
* data - 需要添加的数组
|
||
* cmd - 通讯命令
|
||
* length - 通讯长度
|
||
* frame_no - 通讯帧号
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t UDP_Add_Header(uint8_t *data,uint8_t cmd,uint16_t length, uint16_t frame_no)
|
||
{
|
||
uint8_t len = 0x00;
|
||
|
||
data[len++] = 0xAA;
|
||
data[len++] = 0x55;
|
||
data[len++] = length%256;
|
||
data[len++] = length/256;
|
||
data[len++] = 'T';
|
||
data[len++] = '3';
|
||
data[len++] = 'S';
|
||
data[len++] = 'A';
|
||
data[len++] = cmd;
|
||
data[len++] = frame_no%256;
|
||
data[len++] = frame_no/256;
|
||
data[len++] = ProjectCode%256;
|
||
data[len++] = ProjectCode/256;
|
||
|
||
data[len++] = g_netinfo.device_ip[2]; //本机ip
|
||
data[len++] = g_netinfo.device_ip[3];
|
||
|
||
return len;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : UDP_ADD_SoftwareVer
|
||
* Description : 添加软件版本号
|
||
* Input :
|
||
* data - 需要添加的数组
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t UDP_ADD_SoftwareVer(uint8_t *data)
|
||
{
|
||
uint8_t len = strlen(SoftwareVer);
|
||
if(len > RCU_SoftwareVer) len = RCU_SoftwareVer; //防止版本号溢出死机
|
||
|
||
memcpy(data,SoftwareVer,len); //RCU_SoftwareVer
|
||
return len;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : UDP_ADD_ConfigVer
|
||
* Description : 添加逻辑配置版本号
|
||
* Input :
|
||
* data - 需要添加的数组
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t UDP_ADD_ConfigVer(uint8_t *data)
|
||
{
|
||
//上电启动时,有赋值给Versions数组 添加配置版本
|
||
data[0] = Versions[0];
|
||
data[1] = Versions[1];
|
||
data[2] = Versions[2];
|
||
|
||
return 0x03;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : UDP_Add_ServerIp
|
||
* Description : 添加服务器IP地址
|
||
* Input :
|
||
* data - 需要添加的数组
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t UDP_Add_ServerIp(uint8_t *data)
|
||
{
|
||
//上电启动时,有赋值给Versions数组 添加配置版本
|
||
data[0] = server_info.dis_ip[0];
|
||
data[1] = server_info.dis_ip[1];
|
||
data[2] = server_info.dis_ip[2];
|
||
data[3] = server_info.dis_ip[3];
|
||
|
||
return 0x04;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : UDP_Add_ServerPort
|
||
* Description : 添加服务器通讯端口
|
||
* Input :
|
||
* data - 需要添加的数组
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t UDP_Add_ServerPort(uint8_t *data)
|
||
{
|
||
//上电启动时,有赋值给Versions数组 添加配置版本
|
||
data[0] = server_info.dis_port & 0xFF;
|
||
data[1] = (server_info.dis_port >> 8) & 0xFF;
|
||
|
||
return 0x02;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : UDP_Add_Subnet
|
||
* Description : 添加子网掩码
|
||
* Input :
|
||
* data - 需要添加的数组
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t UDP_Add_Subnet(uint8_t *data)
|
||
{
|
||
//上电启动时,有赋值给Versions数组 添加配置版本
|
||
data[0] = g_netinfo.subnet[0];
|
||
data[1] = g_netinfo.subnet[1];
|
||
data[2] = g_netinfo.subnet[2];
|
||
data[3] = g_netinfo.subnet[3];
|
||
|
||
return 0x04;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : UDP_Add_Gateway
|
||
* Description : 添加网关
|
||
* Input :
|
||
* data - 需要添加的数组
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t UDP_Add_Gateway(uint8_t *data)
|
||
{
|
||
//上电启动时,有赋值给Versions数组 添加配置版本
|
||
data[0] = g_netinfo.gateway[0];
|
||
data[1] = g_netinfo.gateway[1];
|
||
data[2] = g_netinfo.gateway[2];
|
||
data[3] = g_netinfo.gateway[3];
|
||
|
||
return 0x04;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : UDP_Add_Mac
|
||
* Description : 添加MAC地址
|
||
* Input :
|
||
* data - 需要添加的数组
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t UDP_Add_Mac(uint8_t *data)
|
||
{
|
||
//上电启动时,有赋值给Versions数组 添加配置版本
|
||
data[0] = g_netinfo.mac_addr[0];
|
||
data[1] = g_netinfo.mac_addr[1];
|
||
data[2] = g_netinfo.mac_addr[2];
|
||
data[3] = g_netinfo.mac_addr[3];
|
||
data[4] = g_netinfo.mac_addr[4];
|
||
data[5] = g_netinfo.mac_addr[5];
|
||
|
||
return 0x06;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : UDP_Search_Ack
|
||
* Description : 主机向服务器发送注册函数
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t UDP_Search_Ack(void)
|
||
{
|
||
uint32_t sendlen = BLV_UDP_HEAD_LEN;
|
||
uint8_t rev = 0;
|
||
|
||
memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
|
||
|
||
//处理要返回的数据帧
|
||
sendlen += UDP_Add_ServerIp(&Global_Large_Buff[BLV_UDP_HEAD_LEN]); //添加服务器IP地址
|
||
sendlen += UDP_Add_Subnet(&Global_Large_Buff[sendlen]); //添加子网掩码
|
||
sendlen += UDP_Add_Gateway(&Global_Large_Buff[sendlen]); //添加网关
|
||
sendlen += UDP_Add_ServerPort(&Global_Large_Buff[sendlen]); //添加RCU端口
|
||
sendlen += UDP_Add_Mac(&Global_Large_Buff[sendlen]); //添加Mac
|
||
sendlen += UDP_ADD_SoftwareVer(&Global_Large_Buff[sendlen]); //添加固件版本
|
||
sendlen += UDP_ADD_ConfigVer(&Global_Large_Buff[sendlen]); //添加配置版本
|
||
|
||
Global_Large_Buff[sendlen++] = g_netinfo.dns_server_ip[0];
|
||
Global_Large_Buff[sendlen++] = g_netinfo.dns_server_ip[1];
|
||
Global_Large_Buff[sendlen++] = g_netinfo.dns_server_ip[2];
|
||
Global_Large_Buff[sendlen++] = g_netinfo.dns_server_ip[3];
|
||
SRAM_DMA_Read_Buff(&Global_Large_Buff[sendlen],16,SRAM_Register_Start_ADDRESS + Register_RoomTypeNote_OFFSET);
|
||
sendlen += 16;
|
||
SRAM_DMA_Read_Buff(&Global_Large_Buff[sendlen],16,SRAM_Register_Start_ADDRESS + Register_RoomNumNote_OFFSET);
|
||
sendlen += 16;
|
||
SRAM_DMA_Read_Buff(&Global_Large_Buff[sendlen],4,SRAM_Register_Start_ADDRESS + Register_HouseType_OFFSET);
|
||
sendlen += 4;
|
||
SRAM_DMA_Read_Buff(&Global_Large_Buff[sendlen],4,SRAM_Register_Start_ADDRESS + Register_RoomNumber_OFFSET);
|
||
sendlen += 4;
|
||
|
||
sendlen += 2; //先添加CRC16 数据长度2Byte
|
||
UDP_Add_Header(Global_Large_Buff,Search_Cmd,sendlen,0xffff); //添加头部
|
||
NetCRC16(&Global_Large_Buff[0],sendlen);
|
||
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"SocketId:%d , IP:%d.%d.%d.%d , port:%d",g_netinfo.SocketId[SocketIdnex_BLVSeriver],server_info.dis_ip[0],server_info.dis_ip[1],server_info.dis_ip[2],server_info.dis_ip[3],server_info.dis_port);
|
||
|
||
rev = WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &Global_Large_Buff[0], &sendlen, server_info.dis_ip, server_info.dis_port);
|
||
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s rev:%d",__func__,rev);
|
||
|
||
LOG_NET_COMM_Send_Record(0x01,server_info.dis_ip,server_info.dis_port,&Global_Large_Buff[0],sendlen);
|
||
|
||
return rev;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : UDP_Heart_Send
|
||
* Description : 主机向服务器发送心跳包 函数
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t UDP_Heart_Send(void)
|
||
{
|
||
uint32_t sendlen = 0x00;
|
||
uint8_t rev = 0;
|
||
|
||
if((server_info.frame_no < 0xfffe) && (server_info.frame_no >= 0x8000))
|
||
{
|
||
server_info.frame_no++;
|
||
}else{
|
||
server_info.frame_no = 0x8000;
|
||
}
|
||
|
||
memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
|
||
|
||
sendlen = SocketIdnex_BLVSeriver;
|
||
//2025-9-25 修改心跳包参数内容
|
||
Global_Large_Buff[sendlen++] = g_netinfo.mac_addr[0];
|
||
Global_Large_Buff[sendlen++] = g_netinfo.mac_addr[1];
|
||
Global_Large_Buff[sendlen++] = g_netinfo.mac_addr[2];
|
||
Global_Large_Buff[sendlen++] = g_netinfo.mac_addr[3];
|
||
Global_Large_Buff[sendlen++] = g_netinfo.mac_addr[4];
|
||
Global_Large_Buff[sendlen++] = g_netinfo.mac_addr[5];
|
||
|
||
sendlen += 0x06;
|
||
|
||
sendlen += 0x02; //添加CRC校验长度
|
||
UDP_Add_Header(Global_Large_Buff,Heart_Cmd,sendlen,server_info.frame_no); //添加头部
|
||
|
||
NetCRC16(&Global_Large_Buff[0],sendlen);
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s..",__func__);
|
||
|
||
rev = WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &Global_Large_Buff[0], &sendlen, server_info.dis_ip, server_info.dis_port);
|
||
LOG_NET_COMM_Send_Record(0x01,server_info.dis_ip,server_info.dis_port,&Global_Large_Buff[0],sendlen);
|
||
|
||
return rev;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : Udp_Internal_GetTime_Data
|
||
* Description : 向服务器获取时间
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_GetTime_CMD(void)
|
||
{
|
||
uint32_t sendlen = BLV_UDP_PACK_LEN;
|
||
uint8_t rev = 0;
|
||
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s",__func__);
|
||
|
||
memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
|
||
|
||
if(server_info.udp_retry_cnt == 0x00)
|
||
{
|
||
if((server_info.frame_no < 0xfffe) && (server_info.frame_no >= 0x8000))
|
||
{
|
||
server_info.frame_no++;
|
||
}else{
|
||
server_info.frame_no = 0x8000;
|
||
}
|
||
}
|
||
|
||
UDP_Add_Header(Global_Large_Buff,In_QueryTime_Cmd,sendlen,server_info.frame_no);
|
||
NetCRC16(&Global_Large_Buff[0],sendlen);
|
||
|
||
rev = WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &Global_Large_Buff[0], &sendlen, server_info.dis_ip, server_info.dis_port);
|
||
|
||
LOG_NET_COMM_Send_Record(0x01,server_info.dis_ip,server_info.dis_port,&Global_Large_Buff[0],sendlen);
|
||
return rev;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : Udp_Internal_GetRoomRent_CMD
|
||
* Description : 向服务器获取房态
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_GetRoomRent_CMD(void)
|
||
{
|
||
uint32_t sendlen = BLV_UDP_PACK_LEN;
|
||
uint8_t rev = 0;
|
||
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s",__func__);
|
||
|
||
memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
|
||
|
||
if(server_info.udp_retry_cnt == 0x00)
|
||
{
|
||
if((server_info.frame_no < 0xfffe) && (server_info.frame_no >= 0x8000))
|
||
{
|
||
server_info.frame_no++;
|
||
}else{
|
||
server_info.frame_no = 0x8000;
|
||
}
|
||
}
|
||
|
||
UDP_Add_Header(Global_Large_Buff,In_Get_RoomRent_Cmd,sendlen,server_info.frame_no);
|
||
NetCRC16(&Global_Large_Buff[0],sendlen);
|
||
|
||
//Dbg_Print_Buff(DBG_BIT_NET_STATUS_bit,"向服务器 获取房态请求",back_data,sendlen);
|
||
|
||
rev = WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &Global_Large_Buff[0], &sendlen, server_info.dis_ip, server_info.dis_port);
|
||
|
||
LOG_NET_COMM_Send_Record(0x01,server_info.dis_ip,server_info.dis_port,&Global_Large_Buff[0],sendlen);
|
||
return rev;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : Udp_Internal_Reboot_Reason_Report_CMD
|
||
* Description : RCU重启原因
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_Reboot_Reason_Report_CMD(void)
|
||
{
|
||
uint8_t temp_data[24] = {0};
|
||
uint32_t sendlen = 0x00;
|
||
uint8_t rev = 0;
|
||
|
||
memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
|
||
|
||
if( server_info.udp_retry_cnt == 0x00 )
|
||
{
|
||
if((server_info.frame_no < 0xfffe) && (server_info.frame_no >= 0x8000))
|
||
{
|
||
server_info.frame_no++;
|
||
}else {
|
||
server_info.frame_no = 0x8000;
|
||
}
|
||
}else {
|
||
//数据包重发中,帧号不改变
|
||
}
|
||
|
||
sendlen = BLV_UDP_HEAD_LEN;
|
||
|
||
/*Launcher版本 只有Launcher_C1F_V04 以上版本才可以读取到Launcher版本,以下版本是读取乱码 2022-08-04*/
|
||
//MCU_Flash_Read((uint8_t *)&temp_data,20,Launcher_SoftwareVer_Addr);
|
||
if(strncmp((char *)temp_data,"Launcher_",strlen("Launcher_")) == 0x00)
|
||
{
|
||
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN],temp_data,20);
|
||
}else {
|
||
/*读取不到Launcher_ 前缀的字符串默认为Launcher_C1F_V02*/
|
||
memset(temp_data,0,sizeof(temp_data));
|
||
snprintf((char *)temp_data,sizeof(temp_data),"Launcher_C1F_V02 ");
|
||
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN],temp_data,20);
|
||
}
|
||
sendlen += 20;
|
||
|
||
Global_Large_Buff[sendlen++] = SRAM_Read_DW(SRAM_LOG_RCU_Reboot_Reason) & 0xFF; //重启原因
|
||
|
||
sendlen += 0x02; //添加CRC校验长度
|
||
UDP_Add_Header(Global_Large_Buff,In_Reboot_Reason_Cmd,sendlen,server_info.frame_no);
|
||
|
||
NetCRC16(&Global_Large_Buff[0],sendlen);
|
||
|
||
//Dbg_Print_Buff(DBG_BIT_NET_STATUS_bit,"RCU重启原因: ",Global_Large_Buff,sendlen);
|
||
|
||
rev = WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &Global_Large_Buff[0], &sendlen, server_info.dis_ip, server_info.dis_port);
|
||
|
||
LOG_NET_COMM_Send_Record(0x01,server_info.dis_ip,server_info.dis_port,&Global_Large_Buff[0],sendlen);
|
||
|
||
return rev;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : Udp_Internal_Power_Change_Report_CMD
|
||
* Description : 取电变化上报
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_Power_Change_Report_CMD(void)
|
||
{
|
||
uint32_t sendlen = 0x00;
|
||
uint8_t temp_flag = 0,rev = 0;
|
||
|
||
memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
|
||
|
||
if( server_info.udp_retry_cnt == 0x00 )
|
||
{
|
||
if((server_info.frame_no < 0xfffe) && (server_info.frame_no >= 0x8000))
|
||
{
|
||
server_info.frame_no++;
|
||
}else {
|
||
server_info.frame_no = 0x8000;
|
||
}
|
||
}
|
||
|
||
temp_flag = SRAM_Read_Byte(SRAM_UDP_ELEReport_Action);
|
||
|
||
sendlen = BLV_UDP_HEAD_LEN;
|
||
if( (temp_flag & 0x01) != 0x00 )
|
||
{
|
||
Global_Large_Buff[sendlen++] = SRAM_Read_Byte(SRAM_UDP_ELEReport_EleState_Last); //取电动作
|
||
}else {
|
||
Global_Large_Buff[sendlen++] = 0x00;
|
||
}
|
||
|
||
if( (temp_flag & 0x02) != 0x00 )
|
||
{
|
||
Global_Large_Buff[sendlen++] = SRAM_Read_Byte(SRAM_UDP_ELEReport_CardState_Last); //插卡动作
|
||
}else {
|
||
Global_Large_Buff[sendlen++] = 0x00;
|
||
}
|
||
|
||
if( (temp_flag & 0x04) != 0x00 )
|
||
{
|
||
Global_Large_Buff[sendlen++] = SRAM_Read_Byte(SRAM_UDP_ELEReport_CardType_Last); //身份变化
|
||
}else {
|
||
Global_Large_Buff[sendlen++] = 0x00;
|
||
}
|
||
|
||
if( (temp_flag & 0x08) != 0x00 )
|
||
{
|
||
Global_Large_Buff[sendlen++] = SRAM_Read_Byte(SRAM_UDP_ELEReport_VirtualCard_Last); //无卡事件动作
|
||
}else {
|
||
Global_Large_Buff[sendlen++] = 0x00;
|
||
}
|
||
|
||
sendlen += 0x02; //添加CRC校验长度
|
||
UDP_Add_Header(Global_Large_Buff,In_Power_Change_Cmd,sendlen,server_info.frame_no);
|
||
|
||
NetCRC16(&Global_Large_Buff[0],sendlen);
|
||
|
||
rev = WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &Global_Large_Buff[0], &sendlen, server_info.dis_ip, server_info.dis_port);
|
||
|
||
LOG_NET_COMM_Send_Record(0x01,server_info.dis_ip,server_info.dis_port,&Global_Large_Buff[0],sendlen);
|
||
|
||
return rev;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : Find_TempDevice_List_Information
|
||
* Description : 查找到设备列表中的所有温控器,并按照数据组包
|
||
* Input :
|
||
* buff - 填充数据地址
|
||
* dev_num_max - 填充温控器最大数量
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint32_t Find_TempDevice_List_Information(uint8_t *buff,uint8_t dev_num_max)
|
||
{
|
||
uint32_t read_addr = SRAM_Device_List_Start_Addr;
|
||
uint32_t end_addr = SRAM_Read_DW(SRAM_NORMAL_Device_List_Addr);
|
||
Device_Public_Information_G BUS_Public;
|
||
RS485_TEMP_INFO Rs485Temp;
|
||
uint8_t dev_num = 0;
|
||
uint8_t data_offset = 0;
|
||
uint16_t temp_val = 0;
|
||
|
||
memset(&BUS_Public,0,sizeof(Device_Public_Information_G));
|
||
memset(&Rs485Temp,0,sizeof(RS485_TEMP_INFO));
|
||
|
||
if((end_addr < SRAM_Device_List_Start_Addr) || (end_addr > SRAM_Device_List_End_Addr)) end_addr = SRAM_Device_List_End_Addr;
|
||
|
||
for(uint32_t i=SRAM_Device_List_Start_Addr;i<end_addr;)
|
||
{
|
||
if(SRAM_Read_Byte(read_addr + Dev_Type) == DEV_RS485_TEMP)
|
||
{
|
||
if(Device_Data_Check(read_addr) == 0)
|
||
{
|
||
SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),read_addr);
|
||
SRAM_DMA_Read_Buff((uint8_t *)&Rs485Temp,sizeof(RS485_TEMP_INFO),read_addr+Dev_Privately);
|
||
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s Type:%d Addr:%d",__func__,BUS_Public.type,BUS_Public.addr);
|
||
|
||
buff[data_offset++] = BUS_Public.type; //设备类型 - 能耗检测
|
||
buff[data_offset++] = BUS_Public.addr; //设备地址 - 能耗检测 设备默认0x01
|
||
buff[data_offset++] = 0x00; //设备回路 - 空调设备默认0x00
|
||
buff[data_offset++] = 0x00; //设备回路 - 空调默认0x00
|
||
buff[data_offset++] = 0x02; //设备数据长度
|
||
//空调状态
|
||
temp_val = Dev_Temp_State_Data(Rs485Temp.TemStateLast);
|
||
buff[data_offset++] = temp_val & 0xFF;
|
||
buff[data_offset++] = (temp_val >> 8) & 0xFF;
|
||
|
||
dev_num++;
|
||
if(dev_num >= dev_num_max) return dev_num; //超出上限,直接退出
|
||
}
|
||
}
|
||
read_addr += SRAM_Device_List_Size;
|
||
i+= SRAM_Device_List_Size;
|
||
if(read_addr >= end_addr)
|
||
{
|
||
return dev_num;
|
||
}
|
||
}
|
||
|
||
return dev_num;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : Udp_Scan_Roomstate
|
||
* Description : 添加房间设备状态变化数据 - 向上报缓冲区中写入数据
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) void Udp_Addtion_Roomstate(uint8_t type,uint8_t addr,uint16_t loop,uint16_t start)
|
||
{
|
||
uint8_t len = 0x00;
|
||
uint8_t back_data[8];
|
||
uint32_t write_addr = SRAM_Read_DW(SRAM_UDP_SendData_Writeaddr),read_addr = SRAM_Read_DW(SRAM_UDP_SendData_Readaddr);
|
||
|
||
memset(back_data,0,8);
|
||
|
||
/*判断地址是否在范围内*/
|
||
if( (write_addr < SRAM_UDP_SendData_Startaddr) || (write_addr > SRAM_UDP_SendData_Endaddr) \
|
||
|| (read_addr < SRAM_UDP_SendData_Startaddr) || (read_addr > SRAM_UDP_SendData_Endaddr) )
|
||
{
|
||
write_addr = SRAM_UDP_SendData_Startaddr;
|
||
read_addr = SRAM_UDP_SendData_Startaddr;
|
||
SRAM_Write_DW(write_addr,SRAM_UDP_SendData_Writeaddr);
|
||
SRAM_Write_DW(read_addr,SRAM_UDP_SendData_Readaddr);
|
||
SRAM_Write_DW(read_addr,SRAM_UDP_SendData_Tempaddr);
|
||
}
|
||
|
||
back_data[0] = type;
|
||
back_data[1] = addr;
|
||
back_data[2] = (loop & 0xFF);
|
||
back_data[3] = ((loop >> 8) & 0xFF);
|
||
back_data[4] = (start & 0xFF);
|
||
back_data[5] = ((start >> 8) & 0xFF);
|
||
|
||
if( (write_addr + 6) > SRAM_UDP_SendData_Endaddr)
|
||
{
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s overstep_1 %08X!!!",__func__,write_addr);
|
||
len = SRAM_UDP_SendData_Endaddr - write_addr;
|
||
SRAM_DMA_Write_Buff(back_data,len,write_addr);
|
||
write_addr = SRAM_UDP_SendData_Startaddr;
|
||
SRAM_DMA_Write_Buff(&back_data[len],(6-len),write_addr);
|
||
write_addr += (6-len);
|
||
}
|
||
else{
|
||
SRAM_DMA_Write_Buff(back_data,0x06,write_addr);
|
||
write_addr += 0x06; //地址偏移
|
||
}
|
||
|
||
if(write_addr > SRAM_UDP_SendData_Endaddr)
|
||
{
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s overstep %08X!!!",__func__,write_addr);
|
||
write_addr = SRAM_UDP_SendData_Startaddr;
|
||
}
|
||
SRAM_Write_DW(write_addr,SRAM_UDP_SendData_Writeaddr);
|
||
}
|
||
|
||
|
||
/*******************************************************************************
|
||
* Function Name : Udp_Internal_Read_MCU_System_SendAck
|
||
* Description : 搜索命令 - 回复ACK数据
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_Read_MCU_System_SendAck(uint8_t *ip,uint16_t port,uint16_t frame_id)
|
||
{
|
||
UINT32 back_len = BLV_UDP_HEAD_LEN + 449 + 2; //整包数据长度
|
||
|
||
uint8_t temp_data[34] = {0};
|
||
uint8_t temp_rev = 0,rev = 0;
|
||
|
||
memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
|
||
|
||
/*数据打包*/
|
||
UDP_Add_Header(Global_Large_Buff,In_Read_MCUSystem_Cmd,back_len,frame_id); //添加头部
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN] = SRAM_Read_Byte(SRAM_Register_Start_ADDRESS + Register_NetInfo_EN_OFFSET); //IP类型 2022-12-02
|
||
|
||
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN + 1],MCU_TYPE,sizeof(MCU_TYPE)); //机型编号
|
||
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN + 17],g_netinfo.device_ip,4); //IP地址
|
||
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN + 21],server_info.dis_ip,4); //服务器IP地址
|
||
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN + 25],g_netinfo.subnet,4); //子网掩码
|
||
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN + 29],g_netinfo.gateway,4); //网关
|
||
UDP_Add_ServerPort(&Global_Large_Buff[BLV_UDP_HEAD_LEN + 33]); //MCU主机默认端口为3341
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN + 35] = 0; //后两个字节没用
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN + 36] = 0;
|
||
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN + 37],g_netinfo.dns_server_ip,4); //网关
|
||
UDP_ADD_SoftwareVer(&Global_Large_Buff[BLV_UDP_HEAD_LEN+41]); //机型编号 - 软件版本号
|
||
|
||
/*RTC时间*/
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN+61] = HEX_Conversion_To_DEC(RTC_Raw_Data.year);
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN+62] = HEX_Conversion_To_DEC(RTC_Raw_Data.month);
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN+63] = HEX_Conversion_To_DEC(RTC_Raw_Data.day);
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN+64] = HEX_Conversion_To_DEC(RTC_Raw_Data.hour);
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN+65] = HEX_Conversion_To_DEC(RTC_Raw_Data.minute);
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN+66] = HEX_Conversion_To_DEC(RTC_Raw_Data.second);
|
||
|
||
/*Launcher版本 只有Launcher_C1F_V04 以上版本才可以读取到Launcher版本,以下版本是读取乱码 2022-08-04*/
|
||
//MCU_Flash_Read((uint8_t *)&temp_data,20,Launcher_SoftwareVer_Addr);
|
||
if(strncmp((char *)temp_data,"Launcher_",strlen("Launcher_")) == 0x00)
|
||
{
|
||
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN+67],temp_data,20);
|
||
}else {
|
||
/*读取不到Launcher_ 前缀的字符串默认为Launcher_C1F_V02*/
|
||
memset(temp_data,0,sizeof(temp_data));
|
||
snprintf((char *)temp_data,sizeof(temp_data),"Launcher_C1F_V02 ");
|
||
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN+67],temp_data,20);
|
||
}
|
||
|
||
UDP_Add_Mac(&Global_Large_Buff[BLV_UDP_HEAD_LEN+87]); //MAC地址
|
||
SRAM_DMA_Read_Buff(&Global_Large_Buff[BLV_UDP_HEAD_LEN+93],4,SRAM_Register_Start_ADDRESS + Register_ProjectCode_OFFSET); //项目编码
|
||
SRAM_DMA_Read_Buff(&Global_Large_Buff[BLV_UDP_HEAD_LEN+97],4,SRAM_Register_Start_ADDRESS + Register_RoomNumber_OFFSET);
|
||
SRAM_DMA_Read_Buff(&Global_Large_Buff[BLV_UDP_HEAD_LEN+101],4,SRAM_Register_Start_ADDRESS + Register_HouseType_OFFSET);
|
||
SRAM_DMA_Read_Buff(&Global_Large_Buff[BLV_UDP_HEAD_LEN+105],4,SRAM_Register_Start_ADDRESS + Register_ConfigVersion_OFFSET); //配置软件版本
|
||
SRAM_DMA_Read_Buff(&Global_Large_Buff[BLV_UDP_HEAD_LEN+109],4,SRAM_Register_Start_ADDRESS + Register_RoomRent_OFFSET);
|
||
SRAM_DMA_Read_Buff(&Global_Large_Buff[BLV_UDP_HEAD_LEN+113],4,SRAM_Register_Start_ADDRESS + Register_SeasonStatus_OFFSET);
|
||
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN+117] = Get_Authorize_Lock_Status(); //获取授权状态
|
||
SRAM_DMA_Read_Buff(&Global_Large_Buff[BLV_UDP_HEAD_LEN+121],4,SRAM_Register_Start_ADDRESS + Register_MandateUTC_OFFSET);
|
||
SRAM_DMA_Read_Buff(&Global_Large_Buff[BLV_UDP_HEAD_LEN+125],4,SRAM_Register_Start_ADDRESS + Register_MandateExpiresTime_OFFSET);
|
||
SRAM_DMA_Read_Buff(&Global_Large_Buff[BLV_UDP_HEAD_LEN+129],128,SRAM_Register_Start_ADDRESS + Register_RoomNumNote_OFFSET);
|
||
Flash_Read(&Global_Large_Buff[BLV_UDP_HEAD_LEN+257],64,FLASH_MCU_Model_Revision_ADDRESS);
|
||
Flash_Read(&Global_Large_Buff[BLV_UDP_HEAD_LEN+321],64,FLASH_MCU_Control_Revision_ADDRESS);
|
||
|
||
//temp_rev = Read_LogicFile_Information(0x04,(uint8_t *)&temp_data); //查询LOGIC文件中的酒店别名 - 32Byte
|
||
if(temp_rev == 0x00)
|
||
{
|
||
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN+385],temp_data,32);
|
||
}else {
|
||
memset(temp_data,0,32);
|
||
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN+385],temp_data,32);
|
||
}
|
||
//temp_rev = Read_LogicFile_Information(0x07,(uint8_t *)&temp_data); //查询LOGIC文件中的房型名称 - 32Byte
|
||
if(temp_rev == 0x00)
|
||
{
|
||
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN+417],temp_data,32);
|
||
}else {
|
||
memset(temp_data,0,32);
|
||
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN+417],temp_data,32);
|
||
}
|
||
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s ip:%d:%d:%d:%d Port:%d",__func__,ip[0],ip[1],ip[2],ip[3],port);
|
||
|
||
//数据打包
|
||
NetCRC16(&Global_Large_Buff[0],back_len);
|
||
rev = WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], Global_Large_Buff, &back_len, ip, port); //SOCK_UDPS,
|
||
LOG_NET_COMM_Send_Record(0x01,ip,port,&Global_Large_Buff[0],back_len);
|
||
|
||
return rev;
|
||
}
|
||
|
||
/*************************
|
||
**函数名:Udp_Internal_PC_Testing_Reply
|
||
**参 数:data:接受到的数据 len:长度 ip:网络地址 port:端口
|
||
**作 用:UDP网络PC测试设备输入输出回复
|
||
**返回值:
|
||
0x00:数据处理成功
|
||
0xF0:接收数据的CRC校验失败
|
||
************************/
|
||
__attribute__((section(".non_0_wait"))) 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)
|
||
{
|
||
UINT32 back_len = BLV_UDP_HEAD_LEN + reply_len + 3;
|
||
|
||
memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
|
||
|
||
|
||
UDP_Add_Header(Global_Large_Buff,In_BLVPCTestDevice_Cmd,back_len,pack_frame); //添加头部
|
||
|
||
for(uint16_t i=0;i<reply_len;i++)
|
||
{
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN+i] = reply_data[i];
|
||
}
|
||
|
||
NetCRC16(&Global_Large_Buff[0],back_len);
|
||
WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &Global_Large_Buff[0], &back_len, ip, port); //SOCK_UDPS,
|
||
|
||
return 0x00;
|
||
}
|
||
|
||
/*************************
|
||
**函数名:Udp_Internal_PC_Testing_Reply
|
||
**参 数:data:接受到的数据 len:长度 ip:网络地址 port:端口
|
||
**作 用:UDP网络PC测试设备输入输出上报
|
||
**返回值:
|
||
0x00:数据处理成功
|
||
0xF0:接收数据的CRC校验失败
|
||
************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_PC_Testing_Reported(uint8_t *reply_data,uint16_t reply_len,uint8_t *ip,uint16_t port)
|
||
{
|
||
UINT32 back_len = BLV_UDP_HEAD_LEN + reply_len + 2;
|
||
|
||
Dbg_Println(DBG_OPT_DEVICE_STATUS,"%s",__func__);
|
||
|
||
memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
|
||
|
||
if((server_info.frame_no < 0xfffe) && (server_info.frame_no >= 0x8000))
|
||
{
|
||
server_info.frame_no++;
|
||
}
|
||
else
|
||
{
|
||
server_info.frame_no = 0x8000;
|
||
}
|
||
|
||
UDP_Add_Header(Global_Large_Buff,In_BLVPCTestDevice_Cmd,back_len,server_info.frame_no); //添加头部
|
||
|
||
for(uint16_t i=0;i<reply_len;i++)
|
||
{
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN+i] = reply_data[i];
|
||
}
|
||
|
||
NetCRC16(&Global_Large_Buff[0],back_len);
|
||
WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &Global_Large_Buff[0], &back_len, ip, port); //SOCK_UDPS,
|
||
|
||
return 0x00;
|
||
}
|
||
|
||
/*************************
|
||
**函数名:Udp_Internal_PC_Testing_DataDeal
|
||
**参 数:data:接受到的数据 len:长度 ip:网络地址 port:端口
|
||
**作 用:UDP下发设备输入输出测试数据处理
|
||
**返回值:
|
||
0x00:数据处理成功
|
||
0xF0:接收数据的CRC校验失败
|
||
************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_PC_Testing_DataDeal(uint8_t* data, uint16_t DataLen, uint8_t *ip,uint16_t port)
|
||
{
|
||
uint8_t control_dev = 0,control_addr = 0,control_cmd = 0,temp = 0,temp1 = 0,temp2 = 0;
|
||
uint32_t device_listaddr = 0;
|
||
uint16_t ack_frame = 0;
|
||
uint8_t back_data[15];
|
||
uint8_t control_num = 0;
|
||
|
||
memset(back_data,0,15);
|
||
|
||
ack_frame = data[FRAME_NO_OFFSET] + (data[FRAME_NO_OFFSET+1]<<8); //帧号
|
||
|
||
control_dev = data[BLV_UDP_HEAD_LEN+1]; //控制设备类型
|
||
control_addr = data[BLV_UDP_HEAD_LEN+2]; //控制设备地址
|
||
|
||
g_pc_test.pc_ip[0] = ip[0];
|
||
g_pc_test.pc_ip[1] = ip[1];
|
||
g_pc_test.pc_ip[2] = ip[2];
|
||
g_pc_test.pc_ip[3] = ip[3];
|
||
g_pc_test.pc_port = port;
|
||
|
||
/*记录一下当前测试的设备类型及设备地址*/
|
||
g_pc_test.test_dev = control_dev;
|
||
g_pc_test.test_addr = control_addr;
|
||
|
||
device_listaddr = Find_Device_List_Information(control_dev,control_addr);
|
||
if((device_listaddr < SRAM_Device_List_Start_Addr) || (device_listaddr > SRAM_Device_List_End_Addr)) return 0xF0;
|
||
|
||
switch(control_dev)
|
||
{
|
||
case DEV_C5IO_Type: //C5IO 数据处理
|
||
control_cmd = data[BLV_UDP_HEAD_LEN+3];
|
||
if(control_cmd == BLV_C5IO_Set_Relay_CMD) //继电器控制
|
||
{
|
||
control_num = DataLen - BLV_UDP_HEAD_LEN - 2 - 4;
|
||
|
||
if(control_num >= 6) control_num = 6; //目前最长6Byte的控制数据
|
||
//Dbg_Println(DBG_OPT_DEVICE_STATUS,"NET PC Test C5IO_Control Len %d,Control_NUM:%d",DataLen,control_num);
|
||
|
||
for(uint8_t i = 0;i<control_num;i++)
|
||
{
|
||
temp = data[BLV_UDP_HEAD_LEN + 4 + i];
|
||
for(uint8_t j = 0;j<4;j++)
|
||
{
|
||
temp2 = i*4+j; //控制回路
|
||
temp1 = (temp >> j*2) & 0x03; //控制状态
|
||
if(temp1 != 0x00)
|
||
{
|
||
//Dbg_Println(DBG_BIT_NET_STATUS_bit,"PC Test C5IO_Control_RelayCH%d status:%d",temp2,temp1);
|
||
uint8_t control[6];
|
||
control[0] = Dev_Host_HVout;
|
||
control[1] = 0x00;
|
||
control[2] = temp2; //回路
|
||
control[3] = 0x00;
|
||
control[4] = temp1; //控制状态
|
||
control[5] = 0x00;
|
||
|
||
DevActionCtrl(control, 6); //继电器
|
||
}
|
||
}
|
||
}
|
||
}else if(control_cmd == BLV_C5IO_Set_Do_CMD) //DO控制
|
||
{
|
||
for(uint8_t i = 0;i<2;i++)
|
||
{
|
||
temp = data[BLV_UDP_HEAD_LEN + 4 + i];
|
||
for(uint8_t j = 0;j<4;j++)
|
||
{
|
||
temp2 = i*4+j; //控制回路
|
||
temp1 = (temp >> j*2) & 0x03; //控制状态
|
||
if(temp1 != 0x00)
|
||
{
|
||
//Dbg_Println(DBG_BIT_Debug_STATUS_bit,"PC Test C5IO_Control_DoCH%d status:%d",temp2,temp1);
|
||
BUS_C5IO_Control_Do(device_listaddr,temp2,temp1);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return 0x00;
|
||
case DEV_C5MUSIC_Type:
|
||
control_cmd = data[BLV_UDP_HEAD_LEN + 3];
|
||
if(control_cmd == BLV_C5MUSIC_Specify_Play_CMD)
|
||
{
|
||
temp = data[BLV_UDP_HEAD_LEN + 4]; //播放状态
|
||
temp1 = data[BLV_UDP_HEAD_LEN + 5]; //播放文件夹
|
||
temp2 = data[BLV_UDP_HEAD_LEN + 6]; //播放ID
|
||
|
||
//Dbg_Println(DBG_BIT_NET_STATUS_bit,"PC Test C5Music_Control dir:%d id:%d status:%d",temp1,temp2,temp);
|
||
BUS_C5MUSIC_Playback(device_listaddr,temp1,temp,temp2);
|
||
}
|
||
|
||
{
|
||
/*回复数据打包*/
|
||
uint8_t ack_buff[4] = {0};
|
||
|
||
ack_buff[0] = g_pc_test.test_flag;
|
||
ack_buff[1] = g_pc_test.test_dev;
|
||
ack_buff[2] = g_pc_test.test_addr;
|
||
ack_buff[3] = 0x01; //执行结果
|
||
|
||
Udp_Internal_PC_Testing_Reply(ack_buff,0x04,ack_frame,g_pc_test.pc_ip,g_pc_test.pc_port);
|
||
}
|
||
break;
|
||
case DEV_RS485_PWM:
|
||
|
||
control_cmd = data[BLV_UDP_HEAD_LEN + 3];
|
||
if(control_cmd == C12_SET_LIGHT_CMD)
|
||
{
|
||
temp = data[BLV_UDP_HEAD_LEN + 4]; //设置回路
|
||
temp1 = data[BLV_UDP_HEAD_LEN + 5]; //亮度值
|
||
temp2 = data[BLV_UDP_HEAD_LEN + 6]; //渐变时间
|
||
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"PC Test C12Dimming:%d light:%d fade:%d",temp1,temp2,temp);
|
||
|
||
if(temp)
|
||
{
|
||
UINT8 control[6];
|
||
control[0] = DEV_RS485_PWM;
|
||
control[1] = 0x00;
|
||
control[2] = temp-1; //回路
|
||
control[3] = 0x00;
|
||
control[4] = 0x01; //控制状态
|
||
control[5] = temp1; //亮度值
|
||
DevActionCtrl(control, 6); //继电器
|
||
}
|
||
|
||
}
|
||
break;
|
||
default: break;
|
||
}
|
||
|
||
|
||
return 0x00;
|
||
}
|
||
|
||
/*************************
|
||
**函数名:Udp_Internal_BLVPCTestDevice_Process
|
||
**参 数:data:接受到的数据 len:长度 ip:网络地址 port:端口
|
||
**作 用:BLV-C1PC下发设备输入输出测试数据处理
|
||
**返回值:
|
||
0x00:数据处理成功
|
||
0xF0:接收数据的CRC校验失败
|
||
************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_BLVPCTestDevice_Process(uint8_t* data, uint16_t DataLen, uint8_t *ip,uint16_t port)
|
||
{
|
||
/*CRC校验*/
|
||
uint16_t data_crc = data[DataLen-2] + (data[DataLen-1] << 8);
|
||
if(NetCRC16_2(data,DataLen-2) != data_crc) return 0xF0;
|
||
|
||
uint8_t temp1 = 0;
|
||
uint32_t dev_addr = 0;
|
||
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s",__func__);
|
||
|
||
dev_addr = Find_Device_List_Information(DEV_PCTEST_TYPE,DEV_PCTEST_Addr);
|
||
|
||
Device_Public_Information_G BUS_Public;
|
||
PC_TEST_DEVICE_INFO PC_Test_Info;
|
||
|
||
|
||
SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),dev_addr);
|
||
SRAM_DMA_Read_Buff((uint8_t *)&PC_Test_Info,sizeof(PC_TEST_DEVICE_INFO),dev_addr+Dev_Privately);
|
||
|
||
/*测试数据内容*/
|
||
temp1 = data[BLV_UDP_HEAD_LEN];
|
||
if(temp1 == 0x01) //测试输入 - 同时检测时间
|
||
{
|
||
g_pc_test.test_flag = 0x11;
|
||
|
||
g_pc_test.test_dev = data[BLV_UDP_HEAD_LEN + 1]; //输入检测设备类型
|
||
g_pc_test.test_addr = data[BLV_UDP_HEAD_LEN + 2]; //输入检测设备地址
|
||
PC_Test_Info.test_time = data[BLV_UDP_HEAD_LEN + 3]; //测试时间,单位:分钟
|
||
|
||
PC_Test_Info.test_flag = g_pc_test.test_flag;
|
||
PC_Test_Info.test_tick = SysTick_1ms;
|
||
PC_Test_Info.test_time *= 60000;
|
||
|
||
g_pc_test.pc_ip[0] = ip[0]; //2022-07-12
|
||
g_pc_test.pc_ip[1] = ip[1];
|
||
g_pc_test.pc_ip[2] = ip[2];
|
||
g_pc_test.pc_ip[3] = ip[3];
|
||
g_pc_test.pc_port = port;
|
||
}
|
||
else if(temp1 == 0x02) //测试输出
|
||
{
|
||
g_pc_test.test_flag = 0x12;
|
||
PC_Test_Info.test_flag = g_pc_test.test_flag;
|
||
PC_Test_Info.test_tick = SysTick_1ms;
|
||
PC_Test_Info.test_time = 120000;
|
||
|
||
Udp_Internal_PC_Testing_DataDeal(data,DataLen,ip,port);
|
||
}else if(temp1 == 0x03) //开启巡回测试 - 测试485端口
|
||
{
|
||
g_pc_test.test_flag = 0x13;
|
||
PC_Test_Info.test_flag = g_pc_test.test_flag;
|
||
g_pc_test.tour_num = 0;
|
||
g_pc_test.tour_succ = 0;
|
||
|
||
|
||
g_pc_test.pc_ip[0] = ip[0];
|
||
g_pc_test.pc_ip[1] = ip[1];
|
||
g_pc_test.pc_ip[2] = ip[2];
|
||
g_pc_test.pc_ip[3] = ip[3];
|
||
g_pc_test.pc_port = port;
|
||
}
|
||
|
||
BUS_Public.check = 0x00;
|
||
BUS_Public.check = DoubleData_CheckSum((uint8_t *)&BUS_Public, sizeof(Device_Public_Information_G), (uint8_t *)&PC_Test_Info, sizeof(PC_TEST_DEVICE_INFO));
|
||
SRAM_DMA_Write_Buff((uint8_t *)&BUS_Public, sizeof(Device_Public_Information_G),dev_addr);/*将数据保存*/
|
||
SRAM_DMA_Write_Buff((uint8_t *)&PC_Test_Info,sizeof(PC_TEST_DEVICE_INFO),dev_addr+Dev_Privately);
|
||
|
||
return 0x00;
|
||
}
|
||
|
||
/*************************
|
||
**函数名:UDP_Conversion_Baud
|
||
**参 数:data:接受到的数据
|
||
**作 用:将数据转换为对应的波特率
|
||
**返回值:对应的波特率
|
||
************************/
|
||
__attribute__((section(".non_0_wait"))) uint32_t UDP_Conversion_Baud(uint8_t data)
|
||
{
|
||
uint32_t baud = 0;
|
||
switch(data)
|
||
{
|
||
case 0x01:
|
||
baud = 9600;
|
||
break;
|
||
case 0x02:
|
||
baud = 14400;
|
||
break;
|
||
case 0x03:
|
||
baud = 19200;
|
||
break;
|
||
case 0x04:
|
||
baud = 38400;
|
||
break;
|
||
case 0x05:
|
||
baud = 56000;
|
||
break;
|
||
case 0x06:
|
||
baud = 57600;
|
||
break;
|
||
case 0x07:
|
||
baud = 115200;
|
||
break;
|
||
}
|
||
return baud;
|
||
}
|
||
|
||
/*************************
|
||
**函数名:UDP_Conversion_Baud
|
||
**参 数:data:接受到的数据
|
||
**作 用:将数据转换为对应的波特率
|
||
**返回值:对应的波特率
|
||
************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t UDP_Baud_Conversion_Data(uint32_t data)
|
||
{
|
||
uint8_t re_data = 0;
|
||
switch(data)
|
||
{
|
||
case 9600:
|
||
re_data = 0x01;
|
||
break;
|
||
case 14400:
|
||
re_data = 0x02;
|
||
break;
|
||
case 19200:
|
||
re_data = 0x03;
|
||
break;
|
||
case 38400:
|
||
re_data = 0x04;
|
||
break;
|
||
case 56000:
|
||
re_data = 0x05;
|
||
break;
|
||
case 57600:
|
||
re_data = 0x06;
|
||
break;
|
||
case 115200:
|
||
re_data = 0x07;
|
||
break;
|
||
}
|
||
return re_data;
|
||
}
|
||
|
||
/*************************
|
||
**函数名:Udp_Internal_SeriaNet_Process
|
||
**参 数:data:接受到的数据 len:长度 ip:网络地址 port:端口
|
||
**作 用:BLV-C1透传数据设置数据处理
|
||
**返回值:
|
||
0x00:数据处理成功
|
||
0xF0:接收数据的CRC校验失败
|
||
************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_SeriaNet_Process(uint8_t* data, uint16_t DataLen, uint8_t *ip,uint16_t port)
|
||
{
|
||
/*CRC校验*/
|
||
uint16_t data_crc = data[DataLen-2] + (data[DataLen-1] << 8);
|
||
if(NetCRC16_2(data,DataLen-2) != data_crc) return 0xF0;
|
||
|
||
uint8_t back_data[SeriaNet_Cmd_Send_Len]={0};
|
||
UINT32 sendlen = SeriaNet_Cmd_Send_Len;
|
||
uint8_t temp = 0;
|
||
uint16_t pack_frame = 0,temp_len = 0;
|
||
|
||
pack_frame = data[FRAME_NO_OFFSET] + (data[FRAME_NO_OFFSET+1]<<8); //帧号
|
||
|
||
SRAM_DMA_Write_Buff(ip,4,SRAM_IAP_IP_ADDRESS); //保存PC IP地址
|
||
SRAM_Write_Word(port,SRAM_IAP_PORT_ADDRESS); //保存PC 端口号
|
||
/*接收到透传设置命令*/
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s IP:%02X.%02X.%02X.%02X Port:%d\r\n",__func__,ip[0],ip[1],ip[2],ip[3],port);
|
||
|
||
/*透传设置处理*/
|
||
temp = data[BLV_UDP_HEAD_LEN];
|
||
switch(temp)
|
||
{
|
||
case 0x01: //透传状态查询 - 立即回复
|
||
UDP_Add_Header(back_data,In_SeriaNet_Cmd,SeriaNet_Cmd_Send_Len,pack_frame); //添加头部
|
||
back_data[BLV_UDP_HEAD_LEN] = 0x01;
|
||
|
||
if(data[BLV_UDP_HEAD_LEN+1] == 0x01) //端口1
|
||
{
|
||
back_data[BLV_UDP_HEAD_LEN+1] = Poll485_Info.port_mode;
|
||
Poll485_Info.mode_tick = SysTick_1s;
|
||
}else if(data[BLV_UDP_HEAD_LEN+1] == 0x02) //端口2
|
||
{
|
||
back_data[BLV_UDP_HEAD_LEN+1] = Act485_Info.port_mode;
|
||
Act485_Info.mode_tick = SysTick_1s;
|
||
}else if(data[BLV_UDP_HEAD_LEN+1] == 0x03) //端口3
|
||
{
|
||
back_data[BLV_UDP_HEAD_LEN+1] = BUS485_Info.port_mode;
|
||
BUS485_Info.mode_tick = SysTick_1s;
|
||
}
|
||
|
||
NetCRC16(&back_data[0],SeriaNet_Cmd_Send_Len);
|
||
WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &back_data[0], &sendlen, ip, port);
|
||
break;
|
||
case 0x02: //透传设置 - 立即回复
|
||
UDP_Add_Header(back_data,In_SeriaNet_Cmd,SeriaNet_Cmd_Send_Len,pack_frame); //添加头部
|
||
back_data[BLV_UDP_HEAD_LEN] = 0x02;
|
||
back_data[BLV_UDP_HEAD_LEN+1] = 0x01;
|
||
|
||
if(data[BLV_UDP_HEAD_LEN+1] == 0x01) //端口1
|
||
{
|
||
Poll485_Info.baud = UDP_Conversion_Baud(data[BLV_UDP_HEAD_LEN+2]); //设置的波特率
|
||
if(Poll485_Info.baud != Polling_Baud) //设置波特率
|
||
{
|
||
Poll485_Info.BaudRateCfg(Poll485_Info.baud);
|
||
}
|
||
Poll485_Info.mode_outtime = data[BLV_UDP_HEAD_LEN+3]*2; //设置模式超时时间
|
||
Poll485_Info.port_mode = data[BLV_UDP_HEAD_LEN+4]; //设置端口模式
|
||
Poll485_Info.mode_tick = SysTick_1s;
|
||
}else if(data[BLV_UDP_HEAD_LEN+1] == 0x02) //端口2
|
||
{
|
||
Act485_Info.baud = UDP_Conversion_Baud(data[BLV_UDP_HEAD_LEN+2]); //设置的波特率
|
||
if(Act485_Info.baud != Active_Baud) //设置波特率
|
||
{
|
||
Act485_Info.BaudRateCfg(Act485_Info.baud);
|
||
}
|
||
Act485_Info.mode_outtime = data[BLV_UDP_HEAD_LEN+3]*2; //设置模式超时时间
|
||
Act485_Info.port_mode = data[BLV_UDP_HEAD_LEN+4]; //设置端口模式
|
||
Act485_Info.mode_tick = SysTick_1s;
|
||
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"Act485_Info.baud:%d",Act485_Info.baud );
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"Act485_Info.pass_outtime:%d",Act485_Info.mode_outtime );
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"Act485_Info.port_mode:%d",Act485_Info.port_mode );
|
||
}else if(data[BLV_UDP_HEAD_LEN+1] == 0x03) //端口3
|
||
{
|
||
BUS485_Info.baud = UDP_Conversion_Baud(data[BLV_UDP_HEAD_LEN+2]); //设置的波特率
|
||
if(BUS485_Info.baud != Bus_Baud) //设置波特率
|
||
{
|
||
|
||
}
|
||
BUS485_Info.mode_outtime = data[BLV_UDP_HEAD_LEN+3]*2; //设置模式超时时间
|
||
BUS485_Info.port_mode = data[BLV_UDP_HEAD_LEN+4]; //设置端口模式
|
||
BUS485_Info.mode_tick = SysTick_1s;
|
||
}else {
|
||
back_data[BLV_UDP_HEAD_LEN+1] = 0x02;
|
||
}
|
||
|
||
NetCRC16(&back_data[0],SeriaNet_Cmd_Send_Len);
|
||
WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &back_data[0], &sendlen, ip, port);
|
||
break;
|
||
case 0x03: //透传数据传输 - 设备回复或设备没回复,主机回复
|
||
if(data[BLV_UDP_HEAD_LEN+1] == 0x01)
|
||
{
|
||
Poll485_Info.mode_tick = SysTick_1s;
|
||
}else if(data[BLV_UDP_HEAD_LEN+1] == 0x02)
|
||
{
|
||
Act485_Info.mode_tick = SysTick_1s;
|
||
}else if(data[BLV_UDP_HEAD_LEN+1] == 0x03)
|
||
{
|
||
BUS485_Info.mode_tick = SysTick_1s;
|
||
}
|
||
|
||
/*将透传数据放到发送缓冲区*/
|
||
temp_len = DataLen - 15 - 2 - 3;
|
||
//Dbg_Println(DBG_BIT_NET_STATUS_bit,"NET temp_len:%d ",temp_len );
|
||
Write_Uart_SendBuff(data[BLV_UDP_HEAD_LEN+1],data[BLV_UDP_HEAD_LEN+2],&data[BLV_UDP_HEAD_LEN+3],temp_len);
|
||
break;
|
||
}
|
||
|
||
return 0x00;
|
||
}
|
||
|
||
/*************************
|
||
**函数名:Udp_Internal_SeriaNet_Uploading
|
||
**参 数:data_addr:需要上报处理 - 串口数据缓冲区 前2byte字节为数据长度 - 透传数据最长为480Byte
|
||
**作 用:BLV-C1透传数据上发
|
||
**返回值:
|
||
0x00:数据处理成功
|
||
0xF0:接收数据的CRC校验失败
|
||
************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_SeriaNet_Uploading(uint8_t port,uint32_t baud,uint32_t data_addr)
|
||
{
|
||
uint8_t pc_ip[4];
|
||
uint16_t pc_port = 0;
|
||
uint32_t write_addr = data_addr;
|
||
UINT32 data_len = SRAM_Read_Word(data_addr);
|
||
|
||
if(data_len > Passthrough_DataLen_Max) data_len = Passthrough_DataLen_Max;
|
||
|
||
memset(pc_ip,0,sizeof(pc_ip));
|
||
memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
|
||
|
||
if((server_info.frame_no < 0xfffe) && (server_info.frame_no >= 0x8000))
|
||
{
|
||
server_info.frame_no++;
|
||
}
|
||
else
|
||
{
|
||
server_info.frame_no = 0x8000;
|
||
}
|
||
/*读取PC IP地址*/
|
||
SRAM_DMA_Read_Buff(pc_ip,4,SRAM_IAP_IP_ADDRESS);
|
||
pc_port = SRAM_Read_Word(SRAM_IAP_PORT_ADDRESS);
|
||
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"Udp_Internal_SeriaNet_Uploading IP:%02X.%02X.%02X.%02X Port:%d",pc_ip[0],pc_ip[1],pc_ip[2],pc_ip[3],pc_port);
|
||
|
||
write_addr = data_addr+2;
|
||
SRAM_DMA_Read_Buff(&Global_Large_Buff[BLV_UDP_HEAD_LEN + 2],data_len,write_addr);
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"Udp_Internal_SeriaNet_Uploading Len:%d",data_len);
|
||
|
||
data_len += 19; //加上包头长度15Byte及包尾CRC2Byte
|
||
/**/
|
||
UDP_Add_Header(Global_Large_Buff,In_SeriaNetReported_Cmd,data_len,server_info.frame_no); //添加头部
|
||
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN] = port; //当前数据端口号
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN + 1] = UDP_Baud_Conversion_Data(baud); //当前数据波特率
|
||
|
||
NetCRC16(&Global_Large_Buff[0],data_len);
|
||
WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &Global_Large_Buff[0], &data_len, pc_ip, pc_port);
|
||
|
||
|
||
return 0x00;
|
||
|
||
}
|
||
|
||
/*************************
|
||
**函数名:Udp_Internal_SeriaNet_Uploading
|
||
**参 数:data_addr:需要上报处理 - 串口数据缓冲区 前2byte字节为数据长度 - 透传数据最长为480Byte
|
||
**作 用:BLV-C1透传数据上发
|
||
**返回值:
|
||
0x00:数据处理成功
|
||
0xF0:接收数据的CRC校验失败
|
||
************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_SeriaNet_Uploading2(uint8_t port,uint32_t baud,uint8_t* data, uint16_t DataLen)
|
||
{
|
||
uint8_t pc_ip[4];
|
||
uint16_t pc_port = 0;
|
||
UINT32 data_len = DataLen + 19;
|
||
|
||
if(data_len > Passthrough_DataLen_Max) data_len = Passthrough_DataLen_Max;
|
||
|
||
memset(pc_ip,0,sizeof(pc_ip));
|
||
memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
|
||
|
||
if((server_info.frame_no < 0xfffe) && (server_info.frame_no >= 0x8000))
|
||
{
|
||
server_info.frame_no++;
|
||
}
|
||
else
|
||
{
|
||
server_info.frame_no = 0x8000;
|
||
}
|
||
/*读取PC IP地址*/
|
||
SRAM_DMA_Read_Buff(pc_ip,4,SRAM_IAP_IP_ADDRESS);
|
||
pc_port = SRAM_Read_Word(SRAM_IAP_PORT_ADDRESS);
|
||
|
||
|
||
UDP_Add_Header(Global_Large_Buff,In_SeriaNetReported_Cmd,data_len,server_info.frame_no); //添加头部
|
||
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN] = port; //当前数据端口号
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN + 1] = UDP_Baud_Conversion_Data(baud); //当前数据波特率
|
||
|
||
for(uint16_t i = 0;i<data_len - 19;i++)
|
||
{
|
||
Global_Large_Buff[BLV_UDP_HEAD_LEN + 2 + i] = data[i];
|
||
}
|
||
|
||
NetCRC16(&Global_Large_Buff[0],data_len);
|
||
WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &Global_Large_Buff[0], &data_len, pc_ip, pc_port);
|
||
|
||
return 0x00;
|
||
}
|
||
|
||
/*************************
|
||
**函数名:Udp_Internal_SeriaNet_Uploading
|
||
**参 数:data_addr:需要上报处理 - 串口数据缓冲区 前2byte字节为数据长度 - 透传数据最长为480Byte
|
||
**作 用:BLV-C1透传数据上发
|
||
**返回值:
|
||
0x00:数据处理成功
|
||
0xF0:接收数据的CRC校验失败
|
||
************************/
|
||
__attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_SeriaNet_Response_Timeout(void)
|
||
{
|
||
uint8_t pc_ip[4];
|
||
uint16_t pc_port = 0;
|
||
|
||
UINT32 data_len = SeriaNet_Cmd_Send_Len;
|
||
uint8_t back_data[SeriaNet_Cmd_Send_Len];
|
||
|
||
memset(pc_ip,0,sizeof(pc_ip));
|
||
memset(back_data,0,sizeof(back_data));
|
||
|
||
if((server_info.frame_no < 0xfffe) && (server_info.frame_no >= 0x8000))
|
||
{
|
||
server_info.frame_no++;
|
||
}
|
||
else
|
||
{
|
||
server_info.frame_no = 0x8000;
|
||
}
|
||
/*读取PC IP地址*/
|
||
SRAM_DMA_Read_Buff(pc_ip,4,SRAM_IAP_IP_ADDRESS);
|
||
pc_port = SRAM_Read_Word(SRAM_IAP_PORT_ADDRESS);
|
||
|
||
|
||
UDP_Add_Header(back_data,In_SeriaNet_Cmd,data_len,server_info.frame_no); //添加头部
|
||
back_data[BLV_UDP_HEAD_LEN] = 0x03; //透传回复
|
||
back_data[BLV_UDP_HEAD_LEN + 1] = 0x03; //超时状态
|
||
|
||
NetCRC16(&back_data[0],data_len);
|
||
WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &back_data[0], &data_len, pc_ip, pc_port);
|
||
|
||
|
||
return 0x00;
|
||
}
|
||
|
||
|
||
/*******************************************
|
||
* 函数名:BLV_UDP_Comm_Task
|
||
* 参 数:
|
||
* 作 用:局域网相关的任务处理
|
||
* 返回值:无
|
||
* 调用方式:主循环中调用
|
||
********************************************/
|
||
__attribute__((section(".non_0_wait"))) void BLV_UDP_Comm_Task(void)
|
||
{
|
||
static uint32_t udp_state_tick = 0;
|
||
uint32_t temp_val = 0;
|
||
|
||
/*函数主要任务 - 主动发送数据*/
|
||
if( SysTick_1ms - udp_state_tick >= 100 )
|
||
{
|
||
udp_state_tick = SysTick_1ms;
|
||
|
||
if(server_info.init_flag == 0x00) return ; //DNS解析域名失败直接退出
|
||
|
||
/*并且不再TFTP任务中*/
|
||
// if(IAPVarTypeStruct_Ptr != NULL)
|
||
// {
|
||
// if(IAPSTART == IAPVarTypeStruct_Ptr->IapState)
|
||
// {
|
||
// Dbg_Println(DBG_BIT_NET_STATUS_bit,"RoomState_Cmd暂停,IAP任务中..");
|
||
// return;
|
||
// }
|
||
// }
|
||
|
||
server_info.udp_scan_cnt++;
|
||
if(server_info.udp_scan_cnt >= 9)
|
||
{
|
||
server_info.udp_scan_cnt = 0x00;
|
||
|
||
server_info.udp_timesync_cnt++;
|
||
server_info.udp_periodic_cnt++;
|
||
|
||
//判断时间同步 - 有没有到时间
|
||
if(server_info.udp_timesync_cnt >= 7200){
|
||
server_info.udp_timesync_cnt = 0x00;
|
||
server_info.active_cmd_flag |= UDP_ActSend_TimeSync_Flag;
|
||
}
|
||
//判断定期上报 - 有没有到时间
|
||
if(server_info.udp_periodic_cnt >= server_info.udp_periodic_time){
|
||
server_info.udp_periodic_cnt = 0x00;
|
||
server_info.active_cmd_flag |= UDP_ActSend_Periodic_Flag;
|
||
}
|
||
|
||
//判断RCU启用原因标志位成不成立
|
||
if(server_info.rcu_reboot_flag == 0x01){
|
||
server_info.rcu_reboot_flag = 0x00;
|
||
|
||
server_info.active_cmd_flag |= UDP_ActSend_Reboot_Flag; //上报RCU启动原因
|
||
}
|
||
|
||
//UDP_ActSend_PowerChange_Scan_State(); //扫描取电主动上报命令
|
||
|
||
//Udp_Scan_Roomstate(); //扫描房间设备状态
|
||
}
|
||
|
||
switch(server_info.udp_sta)
|
||
{
|
||
case 0x01: //注册
|
||
if(server_info.register_flag == 0x01)
|
||
{
|
||
if(SysTick_1s - server_info.register_tick > USER_NET_Register_Timeout) //每30S 发送一次注册命令
|
||
{
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"UDP注册数据发送超时 %d",server_info.register_num);
|
||
server_info.register_tick = SysTick_1s;
|
||
server_info.register_num++;
|
||
server_info.register_flag = 0x00;
|
||
|
||
if(server_info.register_num >= USER_NET_Register_Times) server_info.init_flag = 0x00;
|
||
}
|
||
|
||
return ;
|
||
}
|
||
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"UDP注册数据发送");
|
||
UDP_Search_Ack(); //如果不在服务器就一直注册
|
||
server_info.udp_idle_tick = SysTick_1ms;
|
||
server_info.register_flag = 0x01;
|
||
server_info.register_tick = SysTick_1s;
|
||
break;
|
||
case 0x02: //判断数据包是否需要发送
|
||
|
||
/*UDP 判断是否达到空闲状态*/
|
||
if(SysTick_1ms - server_info.udp_idle_tick >= 30000)
|
||
{
|
||
server_info.udp_idle_tick = SysTick_1ms;
|
||
|
||
//发送心跳包
|
||
server_info.active_cmd_flag |= UDP_ActSend_Heart_Flag;
|
||
}
|
||
|
||
/*UDP 网络离线判断*/
|
||
if(SysTick_1ms - server_info.udp_online_tick >= server_info.udp_online_time)
|
||
{
|
||
server_info.udp_online_tick = SysTick_1ms;
|
||
|
||
server_info.init_flag = 0x00; //UDP网络离线
|
||
//LOG_SYS_Server_Comm_State_Record(RCU_NO_SERVER);
|
||
return ;
|
||
}
|
||
|
||
for(uint8_t i=0;i<7;i++)
|
||
{
|
||
if( ( server_info.active_cmd_flag & (0x01 << i) ) != 0x00 )
|
||
{
|
||
server_info.udp_send_flag = 0x01 << i;
|
||
server_info.udp_sta = 0x03;
|
||
|
||
server_info.udp_retry_cnt = 0x00;
|
||
server_info.udp_retry_time = 2000;
|
||
break;
|
||
}
|
||
}
|
||
|
||
break;
|
||
case 0x03: //数据包发送
|
||
switch(server_info.udp_send_flag)
|
||
{
|
||
case 0x01: //取断电上报 - 优先级最高
|
||
Udp_Internal_Power_Change_Report_CMD();
|
||
|
||
server_info.udp_retry_num = 0x02; //一共发送3次
|
||
server_info.udp_retry_tick = SysTick_1ms;
|
||
server_info.udp_idle_tick = SysTick_1ms;
|
||
server_info.udp_sta = 0x04; //进入发送等待
|
||
break;
|
||
case 0x02: //设备状态上报 -
|
||
//Udp_Internal_RoomState();
|
||
|
||
server_info.udp_retry_num = 0x02; //一共发送3次
|
||
server_info.udp_retry_tick = SysTick_1ms;
|
||
server_info.udp_idle_tick = SysTick_1ms;
|
||
server_info.udp_sta = 0x04; //进入发送等待
|
||
break;
|
||
case 0x04: //定期上报 - 只发送一次
|
||
//Udp_Internal_Periodic_Report_PackSend();
|
||
|
||
server_info.udp_idle_tick = SysTick_1ms;
|
||
server_info.udp_send_flag = 0x00;
|
||
server_info.active_cmd_flag &= ~UDP_ActSend_Periodic_Flag;
|
||
server_info.udp_sta = 0x02;
|
||
break;
|
||
case 0x08: //上报RCU重启原因 -
|
||
//Udp_Internal_Reboot_Reason_Report_CMD();
|
||
|
||
server_info.udp_retry_num = 0x02; //一共发送3次
|
||
server_info.udp_retry_tick = SysTick_1ms;
|
||
server_info.udp_idle_tick = SysTick_1ms;
|
||
server_info.udp_sta = 0x04; //进入发送等待
|
||
break;
|
||
case 0x10: //获取房态 -
|
||
Udp_Internal_GetRoomRent_CMD();
|
||
|
||
server_info.udp_retry_num = 0x02; //一共发送3次
|
||
server_info.udp_retry_tick = SysTick_1ms;
|
||
server_info.udp_idle_tick = SysTick_1ms;
|
||
server_info.udp_sta = 0x04; //进入发送等待
|
||
break;
|
||
case 0x20: //时间同步 -
|
||
Udp_Internal_GetTime_CMD();
|
||
|
||
server_info.udp_retry_num = 0x02; //一共发送3次
|
||
server_info.udp_retry_tick = SysTick_1ms;
|
||
server_info.udp_idle_tick = SysTick_1ms;
|
||
server_info.udp_sta = 0x04; //进入发送等待
|
||
break;
|
||
case 0x40: //心跳包 - 空闲30S 发送一次
|
||
UDP_Heart_Send();
|
||
|
||
server_info.udp_idle_tick = SysTick_1ms;
|
||
server_info.udp_send_flag = 0x00;
|
||
server_info.active_cmd_flag &= ~UDP_ActSend_Heart_Flag;
|
||
server_info.udp_sta = 0x02;
|
||
break;
|
||
default:
|
||
server_info.udp_sta = 0x02;
|
||
break;
|
||
}
|
||
return ; //发送数据完毕直接退出
|
||
|
||
case 0x04: //等待数据ACK
|
||
|
||
if(server_info.udp_send_flag == 0x00) {
|
||
server_info.udp_sta = 0x02; //接收到回复数据了,结束发送
|
||
break;
|
||
}
|
||
|
||
if( server_info.udp_retry_cnt <= server_info.udp_retry_num )
|
||
{
|
||
if( SysTick_1ms - server_info.udp_retry_tick >= server_info.udp_retry_time)
|
||
{
|
||
server_info.udp_retry_tick = SysTick_1ms;
|
||
//发送超时
|
||
|
||
server_info.udp_retry_cnt++;
|
||
if(server_info.udp_retry_cnt > server_info.udp_retry_num)
|
||
{
|
||
//数据重发已达上限,清楚发送标志位
|
||
|
||
if(server_info.udp_send_flag == 0x02) //如果是设备状态发送失败,清楚发送缓冲区内容
|
||
{
|
||
temp_val = SRAM_Read_DW(SRAM_UDP_SendData_Tempaddr);
|
||
SRAM_Write_DW(temp_val, SRAM_UDP_SendData_Readaddr); //读地址复位
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"上报设备状态失败 读:%8X",temp_val);
|
||
|
||
temp_val = SRAM_Read_DW(SRAM_DEVICE_ONLINE_STATE_TEMP_ADDR); //读临时保存的故障读取地址
|
||
SRAM_Write_DW(temp_val, SRAM_DEVICE_ONLINE_STATE_READ_ADDR); //故障读地址重新赋值
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"上报设备故障失败 读:%8X",temp_val);
|
||
}
|
||
|
||
server_info.active_cmd_flag &= ~server_info.udp_send_flag;
|
||
server_info.udp_sta = 0x02; //结束发送
|
||
}else {
|
||
server_info.udp_sta = 0x03; //数据发送
|
||
server_info.udp_retry_time += 2000;
|
||
}
|
||
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"udp_retry:%02x - %d - %d",server_info.udp_send_flag,server_info.udp_retry_cnt,server_info.udp_retry_time);
|
||
}
|
||
}else {
|
||
//数据重发已达上限,清楚发送标志位
|
||
|
||
server_info.active_cmd_flag &= ~server_info.udp_send_flag;
|
||
server_info.udp_sta = 0x02; //结束发送
|
||
}
|
||
break;
|
||
default:
|
||
server_info.udp_sta = 0x02;
|
||
break;
|
||
}
|
||
|
||
}
|
||
|
||
/*函数附带任务 - 搜索命令的被动回复 增加随机延时 随机延时采用MAC地址最后一位 * 2ms */
|
||
if(server_info.search_ack_flag == 0x01)
|
||
{
|
||
uint32_t temp_tick = 0;
|
||
|
||
temp_tick = g_netinfo.mac_addr[5];
|
||
temp_tick = temp_tick * 2;
|
||
|
||
if( SysTick_1ms - server_info.search_ack_tick >= temp_tick )
|
||
{
|
||
server_info.search_ack_tick = SysTick_1ms;
|
||
server_info.search_ack_flag = 0x00;
|
||
|
||
//Udp_Internal_Read_MCU_System_SendAck(server_info.udp_ip,server_info.local_port,server_info.ack_frame);
|
||
}
|
||
}
|
||
|
||
|
||
}
|