Files
TSCP/TSCP/src/APP/ciapp/ParsePack/ParsePackGateWayData.c
T
2026-06-01 10:44:32 +08:00

2816 lines
70 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.
#include "ParsePackGateWayData.h"
#include "DeviceConfigDataManage.h"
#include "TrainDataManage.h"
#include "2oo2InterfaceDataManage.h"
#include "dquCIInterFace.h"
#include "WLBrakeDataManage.h"
#include "RRMManageAPI.h"
AtsScreenMsgFstStru g_strAtsMsgFst = { 0u }; /*远程筛选首次消息*/
AtsMsgCfmStru g_strAtsCfmFst = { 0u }; /*远程筛选首次确认*/
AtsScreenMsgSndStru g_strAtsMsgSnd = { 0u }; /*远程筛选二次消息*/
AtsMsgCfmStru g_strAtsCfmSnd = { 0u }; /*远程筛选二次确认*/
AtsEaMsgStru g_strAtsEaMsgFst = { 0u }; /*取消区间疏散首次消息*/
AtsMsgCfmStru g_strAtsEaCfmFst = { 0u }; /*取消区间疏散首次确认*/
AtsEaMsgStru g_strAtsEaMsgSnd = { 0u }; /*取消区间疏散再次消息*/
AtsMsgCfmStru g_strAtsEaCfmSnd = { 0u }; /*取消区间疏散再次确认*/
AtsWlbMsgStru g_strAtsWlbMsgFst = { 0u }; /*设置/取消全线列车紧急制动首次消息*/
AtsMsgCfmStru g_strAtsWlbCfmFst = { 0u }; /*设置/取消全线列车紧急制动首次确认*/
AtsWlbMsgStru g_strAtsWlbMsgSnd = { 0u }; /*取消全线列车紧急制动再次消息*/
AtsMsgCfmStru g_strAtsWlbCfmSnd = { 0u }; /*取消全线列车紧急制动再次确认*/
AtsDaMsgStru g_strAtsDaMsgFst = { 0u }; /*取消脱轨防护区首次消息*/
AtsMsgCfmStru g_strAtsDaCfmFst = { 0u }; /*取消脱轨防护区首次确认*/
AtsDaMsgStru g_strAtsDaMsgSnd = { 0u }; /*取消脱轨防护区再次消息*/
AtsMsgCfmStru g_strAtsDaCfmSnd = { 0u }; /*取消脱轨防护区再次确认*/
AtsMsgCfmStru g_strSndAtsCfmFst = { 0U }; /*第二个ATS的远程筛选首次确认*/
AtsMsgCfmStru g_strSndAtsEaCfmFst = { 0U }; /*第二个ATS的取消区间疏散首次确认*/
AtsMsgCfmStru g_strSndAtsWlbCfmFst = { 0U }; /*第二个ATS的设置/取消全线列车紧急制动首次确认*/
AtsMsgCfmStru g_strSndAtsDaCfmFst = { 0U }; /*第二个ATS的取消脱轨防护区首次确认*/
/**
* @brief 解析网关数据帧
* @param const UINT8* dataBuf, 数据缓冲区
* @param const UINT16 dataLength, 数据长度
* @return CI_SUCCESS:成功;CI_ERROR:失败
*/
UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength)
{
UINT8 chRtn = CI_ERROR;
UINT8 chRtn1 = CI_SUCCESS;
UINT8 chRtn2 = CI_SUCCESS;
UINT8 chRtn3 = CI_SUCCESS;
UINT8 chMsgNum = 0u;
UINT32 dwDataVer = 0u;
UINT32 dwPrtclMsg = 0u;
UINT8 chMsgId = 0u;
UINT16 ii = 0u;
UINT16 jj = 0U;
UINT32 dwDataVerLocal = 0u;
UINT8 chMsgIndex = 0u;
UINT8 chLocalId = 0u;
UINT8 chTrainIndex = 0u;
UINT16 wMsgLen = 0U;
UINT16 wMsgLenCount = 0U;
UINT8 cAtsId = 0U;
UINT8 cStation = 0U;
UINT16 wIndex = 0U;
UINT8 cAtsSendRcId = 0U;
UINT32 dwTime = 0U;
UINT8 cTrainNum = 0U;
AtsScreenTrainInfoStru strTrainInfo[TRAIN_SUM_MAX] = { 0U };
UINT32 dwTrainHlhtId = 0U; /*列车互联互通ID*/
UINT8 cCmdType = 0U; /*命令类型*/
UINT8 cLineAttr = 0U; /*线路属性*/
UINT8 cDevType = 0U; /*设备类型*/
UINT8 cDevNum = 0U;
UINT16 wDevId = 0U;
UINT8 szCrcTmp[1024] = { 0U };
if ((NULL != dataBuf) && (0u < dataLength))
{
chLocalId = GetSystemParaLocalCiId();
/* 消息数量 */
chMsgNum = dataBuf[ii++];
/* 数据版本号 */
dwDataVer = LongFromChar(&dataBuf[ii]);
ii += 4u;
/* 协议消息 */
dwPrtclMsg = LongFromChar(&dataBuf[ii]);
ii += 4u;
chRtn = GetCiEmapCheckVer(chLocalId, &dwDataVerLocal, CI_SYSTEM_TYPE_ATS);
if (CI_SUCCESS == chRtn)
{
if(dwDataVer == dwDataVerLocal)
{
; /* 数据版本号校验通过 */
}
else
{
chRtn = CI_ERROR;
chRtn3 = CI_ERROR;
}
}
else
{
; /*获取失败*/
}
if (CI_SUCCESS == chRtn)
{
if (GATE_WAY_PRTCL_VER == dwPrtclMsg)
{
; /* 协议版本号校验通过 */
}
else
{
chRtn = CI_ERROR;
chRtn3 = CI_ERROR;
}
}
else
{
; /*不处理*/
}
if (CI_SUCCESS == chRtn)
{
for (chMsgIndex = 0u; chMsgIndex < chMsgNum; chMsgIndex++)
{
chMsgId = dataBuf[ii++];
wMsgLen = ShortFromChar(&dataBuf[ii]);
ii += 2U;
wMsgLenCount = ii;
ii++;
switch (chMsgId)
{
case MSG_TYPE_REQUEST_FIRST:/* 远程筛选首次消息 */
{
wIndex = ShortFromChar(&dataBuf[ii + 2U]);
if ((FLAG_SET != g_strAtsMsgFst.chFlag) || (g_strAtsMsgFst.wIndex == wIndex))
{
/*未收到或重复收到同一个ATS的一次命令时,解析第一个ATS下发的远程筛选首次消息*/
g_strAtsMsgFst.dwCycle = Get2oo2CurCycleNum();
g_strAtsMsgFst.chAtsId = dataBuf[ii++];
if (0U < g_strAtsMsgFst.chAtsId)
{
;
}
else
{
chRtn = CI_ERROR;
}
if (CI_SUCCESS == chRtn)
{
g_strAtsMsgFst.chStation = dataBuf[ii++];
g_strAtsMsgFst.wIndex = ShortFromChar(&dataBuf[ii]);
ii += 2U;
if (0U < g_strAtsMsgFst.wIndex)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsMsgFst.chTiocId = dataBuf[ii++];
if (g_strAtsMsgFst.chTiocId == chLocalId)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsMsgFst.dwTime = LongFromChar(&dataBuf[ii]);
ii += 4u;
g_strAtsMsgFst.chTrainNum = dataBuf[ii++];
if ((0U < g_strAtsMsgFst.chTrainNum) && (ATS_GATEWAY_CI_TRAIN_MAX > g_strAtsMsgFst.chTrainNum))
{
for (chTrainIndex = 0u; chTrainIndex < g_strAtsMsgFst.chTrainNum; chTrainIndex++)
{
g_strAtsMsgFst.strTrainInfo[chTrainIndex].dwTrainId = LongFromChar(&dataBuf[ii]);
ii += 4u;
if ((0U == g_strAtsMsgFst.strTrainInfo[chTrainIndex].dwTrainId)
|| (UINT32_MAX == g_strAtsMsgFst.strTrainInfo[chTrainIndex].dwTrainId))
{
chRtn = CI_ERROR;
}
else
{
; /*DO NOTHING*/
}
g_strAtsMsgFst.strTrainInfo[chTrainIndex].wLgcId = ShortFromChar(&dataBuf[ii]);
ii += 2u;
if ((0U == g_strAtsMsgFst.strTrainInfo[chTrainIndex].wLgcId)
|| (UINT16_MAX == g_strAtsMsgFst.strTrainInfo[chTrainIndex].wLgcId))
{
chRtn = CI_ERROR;
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
; /*不处理*/
}
else
{
break;
}
}
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsMsgFst.chFlag = FLAG_SET;
}
else
{
; /*DO NOTHING*/
}
chRtn1 = chRtn;
}
else
{
/*解析第二个ATS下发的远程筛选首次消息*/
cAtsId = dataBuf[ii]; /*解析ATS ID*/
ii++;
if (0U < cAtsId)
{
cStation = dataBuf[ii]; /*解析车站编号*/
ii++;
wIndex = ShortFromChar(&dataBuf[ii]); /*解析操作中编号*/
ii += 2U;
if (0U < wIndex)
{
cAtsSendRcId = dataBuf[ii]; /*解析RC ID*/
ii++;
if (cAtsSendRcId == chLocalId)
{
dwTime = LongFromChar(&dataBuf[ii]); /*解析一次命令请求时间*/
ii += 4U;
cTrainNum = dataBuf[ii];
ii++;
if ((0U < cTrainNum) && (ATS_GATEWAY_CI_TRAIN_MAX > cTrainNum))
{
for (chTrainIndex = 0U; chTrainIndex < cTrainNum; chTrainIndex++)
{
strTrainInfo[chTrainIndex].dwTrainId = LongFromChar(&dataBuf[ii]);
ii += 4U;
if ((0U == strTrainInfo[chTrainIndex].dwTrainId)
|| (UINT32_MAX == strTrainInfo[chTrainIndex].dwTrainId))
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Train Id[%d] Error\n", MSG_TYPE_REQUEST_FIRST, strTrainInfo[chTrainIndex].dwTrainId);
chRtn = CI_ERROR;
}
else
{
; /*DO NOTHING*/
}
strTrainInfo[chTrainIndex].wLgcId = ShortFromChar(&dataBuf[ii]);
ii += 2U;
if ((0U == strTrainInfo[chTrainIndex].wLgcId)
|| (UINT16_MAX == strTrainInfo[chTrainIndex].wLgcId))
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse LogSec Id[%d] Error\n", MSG_TYPE_REQUEST_FIRST, strTrainInfo[chTrainIndex].wLgcId);
chRtn = CI_ERROR;
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
; /*不处理*/
}
else
{
break;
}
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Train Num[%d] Error\n", MSG_TYPE_REQUEST_FIRST, cTrainNum);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Rc Id[%d] Error\n", MSG_TYPE_REQUEST_FIRST, cAtsSendRcId);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse WorkStation Id[%d] Error\n", MSG_TYPE_REQUEST_FIRST, wIndex);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Ats Id[%d] Error\n", MSG_TYPE_REQUEST_FIRST, cAtsId);
chRtn = CI_ERROR;
}
if (CI_SUCCESS == chRtn)
{
g_strSndAtsCfmFst.chFlag = FLAG_SET;
g_strSndAtsCfmFst.chTiocId = cAtsSendRcId;
g_strSndAtsCfmFst.chStation = cStation;
g_strSndAtsCfmFst.wIndex = wIndex;
g_strSndAtsCfmFst.dwTime = dwTime;
g_strSndAtsCfmFst.chOpStatus = CONFIRM_FIRST_OTHER_DEV_OP; /*反馈其它操作站站操作中*/
/*计算CRC*/
szCrcTmp[jj] = cAtsId;
jj++;
LongToChar(dwTime, &szCrcTmp[jj]);
jj += 4U;
szCrcTmp[jj] = cTrainNum;
jj++;
for (chTrainIndex = 0U; chTrainIndex < cTrainNum; chTrainIndex++)
{
LongToChar(strTrainInfo[chTrainIndex].dwTrainId, &szCrcTmp[jj]);
jj += 4U;
ShortToChar(strTrainInfo[chTrainIndex].wLgcId, &szCrcTmp[jj]);
jj += 2U;
}
g_strSndAtsCfmFst.dwCrc32 = Tioc_CommonCrc32(szCrcTmp, jj);
}
else
{
; /*DO NOTHING*/
}
chRtn2 = chRtn;
}
break;
}
case MSG_TYPE_REQUEST_SECOND:/* 远程筛选二次消息 */
{
g_strAtsMsgSnd.dwCycle = Get2oo2CurCycleNum();
g_strAtsMsgSnd.chAtsId = dataBuf[ii++];
if (0U < g_strAtsMsgSnd.chAtsId)
{
;
}
else
{
chRtn = CI_ERROR;
}
if (CI_SUCCESS==chRtn)
{
g_strAtsMsgSnd.chStation = dataBuf[ii++];
g_strAtsMsgSnd.wIndex = ShortFromChar(&dataBuf[ii]);
ii += 2U;
if (0U < g_strAtsMsgSnd.wIndex)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS==chRtn)
{
g_strAtsMsgSnd.chTiocId = dataBuf[ii++];
if (g_strAtsMsgSnd.chTiocId == chLocalId)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsMsgSnd.dwTime = LongFromChar(&dataBuf[ii]);
ii += 4u;
g_strAtsMsgSnd.chTrainNum = dataBuf[ii++];
if ((0U < g_strAtsMsgSnd.chTrainNum) && (ATS_GATEWAY_CI_TRAIN_MAX > g_strAtsMsgSnd.chTrainNum))
{
for (chTrainIndex = 0u; chTrainIndex < g_strAtsMsgSnd.chTrainNum; chTrainIndex++)
{
g_strAtsMsgSnd.strTrainInfo[chTrainIndex].dwTrainId = LongFromChar(&dataBuf[ii]);
ii += 4u;
g_strAtsMsgSnd.strTrainInfo[chTrainIndex].wLgcId = ShortFromChar(&dataBuf[ii]);
ii += 2u;
if ((0U == g_strAtsMsgSnd.strTrainInfo[chTrainIndex].dwTrainId)
|| (UINT32_MAX == g_strAtsMsgSnd.strTrainInfo[chTrainIndex].dwTrainId))
{
chRtn = CI_ERROR;
}
else
{
; /*DO NOTHING*/
}
if ((0U == g_strAtsMsgSnd.strTrainInfo[chTrainIndex].wLgcId)
|| (UINT16_MAX == g_strAtsMsgSnd.strTrainInfo[chTrainIndex].wLgcId))
{
chRtn = CI_ERROR;
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
; /*不处理*/
}
else
{
break;
}
}
}
else
{
chRtn = CI_ERROR;/*丢包*/
}
g_strAtsMsgSnd.dwCrc32 = LongFromChar(&dataBuf[ii]);
ii += 4u;
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsMsgSnd.chFlag = FLAG_SET;
}
else
{
; /*DO NOTHING*/
}
chRtn3 = chRtn;
break;
}
case MSG_TYPE_EA_CANCLE_FIRST:/* 区间疏散取消首次消息 */
{
wIndex = ShortFromChar(&dataBuf[ii + 2U]);
if ((FLAG_SET != g_strAtsEaMsgFst.chFlag) || (g_strAtsEaMsgFst.wIndex == wIndex))
{
/*未收到或重复收到同一个ATS的一次命令时,解析第一个ATS下发的取消区间疏散首次消息*/
g_strAtsEaMsgFst.dwCycle = Get2oo2CurCycleNum(); /* 接收到取消区间疏散消息的周期号 */
g_strAtsEaMsgFst.chAtsId = dataBuf[ii++]; /* ATS编号 */
if (0U < g_strAtsEaMsgFst.chAtsId)
{
;
}
else
{
chRtn = CI_ERROR;
}
if (CI_SUCCESS == chRtn)
{
g_strAtsEaMsgFst.chStation = dataBuf[ii++]; /* 车站编号 */
g_strAtsEaMsgFst.wIndex = ShortFromChar(&dataBuf[ii]); /* 操作站编号 */
ii += 2U;
if (0U < g_strAtsEaMsgFst.wIndex)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsEaMsgFst.chTiocId = dataBuf[ii++]; /* TIOC编号 */
if (g_strAtsEaMsgFst.chTiocId == chLocalId)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsEaMsgFst.dwEaTrainId = LongFromChar(&dataBuf[ii]); /* 区间疏散列车互联互通编号 */
ii += 4u;
if ((0u < g_strAtsEaMsgFst.dwEaTrainId) && (UINT32_MAX > g_strAtsEaMsgFst.dwEaTrainId))
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsEaMsgFst.dwTime = LongFromChar(&dataBuf[ii]); /* 下发消息时间 */
ii += 4u;
g_strAtsEaMsgFst.chType = dataBuf[ii];/* 类型 */
ii++;
if (ATS_EA_CMD_TYPE_CANCEL == g_strAtsEaMsgFst.chType)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
g_strAtsEaMsgFst.chLine = dataBuf[ii];/* 区域 */
ii++;
if ((EA_AREA_ALL == g_strAtsEaMsgFst.chLine) || (EA_AREA_UP == g_strAtsEaMsgFst.chLine) || (EA_AREA_DOWN == g_strAtsEaMsgFst.chLine))
{
g_strAtsEaMsgFst.chFlag = FLAG_SET;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
;
}
chRtn1 = chRtn;
}
else
{
/*解析第二个ATS下发的取消区间疏散首次消息*/
cAtsId = dataBuf[ii]; /* ATS编号 */
ii++;
if (0U < cAtsId)
{
cStation = dataBuf[ii]; /* 车站编号 */
ii++;
wIndex = ShortFromChar(&dataBuf[ii]); /* 操作站编号 */
ii += 2U;
if (0U < wIndex)
{
cAtsSendRcId = dataBuf[ii]; /* TIOC编号 */
ii++;
if (cAtsSendRcId == chLocalId)
{
dwTrainHlhtId = LongFromChar(&dataBuf[ii]); /* 区间疏散列车互联互通编号 */
ii += 4U;
if ((0U < dwTrainHlhtId) && (UINT32_MAX > dwTrainHlhtId))
{
dwTime = LongFromChar(&dataBuf[ii]); /* 命令下发消息时间 */
ii += 4U;
cCmdType = dataBuf[ii]; /* 类型 */
ii++;
if (ATS_EA_CMD_TYPE_CANCEL == cCmdType)
{
cLineAttr = dataBuf[ii];/* 线路属性 */
ii++;
if ((EA_AREA_ALL == cLineAttr) || (EA_AREA_UP == cLineAttr) || (EA_AREA_DOWN == cLineAttr))
{
;
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Line Attr[%d] Error\n", MSG_TYPE_EA_CANCLE_FIRST, cLineAttr);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Cmd Type[%d] Error\n", MSG_TYPE_EA_CANCLE_FIRST, cCmdType);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Train Id[%d] Error\n", MSG_TYPE_EA_CANCLE_FIRST, dwTrainHlhtId);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Rc Id[%d] Error\n", MSG_TYPE_EA_CANCLE_FIRST, cAtsSendRcId);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse WorkStation Id[%d] Error\n", MSG_TYPE_EA_CANCLE_FIRST, wIndex);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Ats Id[%d] Error\n", MSG_TYPE_EA_CANCLE_FIRST, cAtsId);
chRtn = CI_ERROR;
}
if (CI_SUCCESS == chRtn)
{
g_strSndAtsEaCfmFst.chFlag = FLAG_SET;
g_strSndAtsEaCfmFst.chTiocId = cAtsSendRcId;
g_strSndAtsEaCfmFst.chStation = cStation;
g_strSndAtsEaCfmFst.wIndex = wIndex;
g_strSndAtsEaCfmFst.dwTime = dwTime;
g_strSndAtsEaCfmFst.chOpStatus = CONFIRM_FIRST_OTHER_DEV_OP; /*反馈其它操作站站操作中*/
/*计算CRC*/
szCrcTmp[jj] = cAtsId;
jj++;
szCrcTmp[jj] = cStation;
jj++;
ShortToChar(wIndex, &szCrcTmp[jj]);
jj += 2U;
LongToChar(dwTrainHlhtId, &szCrcTmp[jj]);
jj += 4U;
LongToChar(dwTime, &szCrcTmp[jj]);
jj += 4U;
szCrcTmp[jj] = cCmdType;
jj++;
szCrcTmp[jj] = cLineAttr;
jj++;
g_strSndAtsEaCfmFst.dwCrc32 = Tioc_CommonCrc32(szCrcTmp, jj);
}
else
{
;
}
chRtn2 = chRtn;
}
break;
}
case MSG_TYPE_EA_CANCLE_SECOND:/* 区间疏散取消二次消息 */
{
g_strAtsEaMsgSnd.dwCycle = Get2oo2CurCycleNum(); /* 收到消息周期号 */
g_strAtsEaMsgSnd.chAtsId = dataBuf[ii++]; /* ATS编号 */
if (0U < g_strAtsEaMsgSnd.chAtsId)
{
;
}
else
{
chRtn = CI_ERROR;
}
if (CI_SUCCESS == chRtn)
{
g_strAtsEaMsgSnd.chStation = dataBuf[ii++]; /* 车站编号 */
g_strAtsEaMsgSnd.wIndex = ShortFromChar(&dataBuf[ii]); /* 操作站编号 */
ii += 2U;
if (0U < g_strAtsEaMsgSnd.wIndex)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsEaMsgSnd.chTiocId = dataBuf[ii++]; /* TIOC编号 */
if (g_strAtsEaMsgSnd.chTiocId == chLocalId)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsEaMsgSnd.dwEaTrainId = LongFromChar(&dataBuf[ii]); /* 疏散列车互联互通编号 */
ii += 4u;
if ((0u < g_strAtsEaMsgSnd.dwEaTrainId) && (UINT32_MAX > g_strAtsEaMsgSnd.dwEaTrainId))
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsEaMsgSnd.dwTime = LongFromChar(&dataBuf[ii]); /* 下发时间 */
ii += 4u;
g_strAtsEaMsgSnd.chType = dataBuf[ii];/* 命令类型 */
ii++;
if (ATS_EA_CMD_TYPE_CANCEL == g_strAtsEaMsgSnd.chType)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsEaMsgSnd.chLine = dataBuf[ii]; /* 要取消的区域 */
ii++;
if ((EA_AREA_ALL == g_strAtsEaMsgSnd.chLine) || (EA_AREA_UP == g_strAtsEaMsgSnd.chLine) || (EA_AREA_DOWN == g_strAtsEaMsgSnd.chLine))
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
g_strAtsEaMsgSnd.dwCrc32 = LongFromChar(&dataBuf[ii]); /* CRC值 */
ii += 4u;
g_strAtsEaMsgSnd.chFlag = FLAG_SET;
}
else
{
;
}
chRtn3 = chRtn;
break;
}
case MSG_TYPE_WLB_SET_FIRST: /* 全线列车紧急制动一次命令 */
{
wIndex = ShortFromChar(&dataBuf[ii + 2U]);
if ((FLAG_SET != g_strAtsWlbMsgFst.chFlag) || (g_strAtsWlbMsgFst.wIndex == wIndex))
{
/*未收到或重复收到同一个ATS的一次命令时,解析第一个ATS下发的全线紧急制动首次消息*/
g_strAtsWlbMsgFst.dwCycle = Get2oo2CurCycleNum(); /* 接收到全线列车紧急制动命令周期号 */
g_strAtsWlbMsgFst.chAtsId = dataBuf[ii++]; /* ATS编号 */
if (0U < g_strAtsWlbMsgFst.chAtsId)
{
;
}
else
{
chRtn = CI_ERROR;
}
if (CI_SUCCESS == chRtn)
{
g_strAtsWlbMsgFst.chStation = dataBuf[ii++]; /* 车站编号 */
g_strAtsWlbMsgFst.wIndex = ShortFromChar(&dataBuf[ii]); /* 操作站编号 */
ii += 2U;
if (0U < g_strAtsWlbMsgFst.wIndex)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsWlbMsgFst.chTiocId = dataBuf[ii++]; /* TIOC编号 */
if (g_strAtsWlbMsgFst.chTiocId == chLocalId)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsWlbMsgFst.chBrakeType = dataBuf[ii++]; /* 制动类型:集中区制动或物理区段制动 */
if ((WLB_TYPE_RC == g_strAtsWlbMsgFst.chBrakeType) || (WLB_TYPE_PHYSEC == g_strAtsWlbMsgFst.chBrakeType))
{
; /* 制动类型合法 */
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /* DO NOTHING */
}
if (CI_SUCCESS == chRtn)
{
g_strAtsWlbMsgFst.chBrakeCount = dataBuf[ii++]; /* 数量 */
if (1u == g_strAtsWlbMsgFst.chBrakeCount)
{
; /* 数量合法,仅为1 */
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /* DO NOTHING */
}
if (CI_SUCCESS == chRtn)
{
g_strAtsWlbMsgFst.wBrakeIndex = ShortFromChar(&dataBuf[ii]); /* ID */
ii += 2u;
chRtn = WlbUrgentIdCheck(g_strAtsWlbMsgFst.chBrakeType, g_strAtsWlbMsgFst.wBrakeIndex); /*校验紧急ID是否合法*/
}
else
{
; /* DO NOTHING */
}
if (CI_SUCCESS == chRtn)
{
g_strAtsWlbMsgFst.dwTime = LongFromChar(&dataBuf[ii]); /* 下发消息时间 */
ii += 4u;
g_strAtsWlbMsgFst.chType = dataBuf[ii];/* 命令类型 */
ii++;
if ((MSG_TYPE_WLB_SET == g_strAtsWlbMsgFst.chType) || (MSG_TYPE_WLB_CANCEL == g_strAtsWlbMsgFst.chType))
{
g_strAtsWlbMsgFst.chFlag = FLAG_SET;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
;
}
chRtn1 = chRtn;
}
else
{
/*解析第二个ATS下发的全线紧急制动首次消息*/
cAtsId = dataBuf[ii]; /* ATS编号 */
ii++;
if (0U < cAtsId)
{
cStation = dataBuf[ii]; /* 车站编号 */
ii++;
wIndex = ShortFromChar(&dataBuf[ii]); /* 操作站编号 */
ii += 2U;
if (0U < wIndex)
{
cAtsSendRcId = dataBuf[ii]; /* TIOC编号 */
ii++;
if (cAtsSendRcId == chLocalId)
{
cDevType = dataBuf[ii]; /* 制动类型:集中区制动或物理区段制动 */
ii++;
if ((WLB_TYPE_RC == cDevType) || (WLB_TYPE_PHYSEC == cDevType))
{
cDevNum = dataBuf[ii]; /* 数量 */
ii++;
if (1U == cDevNum)
{
wDevId = ShortFromChar(&dataBuf[ii]); /* ID */
ii += 2U;
chRtn = WlbUrgentIdCheck(cDevType, wDevId); /*校验紧急ID是否合法*/
if (CI_SUCCESS == chRtn)
{
dwTime = LongFromChar(&dataBuf[ii]); /* 下发消息时间 */
ii += 4U;
cCmdType = dataBuf[ii]; /* 命令类型 */
ii++;
if ((MSG_TYPE_WLB_SET == cCmdType) || (MSG_TYPE_WLB_CANCEL == cCmdType))
{
;
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Cmd Type[%d] Error\n", MSG_TYPE_WLB_SET_FIRST, cCmdType);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Dev Id[%d] Error\n", MSG_TYPE_WLB_SET_FIRST, wDevId);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Dev Num[%d] Error\n", MSG_TYPE_WLB_SET_FIRST, cDevNum);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Dev Type[%d] Error\n", MSG_TYPE_WLB_SET_FIRST, cDevType);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Rc Id[%d] Error\n", MSG_TYPE_WLB_SET_FIRST, cAtsSendRcId);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse WorkStation Id[%d] Error\n", MSG_TYPE_WLB_SET_FIRST, wIndex);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Ats Id[%d] Error\n", MSG_TYPE_WLB_SET_FIRST, cAtsId);
chRtn = CI_ERROR;
}
if (CI_SUCCESS == chRtn)
{
g_strSndAtsWlbCfmFst.chFlag = FLAG_SET;
g_strSndAtsWlbCfmFst.chTiocId = cAtsSendRcId;
g_strSndAtsWlbCfmFst.chStation = cStation;
g_strSndAtsWlbCfmFst.wIndex = wIndex;
g_strSndAtsWlbCfmFst.dwTime = dwTime;
g_strSndAtsWlbCfmFst.chOpStatus = CONFIRM_FIRST_OTHER_DEV_OP; /*反馈其它操作站站操作中*/
/*计算CRC*/
szCrcTmp[jj] = cAtsId;
jj++;
szCrcTmp[jj] = cStation;
jj++;
ShortToChar(wIndex, &szCrcTmp[jj]);
jj += 2U;
szCrcTmp[jj] = cDevType;
jj++;
szCrcTmp[jj] = cDevNum;
jj++;
ShortToChar(wDevId, &szCrcTmp[jj]);
jj += 2U;
LongToChar(dwTime, &szCrcTmp[jj]);
jj += 4U;
szCrcTmp[jj] = cCmdType;
jj++;
g_strSndAtsWlbCfmFst.dwCrc32 = Tioc_CommonCrc32(szCrcTmp, jj);
}
else
{
;
}
chRtn2 = chRtn;
}
break;
}
case MSG_TYPE_WLB_SET_SECOND: /* 全线列车紧急制动二次命令 */
{
g_strAtsWlbMsgSnd.dwCycle = Get2oo2CurCycleNum(); /* 收到消息周期号 */
g_strAtsWlbMsgSnd.chAtsId = dataBuf[ii++]; /* ATS编号 */
if (0U < g_strAtsWlbMsgSnd.chAtsId)
{
;
}
else
{
chRtn = CI_ERROR;
}
if (CI_SUCCESS == chRtn)
{
g_strAtsWlbMsgSnd.chStation = dataBuf[ii++]; /* 车站编号 */
g_strAtsWlbMsgSnd.wIndex = ShortFromChar(&dataBuf[ii]); /* 操作站编号 */
ii += 2U;
if (0U < g_strAtsWlbMsgSnd.wIndex)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsWlbMsgSnd.chTiocId = dataBuf[ii++]; /* TIOC编号 */
if (g_strAtsWlbMsgSnd.chTiocId == chLocalId)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsWlbMsgSnd.chBrakeType = dataBuf[ii++]; /* 制动类型 */
if ((WLB_TYPE_RC == g_strAtsWlbMsgSnd.chBrakeType) || (WLB_TYPE_PHYSEC == g_strAtsWlbMsgSnd.chBrakeType))
{
; /* 制动类型合法 */
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /* DO NOTHING */
}
if (CI_SUCCESS == chRtn)
{
g_strAtsWlbMsgSnd.chBrakeCount = dataBuf[ii++]; /* 数量 */
if (1u == g_strAtsWlbMsgSnd.chBrakeCount)
{
; /* 数量合法,仅为1 */
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /* DO NOTHING */
}
if (CI_SUCCESS == chRtn)
{
g_strAtsWlbMsgSnd.wBrakeIndex = ShortFromChar(&dataBuf[ii]); /* ID */
ii += 2u;
chRtn = WlbUrgentIdCheck(g_strAtsWlbMsgSnd.chBrakeType, g_strAtsWlbMsgSnd.wBrakeIndex); /*校验紧急ID是否合法*/
}
else
{
; /* DO NOTHING */
}
if (CI_SUCCESS == chRtn)
{
g_strAtsWlbMsgSnd.dwTime = LongFromChar(&dataBuf[ii]); /* 下发时间 */
ii += 4u;
g_strAtsWlbMsgSnd.chType = dataBuf[ii];/* 命令类型 */
ii++;
if (MSG_TYPE_WLB_CANCEL == g_strAtsWlbMsgSnd.chType)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsWlbMsgSnd.dwCrc32 = LongFromChar(&dataBuf[ii]); /* CRC值 */
ii += 4u;
g_strAtsWlbMsgSnd.chFlag = FLAG_SET;
}
else
{
;
}
chRtn3 = chRtn;
break;
}
case MSG_TYPE_DA_CANCLE_FIRST:/* 脱轨防护区取消首次消息 */
{
wIndex = ShortFromChar(&dataBuf[ii + 2U]);
if ((FLAG_SET != g_strAtsDaMsgFst.chFlag) || (g_strAtsDaMsgFst.wIndex == wIndex))
{
/*未收到或重复收到同一个ATS的一次命令时,解析第一个ATS下发的取消脱轨防护首次消息*/
g_strAtsDaMsgFst.dwCycle = Get2oo2CurCycleNum(); /* 接收到取消脱轨防护区消息的周期号 */
g_strAtsDaMsgFst.chAtsId = dataBuf[ii++]; /* ATS编号 */
if (0U < g_strAtsDaMsgFst.chAtsId)
{
;
}
else
{
chRtn = CI_ERROR;
}
if (CI_SUCCESS == chRtn)
{
g_strAtsDaMsgFst.chStation = dataBuf[ii++]; /* 车站编号 */
g_strAtsDaMsgFst.wIndex = ShortFromChar(&dataBuf[ii]); /* 操作站编号 */
ii += 2U;
if (0U < g_strAtsDaMsgFst.wIndex)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsDaMsgFst.chTiocId = dataBuf[ii++]; /* TIOC编号 */
if (g_strAtsDaMsgFst.chTiocId == chLocalId)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsDaMsgFst.dwDaTrainId = LongFromChar(&dataBuf[ii]); /* 脱轨列车互联互通编号 */
ii += 4u;
if ((0u < g_strAtsDaMsgFst.dwDaTrainId) && (UINT32_MAX > g_strAtsDaMsgFst.dwDaTrainId))
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsDaMsgFst.dwTime = LongFromChar(&dataBuf[ii]); /* 下发消息时间 */
ii += 4u;
g_strAtsDaMsgFst.chType = dataBuf[ii];/* 类型 */
ii++;
if (ATS_DA_CMD_TYPE_CANCEL == g_strAtsDaMsgFst.chType)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
g_strAtsDaMsgFst.chLine = dataBuf[ii];/* 区域 */
ii++;
if ((DA_AREA_ALL == g_strAtsDaMsgFst.chLine) || (DA_AREA_UP == g_strAtsDaMsgFst.chLine) || (DA_AREA_DOWN == g_strAtsDaMsgFst.chLine))
{
g_strAtsDaMsgFst.chFlag = FLAG_SET;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
;
}
chRtn1 = chRtn;
}
else
{
/*解析第二个ATS下发的取消脱轨防护首次消息*/
cAtsId = dataBuf[ii]; /* ATS编号 */
ii++;
if (0U < cAtsId)
{
cStation = dataBuf[ii]; /* 车站编号 */
ii++;
wIndex = ShortFromChar(&dataBuf[ii]); /* 操作站编号 */
ii += 2U;
if (0U < wIndex)
{
cAtsSendRcId = dataBuf[ii]; /* TIOC编号 */
ii++;
if (cAtsSendRcId == chLocalId)
{
dwTrainHlhtId = LongFromChar(&dataBuf[ii]); /* 脱轨列车互联互通编号 */
ii += 4U;
if ((0U < dwTrainHlhtId) && (UINT32_MAX > dwTrainHlhtId))
{
dwTime = LongFromChar(&dataBuf[ii]); /* 下发消息时间 */
ii += 4U;
cCmdType = dataBuf[ii]; /* 类型 */
ii++;
if (ATS_DA_CMD_TYPE_CANCEL == cCmdType)
{
cLineAttr = dataBuf[ii]; /* 线路属性 */
ii++;
if ((DA_AREA_ALL == cLineAttr) || (DA_AREA_UP == cLineAttr) || (DA_AREA_DOWN == cLineAttr))
{
;
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Line Attr[%d] Error\n", MSG_TYPE_DA_CANCLE_FIRST, cLineAttr);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Cmd Type[%d] Error\n", MSG_TYPE_DA_CANCLE_FIRST, cCmdType);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Train Id[%d] Error\n", MSG_TYPE_DA_CANCLE_FIRST, dwTrainHlhtId);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Rc Id[%d] Error\n", MSG_TYPE_DA_CANCLE_FIRST, cAtsSendRcId);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse WorkStation Id[%d] Error\n", MSG_TYPE_DA_CANCLE_FIRST, wIndex);
chRtn = CI_ERROR;
}
}
else
{
debug_infor_printf((const)"ParseGateWayToCiDataFrame: Cmd Id[%d] Parse Ats Id[%d] Error\n", MSG_TYPE_DA_CANCLE_FIRST, cAtsId);
chRtn = CI_ERROR;
}
if (CI_SUCCESS == chRtn)
{
g_strSndAtsDaCfmFst.chFlag = FLAG_SET;
g_strSndAtsDaCfmFst.chTiocId = cAtsSendRcId;
g_strSndAtsDaCfmFst.chStation = cStation;
g_strSndAtsDaCfmFst.wIndex = wIndex;
g_strSndAtsDaCfmFst.dwTime = dwTime;
g_strSndAtsDaCfmFst.chOpStatus = CONFIRM_FIRST_OTHER_DEV_OP; /*反馈其它操作站站操作中*/
/*计算CRC*/
szCrcTmp[jj] = cAtsId;
jj++;
szCrcTmp[jj] = cStation;
jj++;
ShortToChar(wIndex, &szCrcTmp[jj]);
jj += 2U;
LongToChar(dwTrainHlhtId, &szCrcTmp[jj]);
jj += 4U;
LongToChar(dwTime, &szCrcTmp[jj]);
jj += 4U;
szCrcTmp[jj] = cCmdType;
jj++;
szCrcTmp[jj] = cLineAttr;
jj++;
g_strSndAtsDaCfmFst.dwCrc32 = Tioc_CommonCrc32(szCrcTmp, jj);
}
else
{
;
}
chRtn2 = chRtn;
}
break;
}
case MSG_TYPE_DA_CANCLE_SECOND:/* 脱轨防护区取消二次消息 */
{
g_strAtsDaMsgSnd.dwCycle = Get2oo2CurCycleNum(); /* 收到消息周期号 */
g_strAtsDaMsgSnd.chAtsId = dataBuf[ii++]; /* ATS编号 */
if (0U < g_strAtsDaMsgSnd.chAtsId)
{
;
}
else
{
chRtn = CI_ERROR;
}
if (CI_SUCCESS == chRtn)
{
g_strAtsDaMsgSnd.chStation = dataBuf[ii++]; /* 车站编号 */
g_strAtsDaMsgSnd.wIndex = ShortFromChar(&dataBuf[ii]); /* 操作站编号 */
ii += 2U;
if (0U < g_strAtsDaMsgSnd.wIndex)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsDaMsgSnd.chTiocId = dataBuf[ii++]; /* TIOC编号 */
if (g_strAtsDaMsgSnd.chTiocId == chLocalId)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsDaMsgSnd.dwDaTrainId = LongFromChar(&dataBuf[ii]); /* 疏散列车互联互通编号 */
ii += 4u;
if ((0u < g_strAtsDaMsgSnd.dwDaTrainId) && (UINT32_MAX > g_strAtsDaMsgSnd.dwDaTrainId))
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsDaMsgSnd.dwTime = LongFromChar(&dataBuf[ii]); /* 下发时间 */
ii += 4u;
g_strAtsDaMsgSnd.chType = dataBuf[ii];/* 命令类型 */
ii++;
if (ATS_DA_CMD_TYPE_CANCEL == g_strAtsDaMsgSnd.chType)
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
; /*DO NOTHING*/
}
if (CI_SUCCESS == chRtn)
{
g_strAtsDaMsgSnd.chLine = dataBuf[ii]; /* 要取消的区域 */
ii++;
if ((DA_AREA_ALL == g_strAtsDaMsgSnd.chLine) || (DA_AREA_UP == g_strAtsDaMsgSnd.chLine) || (DA_AREA_DOWN == g_strAtsDaMsgSnd.chLine))
{
;
}
else
{
chRtn = CI_ERROR;
}
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
g_strAtsDaMsgSnd.dwCrc32 = LongFromChar(&dataBuf[ii]); /* CRC值 */
ii += 4u;
g_strAtsDaMsgSnd.chFlag = FLAG_SET;
}
else
{
;
}
chRtn3 = chRtn;
break;
}
default:
{
chRtn = CI_ERROR;
chRtn3 = CI_ERROR;
break;
}
}
if (wMsgLen != (ii - wMsgLenCount))
{
chRtn = CI_ERROR;/*丢包*/
}
else
{
/*继续循环*/
}
if (CI_ERROR == chRtn)
{
break;
}
else
{
;
}
}
}
else
{
;
}
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
; /*不处理*/
}
else
{
/*命令校验非法后,清除对应相关的命令存储*/
if (CI_ERROR == chRtn1)
{
ClearAtsMsgFirst();
ClearAtsEaMsgFirst();
ClearAtsWlbMsgFirst();
ClearAtsDaMsgFirst();
}
if (CI_ERROR == chRtn2)
{
ClearSndAtsScreenFstCfmMsg();
ClearSndAtsEaFstCfmMsg();
ClearSndAtsWlbFstCfmMsg();
ClearSndAtsDaFstCfmMsg();
}
if (CI_ERROR == chRtn3)
{
ClearAtsMsgFirst();
ClearAtsEaMsgFirst();
ClearAtsWlbMsgFirst();
ClearAtsDaMsgFirst();
ClearSndAtsScreenFstCfmMsg();
ClearSndAtsEaFstCfmMsg();
ClearSndAtsWlbFstCfmMsg();
ClearSndAtsDaFstCfmMsg();
ClearAtsMsgSecond();
ClearAtsEaMsgSecond();
ClearAtsWlbMsgSecond();
ClearAtsDaMsgSecond();
}
}
return chRtn;
}
/**
* @brief 获取远程筛选ATS首次消息
* @param 无
* @return 远程筛选ATS首次消息
*/
AtsScreenMsgFstStru * GetAtsMsgFst(void)
{
return &g_strAtsMsgFst;
}
/**
* @brief 获取远程筛选ATS二次消息
* @param 无
* @return 远程筛选ATS二次消息
*/
AtsScreenMsgSndStru * GetAtsMsgSnd(void)
{
return &g_strAtsMsgSnd;
}
/**
* @brief 获取远程筛选首次确认消息
* @param 无
* @return 远程筛选首次确认消息
*/
AtsMsgCfmStru * GetAtsCfmFst(void)
{
return &g_strAtsCfmFst;
}
/**
* @brief 获取远程筛选二次确认消息
* @param 无
* @return 远程筛选二次确认消息
*/
AtsMsgCfmStru * GetAtsCfmSnd(void)
{
return &g_strAtsCfmSnd;
}
/**
* @brief 清除1次ATS筛选信息
* @param void
* @return void
*/
void ClearAtsMsgFirst(void)
{
(void)CommonMemSet((void*)&g_strAtsMsgFst, (UINT32)sizeof(g_strAtsMsgFst), (UINT8)0U, (UINT32)sizeof(g_strAtsMsgFst));
}
/**
* @brief 清除2次ATS筛选信息
* @param void
* @return void
*/
void ClearAtsMsgSecond(void)
{
(void)CommonMemSet((void*)&g_strAtsMsgSnd, (UINT32)sizeof(g_strAtsMsgSnd), (UINT8)0U, (UINT32)sizeof(g_strAtsMsgSnd));
}
/**
* @brief 获取ATS取消区间疏散首次消息
* @param 无
* @return ATS取消区间疏散首次消息
*/
AtsEaMsgStru * GetAtsEaMsgFst(void)
{
return &g_strAtsEaMsgFst;
}
/**
* @brief 获取ATS取消区间疏散二次消息
* @param 无
* @return ATS取消区间疏散二次消息
*/
AtsEaMsgStru * GetAtsEaMsgSnd(void)
{
return &g_strAtsEaMsgSnd;
}
/**
* @brief 获取ATS取消区间疏散首次确认
* @param 无
* @return ATS取消区间疏散首次确认
*/
AtsMsgCfmStru * GetAtsEaCfmFst(void)
{
return &g_strAtsEaCfmFst;
}
/**
* @brief 获取ATS取消区间疏散二次确认
* @param 无
* @return ATS取消区间疏散二次确认
*/
AtsMsgCfmStru * GetAtsEaCfmSnd(void)
{
return &g_strAtsEaCfmSnd;
}
/**
* @brief 清除1次ATS区间疏散信息
* @param void
* @return void
*/
void ClearAtsEaMsgFirst(void)
{
(void)CommonMemSet((void*)&g_strAtsEaMsgFst, (UINT32)sizeof(g_strAtsEaMsgFst), (UINT8)0U, (UINT32)sizeof(g_strAtsEaMsgFst));
}
/**
* @brief 清除2次ATS区间疏散信息
* @param void
* @return void
*/
void ClearAtsEaMsgSecond(void)
{
(void)CommonMemSet((void*)&g_strAtsEaMsgSnd, (UINT32)sizeof(g_strAtsEaMsgSnd), (UINT8)0U, (UINT32)sizeof(g_strAtsEaMsgSnd));
}
/**
* @brief 获取ATS设置/取消全线列车紧急制动首次消息
* @param 无
* @return ATS设置/取消区间疏散首次消息
*/
AtsWlbMsgStru * GetAtsWlbMsgFst(void)
{
return &g_strAtsWlbMsgFst;
}
/**
* @brief 获取ATS取消全线列车紧急制动二次消息
* @param 无
* @return ATS取消全线列车紧急制动二次消息
*/
AtsWlbMsgStru * GetAtsWlbMsgSnd(void)
{
return &g_strAtsWlbMsgSnd;
}
/**
* @brief 获取ATS设置/取消全线列车紧急制动首次确认
* @param 无
* @return ATS设置/取消全线列车紧急制动首次确认
*/
AtsMsgCfmStru * GetAtsWlbCfmFst(void)
{
return &g_strAtsWlbCfmFst;
}
/**
* @brief 获取ATS取消全线列车紧急制动二次确认
* @param 无
* @return ATS取消全线列车紧急制动二次确认
*/
AtsMsgCfmStru * GetAtsWlbCfmSnd(void)
{
return &g_strAtsWlbCfmSnd;
}
/**
* @brief 清除1次ATS设置/取消全线列车紧急制动信息
* @param void
* @return void
*/
void ClearAtsWlbMsgFirst(void)
{
(void)CommonMemSet((void*)&g_strAtsWlbMsgFst, (UINT32)sizeof(g_strAtsWlbMsgFst), (UINT8)0U, (UINT32)sizeof(g_strAtsWlbMsgFst));
}
/**
* @brief 清除2次ATS取消全线列车紧急制动信息
* @param void
* @return void
*/
void ClearAtsWlbMsgSecond(void)
{
(void)CommonMemSet((void*)&g_strAtsWlbMsgSnd, (UINT32)sizeof(g_strAtsWlbMsgSnd), (UINT8)0U, (UINT32)sizeof(g_strAtsWlbMsgSnd));
}
/**
* @brief 获取ATS取消脱轨防护区首次消息
* @param 无
* @return ATS取消脱轨防护区首次消息
*/
AtsDaMsgStru * GetAtsDaMsgFst(void)
{
return &g_strAtsDaMsgFst;
}
/**
* @brief 获取ATS取消脱轨防护区二次消息
* @param 无
* @return ATS取消脱轨防护区二次消息
*/
AtsDaMsgStru * GetAtsDaMsgSnd(void)
{
return &g_strAtsDaMsgSnd;
}
/**
* @brief 获取ATS取消脱轨防护区首次确认
* @param 无
* @return ATS取消脱轨防护区首次确认
*/
AtsMsgCfmStru * GetAtsDaCfmFst(void)
{
return &g_strAtsDaCfmFst;
}
/**
* @brief 获取ATS取消脱轨防护区二次确认
* @param 无
* @return ATS取消脱轨防护区二次确认
*/
AtsMsgCfmStru * GetAtsDaCfmSnd(void)
{
return &g_strAtsDaCfmSnd;
}
/**
* @brief 清除1次ATS取消脱轨防护区信息
* @param void
* @return void
*/
void ClearAtsDaMsgFirst(void)
{
(void)CommonMemSet((void*)&g_strAtsDaMsgFst, (UINT32)sizeof(g_strAtsDaMsgFst), (UINT8)0U, (UINT32)sizeof(g_strAtsDaMsgFst));
}
/**
* @brief 清除2次ATS取消脱轨防护区信息
* @param void
* @return void
*/
void ClearAtsDaMsgSecond(void)
{
(void)CommonMemSet((void*)&g_strAtsDaMsgSnd, (UINT32)sizeof(g_strAtsDaMsgSnd), (UINT8)0U, (UINT32)sizeof(g_strAtsDaMsgSnd));
}
/**
* @brief 组TIOC到网关数据
* @param 无
* @return CI_ERROR失败;CI_SUCCESS成功
*/
UINT8 PackTiocToGateWayData(const UINT8 deviceId, const UINT8 targetDevType)
{
UINT8 szToGateWayDataBuf[CI_TO_ATS_DATA_LEN_MAX] = { 0u };
UINT16 ii = 0u;
UINT16 jj = 0U;
UINT16 wMsgNumIndex = 0u;
UINT8 chRtn = CI_ERROR;
UINT32 dwDataVer = 0u;
UINT8 chLocalId = GetSystemParaLocalCiId();
UINT16 wMsgLenIndex = 0u;
UINT8 chMsgNum = 0u;
UINT8 chAtsScreenNum = 0u;
UINT16 wTrainId = 0u;
UINT16 wLgcId = 0u;
UINT8 chScreenType = 0u;
UINT8 chTrainIndex = 0u;
UINT32 dwTrainId = 0u;
UINT16 wMsgLen = 0u;
UINT16 wDstDevId = 0u;
UINT16 wTrainLgcId = 0u;
UINT8 chEaNum = 0u;
UINT16 wEaTrainid = 0u;
UINT32 dwEaTrainHlhtId = 0u;
UINT8 chEaLgcNum = 0u;
UINT16 * pEaLgcId = NULL;
UINT8 chEaIndex = 0u;
UINT8 chEaLgcIndex = 0u;
UINT8 chEaBuidFlag = 0u;
UINT8 chEaSendNum = 0u;
UINT16 wEaNumIndex = 0u;
UINT8 chEaSrcId = 0u;
UINT8 chPaType = 0u;
UINT8 chEaConfigId = 0u;
ATSTrainInfoStru strTrainInfo = {0u}; /** 汇报列车信息*/
UINT8 chWlbState = WLB_SET;
UINT16 wWlbSum = 0u;
UINT16 wWlbSumIndex = 0; /*紧急制动数量索引位置*/
UINT16 wRcId = 0u;
UINT16 wPhyCurSum = 0U; /*本控区物理区段当前数量*/
UINT16 wPhySecId = 0U; /*物理区段ID*/
UINT8 cPhySecAreaUrgentState = PHYSEC_AREA_URGENT_YES; /*物理区段区域紧急制动状态*/
UINT8 chEaAreaLineType = 0U;
UINT8 chTrainPosMonitorState = 0u;/*列车位置监督标志*/
UINT8 chTrainNvramFlag = 0u;/*列车NVRAM标志*/
UINT32 dwFlyProtectOverCyc= GetFlyProtectOverCyc(); /*飞车*/
UINT8 FlyProtectTrainNum;
UINT8 TrainFlyAxis = 0U; /*飞车计轴*/
UINT8 chIndex = 0U;
TrainFlyProtectStru * pFlyData = NULL;
wRcId = (UINT16)chLocalId; /* RC编号,不带类型 */
/* 留出消息条数填充位置 */
ii++;
chRtn = GetCiEmapCheckVer(chLocalId, &dwDataVer, targetDevType);
if (CI_SUCCESS == chRtn)
{/* 组数据版本 */
LongToChar(dwDataVer, &szToGateWayDataBuf[ii]);
ii += 4u;
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{/* 组协议版本 */
LongToChar(GATE_WAY_PRTCL_VER, &szToGateWayDataBuf[ii]);
ii += 4u;
}
else
{
;
}
if (0U == dwFlyProtectOverCyc)
{
if (CI_SUCCESS == chRtn)
{/* 组TIOC汇报给ATS的远程筛选列车信息 */
szToGateWayDataBuf[ii++] = MSG_TYPE_REPORT; /* 汇报远程筛选列车信息帧 */
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2u;
szToGateWayDataBuf[ii++] = MSG_TYPE_REPORT;
ShortToChar(GATE_WAY_APP_PRTCL_VER, &szToGateWayDataBuf[ii]); /* 应用协议版本号 */
ii += 2u;
szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */
chAtsScreenNum = GetAtsScreenNum();
szToGateWayDataBuf[ii++] = chAtsScreenNum; /* 远程筛选列车数量 */
for (chTrainIndex = 0u; chTrainIndex < chAtsScreenNum; chTrainIndex++)
{
wTrainId = GetAtsScreenTrainIdByIndex(chTrainIndex);
chRtn = dquDevName2HlhtId(wTrainId, wTrainLgcId, &dwTrainId);
chScreenType = GetAtsScreenTypeByIndex(chTrainIndex);
wLgcId = GetAtsScreenLgcIdByIndex(chTrainIndex);
chTrainPosMonitorState = GetTrainPosMonitorState(wTrainId);
chTrainNvramFlag = GetTrainNvramPosFlag(wTrainId);
LongToChar(dwTrainId, &szToGateWayDataBuf[ii]); /* 列车ID */
ii += 4u;
if (TRAIN_SCREEN_TYPE_LU == chScreenType)
{
if ((TRAIN_POS_MONITOR_VALID == chTrainPosMonitorState) || (TRAIN_NVRAM_POS_FLAG_NO == chTrainNvramFlag))
{
szToGateWayDataBuf[ii++] = TRAIN_SCREEN_TYPE_LU; /* 远程筛选类别 */
}
else
{
szToGateWayDataBuf[ii++] = TRAIN_SCREEN_TYPE_POSTION_LOST; /* 监督位置无效筛选 */
}
}
else
{
szToGateWayDataBuf[ii++] = chScreenType;
}
ShortToChar(wLgcId, &szToGateWayDataBuf[ii]); /* 列车所处逻辑区段 */
ii += 2u;
}
wMsgLen = (ii - wMsgLenIndex - 2u);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
if (FLAG_SET == g_strAtsCfmFst.chFlag)
{
szToGateWayDataBuf[ii++] = MSG_TYPE_CONFIRM_FIRST; /* 帧类型 */
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2u;
szToGateWayDataBuf[ii++] = MSG_TYPE_CONFIRM_FIRST;
szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */
szToGateWayDataBuf[ii++] = g_strAtsCfmFst.chStation; /* 车站编号 */
ShortToChar(g_strAtsCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */
ii += 2U;
LongToChar(g_strAtsCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */
ii += 4u;
szToGateWayDataBuf[ii++] = g_strAtsCfmFst.chOpStatus; /* 确认结果 */
LongToChar(g_strAtsCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */
ii += 4u;
wMsgLen = (ii - wMsgLenIndex - 2u);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
}
else
{
;
}
g_strAtsCfmFst.chFlag = FLAG_UNSET;
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
/*组第二个ATS的远程筛选首次确认信息*/
if (FLAG_SET == g_strSndAtsCfmFst.chFlag)
{
szToGateWayDataBuf[ii] = MSG_TYPE_CONFIRM_FIRST; /* 帧类型 */
ii++;
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2U;
szToGateWayDataBuf[ii] = MSG_TYPE_CONFIRM_FIRST;
ii++;
szToGateWayDataBuf[ii] = chLocalId; /* TIOC编号 */
ii++;
szToGateWayDataBuf[ii] = g_strSndAtsCfmFst.chStation; /* 车站编号 */
ii++;
ShortToChar(g_strSndAtsCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */
ii += 2U;
LongToChar(g_strSndAtsCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */
ii += 4U;
szToGateWayDataBuf[ii] = g_strSndAtsCfmFst.chOpStatus; /* 确认结果 */
ii++;
LongToChar(g_strSndAtsCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */
ii += 4U;
wMsgLen = (ii - wMsgLenIndex - 2U);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
/*组包后清除第二个ATS的确认信息*/
ClearSndAtsScreenFstCfmMsg();
}
else
{
;
}
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
if (FLAG_SET == g_strAtsCfmSnd.chFlag)
{
szToGateWayDataBuf[ii++] = MSG_TYPE_CONFIRM_SECOND; /* 帧类型 */
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2u;
szToGateWayDataBuf[ii++] = MSG_TYPE_CONFIRM_SECOND;
szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */
szToGateWayDataBuf[ii++] = g_strAtsCfmSnd.chStation; /* 车站编号 */
ShortToChar(g_strAtsCfmSnd.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */
ii += 2U;
LongToChar(g_strAtsCfmSnd.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */
ii += 4u;
szToGateWayDataBuf[ii++] = g_strAtsCfmSnd.chOpStatus; /* 确认结果 */
LongToChar(g_strAtsCfmSnd.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */
ii += 4u;
wMsgLen = (ii - wMsgLenIndex - 2u);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
}
else
{
;
}
g_strAtsCfmSnd.chFlag = FLAG_UNSET;
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
/* 组TIOC汇报给ATS的区间疏散信息 */
szToGateWayDataBuf[ii++] = MSG_TYPE_EA_REPORT; /* 区间疏散汇报消息 */
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2u;
szToGateWayDataBuf[ii++] = MSG_TYPE_EA_REPORT;
ShortToChar(GATE_WAY_APP_PRTCL_VER, &szToGateWayDataBuf[ii]); /* 应用协议版本号 */
ii += 2u;
szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */
chEaNum = GetEaNum();
if (EA_MAX_NUM < chEaNum)
{
chRtn = CI_ERROR;
}
else
{
chEaSendNum = 0u;
wEaNumIndex = ii; /* 记录汇报数量存储下标 */
ii++;
for (chEaIndex = 0u; chEaIndex < chEaNum; chEaIndex++)
{
wEaTrainid = GetEvacuatingTrainIdByIndex(chEaIndex);
chRtn = dquDevName2HlhtId(wEaTrainid, wTrainLgcId, &dwEaTrainHlhtId);
chEaLgcNum = EaGetLgcNum(chEaIndex);
pEaLgcId = EaGetLgcId(chEaIndex);
chEaBuidFlag = GetEaBuildedFlag(chEaIndex);
chEaSrcId = GetEaSrcTiocByIndex(chEaIndex);
chPaType = GetPaTypeByIndex(chEaIndex);
chEaConfigId = GetEaConfigID(chEaIndex);
chEaAreaLineType = GetEaAreaLineType(chEaIndex);
if ((NULL == pEaLgcId) || (CI_ERROR == chRtn) || (EA_SECTION_MAX_NUM < chEaLgcNum)
|| ((PA_TYPE_DA != chPaType) && (PA_TYPE_EA != chPaType)))
{
chRtn = CI_ERROR;
break;
}
else
{
if ((chEaSrcId == chLocalId) && (PA_TYPE_EA == chPaType))
{
chEaSendNum++;
LongToChar(dwEaTrainHlhtId, &szToGateWayDataBuf[ii]); /* 区间疏散列车互联互通ID */
ii += 4u;
szToGateWayDataBuf[ii++] = chEaConfigId; /* 防护区域ID*/
szToGateWayDataBuf[ii++] = chEaBuidFlag; /* 防护区域建立标志 */
szToGateWayDataBuf[ii++] = chEaAreaLineType; /* 上下行区域 */
szToGateWayDataBuf[ii++] = chEaLgcNum; /* 逻辑区段数量 */
for (chEaLgcIndex = 0u; chEaLgcIndex < chEaLgcNum; chEaLgcIndex++)
{
ShortToChar(pEaLgcId[chEaLgcIndex], &szToGateWayDataBuf[ii]);
ii += 2u;
}
}
else
{
; /* 本控区非建立控区,不汇报给ATS */
}
}
}
szToGateWayDataBuf[wEaNumIndex] = chEaSendNum; /* 组汇报数量 */
wMsgLen = (ii - wMsgLenIndex - 2u);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
}
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
if (FLAG_SET == g_strAtsEaCfmFst.chFlag)
{
szToGateWayDataBuf[ii++] = MSG_TYPE_EA_CONFIRM_FIRST; /* 帧类型 */
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2u;
szToGateWayDataBuf[ii++] = MSG_TYPE_EA_CONFIRM_FIRST;
szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */
szToGateWayDataBuf[ii++] = g_strAtsEaCfmFst.chStation; /* 车站编号 */
ShortToChar(g_strAtsEaCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */
ii += 2U;
LongToChar(g_strAtsEaCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */
ii += 4u;
szToGateWayDataBuf[ii++] = g_strAtsEaCfmFst.chOpStatus; /* 确认结果 */
LongToChar(g_strAtsEaCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */
ii += 4u;
wMsgLen = (ii - wMsgLenIndex - 2u);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
}
else
{
;
}
g_strAtsEaCfmFst.chFlag = FLAG_UNSET;
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
/*组第二个ATS的取消区间疏散首次确认信息*/
if (FLAG_SET == g_strSndAtsEaCfmFst.chFlag)
{
szToGateWayDataBuf[ii] = MSG_TYPE_EA_CONFIRM_FIRST; /* 帧类型 */
ii++;
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2U;
szToGateWayDataBuf[ii] = MSG_TYPE_EA_CONFIRM_FIRST;
ii++;
szToGateWayDataBuf[ii] = chLocalId; /* TIOC编号 */
ii++;
szToGateWayDataBuf[ii] = g_strSndAtsEaCfmFst.chStation; /* 车站编号 */
ii++;
ShortToChar(g_strSndAtsEaCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */
ii += 2U;
LongToChar(g_strSndAtsEaCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */
ii += 4U;
szToGateWayDataBuf[ii] = g_strSndAtsEaCfmFst.chOpStatus; /* 确认结果 */
ii++;
LongToChar(g_strSndAtsEaCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */
ii += 4U;
wMsgLen = (ii - wMsgLenIndex - 2U);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
/*组包后清除第二个ATS的确认信息*/
ClearSndAtsEaFstCfmMsg();
}
else
{
;
}
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
if (FLAG_SET == g_strAtsEaCfmSnd.chFlag)
{
szToGateWayDataBuf[ii++] = MSG_TYPE_EA_CONFIRM_SECOND; /* 帧类型 */
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2u;
szToGateWayDataBuf[ii++] = MSG_TYPE_EA_CONFIRM_SECOND;
szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */
szToGateWayDataBuf[ii++] = g_strAtsEaCfmSnd.chStation; /* 车站编号 */
ShortToChar(g_strAtsEaCfmSnd.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */
ii += 2U;
LongToChar(g_strAtsEaCfmSnd.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */
ii += 4u;
szToGateWayDataBuf[ii++] = g_strAtsEaCfmSnd.chOpStatus; /* 确认结果 */
LongToChar(g_strAtsEaCfmSnd.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */
ii += 4u;
wMsgLen = (ii - wMsgLenIndex - 2u);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
}
else
{
;
}
g_strAtsEaCfmSnd.chFlag = FLAG_UNSET;
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
/* 组TIOC汇报给ATS的全线列车紧急制动信息 */
szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_REPORT; /* 全线列车紧急制动汇报消息 */
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2u;
szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_REPORT;
szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */
wWlbSum = 0U;
wWlbSumIndex = ii;
ii += 2U;
/*组全线紧急制动信息*/
chWlbState = WlbGetState();
if (WLB_UNSET != chWlbState)
{
wWlbSum++;
szToGateWayDataBuf[ii++] = WLB_TYPE_RC; /* 制动类型 */
ShortToChar(wRcId, &szToGateWayDataBuf[ii]); /* RC编号 */
ii += 2u;
}
else
{
/* 未设置,不组包 */
}
/*组区域紧急制动信息*/
wPhyCurSum = GetPhySecCurSum();
for (jj = 0U; jj < wPhyCurSum; jj++)
{
wPhySecId = GetPhySecId(jj);
cPhySecAreaUrgentState = GetPhySecAreaUrgentState(wPhySecId);
if (PHYSEC_AREA_URGENT_NO != cPhySecAreaUrgentState)
{
wWlbSum++;
szToGateWayDataBuf[ii++] = WLB_TYPE_PHYSEC; /* 制动类型 */
ShortToChar(wPhySecId, &szToGateWayDataBuf[ii]); /* 物理区段编号 */
ii += 2U;
}
else
{
/*不组包*/
}
}
ShortToChar(wWlbSum, &szToGateWayDataBuf[wWlbSumIndex]); /* 组紧急制动数量 */
wMsgLen = (ii - wMsgLenIndex - 2u);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
if (FLAG_SET == g_strAtsWlbCfmFst.chFlag)
{
szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_CONFIRM_FIRST; /* 帧类型 */
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2u;
szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_CONFIRM_FIRST;
szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */
szToGateWayDataBuf[ii++] = g_strAtsWlbCfmFst.chStation; /* 车站编号 */
ShortToChar(g_strAtsWlbCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */
ii += 2U;
LongToChar(g_strAtsWlbCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */
ii += 4u;
szToGateWayDataBuf[ii++] = g_strAtsWlbCfmFst.chOpStatus; /* 确认结果 */
LongToChar(g_strAtsWlbCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */
ii += 4u;
wMsgLen = (ii - wMsgLenIndex - 2u);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
}
else
{
;
}
g_strAtsWlbCfmFst.chFlag = FLAG_UNSET;
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
/*组第二个ATS的全线紧急制动首次确认信息*/
if (FLAG_SET == g_strSndAtsWlbCfmFst.chFlag)
{
szToGateWayDataBuf[ii] = MSG_TYPE_WLB_CONFIRM_FIRST; /* 帧类型 */
ii++;
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2U;
szToGateWayDataBuf[ii] = MSG_TYPE_WLB_CONFIRM_FIRST;
ii++;
szToGateWayDataBuf[ii] = chLocalId; /* TIOC编号 */
ii++;
szToGateWayDataBuf[ii] = g_strSndAtsWlbCfmFst.chStation; /* 车站编号 */
ii++;
ShortToChar(g_strSndAtsWlbCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */
ii += 2U;
LongToChar(g_strSndAtsWlbCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */
ii += 4U;
szToGateWayDataBuf[ii] = g_strSndAtsWlbCfmFst.chOpStatus; /* 确认结果 */
ii++;
LongToChar(g_strSndAtsWlbCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */
ii += 4U;
wMsgLen = (ii - wMsgLenIndex - 2U);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
/*组包后清除第二个ATS的确认信息*/
ClearSndAtsWlbFstCfmMsg();
}
else
{
;
}
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
if (FLAG_SET == g_strAtsWlbCfmSnd.chFlag)
{
szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_CONFIRM_SECOND; /* 帧类型 */
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2u;
szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_CONFIRM_SECOND;
szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */
szToGateWayDataBuf[ii++] = g_strAtsWlbCfmSnd.chStation; /* 车站编号 */
ShortToChar(g_strAtsWlbCfmSnd.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */
ii += 2U;
LongToChar(g_strAtsWlbCfmSnd.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */
ii += 4u;
szToGateWayDataBuf[ii++] = g_strAtsWlbCfmSnd.chOpStatus; /* 确认结果 */
LongToChar(g_strAtsWlbCfmSnd.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */
ii += 4u;
wMsgLen = (ii - wMsgLenIndex - 2u);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
}
else
{
;
}
g_strAtsWlbCfmSnd.chFlag = FLAG_UNSET;
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
/* 组TIOC汇报给ATS的脱轨防护区域信息 */
szToGateWayDataBuf[ii++] = MSG_TYPE_DA_REPORT; /* 脱轨防护区域汇报消息 */
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2u;
szToGateWayDataBuf[ii++] = MSG_TYPE_DA_REPORT;
ShortToChar(GATE_WAY_APP_PRTCL_VER, &szToGateWayDataBuf[ii]); /* 应用协议版本号 */
ii += 2u;
szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */
chEaNum = GetEaNum();
if (EA_MAX_NUM < chEaNum)
{
chRtn = CI_ERROR;
}
else
{
chEaSendNum = 0u;
wEaNumIndex = ii; /* 记录汇报数量存储下标 */
ii++;
for (chEaIndex = 0u; chEaIndex < chEaNum; chEaIndex++)
{
wEaTrainid = GetEvacuatingTrainIdByIndex(chEaIndex);
chRtn = dquDevName2HlhtId(wEaTrainid, wTrainLgcId, &dwEaTrainHlhtId);
chEaLgcNum = EaGetLgcNum(chEaIndex);
pEaLgcId = EaGetLgcId(chEaIndex);
chEaBuidFlag = GetEaBuildedFlag(chEaIndex);
chEaSrcId = GetEaSrcTiocByIndex(chEaIndex);
chPaType = GetPaTypeByIndex(chEaIndex);
chEaAreaLineType = GetEaAreaLineType(chEaIndex);
if ((NULL == pEaLgcId) || (CI_ERROR == chRtn) || (EA_SECTION_MAX_NUM < chEaLgcNum)
|| ((PA_TYPE_DA != chPaType) && (PA_TYPE_EA != chPaType)))
{
chRtn = CI_ERROR;
break;
}
else
{
if ((chEaSrcId == chLocalId) && (PA_TYPE_DA == chPaType))
{
chEaSendNum++;
LongToChar(dwEaTrainHlhtId, &szToGateWayDataBuf[ii]); /* 区间疏散列车互联互通ID */
ii += 4u;
szToGateWayDataBuf[ii++] = chEaAreaLineType; /* 上下行区域 */
szToGateWayDataBuf[ii++] = chEaLgcNum; /* 逻辑区段数量 */
for (chEaLgcIndex = 0u; chEaLgcIndex < chEaLgcNum; chEaLgcIndex++)
{
ShortToChar(pEaLgcId[chEaLgcIndex], &szToGateWayDataBuf[ii]);
ii += 2u;
}
}
else
{
; /* 本控区非建立控区,不汇报给ATS */
}
}
}
szToGateWayDataBuf[wEaNumIndex] = chEaSendNum; /* 组汇报数量 */
wMsgLen = (ii - wMsgLenIndex - 2u);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
}
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
if (FLAG_SET == g_strAtsDaCfmFst.chFlag)
{
szToGateWayDataBuf[ii++] = MSG_TYPE_DA_CONFIRM_FIRST; /* 帧类型 */
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2u;
szToGateWayDataBuf[ii++] = MSG_TYPE_DA_CONFIRM_FIRST;
szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */
szToGateWayDataBuf[ii++] = g_strAtsDaCfmFst.chStation; /* 车站编号 */
ShortToChar(g_strAtsDaCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */
ii += 2U;
LongToChar(g_strAtsDaCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */
ii += 4u;
szToGateWayDataBuf[ii++] = g_strAtsDaCfmFst.chOpStatus; /* 确认结果 */
LongToChar(g_strAtsDaCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */
ii += 4u;
wMsgLen = (ii - wMsgLenIndex - 2u);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
}
else
{
;
}
g_strAtsDaCfmFst.chFlag = FLAG_UNSET;
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
/*组第二个ATS的取消防护区域首次确认信息*/
if (FLAG_SET == g_strSndAtsDaCfmFst.chFlag)
{
szToGateWayDataBuf[ii] = MSG_TYPE_DA_CONFIRM_FIRST; /* 帧类型 */
ii++;
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2U;
szToGateWayDataBuf[ii] = MSG_TYPE_DA_CONFIRM_FIRST;
ii++;
szToGateWayDataBuf[ii] = chLocalId; /* TIOC编号 */
ii++;
szToGateWayDataBuf[ii] = g_strSndAtsDaCfmFst.chStation; /* 车站编号 */
ii++;
ShortToChar(g_strSndAtsDaCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */
ii += 2U;
LongToChar(g_strSndAtsDaCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */
ii += 4U;
szToGateWayDataBuf[ii] = g_strSndAtsDaCfmFst.chOpStatus; /* 确认结果 */
ii++;
LongToChar(g_strSndAtsDaCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */
ii += 4U;
wMsgLen = (ii - wMsgLenIndex - 2U);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
/*组包后清除第二个ATS的确认信息*/
ClearSndAtsDaFstCfmMsg();
}
else
{
;
}
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
if (FLAG_SET == g_strAtsDaCfmSnd.chFlag)
{
szToGateWayDataBuf[ii++] = MSG_TYPE_DA_CONFIRM_SECOND; /* 帧类型 */
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2u;
szToGateWayDataBuf[ii++] = MSG_TYPE_DA_CONFIRM_SECOND;
szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */
szToGateWayDataBuf[ii++] = g_strAtsDaCfmSnd.chStation; /* 车站编号 */
ShortToChar(g_strAtsDaCfmSnd.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */
ii += 2U;
LongToChar(g_strAtsDaCfmSnd.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */
ii += 4u;
szToGateWayDataBuf[ii++] = g_strAtsDaCfmSnd.chOpStatus; /* 确认结果 */
LongToChar(g_strAtsDaCfmSnd.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */
ii += 4u;
wMsgLen = (ii - wMsgLenIndex - 2u);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
}
else
{
;
}
g_strAtsDaCfmSnd.chFlag = FLAG_UNSET;
}
else
{
;
}
if (CI_SUCCESS == chRtn)
{
/* 组TIOC汇报给ATS的列车信息 */
rrm_GetInfToATSUCTInfo(&strTrainInfo);
szToGateWayDataBuf[ii++] = MSG_TYPE_TRIAN_INFO_REPORT; /* 汇报远程筛选列车信息帧 */
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2u;
szToGateWayDataBuf[ii++] = MSG_TYPE_TRIAN_INFO_REPORT;
ShortToChar(GATE_WAY_APP_PRTCL_VER, &szToGateWayDataBuf[ii]); /* 应用协议版本号 */
ii += 2u;
szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */
szToGateWayDataBuf[ii++] = strTrainInfo.trainCnt; /* 列车数量 */
for (chTrainIndex = 0u; chTrainIndex < strTrainInfo.trainCnt; chTrainIndex++)
{
(void)dquDevName2HlhtId(strTrainInfo.TrainID[chTrainIndex], wTrainLgcId, &dwTrainId);
LongToChar(dwTrainId, &szToGateWayDataBuf[ii]); /* 列车互联互通ID */
ii += 4u;
ShortToChar(strTrainInfo.TailSecID[chTrainIndex], &szToGateWayDataBuf[ii]); /* 列车车尾所处逻辑区段 */
ii += 2u;
}
wMsgLen = (ii - wMsgLenIndex - 2u);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
chMsgNum++; /* 消息数量递增 */
}
else
{
;
}
}
else
{
/*组飞车宕机信息*/
szToGateWayDataBuf[ii++] = MSG_TYPE_TRAIN_FLY_INFO; /* 帧类型 */
wMsgLenIndex = ii; /* 记录帧长度存放下标 */
ii += 2u;
szToGateWayDataBuf[ii++] = MSG_TYPE_TRAIN_FLY_INFO;
ShortToChar(GATE_WAY_APP_PRTCL_VER, &szToGateWayDataBuf[ii]); /* 应用协议版本号 */
ii += 2u;
szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */
FlyProtectTrainNum = GetFlyProtectNum();
if (SHUT_DOWN_TRAIN_NUMMAX < FlyProtectTrainNum)
{
chRtn = CI_ERROR;
}
else
{
szToGateWayDataBuf[ii++] = FlyProtectTrainNum; /*组飞车列车数量*/
for (chIndex = 0U; chIndex < FlyProtectTrainNum; chIndex++)
{
pFlyData = GetFlyProtectData(chIndex);
wTrainId = pFlyData->wTrainId;
TrainFlyAxis = pFlyData->flyProtectSecCnt;
chRtn = dquDevName2HlhtId((UINT16)(CI_SYSTEM_TYPE_IVOC * 256U) + wTrainId, 0U, &dwTrainId); /*两字节列车ID转换为4字节互联互通ID*/
if (chRtn == CI_SUCCESS)
{/*互联互通ID查询成功*/
LongToChar(dwTrainId, &szToGateWayDataBuf[ii]); /* 列车ID */
ii += 4u;
/** 获取通信车对应的包络id */
if (TRAIN_FLYALARM_SECNUM_MAX < TrainFlyAxis)
{
chRtn = CI_ERROR;
}
else
{
szToGateWayDataBuf[ii++] = TrainFlyAxis; /* 计轴数量 */
/* 获取计轴 id*/
for (jj = 0U; jj < TrainFlyAxis; jj++)
{
wPhySecId = pFlyData->flyProtectSec[jj];
ShortToChar(wPhySecId, &szToGateWayDataBuf[ii]);
ii += 2u;
}
}
}
else
{ /*组包失败*/
chRtn = CI_ERROR;
}
}
wMsgLen = (ii - wMsgLenIndex - 2u);
ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */
}
if (CI_SUCCESS == chRtn)
{
debug_infor_printf((const)"\n GATEWAY_FLY_SHUT_DOWN \n");
chMsgNum = 1U;
}
}
if (CI_SUCCESS == chRtn)
{
/* 组包成功,填入消息数量 */
szToGateWayDataBuf[wMsgNumIndex] = chMsgNum;
wDstDevId = (UINT16)(((UINT16)targetDevType << 8U) | (UINT16)deviceId);
chRtn = OutnetSafeSend(wDstDevId, 0u, &szToGateWayDataBuf[0], ii);
if (CI_SUCCESS == chRtn)
{
debug_infor_printf((const)"\nGATEWAY_SEND:%d", ii);
debug_out_array(0xAA, szToGateWayDataBuf, ii);
}
else
{
;
}
}
else
{
;
}
return chRtn;
}
/**
* @brief 全线紧急制动紧急ID校验
* @param const UINT8 cDeviceType 设备类型
* @param const UINT16 wDeviceId 设备ID
* @return 1 成功;0 失败
* @note Created By LQ 2023.11.09
*/
UINT8 WlbUrgentIdCheck(const UINT8 cDeviceType, const UINT16 wDeviceId)
{
UINT8 retVal = CI_ERROR;
UINT8 cLocalCiId = 0U; /*本联锁ID*/
UINT8 cPhySecBelongCiId = 0U; /*物理区段所属联锁*/
cLocalCiId = GetSystemParaLocalCiId();
if (((WLB_TYPE_RC == cDeviceType) && (0U != wDeviceId) && (CI_SUM_MAX > wDeviceId))
|| ((WLB_TYPE_PHYSEC == cDeviceType) && (0U != wDeviceId) && (PHYSICAL_SECTION_SUM_MAX > wDeviceId)))
{
switch (cDeviceType)
{
case WLB_TYPE_RC:
if ((cLocalCiId == (UINT8)wDeviceId) && (0U != cLocalCiId))
{
retVal = CI_SUCCESS;
}
else
{
/*非本控区,返回失败*/
}
break;
case WLB_TYPE_PHYSEC:
cPhySecBelongCiId = GetPhySecBelongCiId(wDeviceId);
if ((cLocalCiId == cPhySecBelongCiId) && (0U != cLocalCiId))
{
retVal = CI_SUCCESS;
}
else
{
/*非本控区,返回失败*/
}
break;
default:
/*返回失败*/
break;
}
}
else
{
/*入参非法,返回失败*/
}
return retVal;
}
/**
* @brief 清除第二个ATS的远程筛选一次确认信息
* @param 无
* @return 无
* @note Created By LQ 2025.05.29
*/
void ClearSndAtsScreenFstCfmMsg(void)
{
(void)CommonMemSet((void*)&g_strSndAtsCfmFst, (UINT32)sizeof(AtsMsgCfmStru), (UINT8)0U, (UINT32)sizeof(AtsMsgCfmStru));
}
/**
* @brief 清除第二个ATS的取消区间疏散一次确认信息
* @param 无
* @return 无
* @note Created By LQ 2025.05.29
*/
void ClearSndAtsEaFstCfmMsg(void)
{
(void)CommonMemSet((void*)&g_strSndAtsEaCfmFst, (UINT32)sizeof(AtsMsgCfmStru), (UINT8)0U, (UINT32)sizeof(AtsMsgCfmStru));
}
/**
* @brief 清除第二个ATS的全线紧急制动一次确认信息
* @param 无
* @return 无
* @note Created By LQ 2025.05.29
*/
void ClearSndAtsWlbFstCfmMsg(void)
{
(void)CommonMemSet((void*)&g_strSndAtsWlbCfmFst, (UINT32)sizeof(AtsMsgCfmStru), (UINT8)0U, (UINT32)sizeof(AtsMsgCfmStru));
}
/**
* @brief 清除第二个ATS的取消脱轨防护一次确认信息
* @param 无
* @return 无
* @note Created By LQ 2025.05.29
*/
void ClearSndAtsDaFstCfmMsg(void)
{
(void)CommonMemSet((void*)&g_strSndAtsDaCfmFst, (UINT32)sizeof(AtsMsgCfmStru), (UINT8)0U, (UINT32)sizeof(AtsMsgCfmStru));
}