From 7e69b7c395667deae7089285728ea1d5f9f9beb1 Mon Sep 17 00:00:00 2001 From: lh <3191213465@qq.com> Date: Wed, 15 Jul 2026 16:31:39 +0800 Subject: [PATCH] =?UTF-8?q?AID=E9=87=8D=E5=90=AF=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E4=B8=8D=E5=8F=97=E5=BD=B1=E5=93=8D=EF=BC=8C=E5=BE=85=E4=B8=8E?= =?UTF-8?q?AIM=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TSCP/src/MSCP/MSCP_APP_API.c | 2 +- TSCP/src/MSCP/PFM/PFM_InputOutput.c | 3 +- TSCP/src/MSCP/PFM/PFM_RemoteUpdate.c | 87 +++++++++++++++++++--------- TSCP/src/MSCP/PFM/PFM_RemoteUpdate.h | 10 +++- TSCP/src/MSCP/SFM/SFM_Prtcl.c | 32 ++++++++-- TSCP/src/MSCP/SFM/SFM_Prtcl.h | 2 +- 6 files changed, 96 insertions(+), 40 deletions(-) diff --git a/TSCP/src/MSCP/MSCP_APP_API.c b/TSCP/src/MSCP/MSCP_APP_API.c index a828ee3..0aa1e05 100644 --- a/TSCP/src/MSCP/MSCP_APP_API.c +++ b/TSCP/src/MSCP/MSCP_APP_API.c @@ -160,7 +160,7 @@ CM_UINT8 MSCP_AppSendMsg(IN ENUM_MSCP_MSG_CHN_T ch, IN CM_UINT16 dstName, /*- 返回 */ break; case ENUM_MSG_INNET_MAINTENANCE: /*-< 远程部署内网安全通信 */ - rt = Prtcl_InnetSafe_AppRmSend(txBuf, txLen); + rt = Prtcl_InnetSafe_AppRmSend(dstName, txBuf, txLen); MSCP_LOG_MSG("MSCP_AppSendMsg txLen = %d \n",txLen); MSCP_LOG_BIN(txBuf,txLen); /*- 返回 */ diff --git a/TSCP/src/MSCP/PFM/PFM_InputOutput.c b/TSCP/src/MSCP/PFM/PFM_InputOutput.c index 7d1f057..d8c0081 100644 --- a/TSCP/src/MSCP/PFM/PFM_InputOutput.c +++ b/TSCP/src/MSCP/PFM/PFM_InputOutput.c @@ -997,7 +997,8 @@ static CM_INT32 s_2oo2OutputCheckFrame_Pack(OUT CM_UINT8 buf[], IN CM_UINT32 Buf } /*二取表决加入硬重启标志*/ buf[i++] = PFM_GetBoardRebootState(); - MSCP_LOG_MSG("PFM_GetBoardState = %d, PFM_GetBoardRebootState = %d\n",PFM_GetBoardState(), PFM_GetBoardRebootState()); + buf[i++] = PFM_GetHardRebootSrcID(); + MSCP_LOG_MSG("PFM_GetBoardState = %d, PFM_GetBoardRebootState = %d, PFM_GetHardRebootSrcID = %04x\n",PFM_GetBoardState(), PFM_GetBoardRebootState(), PFM_GetHardRebootSrcID()); /*- 返回输出校验报文长度 */ return i; } diff --git a/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.c b/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.c index 938bff6..163c553 100644 --- a/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.c +++ b/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.c @@ -44,11 +44,13 @@ static CM_UINT32 s_packTimer = 0u; /**< 请求命令时间戳 */ static CM_UINT32 s_packFirstSendTimer = 0u; /**< 第一次回复重启确认的周期号 */ static CM_UINT32 s_packFirstRecvTimer = 0u; /**< 收到aid第一次回复重启确认的周期号 */ static CM_UINT8 reboottype = 0u;/**< 重启请求命令 0x55:未更新重启 0xaa:升级重启 0xd1~d7:硬重启 */ +static CM_UINT16 s_rebootSrcid = 0u; extern CM_UINT32 g_MSCP_SysCount; /**< 系统周期号 */ static CM_UINT8 s_countres = 0u;/**重启确认报文回复次数计数 */ static CM_UINT8 packAccredit = 2u; /**授权状态 (当变量置为0或者1,则需要处理远程重启请求报文)*/ static CM_UINT8 reasonAuthorization = 0u; /*授权原因*/ static CM_UINT8 s_HardReboottype = 0u;/**<0xd1~d7:硬重启 */ +static CM_UINT16 s_HardRebootSrcid = 0u;/*接收到的重启命令的源ID*/ static CM_UINT8 s_packHardAccredit = 2u; /**硬重启授权状态 (当变量置为0或者1,则需要处理远程重启请求报文)*/ static CM_UINT8 s_reasonHardAuthorization = 0u; /*硬重启授权原因*/ @@ -100,7 +102,7 @@ static void PFM_DataReastart_SendTwo(void); static void PFM_RM_File(IN CM_UINT8 pathname[]); /*- 远程硬件重启命令接收处理 */ -static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UINT16 packLen,CM_UINT8 packType); +static void PFM_Data_HardWareReastart(CM_UINT16 srcName, CM_UINT8* mData,CM_UINT32 dataOffset,CM_UINT16 packLen,CM_UINT8 packType); /*- 远程切系命令接收处理 */ static void PFM_Data_RemoteSwitch(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UINT16 packLen,CM_UINT8 packType); @@ -109,7 +111,7 @@ static void PFM_Data_RemoteSwitch(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UINT16 static void PFM_RemoteSwitch_Send(CM_UINT8 type,CM_UINT32 rcv_packTime,CM_UINT8 accredit,CM_UINT8 reason); /*- 硬件重启确认帧组包发送 */ -static void PFM_HardWareReastart_Send(CM_UINT8 type,CM_UINT32 rcv_packTime,CM_UINT8 accredit,CM_UINT8 reason); +static void PFM_HardWareReastart_Send(CM_UINT8 type,CM_UINT16 dstName, CM_UINT32 rcv_packTime,CM_UINT8 accredit,CM_UINT8 reason); /*- 继电器检测 */ static ENUM_HARDWARE_BOOT_SELFCHECK_T PFM_Realy_Check(ENUM_HARDWARE_BOOT_SELFCHECK_T s_selfcheck_state,CM_UINT32 s_OutPutTime, CM_UINT8 comResult); @@ -963,6 +965,13 @@ CM_UINT8 PFM_GetBoardRebootState(void) /*- 获取重启状态 */ return reboottype; } +/** + * @brief 获取硬重启命令的源ID + */ +CM_UINT16 PFM_GetHardRebootSrcID(void) +{ + return s_rebootSrcid; +} /** * @brief 获取板卡运行状态 * @return 板卡运行状态 @@ -1467,7 +1476,7 @@ static void PFM_DataReastart_Send(void) CM_ShortToChar(packLen, &mData[0]); /*- 发送远程重启确认报文 */ MSCP_LOG_MSG("shut down dateOffset = %d, packLen = %d\n",dataOffset,packLen); - (void)Prtcl_InnetSafe_AppRmSend(mData, dataOffset); + (void)Prtcl_InnetSafe_AppRmSend(g_Maintenance_Ids[1], mData, dataOffset); } else { @@ -1540,7 +1549,7 @@ static void PFM_DataReastart_SendTwo(void) CM_ShortToChar(packLen, &mData[0]); /*- 发送远程重启确认报文 */ MSCP_LOG_MSG("shut down dateOffset = %d, packLen = %d\n",dataOffset,packLen); - (void)Prtcl_InnetSafe_AppRmSend(mData, dataOffset); + (void)Prtcl_InnetSafe_AppRmSend(g_Maintenance_Ids[1], mData, dataOffset); } else { @@ -1750,7 +1759,7 @@ ENUM_CM_RETURN PFM_MaintenanceID_Search(IN CM_UINT16 id) * @param reason 授权原因 取值范围:0~0xff * @return 无 */ -static void PFM_HardWareReastart_Send(CM_UINT8 type,CM_UINT32 rcv_packTime,CM_UINT8 accredit,CM_UINT8 reason) +static void PFM_HardWareReastart_Send(CM_UINT8 type,CM_UINT16 dstName, CM_UINT32 rcv_packTime,CM_UINT8 accredit,CM_UINT8 reason) { /*- 变量初始化 */ CM_UINT8 mData[1000] = { 0u }; @@ -1804,7 +1813,7 @@ static void PFM_HardWareReastart_Send(CM_UINT8 type,CM_UINT32 rcv_packTime,CM_UI dataOffset += 4u; packLen = dataOffset - 2u; CM_ShortToChar(packLen, &mData[0]); - ret = Prtcl_InnetSafe_AppRmSend(mData,dataOffset); + ret = Prtcl_InnetSafe_AppRmSend(dstName, mData,dataOffset); if(ret == 0) { /*输出异常警告*/ @@ -1880,7 +1889,7 @@ static void PFM_RemoteSwitch_Send(CM_UINT8 type,CM_UINT32 rcv_packTime,CM_UINT8 dataOffset += 4u; packLen = dataOffset - 2u; CM_ShortToChar(packLen, &mData[0]); - ret = Prtcl_InnetSafe_AppRmSend(mData,dataOffset); + ret = Prtcl_InnetSafe_AppRmSend(g_Maintenance_Ids[1],mData,dataOffset); if(ret == 0) { /*输出异常警告*/ @@ -1902,7 +1911,7 @@ static void PFM_RemoteSwitch_Send(CM_UINT8 type,CM_UINT32 rcv_packTime,CM_UINT8 * @param packLen 帧长度 取值范围:0~0xffff * @param packType 帧类型 取值范围:0~0xff */ -static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UINT16 packLen,CM_UINT8 packType) +static void PFM_Data_HardWareReastart(CM_UINT16 srcName,CM_UINT8* mData,CM_UINT32 dataOffset,CM_UINT16 packLen,CM_UINT8 packType) { /*- 变量初始化 */ CM_UINT32 packTimer = 0u; @@ -1915,6 +1924,7 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI CM_UINT32 packRestartCrc = 0u; /*重启请求命令crc*/ CM_UINT8 boottype = 0u;/**<临时 重启请求命令 0x55:未更新重启 0xaa:升级重启 0xd1~d7:硬重启 */ static CM_UINT8 s_boottype = 0u;/**<静态 重启请求命令 0x55:未更新重启 0xaa:升级重启 ,0xd1~d7:硬重启 */ + static CM_UINT16 s_srcid = 0u; CM_UINT8 recvType = 0u; ENUM_2x2_STATE_T localState = SFM_2x2_GetLocal2x2State(); /*- 如果帧类型是一次请求确认 */ @@ -1947,7 +1957,9 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI { /*- 非法包丢弃 */ s_boottype = 0u; + s_srcid = 0u; s_HardReboottype = 0u; + s_HardRebootSrcid = 0U; s_packHardAccredit = 1u; s_reasonHardAuthorization = 1u; (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_WARNING, 4U, DARK_FAULT_CODE_MERGE(REMOTE_UPDATE, DARK_FAULT_CODE_FUN_ORDER_13, TSCP_DARK_ASSERT_1)); @@ -1957,6 +1969,7 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI { /*- 非法包丢弃 */ s_boottype = 0u; + s_srcid = 0u; /* s_HardReboottype = 0u; */ s_packHardAccredit = 1u; s_reasonHardAuthorization = 5u; @@ -1968,7 +1981,9 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI { /*- 非法包丢弃 */ s_boottype = 0u; + s_srcid = 0u; s_HardReboottype = 0u; + s_HardRebootSrcid = 0U; s_packHardAccredit = 1u; s_reasonHardAuthorization = 6u; (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_WARNING, 4U, DARK_FAULT_CODE_MERGE(REMOTE_UPDATE, DARK_FAULT_CODE_FUN_ORDER_13, TSCP_DARK_ASSERT_2)); @@ -1978,7 +1993,9 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI { /*- 非法包丢弃 */ s_boottype = 0u; + s_srcid = 0u; s_HardReboottype = 0u; + s_HardRebootSrcid = 0U; s_packHardAccredit = 1u; s_reasonHardAuthorization = 7u; (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_WARNING, 4U, DARK_FAULT_CODE_MERGE(REMOTE_UPDATE, DARK_FAULT_CODE_FUN_ORDER_13, TSCP_DARK_ASSERT_3)); @@ -1987,9 +2004,10 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI else { s_boottype = boottype; + s_srcid = srcName; s_packHardAccredit = 0u; s_reasonHardAuthorization = 0u; - MSCP_LOG_MSG("0xa5 boottype = %d\n",boottype); + MSCP_LOG_MSG("0xa5 boottype = %d, srcid = %04x\n",boottype, s_srcid); } /*首次应答*/ recvType = 0x55u; @@ -2027,29 +2045,34 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI { /*- crc计算失败丢弃错误包 */ s_boottype = 0u; + s_srcid = 0u; s_HardReboottype = 0u; + s_HardRebootSrcid = 0U; s_packHardAccredit = 1u; s_reasonHardAuthorization = 1u; MSCP_LOG_MSG("error pack 0xa6 packSwitchCrc=%d,calcCrc1=%d,packCrc=%d,calcCrc2=%d\n",packRestartCrc,calcCrc1,packCrc,calcCrc2); (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_WARNING, 4U, DARK_FAULT_CODE_MERGE(REMOTE_UPDATE, DARK_FAULT_CODE_FUN_ORDER_13, TSCP_DARK_ASSERT_4)); } /*- 是否正在执行其它命令 */ - else if((0x55 == s_switch2xFlag) || (0x55 == s_switchRmFlag) || (1 == g_iostate)) + else if((0x55 == s_switch2xFlag) || (0x55 == s_switchRmFlag) || (1 == g_iostate) || (s_srcid != srcName)) { /*- 正在执行其它命令 */ s_boottype = 0u; + s_srcid = 0u; /* s_HardReboottype = 0u; */ s_packHardAccredit = 1u; s_reasonHardAuthorization = 5u; - MSCP_LOG_MSG("error pack 0xa6,s_switch2xFlag=%d,s_switchRmFlag=%d,g_iostate=%d\n" \ - ,s_switch2xFlag,s_switchRmFlag,g_iostate); + MSCP_LOG_MSG("error pack 0xa6,s_switch2xFlag=%d,s_switchRmFlag=%d,g_iostate=%d,srcName=%04x-%04x\n" \ + ,s_switch2xFlag,s_switchRmFlag,g_iostate,s_srcid,srcName); (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_WARNING, 4U, DARK_FAULT_CODE_MERGE(REMOTE_UPDATE, DARK_FAULT_CODE_FUN_ORDER_13, TSCP_DARK_ASSERT_5)); } /*- 切系命令一次回复到二次请求接收时间是否小于两分钟 */ else if(((g_MSCP_SysCount - s_packFirstRecvTimer)*g_RMUP_Cfg.CYC_TIME) >= 120000u) { s_boottype = 0u; + s_srcid = 0u; s_HardReboottype = 0u; + s_HardRebootSrcid = 0U; s_packHardAccredit = 1u; s_reasonHardAuthorization = 7u; MSCP_LOG_MSG("error pack 0xa6 g_MSCP_SysCount = %d s_packFirstRecvTimer = %d\n", g_MSCP_SysCount, s_packFirstRecvTimer); @@ -2058,7 +2081,9 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI else if((boottype <= 0xd0u) || (boottype >= 0xd8u ) || (s_boottype != boottype)) { s_boottype = 0u; + s_srcid = 0u; s_HardReboottype = 0u; + s_HardRebootSrcid = 0U; s_packHardAccredit = 1u; s_reasonHardAuthorization = 6u; MSCP_LOG_MSG("error pack 0xa6 s_boottype = %d boottype = %d\n", s_boottype, boottype); @@ -2067,17 +2092,18 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI else { s_HardReboottype = s_boottype; + s_HardRebootSrcid = s_srcid; s_packHardAccredit = 0u; s_reasonHardAuthorization = 0u; g_iostate = 0x1u; - MSCP_LOG_MSG("0xa6 boottype = %d, s_boottype = %d\n",boottype, s_boottype); + MSCP_LOG_MSG("0xa6 boottype = %d, s_boottype = %d, s_srcid = %d\n",boottype, s_boottype, s_srcid); } /*再次应答*/ recvType = 0x56u; } /*- 硬重启命令请求回复 */ - PFM_HardWareReastart_Send(recvType,packTimer,s_packHardAccredit,s_reasonHardAuthorization); + PFM_HardWareReastart_Send(recvType,srcName,packTimer,s_packHardAccredit,s_reasonHardAuthorization); } /** @@ -2288,7 +2314,7 @@ static void PFM_Data_RemoteSwitch(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UINT16 * - 0xa7首次切系请求 * - 0xa8二次切系请求 */ -CM_UINT8 PFM_RemoteRun_Data(CM_UINT8 *mData,CM_UINT32 dataLen) +CM_UINT8 PFM_RemoteRun_Data(CM_UINT16 srcName, CM_UINT8 *mData,CM_UINT32 dataLen) { /*- 变量初始化 */ CM_UINT32 dataOffset = 0u; @@ -2308,7 +2334,7 @@ CM_UINT8 PFM_RemoteRun_Data(CM_UINT8 *mData,CM_UINT32 dataLen) { if((0xA5u == packType) || (0xA6u == packType)) { - PFM_Data_HardWareReastart(mData,dataOffset,packLen,packType); + PFM_Data_HardWareReastart(srcName,mData,dataOffset,packLen,packType); } else if((0xA7u == packType) || (0xA8u == packType)) { @@ -2343,7 +2369,8 @@ void PFM_HardWareBoot_UpData(void) g_boardState = g_AppSetboardState; /*- 更新硬重启模式 */ reboottype = s_HardReboottype; - MSCP_LOG_MSG("reboottype = %d, s_HardReboottype = %d\n",reboottype,s_HardReboottype); + s_rebootSrcid = s_HardRebootSrcid; + MSCP_LOG_MSG("reboottype = %d, s_HardReboottype = %d, s_HardRebootSrcid = %04x\n",reboottype,s_HardReboottype,s_HardRebootSrcid); /*- 更新切系状态 */ if(0x55 == s_switchRmFlag) { @@ -2370,11 +2397,13 @@ void PFM_HardWareBoot_OutPut(void) /*- 变量初始化 */ CM_INT32 ret = 0; CM_UINT8 type = 0u; + CM_UINT16 srcID = 0u; static ENUM_HARDWARE_BOOT_SELFCHECK_T checkselfret = ENUM_RELAY_1ST_OUTPUT; /*- 重启命令为硬重启命令 */ if((0xd0u < reboottype) && (0xd8u > reboottype)) { type = reboottype; + srcID = s_rebootSrcid; /*- @alias 执行硬重启 */ switch(type) { @@ -2383,7 +2412,7 @@ void PFM_HardWareBoot_OutPut(void) if(ENUM_2x2_MASTER == SFM_2x2_GetLocal2x2State()) { MSCP_LOG_MSG("PFM_HardWareBoot_OutPut 1\n"); - checkselfret = PFM_HardWareBoot_CheckSelf(0x0Cu,ENUM_TYPE_PUB,type); + checkselfret = PFM_HardWareBoot_CheckSelf(0x0Cu,ENUM_TYPE_PUB,type,srcID); } else { @@ -2395,22 +2424,22 @@ void PFM_HardWareBoot_OutPut(void) case 0xd2: /*- 1010:CCU*/ MSCP_LOG_MSG("PFM_HardWareBoot_OutPut 3\n"); - checkselfret = PFM_HardWareBoot_CheckSelf(0x0Au,ENUM_TYPE_CCU,type); + checkselfret = PFM_HardWareBoot_CheckSelf(0x0Au,ENUM_TYPE_CCU,type,srcID); break; case 0xd3: /*- 0110:SEB*/ MSCP_LOG_MSG("PFM_HardWareBoot_OutPut 4\n"); - checkselfret = PFM_HardWareBoot_CheckSelf(0x06u,ENUM_TYPE_SEB,type); + checkselfret = PFM_HardWareBoot_CheckSelf(0x06u,ENUM_TYPE_SEB,type,srcID); break; case 0xd4: /*- 1001:ESB*/ MSCP_LOG_MSG("PFM_HardWareBoot_OutPut 5\n"); - checkselfret = PFM_HardWareBoot_CheckSelf(0x09u,ENUM_TYPE_ESB,type); + checkselfret = PFM_HardWareBoot_CheckSelf(0x09u,ENUM_TYPE_ESB,type,srcID); break; case 0xd5: /*- 0101:EEB*/ MSCP_LOG_MSG("PFM_HardWareBoot_OutPut 6\n"); - checkselfret = PFM_HardWareBoot_CheckSelf(0x05u,ENUM_TYPE_OTHER,type); + checkselfret = PFM_HardWareBoot_CheckSelf(0x05u,ENUM_TYPE_OTHER,type,srcID); break; case 0xd6: /*- 0011:OCIO预留,硬件不支持禁止打开*/ @@ -2424,7 +2453,7 @@ void PFM_HardWareBoot_OutPut(void) if(ENUM_2x2_MASTER == SFM_2x2_GetLocal2x2State()) { MSCP_LOG_MSG("PFM_HardWareBoot_OutPut 9\n"); - checkselfret = PFM_HardWareBoot_CheckSelf(0x0Fu,ENUM_TYPE_ALL,type); + checkselfret = PFM_HardWareBoot_CheckSelf(0x0Fu,ENUM_TYPE_ALL,type,srcID); } else { @@ -2445,7 +2474,9 @@ void PFM_HardWareBoot_OutPut(void) MSCP_LOG_MSG("PFM_HardWareBoot_OutPut 12\n"); /*- 恢复运营状态*/ reboottype = 0u; + s_rebootSrcid = 0u; s_HardReboottype = 0u; + s_HardRebootSrcid = 0u; g_iostate = 0x0u; } } @@ -2468,7 +2499,7 @@ void PFM_HardWareBoot_OutPut(void) * @param reboottype 重启命令类型 取值范围:0xD1~0xD7 * @return ENUM_HARDWARE_BOOT_SELFCHECK_T 当前检测步骤 取值范围:0~11 */ -ENUM_HARDWARE_BOOT_SELFCHECK_T PFM_HardWareBoot_CheckSelf(CM_UINT8 level,ENUM_BOARD_TYPE_T board_type,CM_UINT8 reboottype) +ENUM_HARDWARE_BOOT_SELFCHECK_T PFM_HardWareBoot_CheckSelf(CM_UINT8 level,ENUM_BOARD_TYPE_T board_type,CM_UINT8 reboottype, CM_UINT16 srcName) { /*- 变量初始化 */ static ENUM_HARDWARE_BOOT_SELFCHECK_T s_selfcheck_state = ENUM_RELAY_1ST_OUTPUT; @@ -2738,8 +2769,8 @@ ENUM_HARDWARE_BOOT_SELFCHECK_T PFM_HardWareBoot_CheckSelf(CM_UINT8 level,ENUM_BO /*- 反馈执行结果 */ case ENUM_OUTPUT_RESULT: /*- 发送结果至AID */ - MSCP_LOG_MSG("s_relay_default[0] = %d,s_relay_default[1] = %d,s_relay_default[2] = %d,s_relay_default[3] = %d\n",s_relay_default[0],s_relay_default[1],s_relay_default[2],s_relay_default[3]); - PFM_HardWareBoot_CheckSelf_Response(s_boot_result,s_relay_default,reboottype); + MSCP_LOG_MSG("s_relay_default[0] = %d,s_relay_default[1] = %d,s_relay_default[2] = %d,s_relay_default[3] = %d, srcName = %04x\n",s_relay_default[0],s_relay_default[1],s_relay_default[2],s_relay_default[3], srcName); + PFM_HardWareBoot_CheckSelf_Response(s_boot_result,s_relay_default,reboottype, srcName); /*- 清空所有标志位 */ s_selfcheck_state = ENUM_RELAY_1ST_OUTPUT; s_OutPutTime = 0u; @@ -2901,7 +2932,7 @@ CM_UINT8 PFM_HardWareBoot_CheckSelf_ComState(ENUM_BOARD_TYPE_T type, CM_UINT8 s_ * @param reboottype 重启命令类型 取值范围:0xd1~0xd7 * @return 无 */ -void PFM_HardWareBoot_CheckSelf_Response(CM_UINT8 boot_result,CM_UINT8 *defaultbuf,CM_UINT8 reboottype) +void PFM_HardWareBoot_CheckSelf_Response(CM_UINT8 boot_result,CM_UINT8 *defaultbuf,CM_UINT8 reboottype,CM_UINT16 dstName) { /*- 变量初始化 */ CM_UINT8 mData[1000] = { 0u }; @@ -2946,7 +2977,7 @@ void PFM_HardWareBoot_CheckSelf_Response(CM_UINT8 boot_result,CM_UINT8 *defaultb dataOffset += 4u; packLen = dataOffset - 2u; CM_ShortToChar(packLen, &mData[0]); - ret = Prtcl_InnetSafe_AppRmSend(mData,dataOffset); + ret = Prtcl_InnetSafe_AppRmSend(dstName,mData,dataOffset); if(ret == 0) { /*- 输出异常警告 */ diff --git a/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.h b/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.h index 8f80808..3a2e35e 100644 --- a/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.h +++ b/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.h @@ -124,7 +124,7 @@ ENUM_CM_RETURN PFM_MaintenanceID_Search(IN CM_UINT16 id); /** * @brief 远程硬件重启\切系命令接收处理 */ -CM_UINT8 PFM_RemoteRun_Data(CM_UINT8 *mData,CM_UINT32 dataLen); +CM_UINT8 PFM_RemoteRun_Data(CM_UINT16 srcName, CM_UINT8 *mData,CM_UINT32 dataLen); /*硬件重启IO更新*/ void PFM_HardWareBoot_UpData(void); /*执行硬件重启IO输出*/ @@ -132,14 +132,17 @@ void PFM_HardWareBoot_OutPut(void); CM_UINT8 PFM_GetBoardRebootState(void); +CM_UINT16 PFM_GetHardRebootSrcID(void); + /** * @brief 硬重启自检状态机 * @param level 待输出IO 取值范围:0x00~0x0F * @param board_type 当前命令目标重启板卡类型 取值范围:ENUM_BOARD_TYPE_T * @param reboottype 重启命令类型 取值范围:0xD1~0xD7 +* @param srcName 重启命令的源ID * @return ENUM_HARDWARE_BOOT_SELFCHECK_T 当前检测步骤 */ -ENUM_HARDWARE_BOOT_SELFCHECK_T PFM_HardWareBoot_CheckSelf(CM_UINT8 level,ENUM_BOARD_TYPE_T board_type,CM_UINT8 reboottype); +ENUM_HARDWARE_BOOT_SELFCHECK_T PFM_HardWareBoot_CheckSelf(CM_UINT8 level,ENUM_BOARD_TYPE_T board_type,CM_UINT8 reboottype, CM_UINT16 srcName); /** * @brief 识别AB系通信需要计算的板卡通信状态(对系) * @param type 当前判断板卡通信状态类型 取值范围:ENUM_BOARD_TYPE_T @@ -153,9 +156,10 @@ CM_UINT8 PFM_HardWareBoot_CheckSelf_ComState(ENUM_BOARD_TYPE_T type, CM_UINT8 s_ * @param boot_result 硬重启结果 取值范围:0x55成功,0xAA失败 * @param *defaultbuf 继电器检测结果数组 取值范围:0x55成功,0xAA故障 * @param reboottype 重启命令类型 取值范围:0xd1~0xd7 +* @param dstName 回复的目的ID * @return 无 */ -void PFM_HardWareBoot_CheckSelf_Response(CM_UINT8 boot_result,CM_UINT8 *defaultbuf,CM_UINT8 reboottype); +void PFM_HardWareBoot_CheckSelf_Response(CM_UINT8 boot_result,CM_UINT8 *defaultbuf,CM_UINT8 reboottype,CM_UINT16 dstName); /** * @brief 识别AB系通信需要计算的板卡通信状态 diff --git a/TSCP/src/MSCP/SFM/SFM_Prtcl.c b/TSCP/src/MSCP/SFM/SFM_Prtcl.c index 672ce1d..3fd5a5f 100644 --- a/TSCP/src/MSCP/SFM/SFM_Prtcl.c +++ b/TSCP/src/MSCP/SFM/SFM_Prtcl.c @@ -994,7 +994,7 @@ CM_UINT32 Prtcl_InnetSafe_RmRecv(OUT CM_UINT16* pSrcName, OUT CM_UINT8* pLifeTim (void)CM_QueueRead(rt_len, rxBuf, &s_Innet_RmRecvQ); /*- 解析通信协议,如果是重启或切系命令,执行重启或切系逻辑*/ - rt = PFM_RemoteRun_Data(rxBuf,rt_len); + rt = PFM_RemoteRun_Data(*pSrcName,rxBuf,rt_len); /*- 如果是重启命令*/ if((0xA5 <= rt) && (0xA8 >= rt)) { @@ -1114,7 +1114,7 @@ CM_UINT32 Prtcl_InnetSafe_PlatRmRecv(OUT CM_UINT16* pSrcName, OUT CM_UINT8* pLif * - 0 失败(输入非法) * @details */ -CM_UINT8 Prtcl_InnetSafe_AppRmSend(IN const CM_UINT8* txBuf, IN CM_UINT32 txLen) +CM_UINT8 Prtcl_InnetSafe_AppRmSend(IN CM_UINT16 dstName, IN const CM_UINT8* txBuf, IN CM_UINT32 txLen) { /*- 变量初始化 */ CM_UINT8 buf[2u] = { 0u }; /* 临时变量 */ @@ -1126,14 +1126,17 @@ CM_UINT8 Prtcl_InnetSafe_AppRmSend(IN const CM_UINT8* txBuf, IN CM_UINT32 txLen) { /* 2字节 长度(不含自身) + 2字节 目的ID n字节 数据 */ /*- 锁定发送队列 */ (void)CM_Mutex_Lock(s_Innet_AppRmSend_M); /*- 填写协议输出帧头 */ - CM_ShortToChar(txLen, buf); + CM_ShortToChar(txLen + 2, buf); temprt &= CM_QueueWrite(2u, buf, &s_Innet_AppRmSendQ);/*长度*/ + CM_ShortToCharLE(dstName, buf); + temprt &= CM_QueueWrite(2u, buf, &s_Innet_AppRmSendQ);/*目的ID*/ /*- 填写应用输出报文 */ temprt &= CM_QueueWrite(txLen, txBuf, &s_Innet_AppRmSendQ); if(ENUM_CM_TRUE == temprt) @@ -1176,9 +1179,11 @@ CM_UINT8 Prtcl_InnetSafe_RmSend(IN CM_UINT16 dstName, IN const CM_UINT8* txBuf, CM_UINT16 len = 0u; /* 长度 */ CM_UINT16 applen = 0u; /* 长度 */ CM_UINT8 buf[2u] = { 0u }; /* 临时变量 */ + CM_UINT8 buf4[4u] = {0u}; /* 临时变量*/ CM_UINT8 Buftmp[128] = { 0u }; /* 临时变量 */ CM_UINT8 rt = 0u; /* 函数返回值 */ ENUM_CM_RETURN temprt = ENUM_CM_TRUE; /* 临时返回值 */ + CM_UINT16 appDstID = 0x00u; /*- 输入长度检查 */ if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) @@ -1188,12 +1193,27 @@ CM_UINT8 Prtcl_InnetSafe_RmSend(IN CM_UINT16 dstName, IN const CM_UINT8* txBuf, /*- 读取应用帧头 */ /* 2字节 长度(不含自身) + 2字节 目的ID n字节 数据 */ - (void)CM_QueueRead(2u, buf, &s_Innet_AppRmSendQ);/*长度*/ + (void)CM_QueueScan(2u, buf, &s_Innet_AppRmSendQ);/*长度*/ applen = CM_ShortFromChar(buf); - - (void)CM_QueueRead(applen, Buftmp, &s_Innet_AppRmSendQ);/*长度*/ + if(applen >= 2u) + { + (void)CM_QueueScan(4u, buf4, &s_Innet_AppRmSendQ);/*长度*/ + appDstID = CM_ShortFromCharLE(&buf4[2]); + temprt = PFM_MaintenanceID_Search(appDstID); + applen -= 2u; + } + if(appDstID == dstName || ENUM_CM_FALSE == temprt) + { + (void)CM_QueueRead(2u, buf, &s_Innet_AppRmSendQ); + (void)CM_QueueRead(2u, buf, &s_Innet_AppRmSendQ); + (void)CM_QueueRead(applen, Buftmp, &s_Innet_AppRmSendQ);/*长度*/ + } + else + { + } /*- 解锁发送队列 */ (void)CM_Mutex_Unlock(s_Innet_AppRmSend_M); diff --git a/TSCP/src/MSCP/SFM/SFM_Prtcl.h b/TSCP/src/MSCP/SFM/SFM_Prtcl.h index 03b3f7d..9ba3f0c 100644 --- a/TSCP/src/MSCP/SFM/SFM_Prtcl.h +++ b/TSCP/src/MSCP/SFM/SFM_Prtcl.h @@ -171,7 +171,7 @@ extern "C" /* 发送内网远程部署安全通信数据 */ void SFM_TxInnetSafeRemoteUpdate(IN CM_UINT8 Buf[], IN CM_UINT32 Len); - CM_UINT8 Prtcl_InnetSafe_AppRmSend(IN const CM_UINT8* txBuf, IN CM_UINT32 txLen); + CM_UINT8 Prtcl_InnetSafe_AppRmSend(IN CM_UINT16 dstName, IN const CM_UINT8* txBuf, IN CM_UINT32 txLen); CM_UINT32 Prtcl_InnetSafe_RmRecv(OUT CM_UINT16* pSrcName, OUT CM_UINT8* pLifeTime, OUT CM_UINT8* rxBuf, IN CM_UINT32 rxSize);