Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 57e7dbd2cc | |||
| e71ced450f | |||
| 4608905392 | |||
| 50225f68cf | |||
| d718b121de | |||
| f09be247b4 |
+21
-15
@@ -37,8 +37,15 @@
|
|||||||
#include "PFM_RemoteUpdate.h"
|
#include "PFM_RemoteUpdate.h"
|
||||||
#include "MSCP_Define.h"
|
#include "MSCP_Define.h"
|
||||||
#include "CFM_Raw.h"
|
#include "CFM_Raw.h"
|
||||||
|
#include "CM_IP.h"
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
/** @brief 网卡名 */
|
||||||
|
#define CFM_IP_INTERFACE_2oo2 "fec0"
|
||||||
|
#define CFM_IP_INTERFACE_2x2 "fec1"
|
||||||
|
#define CFM_IP_INTERFACE_MAINTAIN "wm0"
|
||||||
|
#define CFM_IP_NETMASK "255.255.255.0"
|
||||||
|
|
||||||
#define CFM_2oo2_MSG_NUM_MAX (200u)
|
#define CFM_2oo2_MSG_NUM_MAX (200u)
|
||||||
#define CFM_2X2_MSG_NUM_MAX (200u)
|
#define CFM_2X2_MSG_NUM_MAX (200u)
|
||||||
#define CFM_OUTNET_MSG_NUM_MAX (5000u)
|
#define CFM_OUTNET_MSG_NUM_MAX (5000u)
|
||||||
@@ -1031,6 +1038,7 @@ CM_INT32 CFM_2oo2_Currency_NoSplit(STRU_2OO2_NET_NO_PACK_T *p_2oo2_Ctrl,IN const
|
|||||||
/*发送相关*/
|
/*发送相关*/
|
||||||
CM_UINT8 sendBuf[1500] = {0u};
|
CM_UINT8 sendBuf[1500] = {0u};
|
||||||
CM_UINT32 sysCyc = DFM_GetBirthCount(); /*平台周期号*/
|
CM_UINT32 sysCyc = DFM_GetBirthCount(); /*平台周期号*/
|
||||||
|
CM_UINT16 ARQ_Cut = 0u; /* 记录重传请求次数 */
|
||||||
|
|
||||||
CM_UINT64 curTick = 0u; /* 当前时刻 */
|
CM_UINT64 curTick = 0u; /* 当前时刻 */
|
||||||
CM_UINT64 sTick = 0u; /* 起始Tick */
|
CM_UINT64 sTick = 0u; /* 起始Tick */
|
||||||
@@ -1118,6 +1126,7 @@ CM_INT32 CFM_2oo2_Currency_NoSplit(STRU_2OO2_NET_NO_PACK_T *p_2oo2_Ctrl,IN const
|
|||||||
{
|
{
|
||||||
/*发送重传请求*/
|
/*发送重传请求*/
|
||||||
(void)CFM_2oo2_SendARQ_Currency(p_2oo2_Ctrl,ENUM_2oo2_NET_ARQ);
|
(void)CFM_2oo2_SendARQ_Currency(p_2oo2_Ctrl,ENUM_2oo2_NET_ARQ);
|
||||||
|
ARQ_Cut++;
|
||||||
/*- 重置起始时间*/
|
/*- 重置起始时间*/
|
||||||
sTick = CM_GetTick();
|
sTick = CM_GetTick();
|
||||||
}
|
}
|
||||||
@@ -1126,6 +1135,10 @@ CM_INT32 CFM_2oo2_Currency_NoSplit(STRU_2OO2_NET_NO_PACK_T *p_2oo2_Ctrl,IN const
|
|||||||
/*- 无处理 */
|
/*- 无处理 */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(ENUM_BOARDSTATE_RUN == PFM_GetBoardState() && SFM_2oo2_ARQ_MAX_CNT <= ARQ_Cut)
|
||||||
|
{
|
||||||
|
CM_ASSERT(0,NET_MODE, DARK_FAULT_CODE_FUN_ORDER_53, TSCP_DARK_ASSERT_1);
|
||||||
|
}
|
||||||
if((CM_TRUE == mineRcvFlag) && (CM_TRUE == peerRcvFlag))
|
if((CM_TRUE == mineRcvFlag) && (CM_TRUE == peerRcvFlag))
|
||||||
{
|
{
|
||||||
/*- 结束接收 */
|
/*- 结束接收 */
|
||||||
@@ -3319,24 +3332,17 @@ void CFM_Net_Init(void)
|
|||||||
void CFM_NetworkCard_Init(void)
|
void CFM_NetworkCard_Init(void)
|
||||||
{
|
{
|
||||||
/*- 变量初始化 */
|
/*- 变量初始化 */
|
||||||
CM_CHAR str[1024] = {0};
|
ENUM_CM_RETURN ret = ENUM_CM_FALSE;
|
||||||
/*- 配置2取网卡ip */
|
/*- 配置2取网卡ip */
|
||||||
(void)memset(str, 0, sizeof(str));
|
/*- 配置2取网卡ip */
|
||||||
(void)sprintf(str, "ifconfig %s %s", "fec0", g_PFM_Cfg.Local_Cfg.IP_2oo2);
|
ret = CM_IP_TrySetIpAddrRetry(CFM_IP_INTERFACE_2oo2, g_PFM_Cfg.Local_Cfg.IP_2oo2, CFM_IP_NETMASK, 2);
|
||||||
(void)printf("%s\n",str);
|
CM_NM_ASSERT(ENUM_CM_TRUE == ret, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_42, TSCP_DARK_ASSERT_1);
|
||||||
(void)system(str);
|
|
||||||
|
|
||||||
/*- 配置通用网卡ip */
|
/*- 配置通用网卡ip */
|
||||||
(void)memset(str, 0, sizeof(str));
|
ret = CM_IP_TrySetIpAddrRetry(CFM_IP_INTERFACE_2x2, g_PFM_Cfg.Local_Cfg.IP_Com, CFM_IP_NETMASK, 2);
|
||||||
(void)sprintf(str, "ifconfig %s %s", "fec1", g_PFM_Cfg.Local_Cfg.IP_Com);
|
CM_NM_ASSERT(ENUM_CM_TRUE == ret, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_42, TSCP_DARK_ASSERT_2);
|
||||||
(void)printf("%s\n",str);
|
|
||||||
(void)system(str);
|
|
||||||
|
|
||||||
/*- 配置维护网卡ip */
|
/*- 配置维护网卡ip */
|
||||||
(void)memset(str, 0, sizeof(str));
|
ret = CM_IP_TrySetIpAddrRetry(CFM_IP_INTERFACE_MAINTAIN, g_PFM_Cfg.Local_Cfg.IP_Maintain, CFM_IP_NETMASK, 2);
|
||||||
(void)sprintf(str, "ifconfig %s %s", "wm0", g_PFM_Cfg.Local_Cfg.IP_Maintain);
|
CM_NM_ASSERT(ENUM_CM_TRUE == ret, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_42, TSCP_DARK_ASSERT_3);
|
||||||
(void)printf("%s\n",str);
|
|
||||||
(void)system(str);
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @brief UDP接收线程
|
* @brief UDP接收线程
|
||||||
|
|||||||
@@ -41,6 +41,8 @@ extern "C"
|
|||||||
#define CFM_INNET_RAW_MSG_NUM_MAX (7000u)
|
#define CFM_INNET_RAW_MSG_NUM_MAX (7000u)
|
||||||
#define CFM_OUTNET_RAW_MSG_NUM_MAX (1000u)
|
#define CFM_OUTNET_RAW_MSG_NUM_MAX (1000u)
|
||||||
|
|
||||||
|
#define SFM_2oo2_ARQ_MAX_CNT ((ENUM_INIT_OVER<=PFM_LOG_GET_INIT_STAGE())?(g_PFM_Cfg.CYC_TIME/50u+1u):6000u)
|
||||||
|
|
||||||
|
|
||||||
/*暗文类型宏定义*/
|
/*暗文类型宏定义*/
|
||||||
#define DARK_LOG_STRING (0x55u)
|
#define DARK_LOG_STRING (0x55u)
|
||||||
|
|||||||
@@ -0,0 +1,437 @@
|
|||||||
|
#include "CM_IP.h"
|
||||||
|
#include "CM_Memory.h"
|
||||||
|
#include "PFM_Log.h"
|
||||||
|
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <net/if.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/sockio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 检查设置IP接口的输入参数
|
||||||
|
* @param[in] pNetCardName 网卡名
|
||||||
|
* @param[in] pIpAddr IPv4地址字符串
|
||||||
|
* @param[in] pNetMask 子网掩码字符串
|
||||||
|
* @return 参数检查结果
|
||||||
|
*/
|
||||||
|
static ENUM_CM_RETURN CM_IP_SetIpAddrParamCheck(IN const CM_CHAR *pNetCardName,
|
||||||
|
IN const CM_CHAR *pIpAddr,
|
||||||
|
IN const CM_CHAR *pNetMask)
|
||||||
|
{
|
||||||
|
ENUM_CM_RETURN rt = ENUM_CM_FALSE;
|
||||||
|
|
||||||
|
/* 按使用顺序检查参数,避免在空指针上执行strlen等操作。 */
|
||||||
|
if (NULL == pNetCardName)
|
||||||
|
{
|
||||||
|
printf("CM_IP_SetIpAddr netcard name is NULL.\n");
|
||||||
|
}
|
||||||
|
else if (strlen(pNetCardName) >= IFNAMSIZ)
|
||||||
|
{
|
||||||
|
printf("CM_IP_SetIpAddr netcard name is too long: %s.\n", pNetCardName);
|
||||||
|
}
|
||||||
|
else if (NULL == pIpAddr)
|
||||||
|
{
|
||||||
|
printf("CM_IP_SetIpAddr ipAddr is NULL.\n");
|
||||||
|
}
|
||||||
|
else if (NULL == pNetMask)
|
||||||
|
{
|
||||||
|
printf("CM_IP_SetIpAddr netMask is NULL.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rt = ENUM_CM_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 检查读取IP接口的输入参数
|
||||||
|
* @param[in] pNetCardName 网卡名
|
||||||
|
* @param[out] pIpAddr IPv4地址输出缓存
|
||||||
|
* @param[in] ipAddrLen IPv4地址输出缓存长度
|
||||||
|
* @param[out] pNetMask 子网掩码输出缓存
|
||||||
|
* @param[in] netMaskLen 子网掩码输出缓存长度
|
||||||
|
* @return 参数检查结果
|
||||||
|
*/
|
||||||
|
static ENUM_CM_RETURN CM_IP_GetIpAddrParamCheck(IN const CM_CHAR *pNetCardName,
|
||||||
|
OUT CM_CHAR *pIpAddr,
|
||||||
|
IN CM_UINT32 ipAddrLen,
|
||||||
|
OUT CM_CHAR *pNetMask,
|
||||||
|
IN CM_UINT32 netMaskLen)
|
||||||
|
{
|
||||||
|
ENUM_CM_RETURN rt = ENUM_CM_FALSE;
|
||||||
|
|
||||||
|
/* 输出缓存需要能够容纳最长IPv4字符串及结尾字符。 */
|
||||||
|
if (NULL == pNetCardName)
|
||||||
|
{
|
||||||
|
printf("CM_IP_GetIpAddr netcard name is NULL.\n");
|
||||||
|
}
|
||||||
|
else if (strlen(pNetCardName) >= IFNAMSIZ)
|
||||||
|
{
|
||||||
|
printf("CM_IP_GetIpAddr netcard name is too long: %s.\n", pNetCardName);
|
||||||
|
}
|
||||||
|
else if (NULL == pIpAddr)
|
||||||
|
{
|
||||||
|
printf("CM_IP_GetIpAddr ipAddr is NULL.\n");
|
||||||
|
}
|
||||||
|
else if (CM_IP_ADDR_STR_LEN > ipAddrLen)
|
||||||
|
{
|
||||||
|
printf("CM_IP_GetIpAddr ipAddr buffer is too small.\n");
|
||||||
|
}
|
||||||
|
else if (NULL == pNetMask)
|
||||||
|
{
|
||||||
|
printf("CM_IP_GetIpAddr netMask is NULL.\n");
|
||||||
|
}
|
||||||
|
else if (CM_IP_ADDR_STR_LEN > netMaskLen)
|
||||||
|
{
|
||||||
|
printf("CM_IP_GetIpAddr netMask buffer is too small.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rt = ENUM_CM_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 设置网卡IPv4地址
|
||||||
|
* @param[in] pNetCardName 网卡名
|
||||||
|
* @param[in] pIpAddr IPv4点分十进制字符串
|
||||||
|
* @param[in] pNetMask 子网掩码点分十进制字符串
|
||||||
|
* @return 设置结果
|
||||||
|
*/
|
||||||
|
ENUM_CM_RETURN CM_IP_SetIpAddr(IN const CM_CHAR *pNetCardName, IN const CM_CHAR *pIpAddr,
|
||||||
|
IN const CM_CHAR *pNetMask)
|
||||||
|
{
|
||||||
|
ENUM_CM_RETURN rt = ENUM_CM_FALSE;
|
||||||
|
ENUM_CM_RETURN retMem = ENUM_CM_FALSE;
|
||||||
|
ENUM_CM_RETURN paramCheckRt = ENUM_CM_FALSE;
|
||||||
|
CM_INT32 sock = -1;
|
||||||
|
CM_INT32 ret = 0;
|
||||||
|
CM_INT32 ipConvertRet = 0;
|
||||||
|
CM_INT32 netMaskConvertRet = 0;
|
||||||
|
struct ifreq ifReq;
|
||||||
|
struct sockaddr_in *pSockAddr = NULL;
|
||||||
|
struct in_addr netMaskAddr;
|
||||||
|
|
||||||
|
/* 参数检查失败时不创建socket,也不修改网卡配置。 */
|
||||||
|
paramCheckRt = CM_IP_SetIpAddrParamCheck(pNetCardName, pIpAddr, pNetMask);
|
||||||
|
if (ENUM_CM_TRUE == paramCheckRt)
|
||||||
|
{
|
||||||
|
/* ifreq在本函数中只初始化一次,网卡名和地址族供两个ioctl共用。 */
|
||||||
|
retMem = CM_Memset((void*)&ifReq, (CM_UINT8)0U, (CM_SIZE_T)sizeof(struct ifreq),
|
||||||
|
(CM_SIZE_T)sizeof(struct ifreq));
|
||||||
|
if (ENUM_CM_TRUE != retMem)
|
||||||
|
{
|
||||||
|
printf("CM_IP_SetIpAddr memset ifreq failed.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(void)strncpy(ifReq.ifr_name, pNetCardName, IFNAMSIZ - 1);
|
||||||
|
pSockAddr = (struct sockaddr_in*)&ifReq.ifr_addr;
|
||||||
|
#ifdef QNX
|
||||||
|
pSockAddr->sin_len = sizeof(struct sockaddr_in);
|
||||||
|
#endif
|
||||||
|
pSockAddr->sin_family = AF_INET;
|
||||||
|
|
||||||
|
/* 先完成IP和掩码格式转换,任一格式错误都不执行ioctl。 */
|
||||||
|
ipConvertRet = (CM_INT32)inet_pton(AF_INET, pIpAddr, &pSockAddr->sin_addr);
|
||||||
|
netMaskConvertRet = (CM_INT32)inet_pton(AF_INET, pNetMask, &netMaskAddr);
|
||||||
|
if (1 != ipConvertRet)
|
||||||
|
{
|
||||||
|
if (0 == ipConvertRet)
|
||||||
|
{
|
||||||
|
printf("CM_IP_SetIpAddr invalid ip address: %s.\n", pIpAddr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
perror("CM_IP_SetIpAddr inet_pton");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (1 != netMaskConvertRet)
|
||||||
|
{
|
||||||
|
if (0 == netMaskConvertRet)
|
||||||
|
{
|
||||||
|
printf("CM_IP_SetIpAddr invalid netmask: %s.\n", pNetMask);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
perror("CM_IP_SetIpAddr netmask inet_pton");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sock = (CM_INT32)socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
|
if (sock < 0)
|
||||||
|
{
|
||||||
|
perror("CM_IP_SetIpAddr socket");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*- 通过临时UDP socket设置指定网卡IP */
|
||||||
|
ret = (CM_INT32)ioctl(sock, SIOCSIFADDR, &ifReq);
|
||||||
|
if (0 != ret)
|
||||||
|
{
|
||||||
|
perror("CM_IP_SetIpAddr ioctl SIOCSIFADDR");
|
||||||
|
MSCP_LOG_MSG("CM_IP_SetIpAddr ioctl SIOCSIFADDR, %s:%s:%s\n",pNetCardName, pIpAddr, strerror(errno));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* 保留网卡名和地址族,只清除已使用的IP地址字段后写入掩码。 */
|
||||||
|
retMem = CM_Memset((void*)&pSockAddr->sin_addr, (CM_UINT8)0U,
|
||||||
|
(CM_SIZE_T)sizeof(struct in_addr),
|
||||||
|
(CM_SIZE_T)sizeof(struct in_addr));
|
||||||
|
if (ENUM_CM_TRUE != retMem)
|
||||||
|
{
|
||||||
|
printf("CM_IP_SetIpAddr memset address failed.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pSockAddr->sin_addr = netMaskAddr;
|
||||||
|
ret = (CM_INT32)ioctl(sock, SIOCSIFNETMASK, &ifReq);
|
||||||
|
if (0 != ret)
|
||||||
|
{
|
||||||
|
perror("CM_IP_SetIpAddr ioctl SIOCSIFNETMASK");
|
||||||
|
MSCP_LOG_MSG("CM_IP_SetIpAddr ioctl SIOCSIFNETMASK, %s:%s:%s\n",
|
||||||
|
pNetCardName, pNetMask, strerror(errno));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rt = ENUM_CM_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(void)close(sock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 尝试设置网卡IPv4地址并读回校验
|
||||||
|
* @param[in] pNetCardName 网卡名
|
||||||
|
* @param[in] pIpAddr IPv4点分十进制字符串
|
||||||
|
* @param[in] pNetMask 子网掩码点分十进制字符串
|
||||||
|
* @return 设置和校验结果
|
||||||
|
*/
|
||||||
|
ENUM_CM_RETURN CM_IP_TrySetIpAddr(IN const CM_CHAR *pNetCardName, IN const CM_CHAR *pIpAddr,
|
||||||
|
IN const CM_CHAR *pNetMask)
|
||||||
|
{
|
||||||
|
ENUM_CM_RETURN rt = ENUM_CM_FALSE;
|
||||||
|
ENUM_CM_RETURN setRt = ENUM_CM_FALSE;
|
||||||
|
ENUM_CM_RETURN getRt = ENUM_CM_FALSE;
|
||||||
|
CM_CHAR ipAddrRead[CM_IP_ADDR_STR_LEN] = { 0 };
|
||||||
|
CM_CHAR netMaskRead[CM_IP_ADDR_STR_LEN] = { 0 };
|
||||||
|
|
||||||
|
/* 设置成功后立即读回,IP和掩码均一致才认为配置成功。 */
|
||||||
|
setRt = CM_IP_SetIpAddr(pNetCardName, pIpAddr, pNetMask);
|
||||||
|
if (ENUM_CM_TRUE != setRt)
|
||||||
|
{
|
||||||
|
printf("CM_IP_TrySetIpAddr set ip failed.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
getRt = CM_IP_GetIpAddr(pNetCardName, ipAddrRead, (CM_UINT32)sizeof(ipAddrRead),
|
||||||
|
netMaskRead, (CM_UINT32)sizeof(netMaskRead));
|
||||||
|
if (ENUM_CM_TRUE != getRt)
|
||||||
|
{
|
||||||
|
printf("CM_IP_TrySetIpAddr get ip failed.\n");
|
||||||
|
}
|
||||||
|
else if (0 != strcmp(ipAddrRead, pIpAddr))
|
||||||
|
{
|
||||||
|
printf("CM_IP_TrySetIpAddr ip mismatch, set:%s, read:%s.\n", pIpAddr, ipAddrRead);
|
||||||
|
}
|
||||||
|
else if (0 != strcmp(netMaskRead, pNetMask))
|
||||||
|
{
|
||||||
|
printf("CM_IP_TrySetIpAddr netmask mismatch, set:%s, read:%s.\n", pNetMask, netMaskRead);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rt = ENUM_CM_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 尝试设置网卡IPv4地址,失败时重复尝试
|
||||||
|
* @param[in] pNetCardName 网卡名
|
||||||
|
* @param[in] pIpAddr IPv4点分十进制字符串
|
||||||
|
* @param[in] pNetMask 子网掩码点分十进制字符串
|
||||||
|
* @param[in] retryTimes 失败后的重试次数,总尝试次数为retryTimes + 1
|
||||||
|
* @return 设置和校验结果
|
||||||
|
*/
|
||||||
|
ENUM_CM_RETURN CM_IP_TrySetIpAddrRetry(IN const CM_CHAR *pNetCardName, IN const CM_CHAR *pIpAddr,
|
||||||
|
IN const CM_CHAR *pNetMask, IN CM_UINT32 retryTimes)
|
||||||
|
{
|
||||||
|
ENUM_CM_RETURN rt = ENUM_CM_FALSE;
|
||||||
|
CM_UINT32 tryIndex = 0u;
|
||||||
|
CM_CHAR log_buf[1024] = {0};
|
||||||
|
|
||||||
|
/* retryTimes表示首次尝试失败后的额外重试次数。 */
|
||||||
|
while (CM_TRUE)
|
||||||
|
{
|
||||||
|
if (0u != tryIndex)
|
||||||
|
{
|
||||||
|
printf("CM_IP_TrySetIpAddrRetry retry %u.\n", tryIndex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* No action. */
|
||||||
|
}
|
||||||
|
|
||||||
|
rt = CM_IP_TrySetIpAddr(pNetCardName, pIpAddr, pNetMask);
|
||||||
|
if (ENUM_CM_TRUE == rt)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (tryIndex >= retryTimes)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tryIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ENUM_CM_TRUE == rt)
|
||||||
|
{
|
||||||
|
(void)snprintf(log_buf, sizeof(log_buf), "IP Set Success, Interface:%s, IP:%s, NetMask:%s, retryTimes:%u.\n",
|
||||||
|
(NULL != pNetCardName) ? pNetCardName : "NULL",
|
||||||
|
(NULL != pIpAddr) ? pIpAddr : "NULL",
|
||||||
|
(NULL != pNetMask) ? pNetMask : "NULL", tryIndex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(void)snprintf(log_buf, sizeof(log_buf), "IP Set Failed, Interface:%s, IP:%s, NetMask:%s, retryTimes:%u.\n",
|
||||||
|
(NULL != pNetCardName) ? pNetCardName : "NULL",
|
||||||
|
(NULL != pIpAddr) ? pIpAddr : "NULL",
|
||||||
|
(NULL != pNetMask) ? pNetMask : "NULL", tryIndex);
|
||||||
|
}
|
||||||
|
printf("%s", log_buf);
|
||||||
|
MSCP_LOG_MSG("%s", log_buf);
|
||||||
|
|
||||||
|
return rt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 读取网卡IPv4地址
|
||||||
|
* @param[in] pNetCardName 网卡名
|
||||||
|
* @param[out] pIpAddr IPv4点分十进制字符串输出缓存
|
||||||
|
* @param[in] ipAddrLen pIpAddr缓存长度
|
||||||
|
* @param[out] pNetMask 子网掩码字符串输出缓存
|
||||||
|
* @param[in] netMaskLen pNetMask缓存长度
|
||||||
|
* @return 读取结果
|
||||||
|
*/
|
||||||
|
ENUM_CM_RETURN CM_IP_GetIpAddr(IN const CM_CHAR *pNetCardName, OUT CM_CHAR *pIpAddr,
|
||||||
|
IN CM_UINT32 ipAddrLen, OUT CM_CHAR *pNetMask,
|
||||||
|
IN CM_UINT32 netMaskLen)
|
||||||
|
{
|
||||||
|
ENUM_CM_RETURN rt = ENUM_CM_FALSE;
|
||||||
|
ENUM_CM_RETURN retMem = ENUM_CM_FALSE;
|
||||||
|
ENUM_CM_RETURN paramCheckRt = ENUM_CM_FALSE;
|
||||||
|
CM_INT32 sock = -1;
|
||||||
|
CM_INT32 ret = 0;
|
||||||
|
struct ifreq ifReq;
|
||||||
|
struct sockaddr_in *pSockAddr = NULL;
|
||||||
|
const CM_CHAR *pRetIpAddr = NULL;
|
||||||
|
|
||||||
|
/* 参数合法后再清空输出,防止空指针或短缓存被写入。 */
|
||||||
|
paramCheckRt = CM_IP_GetIpAddrParamCheck(pNetCardName, pIpAddr, ipAddrLen,
|
||||||
|
pNetMask, netMaskLen);
|
||||||
|
if (ENUM_CM_TRUE == paramCheckRt)
|
||||||
|
{
|
||||||
|
pIpAddr[0] = '\0';
|
||||||
|
pNetMask[0] = '\0';
|
||||||
|
/* ifreq在本函数中只初始化一次,随后仅复用其中的地址字段。 */
|
||||||
|
retMem = CM_Memset((void*)&ifReq, (CM_UINT8)0U, (CM_SIZE_T)sizeof(struct ifreq),
|
||||||
|
(CM_SIZE_T)sizeof(struct ifreq));
|
||||||
|
if (ENUM_CM_TRUE != retMem)
|
||||||
|
{
|
||||||
|
printf("CM_IP_GetIpAddr memset ifreq failed.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(void)strncpy(ifReq.ifr_name, pNetCardName, IFNAMSIZ - 1);
|
||||||
|
pSockAddr = (struct sockaddr_in*)&ifReq.ifr_addr;
|
||||||
|
#ifdef QNX
|
||||||
|
pSockAddr->sin_len = sizeof(struct sockaddr_in);
|
||||||
|
#endif
|
||||||
|
pSockAddr->sin_family = AF_INET;
|
||||||
|
|
||||||
|
sock = (CM_INT32)socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
|
if (sock < 0)
|
||||||
|
{
|
||||||
|
perror("CM_IP_GetIpAddr socket");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*- 通过临时UDP socket读取指定网卡IP */
|
||||||
|
ret = (CM_INT32)ioctl(sock, SIOCGIFADDR, &ifReq);
|
||||||
|
if (0 != ret)
|
||||||
|
{
|
||||||
|
perror("CM_IP_GetIpAddr ioctl SIOCGIFADDR");
|
||||||
|
MSCP_LOG_MSG("CM_IP_GetIpAddr ioctl SIOCGIFADDR, %s:%s:%s\n",pNetCardName, pIpAddr, strerror(errno));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*- 将二进制地址转换为点分十进制IP字符串 */
|
||||||
|
pRetIpAddr = (const CM_CHAR*)inet_ntop(AF_INET, &pSockAddr->sin_addr, pIpAddr, ipAddrLen);
|
||||||
|
if (NULL == pRetIpAddr)
|
||||||
|
{
|
||||||
|
perror("CM_IP_GetIpAddr inet_ntop");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* 保留网卡名和地址族,只清除IP查询写入的地址字段。 */
|
||||||
|
retMem = CM_Memset((void*)&pSockAddr->sin_addr, (CM_UINT8)0U,
|
||||||
|
(CM_SIZE_T)sizeof(struct in_addr),
|
||||||
|
(CM_SIZE_T)sizeof(struct in_addr));
|
||||||
|
if (ENUM_CM_TRUE != retMem)
|
||||||
|
{
|
||||||
|
printf("CM_IP_GetIpAddr memset address failed.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = (CM_INT32)ioctl(sock, SIOCGIFNETMASK, &ifReq);
|
||||||
|
if (0 != ret)
|
||||||
|
{
|
||||||
|
perror("CM_IP_GetIpAddr ioctl SIOCGIFNETMASK");
|
||||||
|
MSCP_LOG_MSG("CM_IP_GetIpAddr ioctl SIOCGIFNETMASK, %s:%s\n",
|
||||||
|
pNetCardName, strerror(errno));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pRetIpAddr = (const CM_CHAR*)inet_ntop(AF_INET, &pSockAddr->sin_addr,
|
||||||
|
pNetMask, netMaskLen);
|
||||||
|
if (NULL == pRetIpAddr)
|
||||||
|
{
|
||||||
|
perror("CM_IP_GetIpAddr netmask inet_ntop");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rt = ENUM_CM_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(void)close(sock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rt;
|
||||||
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
/**
|
||||||
|
* @file CM_IP.h
|
||||||
|
* @brief 获取网卡IP地址
|
||||||
|
*/
|
||||||
|
#ifndef CM_IP_H_
|
||||||
|
#define CM_IP_H_
|
||||||
|
|
||||||
|
#include "CM_Types.h"
|
||||||
|
|
||||||
|
/** @brief IPv4点分十进制字符串长度,包含字符串结束符 */
|
||||||
|
#define CM_IP_ADDR_STR_LEN (16u)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 设置网卡IPv4地址
|
||||||
|
* @param[in] pNetCardName 网卡名
|
||||||
|
* @param[in] pIpAddr IPv4点分十进制字符串,例如"192.168.1.10"
|
||||||
|
* @param[in] pNetMask 子网掩码点分十进制字符串,例如"255.255.255.0"
|
||||||
|
* @return 设置结果
|
||||||
|
* - ENUM_CM_TRUE 成功
|
||||||
|
* - ENUM_CM_FALSE 失败
|
||||||
|
*/
|
||||||
|
ENUM_CM_RETURN CM_IP_SetIpAddr(IN const CM_CHAR *pNetCardName, IN const CM_CHAR *pIpAddr,
|
||||||
|
IN const CM_CHAR *pNetMask);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 尝试设置网卡IPv4地址并读回校验
|
||||||
|
* @param[in] pNetCardName 网卡名
|
||||||
|
* @param[in] pIpAddr IPv4点分十进制字符串,例如"192.168.1.10"
|
||||||
|
* @param[in] pNetMask 子网掩码点分十进制字符串
|
||||||
|
* @return 设置和校验结果
|
||||||
|
* - ENUM_CM_TRUE 设置成功且读回一致
|
||||||
|
* - ENUM_CM_FALSE 设置失败或读回不一致
|
||||||
|
*/
|
||||||
|
ENUM_CM_RETURN CM_IP_TrySetIpAddr(IN const CM_CHAR *pNetCardName, IN const CM_CHAR *pIpAddr,
|
||||||
|
IN const CM_CHAR *pNetMask);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 尝试设置网卡IPv4地址,失败时重复尝试
|
||||||
|
* @param[in] pNetCardName 网卡名
|
||||||
|
* @param[in] pIpAddr IPv4点分十进制字符串,例如"192.168.1.10"
|
||||||
|
* @param[in] pNetMask 子网掩码点分十进制字符串
|
||||||
|
* @param[in] retryTimes 失败后的重试次数,总尝试次数为retryTimes + 1
|
||||||
|
* @return 设置和校验结果
|
||||||
|
* - ENUM_CM_TRUE 设置成功且读回一致
|
||||||
|
* - ENUM_CM_FALSE 全部尝试失败或读回不一致
|
||||||
|
*/
|
||||||
|
ENUM_CM_RETURN CM_IP_TrySetIpAddrRetry(IN const CM_CHAR *pNetCardName, IN const CM_CHAR *pIpAddr,
|
||||||
|
IN const CM_CHAR *pNetMask, IN CM_UINT32 retryTimes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 读取网卡IPv4地址
|
||||||
|
* @param[in] pNetCardName 网卡名
|
||||||
|
* @param[out] pIpAddr IPv4点分十进制字符串输出缓存
|
||||||
|
* @param[in] ipAddrLen pIpAddr缓存长度,至少为CM_IP_ADDR_STR_LEN
|
||||||
|
* @param[out] pNetMask 子网掩码字符串输出缓存
|
||||||
|
* @param[in] netMaskLen pNetMask缓存长度,至少为CM_IP_ADDR_STR_LEN
|
||||||
|
* @return 读取结果
|
||||||
|
* - ENUM_CM_TRUE 成功
|
||||||
|
* - ENUM_CM_FALSE 失败
|
||||||
|
*/
|
||||||
|
ENUM_CM_RETURN CM_IP_GetIpAddr(IN const CM_CHAR *pNetCardName, OUT CM_CHAR *pIpAddr,
|
||||||
|
IN CM_UINT32 ipAddrLen, OUT CM_CHAR *pNetMask,
|
||||||
|
IN CM_UINT32 netMaskLen);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -40,11 +40,11 @@
|
|||||||
CM_CHAR FS_FILE_PATH[100];
|
CM_CHAR FS_FILE_PATH[100];
|
||||||
|
|
||||||
/** 平台软件版本号 */
|
/** 平台软件版本号 */
|
||||||
const CM_UINT8 MSCP_SW_VERION[4] = { 93u, 1u, 1u, 64u };
|
const CM_UINT8 MSCP_SW_VERION[4] = { 93u, 1u, 1u, 66u };
|
||||||
/** 驱动软件版本号 */
|
/** 驱动软件版本号 */
|
||||||
CM_UINT8 MSCP_DRV_VERION[4] = {0};
|
CM_UINT8 MSCP_DRV_VERION[4] = {0};
|
||||||
/** 与维护一体机接口文档版本号(接口文档发生改变时升级版本号) */
|
/** 与维护一体机接口文档版本号(接口文档发生改变时升级版本号) */
|
||||||
CM_UINT16 TSCP_DOC_VERION[2] = {39u,0u};
|
CM_UINT16 TSCP_DOC_VERION[2] = {40u,0u};
|
||||||
/** 操作系统版本号 */
|
/** 操作系统版本号 */
|
||||||
CM_UINT8 TSCP_QNX_VERION[10] = {0u};
|
CM_UINT8 TSCP_QNX_VERION[10] = {0u};
|
||||||
|
|
||||||
|
|||||||
@@ -401,8 +401,6 @@ void MSCP_ASSERT(unsigned int x, unsigned int MaintenanceFlag, unsigned short Mo
|
|||||||
if(ENUM_INIT_MAIN_NET <= PFM_LOG_GET_INIT_STAGE())
|
if(ENUM_INIT_MAIN_NET <= PFM_LOG_GET_INIT_STAGE())
|
||||||
{
|
{
|
||||||
CFM_LogCiphertextSend();
|
CFM_LogCiphertextSend();
|
||||||
}
|
|
||||||
|
|
||||||
/*- 等待日志队列全部发送*/
|
/*- 等待日志队列全部发送*/
|
||||||
LogQisEmpty = CFM_LogQ_isEmpty();
|
LogQisEmpty = CFM_LogQ_isEmpty();
|
||||||
while (ENUM_CM_FALSE == LogQisEmpty)
|
while (ENUM_CM_FALSE == LogQisEmpty)
|
||||||
@@ -411,6 +409,7 @@ void MSCP_ASSERT(unsigned int x, unsigned int MaintenanceFlag, unsigned short Mo
|
|||||||
CM_Sleep(5u);
|
CM_Sleep(5u);
|
||||||
LogQisEmpty = CFM_LogQ_isEmpty();
|
LogQisEmpty = CFM_LogQ_isEmpty();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*- 退出运营故障码*/
|
/*- 退出运营故障码*/
|
||||||
if(darkBuf == 0x0D0404)
|
if(darkBuf == 0x0D0404)
|
||||||
@@ -538,7 +537,6 @@ void MSCP_REBOOT_ASSERT(unsigned int x, unsigned int MaintenanceFlag,unsigned sh
|
|||||||
if(ENUM_INIT_MAIN_NET <= PFM_LOG_GET_INIT_STAGE())
|
if(ENUM_INIT_MAIN_NET <= PFM_LOG_GET_INIT_STAGE())
|
||||||
{
|
{
|
||||||
CFM_LogCiphertextSend();
|
CFM_LogCiphertextSend();
|
||||||
}
|
|
||||||
/*- 等待日志队列全部发送*/
|
/*- 等待日志队列全部发送*/
|
||||||
LogQisEmpty = CFM_LogQ_isEmpty();
|
LogQisEmpty = CFM_LogQ_isEmpty();
|
||||||
while (ENUM_CM_FALSE == LogQisEmpty)
|
while (ENUM_CM_FALSE == LogQisEmpty)
|
||||||
@@ -547,6 +545,7 @@ void MSCP_REBOOT_ASSERT(unsigned int x, unsigned int MaintenanceFlag,unsigned sh
|
|||||||
CM_Sleep(5u);
|
CM_Sleep(5u);
|
||||||
LogQisEmpty = CFM_LogQ_isEmpty();
|
LogQisEmpty = CFM_LogQ_isEmpty();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* 启动跟踪录制 */
|
/* 启动跟踪录制 */
|
||||||
MSCP_ASSERT_TraceLog();
|
MSCP_ASSERT_TraceLog();
|
||||||
@@ -1111,8 +1110,11 @@ CM_UINT32 *PFM_DarkLogGenerate(CM_UINT16 mode, CM_UINT16 fault, CM_UINT16 num)
|
|||||||
}
|
}
|
||||||
/* 宕机前向通控发送状态为宕机的心跳 连续发送三包*/
|
/* 宕机前向通控发送状态为宕机的心跳 连续发送三包*/
|
||||||
static void s_OutnetHeart_Send(void)
|
static void s_OutnetHeart_Send(void)
|
||||||
|
{
|
||||||
|
if(ENUM_INIT_NET <= PFM_LOG_GET_INIT_STAGE())
|
||||||
{
|
{
|
||||||
CFM_TxOutnetHeart(ENUM_2x2_SHUTDOWN);
|
CFM_TxOutnetHeart(ENUM_2x2_SHUTDOWN);
|
||||||
CFM_TxOutnetHeart(ENUM_2x2_SHUTDOWN);
|
CFM_TxOutnetHeart(ENUM_2x2_SHUTDOWN);
|
||||||
CFM_TxOutnetHeart(ENUM_2x2_SHUTDOWN);
|
CFM_TxOutnetHeart(ENUM_2x2_SHUTDOWN);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -117,6 +117,8 @@ extern "C"
|
|||||||
/*分帧接收*/
|
/*分帧接收*/
|
||||||
#define TSCP_DARK_SFM_2OO2FRAME (0x80u)
|
#define TSCP_DARK_SFM_2OO2FRAME (0x80u)
|
||||||
#define TSCP_DARK_SFM_2X2FRAME (0x81u)
|
#define TSCP_DARK_SFM_2X2FRAME (0x81u)
|
||||||
|
/*2乘切系原因*/
|
||||||
|
#define TSCP_DARK_2X2_SWITCH_REASON (0x82u)
|
||||||
/*警告标志定义*/
|
/*警告标志定义*/
|
||||||
#define TSCP_DARK_WARNING (0x1FFEu)
|
#define TSCP_DARK_WARNING (0x1FFEu)
|
||||||
/** 初始化阶段标志 */
|
/** 初始化阶段标志 */
|
||||||
|
|||||||
@@ -798,7 +798,7 @@ ENUM_CM_RETURN PFM_FileVerity_Response(IN CM_UINT32 TimeStamp,IN STRU_FILE_UPDAT
|
|||||||
CM_UINT8 PFM_RmUp_Check(void)
|
CM_UINT8 PFM_RmUp_Check(void)
|
||||||
{
|
{
|
||||||
/*- 变量初始化 */
|
/*- 变量初始化 */
|
||||||
CM_UINT8 rt = 0u; /* 函数返回值为成功 */
|
CM_UINT8 rt = packAccredit; /* 函数返回值为授权原因 */
|
||||||
/*- 如果crc计算错误 */
|
/*- 如果crc计算错误 */
|
||||||
if((1 == reasonAuthorization) && (1 == packAccredit))
|
if((1 == reasonAuthorization) && (1 == packAccredit))
|
||||||
{
|
{
|
||||||
@@ -1238,6 +1238,7 @@ static CM_UINT8 PFM_DataReastart_Recv(void)
|
|||||||
CM_UINT8 boardType = 0u;
|
CM_UINT8 boardType = 0u;
|
||||||
CM_UINT8 boardId = 0u;
|
CM_UINT8 boardId = 0u;
|
||||||
CM_UINT32 packRestartCrc = 0u; /*重启请求命令crc*/
|
CM_UINT32 packRestartCrc = 0u; /*重启请求命令crc*/
|
||||||
|
static CM_BOOL flag_first_request = CM_FALSE;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
/*- 从内网安全协议读取应用接收报文 */
|
/*- 从内网安全协议读取应用接收报文 */
|
||||||
@@ -1315,15 +1316,17 @@ static CM_UINT8 PFM_DataReastart_Recv(void)
|
|||||||
{
|
{
|
||||||
/*- 无处理 */
|
/*- 无处理 */
|
||||||
}
|
}
|
||||||
|
flag_first_request = CM_TRUE;
|
||||||
packAccredit = 0u;
|
packAccredit = 0u;
|
||||||
reasonAuthorization = 0u;
|
reasonAuthorization = 0u;
|
||||||
MSCP_LOG_MSG("0xa5 reboottype = %d\n",reboottype);
|
MSCP_LOG_MSG("0xa5 reboottype = %d\n",reboottype);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*- 如果帧类型是二次请求确认 */
|
/*- 如果帧类型是二次请求确认 */
|
||||||
else if(0xa6 == packType)
|
else if(0xa6 == packType && CM_TRUE == flag_first_request)
|
||||||
{
|
{
|
||||||
/*- 按照二次请求确认帧继续解包 */
|
/*- 按照二次请求确认帧继续解包 */
|
||||||
|
flag_first_request = CM_FALSE;
|
||||||
boardType = mData[dataOffset];
|
boardType = mData[dataOffset];
|
||||||
dataOffset +=1u;
|
dataOffset +=1u;
|
||||||
MSCP_LOG_MSG("boardType = %d\n",boardType);
|
MSCP_LOG_MSG("boardType = %d\n",boardType);
|
||||||
@@ -1688,19 +1691,26 @@ void PFM_SetMaintenanceId(IN CM_UINT16* dstNames )
|
|||||||
/*- 变量初始化 */
|
/*- 变量初始化 */
|
||||||
CM_INT32 i = 0, j = 0, index = 1;
|
CM_INT32 i = 0, j = 0, index = 1;
|
||||||
CM_UINT8 FindFlag = 0u;
|
CM_UINT8 FindFlag = 0u;
|
||||||
|
CM_UINT32 dstNums= 0u;
|
||||||
/*- 开始遍历内网通信配置:是否遍历完成:下一条配置 */
|
/*- 开始遍历内网通信配置:是否遍历完成:下一条配置 */
|
||||||
if(NULL != dstNames)
|
if(NULL != dstNames)
|
||||||
{
|
{
|
||||||
for (i = 1; i <= (CM_INT32)g_PFM_Cfg.INNET_COM_NUM; i++)
|
dstNums = dstNames[0];
|
||||||
|
if(MAINTAIN_ID_MAX_NUM < dstNums)
|
||||||
{
|
{
|
||||||
for(j = 1; j <= dstNames[0]; j++)
|
dstNums = MAINTAIN_ID_MAX_NUM;
|
||||||
|
}
|
||||||
|
for (i = 1; i <= (CM_INT32)dstNums; i++)
|
||||||
|
{
|
||||||
|
for(j = 1; j <= (CM_INT32)g_PFM_Cfg.INNET_COM_NUM; j++)
|
||||||
{
|
{
|
||||||
/*- 是否找到了目标内网ID */
|
/*- 是否找到了目标内网ID */
|
||||||
if (dstNames[j] == g_PFM_Cfg.INNET_COM_CFG[i].InnetID)
|
if (dstNames[i] == g_PFM_Cfg.INNET_COM_CFG[j].InnetID)
|
||||||
{
|
{
|
||||||
/*- 设置维护终端内网id */
|
/*- 设置维护终端内网id */
|
||||||
g_Maintenance_Ids[index++] = dstNames[j];
|
g_Maintenance_Ids[index++] = dstNames[i];
|
||||||
FindFlag = 1u;
|
FindFlag = 1u;
|
||||||
|
break;
|
||||||
/*- 返回 */
|
/*- 返回 */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ extern "C"
|
|||||||
|
|
||||||
#define FAULT_REBOOT_CUT_MAX (3u) /*故障重启次数限制*/
|
#define FAULT_REBOOT_CUT_MAX (3u) /*故障重启次数限制*/
|
||||||
|
|
||||||
|
#define MAINTAIN_ID_MAX_NUM (2u) /*同时通信的维护终端的最大个数*/
|
||||||
|
|
||||||
extern CM_UINT16 g_Maintenance_Ids[256];/* 维护终端内网id */
|
extern CM_UINT16 g_Maintenance_Ids[256];/* 维护终端内网id */
|
||||||
extern CM_UINT8 g_RemoteUpdate_State;/* 远程部署过程状态 */
|
extern CM_UINT8 g_RemoteUpdate_State;/* 远程部署过程状态 */
|
||||||
extern CM_UINT8 s_switch2xFlag;
|
extern CM_UINT8 s_switch2xFlag;
|
||||||
|
|||||||
@@ -566,11 +566,11 @@ static CM_INT32 s_2oo2_ARQ_Recv(OUT CM_UINT8 *RxData, IN CM_UINT32 RxSize, OUT E
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*本机与邻机接收成功或重传次数超过1分钟(6000次)退出重传 */
|
/*本机与邻机接收成功或重传次数超过1分钟(6000次)退出重传 */
|
||||||
if(((CM_TRUE == MineRcvSuccessFlag) && (CM_TRUE == PeerRcvSuccessFlag)) || (ARQ_Cut >= 6000))
|
if(((CM_TRUE == MineRcvSuccessFlag) && (CM_TRUE == PeerRcvSuccessFlag)) || (ARQ_Cut >= SFM_2oo2_ARQ_MAX_CNT))
|
||||||
{
|
{
|
||||||
/*- 结束接收 */
|
/*- 结束接收 */
|
||||||
/*- 结束接收 重传超过6000次日志记录 */
|
/*- 结束接收 重传超过6000次日志记录 */
|
||||||
if(ARQ_Cut >= 6000)
|
if(ARQ_Cut >= SFM_2oo2_ARQ_MAX_CNT)
|
||||||
{
|
{
|
||||||
MSCP_LOG_MSG("2oo2 failed break ARQ_Cut = %d, MineRcvSuccessFlag = %d, PeerRcvSuccessFlag = %d\n", ARQ_Cut, MineRcvSuccessFlag, PeerRcvSuccessFlag);
|
MSCP_LOG_MSG("2oo2 failed break ARQ_Cut = %d, MineRcvSuccessFlag = %d, PeerRcvSuccessFlag = %d\n", ARQ_Cut, MineRcvSuccessFlag, PeerRcvSuccessFlag);
|
||||||
CM_ASSERT(0,SFM_2oo2_MODE, DARK_FAULT_CODE_FUN_ORDER_6, TSCP_DARK_ASSERT_2);
|
CM_ASSERT(0,SFM_2oo2_MODE, DARK_FAULT_CODE_FUN_ORDER_6, TSCP_DARK_ASSERT_2);
|
||||||
|
|||||||
@@ -172,6 +172,16 @@ static void SFM_2x2_Input2oo2Exchange(STRU_2X2_CTRL_T *peerCtrl);
|
|||||||
static void SFM_2x2_Eth422StateDark(void);
|
static void SFM_2x2_Eth422StateDark(void);
|
||||||
/* 返回4线中通信正常的数量*/
|
/* 返回4线中通信正常的数量*/
|
||||||
static CM_UINT8 s_2x2_CommNormalNum(void);
|
static CM_UINT8 s_2x2_CommNormalNum(void);
|
||||||
|
/**
|
||||||
|
* @brief 备系设置切系原因
|
||||||
|
* @details 这个函数会设置所有可能的原因(按钮/AID/自动)
|
||||||
|
* */
|
||||||
|
static void s_2x2_SlaveGetSwitchReason(void);
|
||||||
|
/**
|
||||||
|
* @brief 备系发送切系原因
|
||||||
|
* @details 实际切系原因只会有一种,发送时按照优先级发送(宕机自动切系>按钮>AID>其他自动切系)
|
||||||
|
* */
|
||||||
|
static void s_2x2_SlaveSendSwitchReason(void);
|
||||||
|
|
||||||
/* 输入周期号同步函数 */
|
/* 输入周期号同步函数 */
|
||||||
static void SFM_2x2_InputSysCycSyn(STRU_2X2_CTRL_T *peerCtrl){
|
static void SFM_2x2_InputSysCycSyn(STRU_2X2_CTRL_T *peerCtrl){
|
||||||
@@ -1355,6 +1365,8 @@ static CM_THREAD_FUNC_T SFM_2x2_StateChange_Thread(void)
|
|||||||
/*二取本机热备状态、按钮状态、通信状态等、确保双CPU数据一致*/
|
/*二取本机热备状态、按钮状态、通信状态等、确保双CPU数据一致*/
|
||||||
s_State_2xAfter_2oo2Sync(&ctrl_2oo2_2xstate,&partner_state);
|
s_State_2xAfter_2oo2Sync(&ctrl_2oo2_2xstate,&partner_state);
|
||||||
curTick[3] = CM_GetTick();
|
curTick[3] = CM_GetTick();
|
||||||
|
/* 尝试获取切系相关状态*/
|
||||||
|
s_2x2_SlaveGetSwitchReason();
|
||||||
/*带着双cpu一致的双系数据做状态机切换*/
|
/*带着双cpu一致的双系数据做状态机切换*/
|
||||||
if(s_2x2_state_Ctrl.MicroCyc < (s_2x2_thread_Ctrl.number_Cyc - 1u))
|
if(s_2x2_state_Ctrl.MicroCyc < (s_2x2_thread_Ctrl.number_Cyc - 1u))
|
||||||
{
|
{
|
||||||
@@ -1536,12 +1548,24 @@ void SFM_2x2_ChangeState(void)
|
|||||||
s_2x2_Ctrl.LastFollowCyc = SFM_2x2_GetSysCount() - 1u;
|
s_2x2_Ctrl.LastFollowCyc = SFM_2x2_GetSysCount() - 1u;
|
||||||
s_2x2_Ctrl.LastCheckOKCount = SFM_2x2_GetSysCount();
|
s_2x2_Ctrl.LastCheckOKCount = SFM_2x2_GetSysCount();
|
||||||
s_2x2_Ctrl.OutPutCheckFailFlag = 0u;
|
s_2x2_Ctrl.OutPutCheckFailFlag = 0u;
|
||||||
|
s_2x2_Ctrl.AppFollowRcvFlag = CM_TRUE;
|
||||||
s_2x2_Ctrl.AppFollowCmpFlag = 0u;
|
s_2x2_Ctrl.AppFollowCmpFlag = 0u;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*无处理*/
|
/*无处理*/
|
||||||
}
|
}
|
||||||
|
if(1u == s_2x2_Ctrl.AppFollowCmpFlag && CM_TRUE == s_2x2_Ctrl.AppFollowRcvFlag && ENUM_2x2_MASTER == s_2x2_state_Ctrl.LocalState)
|
||||||
|
{
|
||||||
|
if(ENUM_2x2_SLAVE == s_2x2_state_Ctrl.PartnerState)
|
||||||
|
{
|
||||||
|
s_2x2_state_Ctrl.LocalState = ENUM_2x2_OFFLINE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CM_RE_ASSERT(0, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_24, TSCP_DARK_ASSERT_7);
|
||||||
|
}
|
||||||
|
}
|
||||||
MSCP_LOG_MSG("timecurr 16.0.0 = %lld us\n", NOW_USED_TIME);
|
MSCP_LOG_MSG("timecurr 16.0.0 = %lld us\n", NOW_USED_TIME);
|
||||||
/*- 记录上周期状态用于回滚*/
|
/*- 记录上周期状态用于回滚*/
|
||||||
s_2x2_state_Ctrl.LastLocalState = s_2x2_Ctrl.LocalState;
|
s_2x2_state_Ctrl.LastLocalState = s_2x2_Ctrl.LocalState;
|
||||||
@@ -1630,6 +1654,8 @@ void SFM_2x2_ChangeState(void)
|
|||||||
(void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_AREA, 1U, &s_2x2_Ctrl.LocalAreaState);
|
(void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_AREA, 1U, &s_2x2_Ctrl.LocalAreaState);
|
||||||
(void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_AREA_SWITCH, 1U, &s_2x2_Ctrl.AreaSwitchMode);
|
(void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_AREA_SWITCH, 1U, &s_2x2_Ctrl.AreaSwitchMode);
|
||||||
}
|
}
|
||||||
|
/* 如果发生了备系升主,暗文发送原因*/
|
||||||
|
s_2x2_SlaveSendSwitchReason();
|
||||||
|
|
||||||
SFM_2x2_LOG_Transition();
|
SFM_2x2_LOG_Transition();
|
||||||
SFM_AREA_LOG_Transition();
|
SFM_AREA_LOG_Transition();
|
||||||
@@ -1672,6 +1698,7 @@ void SFM_2x2_Init(IN const CM_UINT8 *VitalBuf, IN CM_UINT16 VitalLen, INOUT CM_U
|
|||||||
s_2x2_Ctrl.LocalState = ENUM_2x2_OFFLINE;
|
s_2x2_Ctrl.LocalState = ENUM_2x2_OFFLINE;
|
||||||
s_2x2_Ctrl.PartnerState = ENUM_2x2_SHUTDOWN;
|
s_2x2_Ctrl.PartnerState = ENUM_2x2_SHUTDOWN;
|
||||||
s_2x2_Ctrl.AppFollowCmpFlag = 1u;
|
s_2x2_Ctrl.AppFollowCmpFlag = 1u;
|
||||||
|
s_2x2_Ctrl.AppFollowRcvFlag = CM_FALSE;
|
||||||
|
|
||||||
/*- 更新上一周期的主备状态为这周期的主备状态(给应用用) */
|
/*- 更新上一周期的主备状态为这周期的主备状态(给应用用) */
|
||||||
s_2x2_Ctrl.LastLocalState = s_2x2_Ctrl.LocalState;
|
s_2x2_Ctrl.LastLocalState = s_2x2_Ctrl.LocalState;
|
||||||
@@ -1690,6 +1717,7 @@ void SFM_2x2_Init(IN const CM_UINT8 *VitalBuf, IN CM_UINT16 VitalLen, INOUT CM_U
|
|||||||
|
|
||||||
s_2x2_state_Ctrl.LocalAIDSwitchState = ENUM_2x2_AIDSWITCH_DISABLE;
|
s_2x2_state_Ctrl.LocalAIDSwitchState = ENUM_2x2_AIDSWITCH_DISABLE;
|
||||||
s_2x2_state_Ctrl.PartnerAIDSwitchState = ENUM_2x2_AIDSWITCH_DISABLE;
|
s_2x2_state_Ctrl.PartnerAIDSwitchState = ENUM_2x2_AIDSWITCH_DISABLE;
|
||||||
|
s_2x2_state_Ctrl.switchReason = ENUM_2x2_SWITCH_REASON_NULL;
|
||||||
|
|
||||||
s_2x2_state_Ctrl.LocalID =s_2x2_Ctrl.LocalID;
|
s_2x2_state_Ctrl.LocalID =s_2x2_Ctrl.LocalID;
|
||||||
s_2x2_state_Ctrl.PartnerID = s_2x2_Ctrl.PartnerID;
|
s_2x2_state_Ctrl.PartnerID = s_2x2_Ctrl.PartnerID;
|
||||||
@@ -3045,10 +3073,12 @@ void SFM_2x2_EndProc(void)
|
|||||||
curTickTest[0] = CM_GetTick();
|
curTickTest[0] = CM_GetTick();
|
||||||
if (s_2x2_Ctrl.RxAppFollowSysCyc >= sysCyc)
|
if (s_2x2_Ctrl.RxAppFollowSysCyc >= sysCyc)
|
||||||
{
|
{
|
||||||
|
s_2x2_Ctrl.AppFollowRcvFlag = CM_TRUE;
|
||||||
s_2x2_AppFollow_SyncCheck();
|
s_2x2_AppFollow_SyncCheck();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
s_2x2_Ctrl.AppFollowRcvFlag = CM_FALSE;
|
||||||
/*没有收到数据 将离线*/
|
/*没有收到数据 将离线*/
|
||||||
s_2x2_Ctrl.AppFollowCmpFlag = 1u;
|
s_2x2_Ctrl.AppFollowCmpFlag = 1u;
|
||||||
}
|
}
|
||||||
@@ -3063,12 +3093,14 @@ void SFM_2x2_EndProc(void)
|
|||||||
if (s_2x2_Ctrl.RxAppFollowSysCyc >= sysCyc)
|
if (s_2x2_Ctrl.RxAppFollowSysCyc >= sysCyc)
|
||||||
{
|
{
|
||||||
/*- 调用应用API覆盖应用关键数据 */
|
/*- 调用应用API覆盖应用关键数据 */
|
||||||
|
s_2x2_Ctrl.AppFollowRcvFlag = CM_TRUE;
|
||||||
retFollowUp = APP_API_FollowUp(g_RxAppFollow, (CM_UINT32)g_RxAppFollow_len);
|
retFollowUp = APP_API_FollowUp(g_RxAppFollow, (CM_UINT32)g_RxAppFollow_len);
|
||||||
CM_RE_ASSERT(ENUM_CM_TRUE == retFollowUp, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_9, TSCP_DARK_ASSERT_2);
|
CM_RE_ASSERT(ENUM_CM_TRUE == retFollowUp, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_9, TSCP_DARK_ASSERT_2);
|
||||||
s_2x2_Ctrl.AppFollowCmpFlag = 0u;
|
s_2x2_Ctrl.AppFollowCmpFlag = 0u;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
s_2x2_Ctrl.AppFollowRcvFlag = CM_FALSE;
|
||||||
s_2x2_Ctrl.AppFollowCmpFlag = 1u;
|
s_2x2_Ctrl.AppFollowCmpFlag = 1u;
|
||||||
}
|
}
|
||||||
curTickTest[1] = CM_GetTick();
|
curTickTest[1] = CM_GetTick();
|
||||||
@@ -4418,3 +4450,62 @@ static void s_2x2_BaseFollow_Sync(void)
|
|||||||
s_2x2_Ctrl.AreaTimeOffset = (CM_INT64)CM_64FromChar(&g_RxBaseFollow[offset]);
|
s_2x2_Ctrl.AreaTimeOffset = (CM_INT64)CM_64FromChar(&g_RxBaseFollow[offset]);
|
||||||
offset += 8u;
|
offset += 8u;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* @brief 备系设置切系原因
|
||||||
|
* @details 这个函数会设置所有可能的原因(按钮/AID/自动)
|
||||||
|
* */
|
||||||
|
static void s_2x2_SlaveGetSwitchReason(void)
|
||||||
|
{
|
||||||
|
if(ENUM_2x2_SLAVE == s_2x2_state_Ctrl.LocalState)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(1 == s_2x2_state_Ctrl.ctrSwitchFlag)
|
||||||
|
{
|
||||||
|
s_2x2_state_Ctrl.switchReason |= ENUM_2x2_SWITCH_REASON_CTR;
|
||||||
|
}
|
||||||
|
if(1u == s_2x2_state_Ctrl.aidSwitchFlag)
|
||||||
|
{
|
||||||
|
s_2x2_state_Ctrl.switchReason |= ENUM_2x2_SWITCH_REASON_AID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief 备系发送切系原因
|
||||||
|
* @details 实际切系原因只会有一种,发送时按照优先级发送(宕机自动切系>按钮>AID>其他自动切系)
|
||||||
|
* */
|
||||||
|
static void s_2x2_SlaveSendSwitchReason(void)
|
||||||
|
{
|
||||||
|
CM_UINT8 reason = 0x00u;
|
||||||
|
if(ENUM_2x2_MASTER == s_2x2_Ctrl.LocalState && ENUM_2x2_SLAVE == s_2x2_Ctrl.LastLocalState)
|
||||||
|
{
|
||||||
|
/* 执行了切系*/
|
||||||
|
if(ENUM_2x2_SHUTDOWN == s_2x2_Ctrl.PartnerState)
|
||||||
|
{
|
||||||
|
/* 另一系宕机,一定是自动切系(因为备系升主逻辑中宕机升主优先级最高)*/
|
||||||
|
reason = 0x00u;
|
||||||
|
}
|
||||||
|
else if(ENUM_2x2_SWITCH_REASON_CTR == (ENUM_2x2_SWITCH_REASON_CTR & s_2x2_state_Ctrl.switchReason))
|
||||||
|
{
|
||||||
|
/* 人工按钮切系*/
|
||||||
|
reason = 0x55u;
|
||||||
|
}
|
||||||
|
else if(ENUM_2x2_SWITCH_REASON_AID == (ENUM_2x2_SWITCH_REASON_AID & s_2x2_state_Ctrl.switchReason))
|
||||||
|
{
|
||||||
|
/* 人工AID切系*/
|
||||||
|
reason = 0xAAu;
|
||||||
|
}
|
||||||
|
else if(ENUM_2x2_SWITCH_REASON_AUTO == (ENUM_2x2_SWITCH_REASON_AUTO & s_2x2_state_Ctrl.switchReason))
|
||||||
|
{
|
||||||
|
/* 自动切系*/
|
||||||
|
reason = 0x00u;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* 其他情况,默认自动切系*/
|
||||||
|
reason = 0x00u;
|
||||||
|
}
|
||||||
|
(void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_2X2_SWITCH_REASON, 1U, &reason);
|
||||||
|
}
|
||||||
|
s_2x2_state_Ctrl.switchReason = ENUM_2x2_SWITCH_REASON_NULL;
|
||||||
|
}
|
||||||
@@ -45,6 +45,15 @@ extern CM_UINT32 g_MSCP_SysCount;
|
|||||||
#define MSCP_2X2_THREAD_TIME (40U) /*2x线程运行时间*/
|
#define MSCP_2X2_THREAD_TIME (40U) /*2x线程运行时间*/
|
||||||
#define MSCP_2X2_STATE_OVER_TIME (MSCP_2X2_THREAD_TIME + 25U) /*2x线程判断数据超时时间*/
|
#define MSCP_2X2_STATE_OVER_TIME (MSCP_2X2_THREAD_TIME + 25U) /*2x线程判断数据超时时间*/
|
||||||
#define MSCP_2X2_STATE_RCV_WITETIME (MSCP_2X2_THREAD_TIME - 20U) /*2x线程等待对系数据时间*/
|
#define MSCP_2X2_STATE_RCV_WITETIME (MSCP_2X2_THREAD_TIME - 20U) /*2x线程等待对系数据时间*/
|
||||||
|
|
||||||
|
/* 切系原因*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
ENUM_2x2_SWITCH_REASON_NULL = 0x00u, /* 没有切系*/
|
||||||
|
ENUM_2x2_SWITCH_REASON_AUTO = 0x01u, /* 自动切系*/
|
||||||
|
ENUM_2x2_SWITCH_REASON_CTR = 0x02u, /* 按钮切系*/
|
||||||
|
ENUM_2x2_SWITCH_REASON_AID = 0x04u /* AID切系*/
|
||||||
|
}ENUM_2x2_SWITCH_REASON_T;
|
||||||
/** 2x2消息类型 */
|
/** 2x2消息类型 */
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
@@ -190,6 +199,7 @@ extern CM_UINT32 g_MSCP_SysCount;
|
|||||||
/*输出比较信息*/
|
/*输出比较信息*/
|
||||||
CM_UINT32 LastCheckOKCount; /**< 上次输出比较成功(跟随成功)的本地时间,2oo2比较 (这个标志用来判断如果未收到主系的数据,则停止更新,后将为离线)*/
|
CM_UINT32 LastCheckOKCount; /**< 上次输出比较成功(跟随成功)的本地时间,2oo2比较 (这个标志用来判断如果未收到主系的数据,则停止更新,后将为离线)*/
|
||||||
CM_UINT32 OutPutCheckFailFlag; /**< 上次输出比较成功(跟随成功)的本地时间,2oo2比较 (这个标志用来判断收到输出数据后是否比较成功, 比较失败则降级)*/
|
CM_UINT32 OutPutCheckFailFlag; /**< 上次输出比较成功(跟随成功)的本地时间,2oo2比较 (这个标志用来判断收到输出数据后是否比较成功, 比较失败则降级)*/
|
||||||
|
CM_BOOL AppFollowRcvFlag; /* 上次应用跟随数据的接收结果,只判断是否是否成功接收*/
|
||||||
CM_UINT32 AppFollowCmpFlag; /**< 上次应用跟随数据比较结果,只有备系使用 (这个标志用来判断备系和主系应用跟随数据是否比较成功, 比较失败则降级)*/
|
CM_UINT32 AppFollowCmpFlag; /**< 上次应用跟随数据比较结果,只有备系使用 (这个标志用来判断备系和主系应用跟随数据是否比较成功, 比较失败则降级)*/
|
||||||
CM_UINT32 RxCheckSysCyc; /**< 收到的输出校验帧的周期号,2oo2交换 */
|
CM_UINT32 RxCheckSysCyc; /**< 收到的输出校验帧的周期号,2oo2交换 */
|
||||||
CM_INT32 RxCheckLen; /**< 收到的输出校验帧长度,2oo2交换 */
|
CM_INT32 RxCheckLen; /**< 收到的输出校验帧长度,2oo2交换 */
|
||||||
@@ -241,6 +251,7 @@ extern CM_UINT32 g_MSCP_SysCount;
|
|||||||
CM_UINT32 LastRxInputSysCyc; /**< 收到的对系输入数据的周期号,2oo2交换 */
|
CM_UINT32 LastRxInputSysCyc; /**< 收到的对系输入数据的周期号,2oo2交换 */
|
||||||
/*跟随数据*/
|
/*跟随数据*/
|
||||||
CM_UINT32 LastFollowCyc; /**< 上次进行平台跟随的时间,2oo2比较,*/
|
CM_UINT32 LastFollowCyc; /**< 上次进行平台跟随的时间,2oo2比较,*/
|
||||||
|
CM_BOOL AppFollowRcvFlag; /* 上次应用跟随数据的接收结果,只判断是否是否成功接收*/
|
||||||
CM_UINT32 AppFollowCmpFlag; /**< 上次应用跟随数据比较结果,只有备系使用 (这个标志用来判断备系和主系应用跟随数据是否比较成功, 比较失败则降级)*/
|
CM_UINT32 AppFollowCmpFlag; /**< 上次应用跟随数据比较结果,只有备系使用 (这个标志用来判断备系和主系应用跟随数据是否比较成功, 比较失败则降级)*/
|
||||||
|
|
||||||
/*输出比较信息*/
|
/*输出比较信息*/
|
||||||
@@ -261,6 +272,8 @@ extern CM_UINT32 g_MSCP_SysCount;
|
|||||||
ENUM_2x2_AID_SWITCH_STATE PartPeerAIDSwitchState; /**< 对系的邻机的主动切系按钮状态 */
|
ENUM_2x2_AID_SWITCH_STATE PartPeerAIDSwitchState; /**< 对系的邻机的主动切系按钮状态 */
|
||||||
CM_UINT8 aidSwitchFlag; /**< aid切系控制标志 */
|
CM_UINT8 aidSwitchFlag; /**< aid切系控制标志 */
|
||||||
|
|
||||||
|
ENUM_2x2_SWITCH_REASON_T switchReason; /*记录切系原因*/
|
||||||
|
|
||||||
/*脉冲*/
|
/*脉冲*/
|
||||||
ENUM_PULSE_TYPE_T pulse[5][2]; /* [][0]A系, [][1]B系, [0]四个CPU一致的脉冲,[1]1-1, [2]1-2, [3]2-1, [4]2-2(TODO 下标使用宏定义)*/
|
ENUM_PULSE_TYPE_T pulse[5][2]; /* [][0]A系, [][1]B系, [0]四个CPU一致的脉冲,[1]1-1, [2]1-2, [3]2-1, [4]2-2(TODO 下标使用宏定义)*/
|
||||||
ENUM_PULSE_TYPE_T pulseFeedBack; /*本系回读*/
|
ENUM_PULSE_TYPE_T pulseFeedBack; /*本系回读*/
|
||||||
|
|||||||
Reference in New Issue
Block a user