Files
GPS-Navigator-/ETH/UdpServer/User/interface_etherent.c

748 lines
29 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.

/*
* eth_drive.c
*
* Created on: 2023年1月5日
* Author: Administrator
*/
#include "interface_etherent.h"
#include "interface_config.h"
#include <string.h>
#include "eth_driver.h"
#include "eth_driver.h"
//*********************************************************************
//全局变量
u8 MACAddr[6]= {0}; //MAC address
u8 IPAddr[4] = { 192, 168, 17, 30 }; //IP address
u8 GWIPAddr[4] = { 192, 168, 17, 1 }; //Gateway IP address
u8 IPMask[4] = { 255, 255, 255, 0 }; //subnet mask
u16 srcport = 8011; //source port
u16 LocalPort = 8000;
u16 DownloadPort = 7811;
u8 SocketRecvBuf0[WCHNET_NUM_TCP][RECE_BUF_LEN] = {0}; //socket receive buffer
u8 SocketRecvBuf1[RECE_BUF_LEN] = {0}; //socket receive buffer
u8 SocketRecvBuf2[RECE_BUF_LEN] = {0}; //socket receive buffer
u16 Desport = 7900;
u8 pc_ipAddr[4] = { 192, 168, 17, 2 }; //计算机IP address
u8 remote_base_ip[4] = { 192, 168, 10, 8 }; //远程基站IP address
u16 remote_port = 1008; //远程基站端口
u8 tcp_socket[WCHNET_NUM_TCP]; //Save the currently connected socket
SystemDataRecord g_systemDataRecord = {0,0,0,0};
u8 SocketId = 0;
u8 SocketId2 = 1;
u8 SocketId3 = 2;
u8 SocketId4 = 3;
u8 ETHResBuf[500] = {0};
u32 ETHUDPTxLen = 0;
uint8_t portableOcuTimeOutCnt = 0;
uint8_t remoteOcuTimeOutCnt = 0;
uint8_t OwnMasterTimCnt = 0;
uint8_t OwnMasterOnline = 0;
uint8_t portableOcuOnline = 0;
uint8_t remoteOcuOnline = 0;
Timer ethernet_timer_interface;
Timer ethernet_timer_interface1;
/*********************************************************************
* @fn mStopIfError
*
* @brief check if error.
*
* @param iError - error constants.
*
* @return none
*/
void mStopIfError(u8 iError)
{
if (iError == WCHNET_ERR_SUCCESS)
return;
printf("Error: %02X\r\n", (u16) iError);
}
/*********************************************************************
* @fn IAP_EEPROM_ERASE
*
* @brief erase Data-Flash block, minimal block is 256B
*
* @param Page_Address - the address of the page being erased.
* Length - Erased data length
*
* @return none
*/
void IAP_EEPROM_ERASE(uint32_t Page_Address, u32 Length)
{
u32 NbrOfPage, EraseCounter;
FLASH_Unlock_Fast();
NbrOfPage = Length / FLASH_PAGE_SIZE;
for (EraseCounter = 0; EraseCounter < NbrOfPage; EraseCounter++) {
FLASH_ErasePage_Fast( Page_Address + (FLASH_PAGE_SIZE * EraseCounter)); //Erase 256B
}
FLASH_Lock_Fast();
}
/*********************************************************************
* @fn IAP_EEPROM_WRITE
*
* @brief write Data-Flash data block
*
* @param StartAddr - the address of the page being written.
* Buffer - data buff
* Length - written data length
*
* @return FLASH_Status
*/
void IAP_EEPROM_WRITE( u32 StartAddr, u8 *Buffer, u32 Length )
{
u32 address = StartAddr;
u32 *p_buff = (u32 *)Buffer;
u16 pageNum = Length / FLASH_PAGE_SIZE;
u16 lastDataNum = Length % FLASH_PAGE_SIZE;
u16 i;
if(pageNum){ //write by page(256B)
FLASH_Unlock_Fast();
for(i = 0; i < pageNum; i++)
FLASH_ProgramPage_Fast((address + FLASH_PAGE_SIZE * i),(p_buff + (FLASH_PAGE_SIZE / 4) * i));
FLASH_Lock_Fast();
}
if(lastDataNum){ //write by a half word(2B)
u8 *p_buff1 = Buffer + FLASH_PAGE_SIZE * pageNum;
address = StartAddr + FLASH_PAGE_SIZE * pageNum;
FLASH_Unlock();
for(i = 0; i < lastDataNum; i += 2)
FLASH_ProgramHalfWord((address + i), *(u16 *)(p_buff1 + i));
FLASH_Lock();
}
}
/*********************************************************************
* @fn IAP_EEPROM_READ
*
* @brief read Data-Flash data block
*
* @param StartAddr - the address of the page being read.
* Buffer - data buff
* Length - read data length
*
* @return none
*/
void IAP_EEPROM_READ( u32 StartAddr, u8 *Buffer, u32 Length )
{
u32 address = StartAddr;
u32 *p_buff = (u32 *)Buffer;
while(address < (StartAddr + Length))
{
*p_buff = (*(u32 *)address);
address += 4;
p_buff++;
}
}
/*********************************************************************
* @fn WCHNET_UdpServerRecv
*
* @brief UDP Receive data function
*
*@param socinf - socket information.
* ipaddr - The IP address from which the data was sent
* port - source port
* buf - pointer to the data buffer
* len - received data length
* @return none
*/
void WCHNET_UdpServerRecv(struct _SCOK_INF *socinf, u32 ipaddr, u16 port, u8 *buf, u32 len)
{
u8 ip_addr[4];
//---------------------------------------------------------------------------------------
if((0xFF == buf[0]) && (0xBB == buf[1]))//自主计算机手动遥控器或者远程遥控器
{
portableOcuOnline = 1;
portableOcuTimeOutCnt = 0;
}
else if((0xFF == buf[0]) && (0xCC == buf[1]))//自主计算器 自动
{
portableOcuOnline = 1;
}
else if(DF_DownloadDesIPAdress == ip_addr[3])//以太网接收
{
}
else
{
}
}
/*********************************************************************
* @fn WCHNET_UdpServerRecv
*
* @brief UDP Receive data function
*
*@param socinf - socket information.
* ipaddr - The IP address from which the data was sent
* port - source port
* buf - pointer to the data buffer
* len - received data length
* @return none
*/
void WCHNET_UdpServerRecv1(struct _SCOK_INF *socinf, u32 ipaddr, u16 port, u8 *buf, u32 len)//端口8000
{
//---------------------------------------------------------------------------------------
if( (0x80 == buf[0]) && (0x00 == buf[1]) )
{
memcpy((uint8_t *)&(un_request_frame.arr[0]),buf, sizeof(UnRequestFrame));
printf("read_id = %d \r\n",request_read_id);
//20250412 保存请求者信息
for (uint8_t i = 0; i < 4; i++)
{
str_RequestMessage.ip_adesser[i] = ipaddr & 0xff;
ipaddr = ipaddr >> 8;
}
str_RequestMessage.port = port;
publishMessage(&un_request_frame, 1);
}
}
/*********************************************************************
* @fn WCHNET_UdpServerRecv
*
* @brief UDP Receive data function
*
*@param socinf - socket information.
* ipaddr - The IP address from which the data was sent
* port - source port
* buf - pointer to the data buffer
* len - received data length
* @return none
*/
void WCHNET_UdpServerRecv2(struct _SCOK_INF *socinf, u32 ipaddr, u16 port, u8 *buf, u32 len)//端口7811
{
u8 ip_addr[4];
u16 i = 0;
u32 PCLen2 = 0;
u8 ENETTxMessage[8] = {0,0,0,0,0,0,0,0};
//---------------------------------------------------------------------------------------
printf("Remote IP:");
for (i = 0; i < 4; i++) {
ip_addr[i] = ipaddr & 0xff;
printf("%d ", ip_addr[i]);
ipaddr = ipaddr >> 8;
}
printf("srcport = %d len = %d socketid = %d\r\n", port, len,
socinf->SockIndex);
if((buf[0] == 0x01) && (buf[1] == 0x0A))//接收指令进入boot然后重启 20230430增加
{
g_systemDataRecord.canBootloaderUpgrade = CAN_BOOTLOADER_UPGRADE;//设置boot标志
IAP_EEPROM_ERASE(DATA_START_ADDR, FLASH_PAGE_SIZE);
IAP_EEPROM_WRITE(DATA_START_ADDR, (uint8_t *)&g_systemDataRecord, 4);
//写入标志量
while(1)
{
NVIC_SystemReset();//重启
}
}
else if((buf[0] == 0x01) && (buf[1] == 0x01))//反馈当前状态
{
IAP_EEPROM_READ( DATA_START_ADDR, (uint8_t *)&g_systemDataRecord, 4 );
PCLen2 = 8;
ENETTxMessage[0] = 0x01;
ENETTxMessage[1] = 0x01;
ENETTxMessage[2] = 0;//主版本号,两字节
ENETTxMessage[3] = 1;
ENETTxMessage[4] = 0;//次版本号,两字节
ENETTxMessage[5] = 0;
ENETTxMessage[6] = 0;
ENETTxMessage[7] = NORMAL_ON;//1固件是Bootloader, 0:固件是APP
UdpSendToData(SocketId3,ENETTxMessage,&PCLen2,ip_addr,port);//测试
}
}
/*********************************************************************
* @fn WCHNET_CreateTcpSocket
*
* @brief Create TCP Socket
*
* @return none
*/
void WCHNET_CreateTcpSocket(void)
{
u8 i;
SOCK_INF TmpSocketInf;
memset((void *) &TmpSocketInf, 0, sizeof(SOCK_INF));
memcpy((void *) TmpSocketInf.IPAddr, remote_base_ip, 4);
TmpSocketInf.DesPort = remote_port;
TmpSocketInf.SourPort = 1008;
TmpSocketInf.ProtoType = PROTO_TYPE_TCP;
TmpSocketInf.RecvBufLen = RECE_BUF_LEN;
i = WCHNET_SocketCreat(&SocketId3, &TmpSocketInf);
printf("SocketId %d\r\n", SocketId3);
mStopIfError(i);
i = WCHNET_SocketConnect(SocketId3); //make a TCP connection
mStopIfError(i);
}
/*********************************************************************
* @fn WCHNET_CreateUdpSocket
*
* @brief Create UDP Socket
*
* @return none
*/
void WCHNET_CreateUdpSocket(void)
{
// u8 i;
SOCK_INF TmpSocketInf;
// memset((void *) &TmpSocketInf, 0, sizeof(SOCK_INF));
// TmpSocketInf.SourPort = srcport;
// TmpSocketInf.ProtoType = PROTO_TYPE_UDP;
// TmpSocketInf.RecvStartPoint = (u32) SocketRecvBuf0;
// TmpSocketInf.RecvBufLen = UDP_RECE_BUF_LEN;
// TmpSocketInf.AppCallBack = WCHNET_UdpServerRecv;
// i = WCHNET_SocketCreat(&SocketId, &TmpSocketInf);
// printf("WCHNET_SocketCreat %d\r\n", SocketId);
// mStopIfError(i);
#if KEEPALIVE_ENABLE //Configure keep alive parameters
{
struct _KEEP_CFG cfg;
cfg.KLIdle = 20000;
cfg.KLIntvl = 15000;
cfg.KLCount = 9;
WCHNET_ConfigKeepLive(&cfg);
}
#endif
memset(tcp_socket, 0xff, WCHNET_NUM_TCP);
WCHNET_CreateTcpSocket();
// memset((void *) &TmpSocketInf, 0, sizeof(SOCK_INF));
// TmpSocketInf.SourPort = srcport;
// TmpSocketInf.ProtoType = PROTO_TYPE_TCP;
// i = WCHNET_SocketCreat(&SocketId, &TmpSocketInf);
// printf("SocketIdForListen %d\r\n", SocketId);
// mStopIfError(i);
// i = WCHNET_SocketListen(SocketId); //listen for connections
// mStopIfError(i);
//
memset((void *)&TmpSocketInf, 0, sizeof(SOCK_INF));
TmpSocketInf.SourPort = LocalPort;
TmpSocketInf.ProtoType = PROTO_TYPE_UDP;
TmpSocketInf.RecvStartPoint = (u32) SocketRecvBuf1;
TmpSocketInf.RecvBufLen = RECE_BUF_LEN;
TmpSocketInf.AppCallBack = WCHNET_UdpServerRecv1;
WCHNET_SocketCreat(&SocketId2, &TmpSocketInf);
printf("WCHNET_SocketCreat %d\r\n", SocketId2);
// WCHNET_ModifyRecvBuf(SocketId, (u32)SocketRecvBuf[SocketId], RECE_BUF_LEN);
memset((void *) &TmpSocketInf, 0, sizeof(SOCK_INF));
TmpSocketInf.SourPort = DownloadPort;
TmpSocketInf.ProtoType = PROTO_TYPE_UDP;
TmpSocketInf.RecvStartPoint = (u32) SocketRecvBuf2;
TmpSocketInf.RecvBufLen = RECE_BUF_LEN;
TmpSocketInf.AppCallBack = WCHNET_UdpServerRecv2;
WCHNET_SocketCreat(&SocketId3, &TmpSocketInf);
printf("WCHNET_SocketCreat %d\r\n", SocketId3);
// mStopIfError(i);
}
/*********************************************************************
* @fn WCHNET_DataLoopback
*
* @brief Data loopback function.
*
* @param id - socket id.
*
* @return none
*/
void WCHNET_DataLoopback(u8 id)
{
#if 1
u8 i;
u32 len;
u32 endAddr = SocketInf[id].RecvStartPoint + SocketInf[id].RecvBufLen; //Receive buffer end address
if ((SocketInf[id].RecvReadPoint + SocketInf[id].RecvRemLen) > endAddr)
{ //Calculate the length of the received data
len = endAddr - SocketInf[id].RecvReadPoint;
}
else
{
len = SocketInf[id].RecvRemLen;
}
if(remote_port == SocketInf[id].DesPort)//接收数据源端口正确就认为以太网传输RTCM数据
{
memcpy(&RTCM_Buffer1.dma_buffer[RTCM_Buffer1.active_buf][0],(u8 *) SocketInf[id].RecvReadPoint,len);
RTCM_Buffer1.type = ethernet;
RTCM_Buffer1.buf_len = (uint16_t)len;
RTCM_Buffer1.active_buf ^= 1;
RTCM_Buffer1.eth_cnt ++;//累加判断
publishMessage(&RTCM_Buffer1, 1);
}
// printf("源端口: %u, 目标端口: %u\n",
// SocketInf[id].SourPort, SocketInf[id].DesPort);
// i = WCHNET_SocketSend(id, (u8 *) SocketInf[id].RecvReadPoint, &len); //send data
if (i == WCHNET_ERR_SUCCESS) {
WCHNET_SocketRecv(id, NULL, &len); //Clear sent data
}
#else
u32 len, totallen;
u8 *p = MyBuf, TransCnt = 255;
len = WCHNET_SocketRecvLen(id, NULL); //query length
printf("Receive Len = %d\r\n", len);
totallen = len;
WCHNET_SocketRecv(id, MyBuf, &len); //Read the data of the receive buffer into MyBuf
while(1){
len = totallen;
WCHNET_SocketSend(id, p, &len); //Send the data
totallen -= len; //Subtract the sent length from the total length
p += len; //offset buffer pointer
if( !--TransCnt ) break; //Timeout exit
if(totallen) continue; //If the data is not sent, continue to send
break; //After sending, exit
}
#endif
}
/*********************************************************************
* @fn WCHNET_HandleSockInt
*
* @brief Socket Interrupt Handle
*
* @param socketid - socket id.
* intstat - interrupt status
*
* @return none
*/
void WCHNET_HandleSockInt(u8 socketid, u8 intstat)
{
u8 i;
if (intstat & SINT_STAT_RECV) //receive data
{
WCHNET_DataLoopback(socketid);
}
if (intstat & SINT_STAT_CONNECT) //connect successfully
{
#if KEEPALIVE_ENABLE
WCHNET_SocketSetKeepLive(socketid, ENABLE);
#endif
WCHNET_ModifyRecvBuf(socketid, (u32) SocketRecvBuf0[socketid], RECE_BUF_LEN);
for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) {
if (tcp_socket[i] == 0xff) { //save connected socket id
tcp_socket[i] = socketid;
break;
}
}
printf("TCP Connect Success\r\n");
printf("socket id: %d\r\n",tcp_socket[i]);
}
if (intstat & SINT_STAT_DISCONNECT) //disconnect
{
for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) { //delete disconnected socket id
if (tcp_socket[i] == socketid) {
tcp_socket[i] = 0xff;
break;
}
}
printf("TCP Disconnect\r\n");
}
if (intstat & SINT_STAT_TIM_OUT) //timeout disconnect
{
for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) { //delete disconnected socket id
if (tcp_socket[i] == socketid) {
tcp_socket[i] = 0xff;
break;
}
}
printf("TCP Timeout\r\n");
WCHNET_CreateTcpSocket();
}
}
/*********************************************************************
* @fn WCHNET_HandleGlobalInt
*
* @brief Global Interrupt Handle
*
* @return none
*/
void WCHNET_HandleGlobalInt(void)
{
u8 intstat;
u16 i;
u8 socketint;
enter_critical_section();
intstat = WCHNET_GetGlobalInt(); //get global interrupt flag
if (intstat & GINT_STAT_UNREACH) //Unreachable interrupt
{
// printf("GINT_STAT_UNREACH\r\n");
}
if (intstat & GINT_STAT_IP_CONFLI) //IP conflict
{
printf("GINT_STAT_IP_CONFLI\r\n");
}
if (intstat & GINT_STAT_PHY_CHANGE) //PHY status change
{
i = WCHNET_GetPHYStatus();
if (i & PHY_Linked_Status)
printf("PHY Link Success\r\n");
}
if (intstat & GINT_STAT_SOCKET) { //socket related interrupt
for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) {
socketint = WCHNET_GetSocketInt(i);
if (socketint)
WCHNET_HandleSockInt(i, socketint);
}
}
exit_critical_section(0x00);
}
/**
* @brief UDP send, specify the target IP and target port
*
* @param socketid - socket id value
* @param *buf - Address of the sent data
* @param(in) *slen - Address of the sent length
* @param *sip - destination IP address
* @param port - destination port
*
* @param(out) *slen - actual length sent
*
* @return @ERR_T
*/
uint8_t UdpSendToData(uint8_t socketid, uint8_t *buf, uint32_t *slen, uint8_t *sip, uint16_t port)//发送数据
{
uint16_t i = 0;
//--------------------------------------------------------------
WCHNET_SocketUdpSendTo( socketid, buf, slen,sip, port);//发送
while(slen[0] != 0)//判断缓存是否空闲,空闲执行往下,否则就就等待一段时间,超时就直接跳出函数
{
i++;
if(i > DF_EthInfoWiteTime)
{
i = 0;
return DF_SEND_Fail;//发送失败
}
}
return DF_SEND_Success;
}
/*@brief 计算字节累加校验码取低8位
? @param data 待校验数据的起始地址
? @param len 数据长度(单位:字节)
? @return 校验码低8位
?*/
uint8_t CalculateChecksum(const uint8_t* data, size_t len)
{
uint32_t checksum = 0; // 使用32位变量防止溢出
for (size_t i = 0; i < len; ++i) {
checksum += data[i]; // 累加每个字节
}
return (uint8_t)(checksum & 0xFF); // 取低8位
}
// 以太网定时器信号处理函数
static void ethernetInterfaceTimerProcess(void *signal_id)
{
static u_int32_t navigation_output_len = 0;
// static u_int32_t navigation_output_len1 = 0;
//----------------------------------------------------------------------
if (signal_id == &navigation_output1)
{
navigation_outputC1.bit_data.frame_header = 0xCCAA;
navigation_outputC1.bit_data.frame_type = 0x2700;
navigation_outputC1.bit_data.frame_length = 0x4100;
navigation_outputC1.bit_data.accumulated ++;
navigation_outputC1.bit_data.time = 0X00;
navigation_outputC1.bit_data.car_speed = 0X00;
//小端转换为大端
navigation_outputC1.bit_data.gyroscope_x_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.gyroscope_x_axis);
navigation_outputC1.bit_data.gyroscope_y_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.gyroscope_y_axis);
navigation_outputC1.bit_data.gyroscope_z_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.gyroscope_z_axis);
navigation_outputC1.bit_data.acceleration_x_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.acceleration_x_axis);
navigation_outputC1.bit_data.acceleration_y_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.acceleration_y_axis);
navigation_outputC1.bit_data.acceleration_z_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.acceleration_z_axis);
navigation_outputC1.bit_data.magnetic_x_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.magnetic_x_axis);
navigation_outputC1.bit_data.magnetic_y_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.magnetic_y_axis);
navigation_outputC1.bit_data.magnetic_z_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.magnetic_z_axis);
navigation_outputC1.bit_data.lon = SWAP_ENDIAN_32(navigation_output1.bit_data.lon);
navigation_outputC1.bit_data.lat = SWAP_ENDIAN_32(navigation_output1.bit_data.lat);
navigation_outputC1.bit_data.high = SWAP_ENDIAN_32(navigation_output1.bit_data.high);
navigation_outputC1.bit_data.gps_speed = SWAP_ENDIAN_16(navigation_output1.bit_data.gps_speed);
navigation_outputC1.bit_data.dual_antenna_heading = SWAP_ENDIAN_16(navigation_output1.bit_data.dual_antenna_heading);
navigation_outputC1.bit_data.car_speed = SWAP_ENDIAN_16(navigation_output1.bit_data.car_speed);
navigation_outputC1.bit_data.time = SWAP_ENDIAN_32(navigation_output1.bit_data.time);
navigation_outputC1.bit_data.rtk_state = navigation_output1.bit_data.rtk_state;
navigation_outputC1.bit_data.crc1 = CalculateChecksum(&navigation_outputC1.arr[0],sizeof(UnInfNavigationOutputC)-1);
// for(uint8_t i = 0; i < WCHNET_NUM_TCP; i++)
// {
// if(tcp_socket[i] != 0xFF)
// {
// if(0 == navigation_output_len1)
// {
// navigation_output_len1 = sizeof(navigation_outputC1);
// }
// i = WCHNET_SocketSend(tcp_socket[i], (uint8_t *)&navigation_outputC1, &navigation_output_len1); //send data
// if (i == WCHNET_ERR_SUCCESS) {
// WCHNET_SocketRecv(tcp_socket[i], NULL, &navigation_output_len1); //Clear sent data
// }
// }
// }
}
else if (signal_id == &navigation_output2)
{
navigation_output2.bit_data.frame_header = 0xCCAA;
navigation_output2.bit_data.frame_type = 0x2700;
navigation_output2.bit_data.frame_length = 0x3100;
navigation_output2.bit_data.accumulated ++;
navigation_output2.bit_data.time = 0X00;
navigation_output2.bit_data.car_speed = 0X00;
//小端转换为大端
navigation_output2.bit_data.gyroscope_x_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.gyroscope_x_axis);
navigation_output2.bit_data.gyroscope_y_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.gyroscope_y_axis);
navigation_output2.bit_data.gyroscope_z_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.gyroscope_z_axis);
navigation_output2.bit_data.acceleration_x_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.acceleration_x_axis);
navigation_output2.bit_data.acceleration_y_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.acceleration_y_axis);
navigation_output2.bit_data.acceleration_z_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.acceleration_z_axis);
navigation_output2.bit_data.magnetic_x_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.magnetic_x_axis);
navigation_output2.bit_data.magnetic_y_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.magnetic_y_axis);
navigation_output2.bit_data.magnetic_z_axis = SWAP_ENDIAN_16(navigation_output1.bit_data.magnetic_z_axis);
navigation_output2.bit_data.lon = SWAP_ENDIAN_32(navigation_output1.bit_data.lon);
navigation_output2.bit_data.lat = SWAP_ENDIAN_32(navigation_output1.bit_data.lat);
navigation_output2.bit_data.high = SWAP_ENDIAN_32(navigation_output1.bit_data.high);
navigation_output2.bit_data.gps_speed = SWAP_ENDIAN_16(navigation_output1.bit_data.gps_speed);
navigation_output2.bit_data.dual_antenna_heading = SWAP_ENDIAN_16(navigation_output1.bit_data.dual_antenna_heading);
navigation_output2.bit_data.car_speed = SWAP_ENDIAN_16(navigation_output1.bit_data.car_speed);
navigation_output2.bit_data.time = SWAP_ENDIAN_32(navigation_output1.bit_data.time);
navigation_output2.bit_data.rtk_state = navigation_output1.bit_data.rtk_state;
navigation_output2.bit_data.crc1 = CalculateChecksum(&navigation_output2.arr[0],sizeof(UnInfNavigationOutput)-1);
if(0 == navigation_output_len)
{
navigation_output_len = sizeof(navigation_output2);
}
UdpSendToData(SocketId2, (uint8_t *)&navigation_output2, &navigation_output_len, &str_RequestMessage.ip_adesser[0],str_RequestMessage.port);//发送数据
}
else
{
}
}
void ethInterruptProcess(void *signal_id)
{
/*Ethernet library main task function,
* which needs to be called cyclically*/
WCHNET_MainTask();
/*Query the Ethernet global interrupt,
* if there is an interrupt, call the global interrupt handler*/
if(WCHNET_QueryGlobalInt())
{
WCHNET_HandleGlobalInt();
}
timerStart(&ethernet_timer_interface, 1,1); //1ms调用一次
}
void ethernetFaultProcess(void *signal_id)//以太网RTCM连接判断。
{
static uint8_t eth_cnt_last = 0;
if( (RTCM_Buffer1.eth_cnt == eth_cnt_last) && (ethernet == RTCM_Buffer1.type) )//如果数据一样且那5s就是断开连接了。
{
RTCM_Buffer1.type = init;
}
else
{
eth_cnt_last = RTCM_Buffer1.eth_cnt;
}
timerStart(&ethernet_timer_interface1, 8000,1); //8s调用一次
}
void ethernetInterfaceInit(void)
{
//-----------------------------------
// 订阅定时器信号,用于定时采集
subscribe(&navigation_output1, ethernetInterfaceTimerProcess);
subscribe(&navigation_output2, ethernetInterfaceTimerProcess);
subscribe(&ethernet_timer_interface, ethInterruptProcess);
subscribe(&ethernet_timer_interface1, ethernetFaultProcess); //1ms调用一次
timerStart(&ethernet_timer_interface, 1,1); //1ms调用一次
timerStart(&ethernet_timer_interface1, 5000,1); //5s调用一次
printf( "ethernetInterface: initial OK %d\n",getCurrentTime());
}