同时上电,一主三备正常,待遍历异常场景
This commit is contained in:
@@ -111,6 +111,7 @@ INCLUDES += -I ./src/APP \
|
|||||||
-I ./src/MSCP_CFG \
|
-I ./src/MSCP_CFG \
|
||||||
-I ./src/MSCP/Area\
|
-I ./src/MSCP/Area\
|
||||||
-I ./src/MSCP/OFM\
|
-I ./src/MSCP/OFM\
|
||||||
|
-I ./src/MSCP/Arb
|
||||||
#LIBS += -L/path/to/my/lib/$(PLATFORM)/usr/lib -lmylib
|
#LIBS += -L/path/to/my/lib/$(PLATFORM)/usr/lib -lmylib
|
||||||
#LIBS += -L../mylib/$(OUTPUT_DIR) -lmylib
|
#LIBS += -L../mylib/$(OUTPUT_DIR) -lmylib
|
||||||
|
|
||||||
|
|||||||
+42
-25
@@ -104,8 +104,11 @@ static void s_Area_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* SN, CM_UINT8* rcv_
|
|||||||
static void s_Area_2oo2Sync_AfterStateRecv();
|
static void s_Area_2oo2Sync_AfterStateRecv();
|
||||||
/**
|
/**
|
||||||
* @brief 2取同步后,判断本周期是否收到请求,并进行回复组包发送
|
* @brief 2取同步后,判断本周期是否收到请求,并进行回复组包发送
|
||||||
|
* @param ack_partner 是否需要向对系回复ACK
|
||||||
|
* @param ack_area_a 是否需要向另一地A系回复ACK
|
||||||
|
* @param ack_area_b 是否需要向另一地B系回复ACK
|
||||||
*/
|
*/
|
||||||
static void s_Area_SendACK_After2oo2();
|
static void s_Area_SendACK_After2oo2(CM_BOOL ack_partner, CM_BOOL ack_area_a, CM_BOOL ack_area_b);
|
||||||
/**
|
/**
|
||||||
* @brief 对接收到的仲裁应答进行2取同步
|
* @brief 对接收到的仲裁应答进行2取同步
|
||||||
*/
|
*/
|
||||||
@@ -256,10 +259,11 @@ static void s_Area_State_Req_Send_Process(void)
|
|||||||
CM_Memset(&state_pack.Reserver[0], 0, AREA_ARB_RESERVER_LEN, AREA_ARB_RESERVER_LEN);
|
CM_Memset(&state_pack.Reserver[0], 0, AREA_ARB_RESERVER_LEN, AREA_ARB_RESERVER_LEN);
|
||||||
AREA_COMM_STATUS_PTR->LocalSN = DFM_GetBirthCount();
|
AREA_COMM_STATUS_PTR->LocalSN = DFM_GetBirthCount();
|
||||||
/**判断需要发送至哪一系 */
|
/**判断需要发送至哪一系 */
|
||||||
if(ENUM_AREA_UNKNOW == AREA_STATE_CTRL_PTR->StateArea.Local_state &&
|
if(MSCP_AREA_ID_A == AREA_BASIC_CFG_PTR->AreaID &&
|
||||||
|
ENUM_AREA_UNKNOW == AREA_STATE_CTRL_PTR->StateArea.Local_state &&
|
||||||
ENUM_2x2_MASTER == AREA_STATE_CTRL_PTR->State2x.LocalState)
|
ENUM_2x2_MASTER == AREA_STATE_CTRL_PTR->State2x.LocalState)
|
||||||
{
|
{
|
||||||
/**未知地主系,刚上电,向其他三系发送请求 */
|
/**未知地主系(仅A地),刚上电,向其他三系发送请求 */
|
||||||
/**发送至本地另一系 */
|
/**发送至本地另一系 */
|
||||||
state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_BoardID;
|
state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_BoardID;
|
||||||
tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack);
|
tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack);
|
||||||
@@ -351,6 +355,12 @@ static void s_Area_State_Ack_Send_Process(void)
|
|||||||
CM_UINT32 crc1 = 0u, crc2 = 0u;
|
CM_UINT32 crc1 = 0u, crc2 = 0u;
|
||||||
CM_UINT32 timeStamp = 0u, timeNow = 0u;
|
CM_UINT32 timeStamp = 0u, timeNow = 0u;
|
||||||
CM_UINT8 srcID = 0u, dstID = 0u;
|
CM_UINT8 srcID = 0u, dstID = 0u;
|
||||||
|
CM_UINT32 rcv_sn = 0u;
|
||||||
|
/**记录是否需要向某一系发送ACK */
|
||||||
|
CM_BOOL ack_flags[4] = {CM_FALSE,CM_FALSE,CM_FALSE,CM_FALSE};
|
||||||
|
CM_UINT8 partner_id = AREA_BASIC_CFG_PTR->Partner_BoardID;
|
||||||
|
CM_UINT8 area_a_id = AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID;
|
||||||
|
CM_UINT8 area_b_id = AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID;
|
||||||
/**接收请求 */
|
/**接收请求 */
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -367,19 +377,21 @@ static void s_Area_State_Ack_Send_Process(void)
|
|||||||
dstID = state_pack.DstID;
|
dstID = state_pack.DstID;
|
||||||
if(crc1 == state_pack.CRC1 && crc2 == state_pack.CRC2
|
if(crc1 == state_pack.CRC1 && crc2 == state_pack.CRC2
|
||||||
&& dstID == AREA_BASIC_CFG_PTR->BoardID &&
|
&& dstID == AREA_BASIC_CFG_PTR->BoardID &&
|
||||||
ENUM_AREA_MSG_STATE_REQ == state_pack.MsgType)
|
ENUM_AREA_MSG_STATE_REQ == state_pack.MsgType &&
|
||||||
|
rcv_sn > state_pack.SN)
|
||||||
{
|
{
|
||||||
/**CRC与目的ID校验通过*/
|
/**CRC与目的ID校验通过,并且SN最新*/
|
||||||
|
ack_flags[srcID] = CM_TRUE;
|
||||||
s_Area_SetCommStatus_byID(srcID, state_pack.SN, CM_TRUE);
|
s_Area_SetCommStatus_byID(srcID, state_pack.SN, CM_TRUE);
|
||||||
Area_SetState_byID(srcID, state_pack.StateArea);
|
AreaArb_SetState_byID(srcID, state_pack.StateArea);
|
||||||
Area_Set2xState_byID(srcID, state_pack.State2x);
|
AreaArb_Set2xState_byID(srcID, state_pack.State2x);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (0u < rcv_len);
|
} while (0u < rcv_len);
|
||||||
/**进行2取同步 */
|
/**进行2取同步 */
|
||||||
s_Area_2oo2Sync_AfterStateRecv();
|
s_Area_2oo2Sync_AfterStateRecv();
|
||||||
/**进行ACK回复 */
|
/**进行ACK回复 */
|
||||||
s_Area_SendACK_After2oo2();
|
s_Area_SendACK_After2oo2(ack_flags[partner_id],ack_flags[area_a_id], ack_flags[area_b_id]);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @brief 区域状态的应答ACK接收处理
|
* @brief 区域状态的应答ACK接收处理
|
||||||
@@ -415,8 +427,8 @@ static void s_Area_State_Ack_Recv_Process(void)
|
|||||||
{
|
{
|
||||||
/**CRC与目的ID校验通过,并且是本周期接收到的回复(校时未完成时容忍一周期) */
|
/**CRC与目的ID校验通过,并且是本周期接收到的回复(校时未完成时容忍一周期) */
|
||||||
s_Area_SetCommStatus_byID(srcID, state_pack.SN, CM_TRUE);
|
s_Area_SetCommStatus_byID(srcID, state_pack.SN, CM_TRUE);
|
||||||
Area_SetState_byID(srcID, state_pack.StateArea);
|
AreaArb_SetState_byID(srcID, state_pack.StateArea);
|
||||||
Area_Set2xState_byID(srcID, state_pack.State2x);
|
AreaArb_Set2xState_byID(srcID, state_pack.State2x);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (0u < rcv_len);
|
} while (0u < rcv_len);
|
||||||
@@ -441,7 +453,7 @@ static void s_Area_Arb_Send_Process(void)
|
|||||||
{
|
{
|
||||||
STRU_AREA_WITH_ARB_PACK_T arb_pack = {0}, peer_pack = {0};
|
STRU_AREA_WITH_ARB_PACK_T arb_pack = {0}, peer_pack = {0};
|
||||||
CM_UINT32 tmp_len = 0u;
|
CM_UINT32 tmp_len = 0u;
|
||||||
CM_UINT8 tmp_buf[1400] = 0u;
|
CM_UINT8 tmp_buf[1400] = {0u};
|
||||||
ENUM_AREA_STATE local_area_state = AREA_STATE_CTRL_PTR->StateArea.Local_state;
|
ENUM_AREA_STATE local_area_state = AREA_STATE_CTRL_PTR->StateArea.Local_state;
|
||||||
CM_UINT32 tolerate_arb = 0u; /**仲裁请求容忍 */
|
CM_UINT32 tolerate_arb = 0u; /**仲裁请求容忍 */
|
||||||
/**请求帧帧基础信息组包 */
|
/**请求帧帧基础信息组包 */
|
||||||
@@ -456,8 +468,8 @@ static void s_Area_Arb_Send_Process(void)
|
|||||||
DOUBLE_CRC_GET(arb_pack, peer_pack, tmp_buf, tmp_len);
|
DOUBLE_CRC_GET(arb_pack, peer_pack, tmp_buf, tmp_len);
|
||||||
CM_ASSERT(AREA_ARB_FRAME_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
|
CM_ASSERT(AREA_ARB_FRAME_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
|
||||||
/**获取对应状态的板卡ID */
|
/**获取对应状态的板卡ID */
|
||||||
CM_UINT8 id_sm = Area_GetID_byState(ENUM_AREA_SLAVE, ENUM_2x2_MASTER); /**备地主的板卡ID */
|
CM_UINT8 id_sm = AreaArb_GetID_byState(ENUM_AREA_SLAVE, ENUM_2x2_MASTER); /**备地主的板卡ID */
|
||||||
CM_UINT8 id_mm = Area_GetID_byState(ENUM_AREA_MASTER, ENUM_2x2_MASTER); /**主地主的板卡ID */
|
CM_UINT8 id_mm = AreaArb_GetID_byState(ENUM_AREA_MASTER, ENUM_2x2_MASTER); /**主地主的板卡ID */
|
||||||
/**获取通信中断标志 */
|
/**获取通信中断标志 */
|
||||||
CM_UINT8 flag_comm_all_down = AREA_COMM_STATUS_PTR->Patner_RcvFlag | AREA_COMM_STATUS_PTR->Area_A_RcvFlag | AREA_COMM_STATUS_PTR->Area_B_RcvFlag;
|
CM_UINT8 flag_comm_all_down = AREA_COMM_STATUS_PTR->Patner_RcvFlag | AREA_COMM_STATUS_PTR->Area_A_RcvFlag | AREA_COMM_STATUS_PTR->Area_B_RcvFlag;
|
||||||
/**重置仲裁请求发送标志 */
|
/**重置仲裁请求发送标志 */
|
||||||
@@ -618,8 +630,8 @@ static void s_Area_State_Multi_Recv_Process(void)
|
|||||||
ENUM_AREA_MSG_STATE_MULTI == multi_pack.MsgType)
|
ENUM_AREA_MSG_STATE_MULTI == multi_pack.MsgType)
|
||||||
{
|
{
|
||||||
s_Area_SetCommStatus_byID(multi_pack.SrcID, multi_pack.SN, CM_TRUE);
|
s_Area_SetCommStatus_byID(multi_pack.SrcID, multi_pack.SN, CM_TRUE);
|
||||||
Area_SetState_byID(multi_pack.SrcID, multi_pack.StateArea);
|
AreaArb_SetState_byID(multi_pack.SrcID, multi_pack.StateArea);
|
||||||
Area_Set2xState_byID(multi_pack.SrcID, multi_pack.State2x);
|
AreaArb_Set2xState_byID(multi_pack.SrcID, multi_pack.State2x);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -642,12 +654,19 @@ static void s_Area_Cycle_Init(void)
|
|||||||
AREA_STATE_CTRL_PTR->State2x.Area_B_State = ENUM_2x2_SHUTDOWN;
|
AREA_STATE_CTRL_PTR->State2x.Area_B_State = ENUM_2x2_SHUTDOWN;
|
||||||
/**从2乘线程获取地内的系状态 */
|
/**从2乘线程获取地内的系状态 */
|
||||||
SFM_2x2_GetStateAfterStateChange(&(AREA_STATE_CTRL_PTR->State2x.LocalState), &(AREA_STATE_CTRL_PTR->State2x.PartnerState));
|
SFM_2x2_GetStateAfterStateChange(&(AREA_STATE_CTRL_PTR->State2x.LocalState), &(AREA_STATE_CTRL_PTR->State2x.PartnerState));
|
||||||
if(ENUM_2x2_OFFLINE == AREA_STATE_CTRL_PTR->State2x.LocalState &&
|
/**如果上周期与某一系通信中断,清空接收SN */
|
||||||
((ENUM_AREA_MASTER == AREA_STATE_CTRL_PTR->StateArea.Local_state) || (ENUM_AREA_SLAVE == AREA_STATE_CTRL_PTR->StateArea.Local_state)))
|
if(CM_FALSE == AREA_COMM_STATUS_PTR->Patner_RcvFlag)
|
||||||
{
|
{
|
||||||
/**2乘离线系,置自己为离线地 */
|
AREA_COMM_STATUS_PTR->PatnerSN = 0u;
|
||||||
AREA_STATE_CTRL_PTR->StateArea.Local_state = ENUM_AREA_OFFLINE;
|
|
||||||
}
|
}
|
||||||
|
if(CM_FALSE == AREA_COMM_STATUS_PTR->Area_A_RcvFlag)
|
||||||
|
{
|
||||||
|
AREA_COMM_STATUS_PTR->Area_A_SN = 0u;
|
||||||
|
}
|
||||||
|
if(CM_FALSE == AREA_COMM_STATUS_PTR->Area_B_RcvFlag)
|
||||||
|
{
|
||||||
|
AREA_COMM_STATUS_PTR->Area_B_SN = 0u;
|
||||||
|
}
|
||||||
/**每周期初始化接收标志 */
|
/**每周期初始化接收标志 */
|
||||||
AREA_COMM_STATUS_PTR->Patner_RcvFlag = CM_FALSE;
|
AREA_COMM_STATUS_PTR->Patner_RcvFlag = CM_FALSE;
|
||||||
AREA_COMM_STATUS_PTR->Area_A_RcvFlag = CM_FALSE;
|
AREA_COMM_STATUS_PTR->Area_A_RcvFlag = CM_FALSE;
|
||||||
@@ -691,7 +710,6 @@ static void s_Area_SetCommStatus_byID(CM_UINT8 ID, CM_UINT32 sn, CM_BOOL rcv_fla
|
|||||||
*/
|
*/
|
||||||
static void s_Area_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* sn, CM_UINT8* rcv_flag)
|
static void s_Area_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* sn, CM_UINT8* rcv_flag)
|
||||||
{
|
{
|
||||||
CM_UINT32 sn = 0u;
|
|
||||||
if(ID == AREA_BASIC_CFG_PTR->BoardID)
|
if(ID == AREA_BASIC_CFG_PTR->BoardID)
|
||||||
{
|
{
|
||||||
if(NULL != sn)
|
if(NULL != sn)
|
||||||
@@ -741,7 +759,6 @@ static void s_Area_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* sn, CM_UINT8* rcv_
|
|||||||
{
|
{
|
||||||
AREA_LOG_MSG("Cant Find ID:%d\n", ID);
|
AREA_LOG_MSG("Cant Find ID:%d\n", ID);
|
||||||
}
|
}
|
||||||
return sn;
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @brief 对接收到的区域状态请求进行2取同步
|
* @brief 对接收到的区域状态请求进行2取同步
|
||||||
@@ -817,7 +834,7 @@ static void s_Area_2oo2Sync_AfterStateRecv()
|
|||||||
/**
|
/**
|
||||||
* @brief 2取同步后,判断本周期是否收到请求,并进行回复组包发送
|
* @brief 2取同步后,判断本周期是否收到请求,并进行回复组包发送
|
||||||
*/
|
*/
|
||||||
static void s_Area_SendACK_After2oo2()
|
static void s_Area_SendACK_After2oo2(CM_BOOL ack_partner, CM_BOOL ack_area_a, CM_BOOL ack_area_b)
|
||||||
{
|
{
|
||||||
STRU_AREA_WITH_ARB_STATE_PACK_T state_pack = {0}, peer_pack = {0};
|
STRU_AREA_WITH_ARB_STATE_PACK_T state_pack = {0}, peer_pack = {0};
|
||||||
CM_UINT8 tmp_buf[1400] = {0};
|
CM_UINT8 tmp_buf[1400] = {0};
|
||||||
@@ -832,7 +849,7 @@ static void s_Area_SendACK_After2oo2()
|
|||||||
CM_Memset(&state_pack.Reserver[0], 0, AREA_ARB_RESERVER_LEN, AREA_ARB_RESERVER_LEN);
|
CM_Memset(&state_pack.Reserver[0], 0, AREA_ARB_RESERVER_LEN, AREA_ARB_RESERVER_LEN);
|
||||||
|
|
||||||
/**判断请求的接收情况 */
|
/**判断请求的接收情况 */
|
||||||
if(CM_TRUE == AREA_COMM_STATUS_PTR->Patner_RcvFlag)
|
if(CM_TRUE == AREA_COMM_STATUS_PTR->Patner_RcvFlag && CM_TRUE == ack_partner)
|
||||||
{
|
{
|
||||||
/**接收到了对系的请求,组包回复 */
|
/**接收到了对系的请求,组包回复 */
|
||||||
state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_BoardID;
|
state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_BoardID;
|
||||||
@@ -842,7 +859,7 @@ static void s_Area_SendACK_After2oo2()
|
|||||||
CM_ASSERT(AREA_ARB_STATE_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
|
CM_ASSERT(AREA_ARB_STATE_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
|
||||||
Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID, &state_pack, sizeof(state_pack));
|
Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID, &state_pack, sizeof(state_pack));
|
||||||
}
|
}
|
||||||
if(CM_TRUE == AREA_COMM_STATUS_PTR->Area_A_RcvFlag)
|
if(CM_TRUE == AREA_COMM_STATUS_PTR->Area_A_RcvFlag && CM_TRUE == ack_area_a)
|
||||||
{
|
{
|
||||||
/**接收到了另一地A系的请求,组包回复 */
|
/**接收到了另一地A系的请求,组包回复 */
|
||||||
state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID;
|
state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID;
|
||||||
@@ -852,7 +869,7 @@ static void s_Area_SendACK_After2oo2()
|
|||||||
CM_ASSERT(AREA_ARB_STATE_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
|
CM_ASSERT(AREA_ARB_STATE_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
|
||||||
Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID, &state_pack, sizeof(state_pack));
|
Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID, &state_pack, sizeof(state_pack));
|
||||||
}
|
}
|
||||||
if(CM_TRUE == AREA_COMM_STATUS_PTR->Area_B_RcvFlag)
|
if(CM_TRUE == AREA_COMM_STATUS_PTR->Area_B_RcvFlag && CM_TRUE == ack_area_b)
|
||||||
{
|
{
|
||||||
/**接收到了另一地A系的请求,组包回复 */
|
/**接收到了另一地A系的请求,组包回复 */
|
||||||
state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID;
|
state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID;
|
||||||
|
|||||||
@@ -288,7 +288,7 @@ ENUM_CM_RETURN Area_State_Multi_Send(IN const CM_UINT8* pBuf, IN CM_INT32 BufLen
|
|||||||
* - 1~0xFFFFFFFF 接收报文长度
|
* - 1~0xFFFFFFFF 接收报文长度
|
||||||
* - 0 接收失败
|
* - 0 接收失败
|
||||||
*/
|
*/
|
||||||
CM_INT32 Area_State_Recv(CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT CM_UINT32* timeRcv)
|
CM_INT32 Area_State_Multi_Recv(CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT CM_UINT32* timeRcv)
|
||||||
{
|
{
|
||||||
/*- 变量初始化 */
|
/*- 变量初始化 */
|
||||||
CM_UINT8 buf[65535] = {0};
|
CM_UINT8 buf[65535] = {0};
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ ENUM_CM_RETURN Area_State_Multi_Send(IN const CM_UINT8* pBuf, IN CM_INT32 BufLen
|
|||||||
* - 1~0xFFFFFFFF 接收报文长度
|
* - 1~0xFFFFFFFF 接收报文长度
|
||||||
* - 0 接收失败
|
* - 0 接收失败
|
||||||
*/
|
*/
|
||||||
CM_INT32 Area_State_Recv(CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT CM_UINT32* timeRcv);
|
CM_INT32 Area_State_Multi_Recv(CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT CM_UINT32* timeRcv);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 仲裁模式下所有的接收缓冲区
|
* @brief 仲裁模式下所有的接收缓冲区
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
/**
|
/**
|
||||||
* @brief 通过ID获取对应板卡区域状态
|
* @brief 通过ID获取对应板卡区域状态
|
||||||
*/
|
*/
|
||||||
ENUM_AREA_STATE Area_GetState_byID(CM_UINT8 ID)
|
ENUM_AREA_STATE AreaArb_GetState_byID(CM_UINT8 ID)
|
||||||
{
|
{
|
||||||
ENUM_AREA_STATE state = ENUM_AREA_SHUTDOWN;
|
ENUM_AREA_STATE state = ENUM_AREA_SHUTDOWN;
|
||||||
if(ID == AREA_BASIC_CFG_PTR->BoardID)
|
if(ID == AREA_BASIC_CFG_PTR->BoardID)
|
||||||
@@ -33,7 +33,7 @@ ENUM_AREA_STATE Area_GetState_byID(CM_UINT8 ID)
|
|||||||
/**
|
/**
|
||||||
* @brief 通过ID设置对应板卡区域状态
|
* @brief 通过ID设置对应板卡区域状态
|
||||||
*/
|
*/
|
||||||
void Area_SetState_byID(CM_UINT8 ID, ENUM_AREA_STATE state)
|
void AreaArb_SetState_byID(CM_UINT8 ID, ENUM_AREA_STATE state)
|
||||||
{
|
{
|
||||||
if(ID == AREA_BASIC_CFG_PTR->BoardID)
|
if(ID == AREA_BASIC_CFG_PTR->BoardID)
|
||||||
{
|
{
|
||||||
@@ -60,7 +60,7 @@ void Area_SetState_byID(CM_UINT8 ID, ENUM_AREA_STATE state)
|
|||||||
/**
|
/**
|
||||||
* @brief 通过ID获取对应板卡2x状态
|
* @brief 通过ID获取对应板卡2x状态
|
||||||
*/
|
*/
|
||||||
ENUM_2x2_STATE_T Area_Get2xState_byID(CM_UINT8 ID)
|
ENUM_2x2_STATE_T AreaArb_Get2xState_byID(CM_UINT8 ID)
|
||||||
{
|
{
|
||||||
ENUM_2x2_STATE_T state = ENUM_2x2_SHUTDOWN;
|
ENUM_2x2_STATE_T state = ENUM_2x2_SHUTDOWN;
|
||||||
if(ID == AREA_BASIC_CFG_PTR->BoardID)
|
if(ID == AREA_BASIC_CFG_PTR->BoardID)
|
||||||
@@ -89,7 +89,7 @@ ENUM_2x2_STATE_T Area_Get2xState_byID(CM_UINT8 ID)
|
|||||||
/**
|
/**
|
||||||
* @brief 通过ID设置对应板卡2x状态
|
* @brief 通过ID设置对应板卡2x状态
|
||||||
*/
|
*/
|
||||||
void Area_Set2xState_byID(CM_UINT8 ID, ENUM_2x2_STATE_T state)
|
void AreaArb_Set2xState_byID(CM_UINT8 ID, ENUM_2x2_STATE_T state)
|
||||||
{
|
{
|
||||||
if(ID == AREA_BASIC_CFG_PTR->BoardID)
|
if(ID == AREA_BASIC_CFG_PTR->BoardID)
|
||||||
{
|
{
|
||||||
@@ -115,7 +115,7 @@ void Area_Set2xState_byID(CM_UINT8 ID, ENUM_2x2_STATE_T state)
|
|||||||
/**
|
/**
|
||||||
* @brief 通过状态获取某个板卡ID
|
* @brief 通过状态获取某个板卡ID
|
||||||
*/
|
*/
|
||||||
CM_UINT8 Area_GetID_byState(ENUM_AREA_STATE* state_area, ENUM_2x2_STATE_T* state_2x)
|
CM_UINT8 AreaArb_GetID_byState(ENUM_AREA_STATE* state_area, ENUM_2x2_STATE_T* state_2x)
|
||||||
{
|
{
|
||||||
CM_UINT8 boardID = 0u;
|
CM_UINT8 boardID = 0u;
|
||||||
|
|
||||||
@@ -141,4 +141,21 @@ CM_UINT8 Area_GetID_byState(ENUM_AREA_STATE* state_area, ENUM_2x2_STATE_T* state
|
|||||||
}
|
}
|
||||||
|
|
||||||
return boardID;
|
return boardID;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief 仲裁模式下使用,获取所有区域状态
|
||||||
|
*/
|
||||||
|
void AreaArb_Get_All_State(STR_Area_State *p_all_State)
|
||||||
|
{
|
||||||
|
if(NULL == p_all_State)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p_all_State->Local_state = AREA_STATE_CTRL_PTR->StateArea.Local_state;
|
||||||
|
p_all_State->Partner_state = AREA_STATE_CTRL_PTR->StateArea.Partner_state;
|
||||||
|
p_all_State->Partner_Area_A_state = AREA_STATE_CTRL_PTR->StateArea.Partner_Area_A_state;
|
||||||
|
p_all_State->Partner_Area_B_state = AREA_STATE_CTRL_PTR->StateArea.Partner_Area_B_state;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -4,29 +4,34 @@
|
|||||||
#include "SFM_2x2.h"
|
#include "SFM_2x2.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 通过ID获取对应板卡区域状态
|
* @brief 仲裁模式下使用,通过ID获取对应板卡区域状态
|
||||||
*/
|
*/
|
||||||
ENUM_AREA_STATE Area_GetState_byID(CM_UINT8 ID);
|
ENUM_AREA_STATE AreaArb_GetState_byID(CM_UINT8 ID);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 通过ID设置对应板卡区域状态
|
* @brief 仲裁模式下使用,通过ID设置对应板卡区域状态
|
||||||
*/
|
*/
|
||||||
void Area_SetState_byID(CM_UINT8 ID, ENUM_AREA_STATE state);
|
void AreaArb_SetState_byID(CM_UINT8 ID, ENUM_AREA_STATE state);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 通过ID获取对应板卡2x状态
|
* @brief 仲裁模式下使用,通过ID获取对应板卡2x状态
|
||||||
*/
|
*/
|
||||||
ENUM_2x2_STATE_T Area_Get2xState_byID(CM_UINT8 ID);
|
ENUM_2x2_STATE_T AreaArb_Get2xState_byID(CM_UINT8 ID);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 通过ID设置对应板卡2x状态
|
* @brief 仲裁模式下使用,通过ID设置对应板卡2x状态
|
||||||
*/
|
*/
|
||||||
void Area_Set2xState_byID(CM_UINT8 ID, ENUM_2x2_STATE_T state);
|
void AreaArb_Set2xState_byID(CM_UINT8 ID, ENUM_2x2_STATE_T state);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 通过状态获取某个板卡ID
|
* @brief 仲裁模式下使用,通过状态获取某个板卡ID
|
||||||
* @return 0表示无该板卡
|
* @return 0表示无该板卡
|
||||||
*/
|
*/
|
||||||
CM_UINT8 Area_GetID_byState(ENUM_AREA_STATE* state_area, ENUM_2x2_STATE_T* state_2x);
|
CM_UINT8 AreaArb_GetID_byState(ENUM_AREA_STATE* state_area, ENUM_2x2_STATE_T* state_2x);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 仲裁模式下使用,获取所有区域状态
|
||||||
|
*/
|
||||||
|
void AreaArb_Get_All_State(STR_Area_State *p_all_State);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "Arb_State_Vote.h"
|
#include "Arb_State_Vote.h"
|
||||||
|
#include "Arb_State.h"
|
||||||
|
|
||||||
/**仅在状态表决时使用,简化宏,只包含区域状态 */
|
/**仅在状态表决时使用,简化宏,只包含区域状态 */
|
||||||
#define VOTE_STATE_CTRL (&(AREA_STATE_CTRL_PTR->StateArea))
|
#define VOTE_STATE_CTRL (&(AREA_STATE_CTRL_PTR->StateArea))
|
||||||
@@ -65,7 +66,7 @@ void s_Unknown_vote(void)
|
|||||||
ENUM_AREA_STATE Area_A_State = VOTE_STATE_CTRL->Partner_Area_A_state;
|
ENUM_AREA_STATE Area_A_State = VOTE_STATE_CTRL->Partner_Area_A_state;
|
||||||
ENUM_AREA_STATE Area_B_State = VOTE_STATE_CTRL->Partner_Area_B_state;
|
ENUM_AREA_STATE Area_B_State = VOTE_STATE_CTRL->Partner_Area_B_state;
|
||||||
/**初始化未知地计数 */
|
/**初始化未知地计数 */
|
||||||
static CM_UINT32 unkown_cnt = 0u;
|
static CM_UINT32 s_unkown_cnt = 0u;
|
||||||
/**状态转换部分 */
|
/**状态转换部分 */
|
||||||
if(0x55u == AREA_ARB_CTRL_PTR->Arb_Ack)
|
if(0x55u == AREA_ARB_CTRL_PTR->Arb_Ack)
|
||||||
{
|
{
|
||||||
@@ -96,25 +97,25 @@ void s_Unknown_vote(void)
|
|||||||
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
|
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
|
||||||
}
|
}
|
||||||
else if((MSCP_AREA_ID_A == AREA_BASIC_CFG_PTR->AreaID)
|
else if((MSCP_AREA_ID_A == AREA_BASIC_CFG_PTR->AreaID)
|
||||||
&& (ENUM_AREA_UNKNOW == Area_A_State || ENUM_AREA_SHUTDOWN == Area_A_State || ENUM_AREA_OFFLINE == Area_A_State)
|
&& (ENUM_AREA_UNKNOW == Area_A_State || ENUM_AREA_OFFLINE == Area_A_State)
|
||||||
&& (ENUM_AREA_UNKNOW == Area_B_State || ENUM_AREA_SHUTDOWN == Area_B_State || ENUM_AREA_OFFLINE == Area_B_State))
|
&& (ENUM_AREA_UNKNOW == Area_B_State || ENUM_AREA_OFFLINE == Area_B_State))
|
||||||
{
|
{
|
||||||
/**另一地为未知地/离线地/宕机,本地是A地,维持10周期升主 */
|
/**另一地为未知地/离线地,本地是A地,维持10周期升主(另一地是宕机时等待仲裁回复) */
|
||||||
unkown_cnt++;
|
s_unkown_cnt++;
|
||||||
if(unkown_cnt > MSCP_AREA_UNKNOW_COUNT_MAX)
|
if(s_unkown_cnt > MSCP_AREA_UNKNOW_COUNT_MAX)
|
||||||
{
|
{
|
||||||
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
|
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
|
||||||
unkown_cnt = 0u;
|
s_unkown_cnt = 0u;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/**维持未知地 */
|
||||||
}
|
}
|
||||||
/**离开未知地,清空计数 */
|
/**离开未知地,清空计数 */
|
||||||
if(ENUM_AREA_UNKNOW == VOTE_STATE_CTRL->Local_state)
|
if(ENUM_AREA_UNKNOW == VOTE_STATE_CTRL->Local_state)
|
||||||
{
|
{
|
||||||
unkown_cnt = 0u;
|
s_unkown_cnt = 0u;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -122,9 +123,34 @@ void s_Unknown_vote(void)
|
|||||||
*/
|
*/
|
||||||
void s_Offline_vote(void)
|
void s_Offline_vote(void)
|
||||||
{
|
{
|
||||||
CM_BOOL Sync_Fail_Flag = AREA_FLAGS_CTRL_PTR->Sync_Fail_Flag;
|
CM_BOOL Sync_Health_Flag = AREA_FLAGS_CTRL_PTR->Sync_Health_Flag; /**同步成功标志 */
|
||||||
CM_BOOL Sync_Health_Flag = AREA_FLAGS_CTRL_PTR->Sync_Health_Flag;
|
CM_UINT8 id_mm = AreaArb_GetID_byState(ENUM_AREA_MASTER, ENUM_2x2_MASTER); /**主地主的ID */
|
||||||
if()
|
/**状态转换 */
|
||||||
|
if(CM_TRUE == Sync_Health_Flag)
|
||||||
|
{
|
||||||
|
/**同步成功 */
|
||||||
|
if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_state)
|
||||||
|
{
|
||||||
|
/**主地在本地,升主地 */
|
||||||
|
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
|
||||||
|
}
|
||||||
|
else if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_A_state ||
|
||||||
|
ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_B_state)
|
||||||
|
{
|
||||||
|
/**主地在另一地,升备地 */
|
||||||
|
VOTE_STATE_CTRL->Local_state = ENUM_AREA_SLAVE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(0u == id_mm && 0)
|
||||||
|
{
|
||||||
|
/**(预留)主地主ID不存在,认为主地主宕机,离线地降未知地 */
|
||||||
|
VOTE_STATE_CTRL->Local_state = ENUM_AREA_UNKNOW;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -135,12 +161,56 @@ void s_Offline_vote(void)
|
|||||||
*/
|
*/
|
||||||
void s_Master_vote(void)
|
void s_Master_vote(void)
|
||||||
{
|
{
|
||||||
|
if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_A_state || ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_B_state)
|
||||||
|
{
|
||||||
|
/**双主宕机 */
|
||||||
|
CM_ASSERT(0, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @brief 备地状态转换
|
* @brief 备地状态转换
|
||||||
*/
|
*/
|
||||||
void s_Slave_vote(void)
|
void s_Slave_vote(void)
|
||||||
{
|
{
|
||||||
|
static CM_UINT32 s_slave_cnt = 0u; /**备系降离线容忍计数 */
|
||||||
|
CM_UINT8 id_mm = AreaArb_GetID_byState(ENUM_AREA_MASTER, ENUM_2x2_MASTER); /**主地主的ID */
|
||||||
|
CM_BOOL Sync_Fail_Flag = AREA_FLAGS_CTRL_PTR->Sync_Fail_Flag; /**同步失败标志 */
|
||||||
|
if(0x55u == AREA_ARB_CTRL_PTR->Arb_Ack)
|
||||||
|
{
|
||||||
|
/**收到仲裁升主回复 */
|
||||||
|
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
|
||||||
|
}
|
||||||
|
else if(CM_FALSE == Sync_Fail_Flag)
|
||||||
|
{
|
||||||
|
/**同步失败 */
|
||||||
|
if(0u != id_mm)
|
||||||
|
{
|
||||||
|
/**主地主存活,降离线 */
|
||||||
|
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/**主地主ID不存在,认为主地主宕机,容忍一周期降离线 */
|
||||||
|
s_slave_cnt++;
|
||||||
|
if(s_slave_cnt > MSCP_AREA_SLAVE_TOLERATE_COUNT)
|
||||||
|
{
|
||||||
|
s_slave_cnt = 0u;
|
||||||
|
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_state)
|
||||||
|
{
|
||||||
|
/**对系是主地,升主地(备地主升主地主后,备地备通过这条逻辑升主地) */
|
||||||
|
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
/**离开备地,清空计数 */
|
||||||
|
if(ENUM_AREA_SLAVE != VOTE_STATE_CTRL->Local_state)
|
||||||
|
{
|
||||||
|
s_slave_cnt = 0u;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
#ifndef AREA_NET_H_
|
||||||
|
#define AREA_NET_H_
|
||||||
#include "CM_Types.h"
|
#include "CM_Types.h"
|
||||||
#include "CFM_Net.h"
|
#include "CFM_Net.h"
|
||||||
#include "CM_MQ.h"
|
#include "CM_MQ.h"
|
||||||
@@ -36,4 +38,6 @@
|
|||||||
void Area_LOG_MSG(IN const CM_CHAR *filename, IN CM_INT32 line, IN const CM_CHAR* fmt, ...);
|
void Area_LOG_MSG(IN const CM_CHAR *filename, IN CM_INT32 line, IN const CM_CHAR* fmt, ...);
|
||||||
#define AREA_LOG_MSG(fmt, ...) (Area_LOG_MSG(FILENAME(__FILE__),(CM_INT32)__LINE__,(fmt), ##__VA_ARGS__))
|
#define AREA_LOG_MSG(fmt, ...) (Area_LOG_MSG(FILENAME(__FILE__),(CM_INT32)__LINE__,(fmt), ##__VA_ARGS__))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#define MSCP_AREA_B_BOARD_ID_B 0x04
|
#define MSCP_AREA_B_BOARD_ID_B 0x04
|
||||||
|
|
||||||
#define MSCP_AREA_UNKNOW_COUNT_MAX 0x0au
|
#define MSCP_AREA_UNKNOW_COUNT_MAX 0x0au
|
||||||
|
#define MSCP_AREA_SLAVE_TOLERATE_COUNT (1u) /**< 备地降离线容忍次数 */
|
||||||
|
|
||||||
#define MSCP_MSG_BUF_MAX 1024u /**< 区域通信消息最大缓冲区大小 */
|
#define MSCP_MSG_BUF_MAX 1024u /**< 区域通信消息最大缓冲区大小 */
|
||||||
|
|
||||||
|
|||||||
@@ -446,7 +446,11 @@ static CM_THREAD_FUNC_T MSCP_CycBase(void)
|
|||||||
/*TODO 发送2x状态起始信号量*/
|
/*TODO 发送2x状态起始信号量*/
|
||||||
SFM_2x2_Thread_PostStart();
|
SFM_2x2_Thread_PostStart();
|
||||||
/* 发送区域线程开始信号*/
|
/* 发送区域线程开始信号*/
|
||||||
Area_Start();
|
if(0x55 != g_PFM_Cfg.M_Arb_Enable)
|
||||||
|
{
|
||||||
|
Area_Start();
|
||||||
|
}
|
||||||
|
|
||||||
PFM_CFC_Check(24);
|
PFM_CFC_Check(24);
|
||||||
/*- 发起校时请求*/
|
/*- 发起校时请求*/
|
||||||
CFM_SendLocalARQ();
|
CFM_SendLocalARQ();
|
||||||
@@ -629,7 +633,7 @@ static void SelfCheckInit(void)
|
|||||||
{
|
{
|
||||||
#ifdef QNX
|
#ifdef QNX
|
||||||
/*- 文件自检初始化 */
|
/*- 文件自检初始化 */
|
||||||
PFM_FileInit();
|
//PFM_FileInit();
|
||||||
/*- 内存自检初始化*/
|
/*- 内存自检初始化*/
|
||||||
PFM_MemCheck_Init();
|
PFM_MemCheck_Init();
|
||||||
/*- CPU自检初始化*/
|
/*- CPU自检初始化*/
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
#include "CFM_Sync.h"
|
#include "CFM_Sync.h"
|
||||||
#include "stdarg.h"
|
#include "stdarg.h"
|
||||||
#include "Area_state.h"
|
#include "Area_state.h"
|
||||||
|
#include "Arb_State.h"
|
||||||
|
|
||||||
/*通信中断时间和同步超时时间可以相同,此时优先执行通信中断切系*/
|
/*通信中断时间和同步超时时间可以相同,此时优先执行通信中断切系*/
|
||||||
|
|
||||||
@@ -1060,6 +1061,11 @@ static CM_THREAD_FUNC_T SFM_2x2_StateChange_Thread(void)
|
|||||||
|
|
||||||
/*发送2x状态结束信号量*/
|
/*发送2x状态结束信号量*/
|
||||||
CM_Sem_Post(s_2x2_thread_Ctrl.m_Stop);
|
CM_Sem_Post(s_2x2_thread_Ctrl.m_Stop);
|
||||||
|
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
|
||||||
|
{
|
||||||
|
Area_Arb_Start();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1160,7 +1166,15 @@ void SFM_4x2_ChangeState(void)
|
|||||||
/*- 等待2x结束信号量*/
|
/*- 等待2x结束信号量*/
|
||||||
CM_Sem_Wait(s_2x2_thread_Ctrl.m_Stop);
|
CM_Sem_Wait(s_2x2_thread_Ctrl.m_Stop);
|
||||||
/*- 等待Area结束信号量*/
|
/*- 等待Area结束信号量*/
|
||||||
Area_Wait_Stop();
|
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
|
||||||
|
{
|
||||||
|
Area_Arb_Stop();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Area_Wait_Stop();
|
||||||
|
}
|
||||||
|
|
||||||
Area_LOG_Transition();
|
Area_LOG_Transition();
|
||||||
MSCP_LOG_MSG("SFM_4x2_ChangeState start\n");
|
MSCP_LOG_MSG("SFM_4x2_ChangeState start\n");
|
||||||
/*- 执行最后的切系逻辑*/
|
/*- 执行最后的切系逻辑*/
|
||||||
@@ -1169,7 +1183,15 @@ void SFM_4x2_ChangeState(void)
|
|||||||
s_2x2_Ctrl.MineExtendState = MSCP_Get_2X_VagueCom_State(&s_2x2_state_Ctrl.MineExtendOKCount[0]); /**< 本机串口通信状态,2oo2交换 */
|
s_2x2_Ctrl.MineExtendState = MSCP_Get_2X_VagueCom_State(&s_2x2_state_Ctrl.MineExtendOKCount[0]); /**< 本机串口通信状态,2oo2交换 */
|
||||||
s_2x2_Ctrl.PeerExtendState = MSCP_Get_2X_VagueCom_State(&s_2x2_state_Ctrl.PeerExtendOKCount[0]); /**< 邻机串口通信状态,2oo2交换 */
|
s_2x2_Ctrl.PeerExtendState = MSCP_Get_2X_VagueCom_State(&s_2x2_state_Ctrl.PeerExtendOKCount[0]); /**< 邻机串口通信状态,2oo2交换 */
|
||||||
/**获取区域状态 */
|
/**获取区域状态 */
|
||||||
Area_Get_All_State(&Area_State);
|
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
|
||||||
|
{
|
||||||
|
AreaArb_Get_All_State(&Area_State);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Area_Get_All_State(&Area_State);
|
||||||
|
}
|
||||||
|
|
||||||
/*- 切系完成*/
|
/*- 切系完成*/
|
||||||
if(ENUM_2x2_AIDSWITCH_OVER == s_2x2_state_Ctrl.LocalAIDSwitchState)
|
if(ENUM_2x2_AIDSWITCH_OVER == s_2x2_state_Ctrl.LocalAIDSwitchState)
|
||||||
{
|
{
|
||||||
@@ -1252,13 +1274,14 @@ void SFM_4x2_ChangeState(void)
|
|||||||
/**< 本系区域状态 */
|
/**< 本系区域状态 */
|
||||||
s_2x2_state_Ctrl.LocalAreaState = Area_State.Local_state;
|
s_2x2_state_Ctrl.LocalAreaState = Area_State.Local_state;
|
||||||
MSCP_LOG_MSG("s_2x2_state_Ctrl.LocalAreaState = %d 2x2 = %d\n",Area_State.Local_state, s_2x2_state_Ctrl.LocalState);
|
MSCP_LOG_MSG("s_2x2_state_Ctrl.LocalAreaState = %d 2x2 = %d\n",Area_State.Local_state, s_2x2_state_Ctrl.LocalState);
|
||||||
|
printf("AreaState = %d 2x2 = %d\n",Area_State.Local_state, s_2x2_state_Ctrl.LocalState);
|
||||||
/**<是否存在区域备地*/
|
/**<是否存在区域备地*/
|
||||||
s_2x2_state_Ctrl.Area_Slave_Is_Exist = Area_Slave_Is_Exist();
|
s_2x2_state_Ctrl.Area_Slave_Is_Exist = Area_Slave_Is_Exist();
|
||||||
/*- 2x线程->更新主线程热备状态*/
|
/*- 2x线程->更新主线程热备状态*/
|
||||||
s_2x2_Ctrl.LocalState = SFM_2x2_StateDecision(s_2x2_state_Ctrl.LocalAreaState,s_2x2_state_Ctrl.LocalState);
|
s_2x2_Ctrl.LocalState = SFM_2x2_StateDecision(s_2x2_state_Ctrl.LocalAreaState,s_2x2_state_Ctrl.LocalState);
|
||||||
/* 判断3乘是离线则将地状态设置为离线,
|
/* 判断3乘是离线则将地状态设置为离线,
|
||||||
* (通控健康度2乘、数据同步失败导致离线需要将地的状态拉下来) */
|
* (通控健康度2乘、数据同步失败导致离线需要将地的状态拉下来) */
|
||||||
if ((ENUM_2x2_OFFLINE == s_2x2_state_Ctrl.LocalState) && ((ENUM_AREA_MASTER == s_2x2_state_Ctrl.LocalAreaState) || (ENUM_AREA_SLAVE == s_2x2_state_Ctrl.LocalAreaState)))
|
if ((0x55u != g_PFM_Cfg.M_Arb_Enable) && (ENUM_2x2_OFFLINE == s_2x2_state_Ctrl.LocalState) && ((ENUM_AREA_MASTER == s_2x2_state_Ctrl.LocalAreaState) || (ENUM_AREA_SLAVE == s_2x2_state_Ctrl.LocalAreaState)))
|
||||||
{
|
{
|
||||||
Area_Set_State(ENUM_AREA_OFFLINE);
|
Area_Set_State(ENUM_AREA_OFFLINE);
|
||||||
MSCP_LOG_MSG("2x state is %d set area offline\n",s_2x2_state_Ctrl.LocalAreaState);
|
MSCP_LOG_MSG("2x state is %d set area offline\n",s_2x2_state_Ctrl.LocalAreaState);
|
||||||
@@ -1550,6 +1573,10 @@ void SFM_2x2_Init(IN const CM_UINT8 *VitalBuf, IN CM_UINT16 VitalLen, INOUT CM_U
|
|||||||
/*独立线程参数初始化*/
|
/*独立线程参数初始化*/
|
||||||
s_2x2_thread_Ctrl.number_Cyc = (g_PFM_Cfg.CYC_TIME - 60U) / MSCP_2X2_THREAD_TIME;/*根据周期计算,预留60ms*/
|
s_2x2_thread_Ctrl.number_Cyc = (g_PFM_Cfg.CYC_TIME - 60U) / MSCP_2X2_THREAD_TIME;/*根据周期计算,预留60ms*/
|
||||||
(s_2x2_thread_Ctrl.number_Cyc > 1u)?(s_2x2_thread_Ctrl.number_Cyc) : (s_2x2_thread_Ctrl.number_Cyc = 1u);
|
(s_2x2_thread_Ctrl.number_Cyc > 1u)?(s_2x2_thread_Ctrl.number_Cyc) : (s_2x2_thread_Ctrl.number_Cyc = 1u);
|
||||||
|
if(0x55u == g_PFM_Cfg.M_Arb_Enable && 2u < s_2x2_thread_Ctrl.number_Cyc)
|
||||||
|
{
|
||||||
|
s_2x2_thread_Ctrl.number_Cyc -= 2u;
|
||||||
|
}
|
||||||
CM_Sem_Init(&s_2x2_thread_Ctrl.m_Start);
|
CM_Sem_Init(&s_2x2_thread_Ctrl.m_Start);
|
||||||
CM_Sem_Init(&s_2x2_thread_Ctrl.m_Stop);
|
CM_Sem_Init(&s_2x2_thread_Ctrl.m_Stop);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user