Files
RCU_C1P_Module/MCU_Driver/blv_netcomm_function.c
caocong d2d8800788 feat:新建项目文件
BLV主机C1P模块
2025-12-06 13:49:01 +08:00

1518 lines
59 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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);
}
}
}