一主三备完成
This commit is contained in:
+52
-38
@@ -43,7 +43,7 @@ static void s_Area_State_Req_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK
|
||||
* @brief 处理校验通过的状态ACK帧
|
||||
*/
|
||||
static void s_Area_State_Ack_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK_T* state_pack,
|
||||
IN CM_UINT32 local_sn, IN CM_UINT8 time_sync_flag);
|
||||
IN CM_UINT32 local_sn);
|
||||
/**
|
||||
* @brief 仲裁处理
|
||||
*/
|
||||
@@ -279,7 +279,6 @@ static void s_Area_State_Multi_Process(void)
|
||||
else
|
||||
{
|
||||
/**非主地主接收组播状态数据 */
|
||||
CM_Sleep(10u); /**等待10ms后接收组播数据 */
|
||||
s_Area_State_Multi_Recv_Process();
|
||||
}
|
||||
|
||||
@@ -428,8 +427,9 @@ static void s_Area_State_Ack_Process(void)
|
||||
CM_UINT8 timeSyncFlag = AREA_FLAGS_CTRL_PTR->Time_Sync_Flag;
|
||||
CM_BOOL ack_flags[5] = {CM_FALSE, CM_FALSE, CM_FALSE, CM_FALSE, CM_FALSE};
|
||||
|
||||
CM_UINT32 i = 0u;
|
||||
/**持续30ms */
|
||||
do
|
||||
for(i = 0u;i<10;i++)
|
||||
{
|
||||
/**REQ与ACK共用一个FIFO,每条报文只读取一次并按类型分发。 */
|
||||
do
|
||||
@@ -446,9 +446,7 @@ static void s_Area_State_Ack_Process(void)
|
||||
|
||||
if((crc1 == state_pack.CRC1) && (crc2 == state_pack.CRC2) &&
|
||||
((AREA_ARB_STATE_PACK_LEN - 1u) == state_pack.Len) &&
|
||||
(state_pack.DstID == AREA_BASIC_CFG_PTR->BoardID) &&
|
||||
(srcID >= MSCP_AREA_A_BOARD_ID_A) &&
|
||||
(srcID <= MSCP_AREA_B_BOARD_ID_B))
|
||||
(state_pack.DstID == AREA_BASIC_CFG_PTR->BoardID))
|
||||
{
|
||||
if(ENUM_AREA_MSG_STATE_REQ == state_pack.MsgType)
|
||||
{
|
||||
@@ -456,7 +454,7 @@ static void s_Area_State_Ack_Process(void)
|
||||
}
|
||||
else if(ENUM_AREA_MSG_STATE_ACK == state_pack.MsgType)
|
||||
{
|
||||
s_Area_State_Ack_Recv_Process(&state_pack, localsn, timeSyncFlag);
|
||||
s_Area_State_Ack_Recv_Process(&state_pack, localsn);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -468,17 +466,12 @@ static void s_Area_State_Ack_Process(void)
|
||||
|
||||
/**同步接收状态和本周期ACK目标,再统一回复。 */
|
||||
s_Area_2oo2Sync_AfterStateRecv(ack_flags);
|
||||
if((partner_id <= MSCP_AREA_B_BOARD_ID_B) &&
|
||||
(area_a_id <= MSCP_AREA_B_BOARD_ID_B) &&
|
||||
(area_b_id <= MSCP_AREA_B_BOARD_ID_B))
|
||||
{
|
||||
s_Area_SendACK_After2oo2(ack_flags[partner_id], ack_flags[area_a_id], ack_flags[area_b_id]);
|
||||
}
|
||||
s_Area_SendACK_After2oo2(ack_flags[partner_id], ack_flags[area_a_id], ack_flags[area_b_id]);
|
||||
CM_Memset(ack_flags, 0, sizeof(ack_flags), sizeof(ack_flags));
|
||||
|
||||
CM_Sleep(2u);
|
||||
used_time = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION) - start_tick;
|
||||
} while(used_time < 30u);
|
||||
}
|
||||
}
|
||||
|
||||
static void s_Area_State_Req_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK_T* state_pack,
|
||||
@@ -492,7 +485,7 @@ static void s_Area_State_Req_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK
|
||||
}
|
||||
|
||||
s_Area_GetCommStatus_byID(state_pack->SrcID, &last_sn, NULL);
|
||||
if(state_pack->SN > last_sn)
|
||||
if(state_pack->SN >= last_sn)
|
||||
{
|
||||
ack_flags[state_pack->SrcID] = CM_TRUE;
|
||||
s_Area_SetCommStatus_byID(state_pack->SrcID, state_pack->SN, CM_TRUE);
|
||||
@@ -504,7 +497,7 @@ static void s_Area_State_Req_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK
|
||||
}
|
||||
|
||||
static void s_Area_State_Ack_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK_T* state_pack,
|
||||
IN CM_UINT32 local_sn, IN CM_UINT8 time_sync_flag)
|
||||
IN CM_UINT32 local_sn)
|
||||
{
|
||||
CM_UINT32 sn_diff = 0u;
|
||||
|
||||
@@ -513,6 +506,8 @@ static void s_Area_State_Ack_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK
|
||||
return;
|
||||
}
|
||||
|
||||
CM_UINT8 time_sync_flag = state_pack->TimeSyncFlag;
|
||||
|
||||
sn_diff = (local_sn >= state_pack->SN) ?
|
||||
(local_sn - state_pack->SN) : (state_pack->SN - local_sn);
|
||||
if(((1u == time_sync_flag) && (state_pack->SN == local_sn)) ||
|
||||
@@ -524,6 +519,11 @@ static void s_Area_State_Ack_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK
|
||||
AREA_LOG_MSG("AREA_ARB:State ACK received, SrcID:%d SN:%u State:%d 2x2:%d\n",
|
||||
state_pack->SrcID, state_pack->SN, state_pack->StateArea, state_pack->State2x);
|
||||
}
|
||||
else
|
||||
{
|
||||
AREA_LOG_MSG("AREA_ARB:State ACK recv failed, SrcID:%d SN:%u State:%d 2x2:%d\n",
|
||||
state_pack->SrcID, state_pack->SN, state_pack->StateArea, state_pack->State2x);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -565,17 +565,18 @@ static void s_Area_Arb_Send_Process(void)
|
||||
CM_UINT8 id_sm = AreaArb_GetID_byState(ENUM_AREA_SLAVE, 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_BOOL flag_comm_all_down = AREA_COMM_STATUS_PTR->Area_A_RcvFlag | AREA_COMM_STATUS_PTR->Area_B_RcvFlag; /**用于判断通信是否完全中断 */
|
||||
CM_BOOL flag_comm_all_up = AREA_COMM_STATUS_PTR->Area_A_RcvFlag & AREA_COMM_STATUS_PTR->Area_B_RcvFlag; /**用于判断通信是否完全正常 */
|
||||
/**重置仲裁请求发送标志 */
|
||||
AREA_ARB_CTRL_PTR->Arb_Send_Flag = 0u;
|
||||
AREA_ARB_CTRL_PTR->Arb_Send_Flag = 0u;
|
||||
|
||||
/**判断是否发送仲裁请求 */
|
||||
if(ENUM_2x2_MASTER == AREA_STATE_CTRL_PTR->State2x.LocalState)
|
||||
{
|
||||
/**主系判断是否发送仲裁请求 */
|
||||
if(ENUM_AREA_MASTER == local_area_state && 0u == id_sm)
|
||||
if(ENUM_AREA_MASTER == local_area_state && 0u == id_sm && CM_FALSE == flag_comm_all_up)
|
||||
{
|
||||
/**本地主地主,与备地主通信中断,发送仲裁请求 */
|
||||
/**本地主地主,与备地通信存在异常,发送仲裁请求 */
|
||||
AREA_ARB_CTRL_PTR->Arb_Send_Flag = 1u;
|
||||
send_rt = Area_Arb_Req_Send(tmp_buf, tmp_len);
|
||||
AREA_LOG_MSG("AREA_ARB:Request arbitration, master lost slave, BoardID:%d SN:%u Result:0x%x\n",
|
||||
@@ -599,7 +600,7 @@ static void s_Area_Arb_Send_Process(void)
|
||||
}
|
||||
else if(ENUM_AREA_UNKNOW == local_area_state && CM_FALSE == flag_comm_all_down)
|
||||
{
|
||||
/**未知地主系,与其他三系通信持续中断10周期,发送仲裁请求 */
|
||||
/**未知地主系,与另一地通信持续中断10周期,发送仲裁请求 */
|
||||
if(tolerate_arb >= 10u)
|
||||
{
|
||||
AREA_ARB_CTRL_PTR->Arb_Send_Flag = 1u;
|
||||
@@ -745,32 +746,45 @@ static void s_Area_State_Multi_Recv_Process(void)
|
||||
CM_INT32 rcv_len = 0;
|
||||
STRU_AREA_WITH_ARB_STATE_MULTI_PACK_T multi_pack = {0}; /**状态组播帧数据结构体 */
|
||||
CM_UINT32 tickNow = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION);
|
||||
CM_UINT32 tickStart = tickNow, usedTime = 0u;
|
||||
CM_UINT32 tickRcv = 0u;
|
||||
/*组播接收*/
|
||||
rcv_len = Area_State_Multi_Recv(wire_buf, sizeof(wire_buf), &tickRcv);
|
||||
|
||||
/*双CRC校验*/
|
||||
if(AREA_ARB_STATE_MULTI_PACK_LEN == rcv_len &&
|
||||
((tickNow - tickRcv) < g_PFM_Cfg.CYC_TIME))
|
||||
do
|
||||
{
|
||||
Area_Arb_State_Multi_UnPack(&multi_pack, wire_buf, (CM_UINT32)rcv_len);
|
||||
crc1 = CM_Crc32_1(&wire_buf[1], (CM_UINT32)rcv_len - 9u);
|
||||
crc2 = CM_Crc32_2(&wire_buf[1], (CM_UINT32)rcv_len - 9u);
|
||||
if(crc1 == multi_pack.CRC1 && crc2 == multi_pack.CRC2 &&
|
||||
((AREA_ARB_STATE_MULTI_PACK_LEN - 1u) == multi_pack.Len) &&
|
||||
ENUM_AREA_MSG_STATE_MULTI == multi_pack.MsgType)
|
||||
rcv_len = Area_State_Multi_Recv(wire_buf, sizeof(wire_buf), &tickRcv);
|
||||
tickNow = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION);
|
||||
if(AREA_ARB_STATE_MULTI_PACK_LEN == rcv_len &&
|
||||
((tickNow - tickRcv) < g_PFM_Cfg.CYC_TIME))
|
||||
{
|
||||
s_Area_SetCommStatus_byID(multi_pack.SrcID, multi_pack.SN, CM_TRUE);
|
||||
AreaArb_SetState_byID(multi_pack.SrcID, multi_pack.StateArea);
|
||||
AreaArb_Set2xState_byID(multi_pack.SrcID, multi_pack.State2x);
|
||||
AREA_LOG_MSG("AREA_ARB:Multicast state received, SrcID:%d SN:%u State:%d 2x2:%d\n",
|
||||
multi_pack.SrcID, multi_pack.SN, multi_pack.StateArea, multi_pack.State2x);
|
||||
Area_Arb_State_Multi_UnPack(&multi_pack, wire_buf, (CM_UINT32)rcv_len);
|
||||
crc1 = CM_Crc32_1(&wire_buf[1], (CM_UINT32)rcv_len - 9u);
|
||||
crc2 = CM_Crc32_2(&wire_buf[1], (CM_UINT32)rcv_len - 9u);
|
||||
if(crc1 == multi_pack.CRC1 && crc2 == multi_pack.CRC2 &&
|
||||
((AREA_ARB_STATE_MULTI_PACK_LEN - 1u) == multi_pack.Len) &&
|
||||
ENUM_AREA_MSG_STATE_MULTI == multi_pack.MsgType)
|
||||
{
|
||||
s_Area_SetCommStatus_byID(multi_pack.SrcID, multi_pack.SN, CM_TRUE);
|
||||
AreaArb_SetState_byID(multi_pack.SrcID, multi_pack.StateArea);
|
||||
AreaArb_Set2xState_byID(multi_pack.SrcID, multi_pack.State2x);
|
||||
AREA_LOG_MSG("AREA_ARB:Multicast state received, SrcID:%d SN:%u State:%d 2x2:%d\n",
|
||||
multi_pack.SrcID, multi_pack.SN, multi_pack.StateArea, multi_pack.State2x);
|
||||
}
|
||||
else
|
||||
{
|
||||
AREA_LOG_MSG("Multi Recv Crc Fail %08x-%08x, %08x-%08x\n",crc1, multi_pack.CRC1, crc2, multi_pack.CRC2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
AREA_LOG_MSG("Multi Recv Crc Fail %08x-%08x, %08x-%08x\n",crc1, multi_pack.CRC1, crc2, multi_pack.CRC2);
|
||||
}
|
||||
}
|
||||
AREA_LOG_MSG("AREA_ARB:Multicast state received, tickNow - tickRcv = %llums\n", tickNow - tickRcv);
|
||||
}
|
||||
usedTime = tickNow - tickStart;
|
||||
CM_Sleep(1u);
|
||||
} while (usedTime < 10u);
|
||||
|
||||
|
||||
|
||||
}
|
||||
/**
|
||||
|
||||
@@ -273,7 +273,7 @@ ENUM_CM_RETURN Area_State_Multi_Send(IN const CM_UINT8* pBuf, IN CM_INT32 BufLen
|
||||
if(NULL != pBuf)
|
||||
{
|
||||
/*- 组播发送 */
|
||||
rt = CM_UDP_Send_Msg(AREA_MULTI_COMM_CFG_PTR->Socket_Send, pBuf, BufLen, inet_addr(AREA_MULTI_COMM_CFG_PTR->IP_Multicast),AREA_MULTI_COMM_CFG_PTR->Port_Send);
|
||||
rt = CM_UDP_Send_Msg(AREA_MULTI_COMM_CFG_PTR->Socket_Send, pBuf, BufLen, inet_addr(AREA_MULTI_COMM_CFG_PTR->IP_Multicast),AREA_MULTI_COMM_CFG_PTR->Port_Recv);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user