diff --git a/TSCP/src/MSCP/Arb/Arb.c b/TSCP/src/MSCP/Arb/Arb.c index 3a0c95f..ffa5f3f 100644 --- a/TSCP/src/MSCP/Arb/Arb.c +++ b/TSCP/src/MSCP/Arb/Arb.c @@ -524,7 +524,7 @@ static void s_Area_Arb_Send_Process(void) tolerate_arb++; } } - else if(ENUM_AREA_UNKNOW == local_area_state && CM_FALSE == flag_comm_all_down) + else if(ENUM_AREA_UNKNOW == local_area_state && CM_FALSE == flag_comm_all_up) { /**未知地主系,与另一地通信持续中断10周期,发送仲裁请求 */ if(tolerate_arb >= 10u) @@ -1093,3 +1093,17 @@ static void s_Area_DoubleCRC_Get(IN const CM_UINT8* buf, IN CM_UINT32 len, *crc1 = local_crc[0]; *crc2 = local_crc[1]; } +/** + * @brief 获取另一地A系的ID + */ +CM_UINT8 AreaArb_GetArea_A_ID(void) +{ + return AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID; +} +/** + * @brief 获取另一地B系的ID + */ +CM_UINT8 AreaArb_GetArea_B_ID(void) +{ + return AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID; +} \ No newline at end of file diff --git a/TSCP/src/MSCP/Arb/Arb.h b/TSCP/src/MSCP/Arb/Arb.h index ccf5df9..87e2b1c 100644 --- a/TSCP/src/MSCP/Arb/Arb.h +++ b/TSCP/src/MSCP/Arb/Arb.h @@ -131,5 +131,12 @@ void AreaArb_SetCommStatus_byID(CM_UINT8 ID, CM_UINT32 sn, CM_BOOL rcv_flag); * @brief 根据ID获取接收状态 */ void AreaArb_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* SN, CM_BOOL* rcv_flag); - +/** + * @brief 获取另一地A系的ID + */ +CM_UINT8 AreaArb_GetArea_A_ID(void); +/** + * @brief 获取另一地B系的ID + */ +CM_UINT8 AreaArb_GetArea_B_ID(void); #endif \ No newline at end of file diff --git a/TSCP/src/MSCP/Arb/Arb_Net.c b/TSCP/src/MSCP/Arb/Arb_Net.c index 89bc2f1..69a70cb 100644 --- a/TSCP/src/MSCP/Arb/Arb_Net.c +++ b/TSCP/src/MSCP/Arb/Arb_Net.c @@ -509,7 +509,7 @@ static void s_Area_Arb_IP_Init(void) g_PFM_Cfg.Partner_Area_A_Cfg.IP_4x2, g_PFM_Cfg.Partner_Area_B_Cfg.IP_4x2); /*获取仲裁网络配置*/ - rt = CM_Memcpy(ARB_COMM_CFG_PTR->IP_Local, 32, g_PFM_Cfg.Local_Cfg.IP_4x2,32);/**< 对地通信IP */ + rt = CM_Memcpy(ARB_COMM_CFG_PTR->IP_Local, 32, g_PFM_Cfg.Local_Cfg.IP_Area,32);/**< 对地通信IP */ CM_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); rt = CM_Memcpy(ARB_COMM_CFG_PTR->IP_Arb, 32, g_PFM_Cfg.Arb_CFG.IP_Arb,32);/**< 对地通信IP */ diff --git a/TSCP/src/MSCP/Arb/Arb_State.c b/TSCP/src/MSCP/Arb/Arb_State.c index b32ac5f..0e6795d 100644 --- a/TSCP/src/MSCP/Arb/Arb_State.c +++ b/TSCP/src/MSCP/Arb/Arb_State.c @@ -169,3 +169,20 @@ void AreaArb_Get_All_State(STR_Area_State *p_all_State) p_all_State->Partner_Area_B_state = AREA_STATE_CTRL_PTR->StateArea.Partner_Area_B_state; } } +/** + * @brief 判断是否存在备地 + */ +CM_BOOL AreaArb_Slave_Is_Exist() +{ + CM_BOOL rt = CM_FALSE; + if((ENUM_AREA_SLAVE == AREA_STATE_CTRL_PTR->StateArea.Local_state) || (ENUM_AREA_SLAVE == AREA_STATE_CTRL_PTR->StateArea.Partner_state) + || (ENUM_AREA_SLAVE == AREA_STATE_CTRL_PTR->StateArea.Partner_Area_A_state) || (ENUM_AREA_SLAVE == AREA_STATE_CTRL_PTR->StateArea.Partner_Area_B_state)) + { + rt = CM_TRUE; + } + else + { + + } + return rt; +} \ No newline at end of file diff --git a/TSCP/src/MSCP/Arb/Arb_State.h b/TSCP/src/MSCP/Arb/Arb_State.h index 611d296..cbc7c4a 100644 --- a/TSCP/src/MSCP/Arb/Arb_State.h +++ b/TSCP/src/MSCP/Arb/Arb_State.h @@ -33,5 +33,9 @@ CM_UINT8 AreaArb_GetID_byState(ENUM_AREA_STATE state_area, ENUM_2x2_STATE_T stat * @brief 仲裁模式下使用,获取所有区域状态 */ void AreaArb_Get_All_State(STR_Area_State *p_all_State); +/** + * @brief 判断是否存在备地 + */ +CM_BOOL AreaArb_Slave_Is_Exist(); #endif \ No newline at end of file diff --git a/TSCP/src/MSCP/Arb/Arb_State_Vote.c b/TSCP/src/MSCP/Arb/Arb_State_Vote.c index 1ffa779..508edfe 100644 --- a/TSCP/src/MSCP/Arb/Arb_State_Vote.c +++ b/TSCP/src/MSCP/Arb/Arb_State_Vote.c @@ -182,6 +182,8 @@ void s_Offline_vote(void) */ void s_Master_vote(void) { + ENUM_2x2_STATE_T state2x = AREA_STATE_CTRL_PTR->State2x.LocalState; + if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_A_state || ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_B_state) { /**双主宕机 */ @@ -189,6 +191,16 @@ void s_Master_vote(void) VOTE_STATE_CTRL->Partner_Area_A_state, VOTE_STATE_CTRL->Partner_Area_B_state); CM_ASSERT(0, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); } + else if(ENUM_2x2_OFFLINE == state2x) + { + /**与主地主同步失败 */ + VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE; + AREA_LOG_MSG("AREA_STATE_VOTE:Master>>>>>Offline, Sync failed\n"); + } + else + { + + } } /** * @brief 备地状态转换 @@ -196,38 +208,23 @@ void s_Master_vote(void) void s_Slave_vote(void) { CM_BOOL flag_comm_mm_status = CM_FALSE; /**与主地主的通信状态 */ - static CM_UINT32 s_slave_cnt = 0u; /**备系降离线容忍计数 */ CM_UINT8 id_mm = AreaArb_GetID_byState(ENUM_AREA_MASTER, ENUM_2x2_MASTER); /**主地主的ID */ AreaArb_GetCommStatus_byID(id_mm, NULL, &flag_comm_mm_status); - - CM_BOOL Sync_Fail_Flag = AREA_FLAGS_CTRL_PTR->Sync_Fail_Flag; /**同步失败标志 */ + + ENUM_2x2_STATE_T state2x = AREA_STATE_CTRL_PTR->State2x.LocalState; + if(0x55u == AREA_ARB_CTRL_PTR->Arb_Ack) { /**收到仲裁升主回复 */ VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER; AREA_LOG_MSG("AREA_STATE_VOTE:Slave>>>>>Master, Arbitration ACK received\n"); } - else if(CM_FALSE == Sync_Fail_Flag) + else if(ENUM_2x2_OFFLINE == state2x) { /**同步失败 */ - if(CM_TRUE == flag_comm_mm_status) - { - /**主地主存活,降离线 */ - VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE; - AREA_LOG_MSG("AREA_STATE_VOTE:Slave>>>>>Offline, Sync failed and Master ID:%d exists\n", - id_mm); - } - else - { - /**与主地主通信中断,认为主地主宕机,容忍一周期降离线 */ - s_slave_cnt++; - if(s_slave_cnt > MSCP_AREA_SLAVE_TOLERATE_COUNT) - { - s_slave_cnt = 0u; - VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE; - AREA_LOG_MSG("AREA_STATE_VOTE:Slave>>>>>Offline, Sync failed and Master is lost\n"); - } - } + VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE; + AREA_LOG_MSG("AREA_STATE_VOTE:Slave>>>>>Offline, Sync failed and Master ID:%d exists\n", + id_mm); } else if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_state) { @@ -239,9 +236,4 @@ void s_Slave_vote(void) { } - /**离开备地,清空计数 */ - if(ENUM_AREA_SLAVE != VOTE_STATE_CTRL->Local_state) - { - s_slave_cnt = 0u; - } } diff --git a/TSCP/src/MSCP/Area/Area_Arb_Common.c b/TSCP/src/MSCP/Area/Area_Arb_Common.c new file mode 100644 index 0000000..b94a98b --- /dev/null +++ b/TSCP/src/MSCP/Area/Area_Arb_Common.c @@ -0,0 +1,78 @@ +#include "Area_Arb_Common.h" + +/** + * @brief 执行初始化,4线与仲裁模式根据配置区分 + */ +void Area_Arb_Common_Init(void) +{ + if(0x55u == g_PFM_Cfg.M_Arb_Enable) + { + Area_With_Arb_Init(); + } + else + { + Area_init();//区域初始化 + } +} +/** + * @brief 获取所有板卡区域状态,4线与仲裁模式根据配置开关从不同结构体获取 + */ +void Area_Arb_Common_Get_All_State(STR_Area_State *p_all_State) +{ + if(0x55u == g_PFM_Cfg.M_Arb_Enable) + { + AreaArb_Get_All_State(p_all_State); + } + else + { + Area_Get_All_State(p_all_State); + } +} +/** + * @brief 获取另一地A系的ID + */ +CM_UINT32 Area_Arb_Common_GetArea_A_ID(void) +{ + CM_UINT32 id = 0u; + if(0x55u == g_PFM_Cfg.M_Arb_Enable) + { + id = (CM_UINT32)AreaArb_GetArea_A_ID(); + } + else + { + id = Area_GetArea_A_ID(); + } + return id; +} +/** + * @brief 获取另一地B系的ID + */ +CM_UINT32 Area_Arb_Common_GetArea_B_ID(void) +{ + CM_UINT32 id = 0u; + if(0x55u == g_PFM_Cfg.M_Arb_Enable) + { + id = (CM_UINT32)AreaArb_GetArea_B_ID(); + } + else + { + id = Area_GetArea_B_ID(); + } + return id; +} +/** + * @brief 判断是否存在备地 + */ +CM_BOOL Area_Arb_Common_Slave_Is_Exist(void) +{ + CM_BOOL rt = ENUM_CM_FALSE; + if(0x55u == g_PFM_Cfg.M_Arb_Enable) + { + rt = Area_Slave_Is_Exist(); + } + else + { + rt = AreaArb_Slave_Is_Exist(); + } + return rt; +} \ No newline at end of file diff --git a/TSCP/src/MSCP/Area/Area_Arb_Common.h b/TSCP/src/MSCP/Area/Area_Arb_Common.h new file mode 100644 index 0000000..d3319f8 --- /dev/null +++ b/TSCP/src/MSCP/Area/Area_Arb_Common.h @@ -0,0 +1,31 @@ +#ifndef AREA_ARB_H_ +#define AREA_ARB_H_ +#include "Area.h" +#include "Arb.h" +#include "Arb_State.h" +/** + * 该文件为4线模式和仲裁模式的共用头文件,用于对其他模块的通用接口 + */ + +/** + * @brief 执行初始化,4线与仲裁模式根据配置区分 + */ +void Area_Arb_Common_Init(void); +/** + * @brief 获取所有板卡区域状态,4线与仲裁模式根据配置开关从不同结构体获取 + */ +void Area_Arb_Common_Get_All_State(STR_Area_State *p_all_State); +/** + * @brief 获取另一地A系的ID,执行初始化,4线与仲裁模式根据配置区分 + */ +CM_UINT32 Area_Arb_Common_GetArea_A_ID(void); +/** + * @brief 获取另一地B系的ID,执行初始化,4线与仲裁模式根据配置区分 + */ +CM_UINT32 Area_Arb_Common_GetArea_B_ID(void); +/** + * @brief 判断是否存在备地 + */ +CM_BOOL Area_Arb_Common_Slave_Is_Exist(void); + +#endif \ No newline at end of file diff --git a/TSCP/src/MSCP/Area/Area_state.h b/TSCP/src/MSCP/Area/Area_state.h index 493e303..f0978a1 100644 --- a/TSCP/src/MSCP/Area/Area_state.h +++ b/TSCP/src/MSCP/Area/Area_state.h @@ -26,7 +26,6 @@ #define MSCP_AREA_B_BOARD_ID_B 0x04 #define MSCP_AREA_UNKNOW_COUNT_MAX 0x0au -#define MSCP_AREA_SLAVE_TOLERATE_COUNT (1u) /**< 备地降离线容忍次数 */ #define MSCP_MSG_BUF_MAX 1024u /**< 区域通信消息最大缓冲区大小 */ diff --git a/TSCP/src/MSCP/MSCP_main.c b/TSCP/src/MSCP/MSCP_main.c index 67fe115..6bb3d19 100644 --- a/TSCP/src/MSCP/MSCP_main.c +++ b/TSCP/src/MSCP/MSCP_main.c @@ -41,6 +41,7 @@ #include "PFM_RemoteUpdate.h" #include "CFM_Sync.h" #include "Arb.h" +#include "Area_Arb_Common.h" #if QNX #include #include @@ -243,15 +244,8 @@ static void MSCP_Init(void) PFM_LOG_SET_INIT_STAGE(ENUM_INIT_APP_CTRL); PFM_LOG_SET_INIT_STAGE(ENUM_INIT_2X2USART); CFM_TimeSync_Init(2);//时间同步初始化 - if(0x55u == g_PFM_Cfg.M_Arb_Enable) - { - Area_With_Arb_Init(); - } - else - { - Area_init();//区域初始化 - } - + /* 区域初始化*/ + Area_Arb_Common_Init(); /*- 是否开启2oo2功能 */ if (0x55u == g_PFM_Cfg.M_2oo2_Enable) diff --git a/TSCP/src/MSCP/SFM/SFM_2x2.c b/TSCP/src/MSCP/SFM/SFM_2x2.c index 53ef2a6..4f0808f 100644 --- a/TSCP/src/MSCP/SFM/SFM_2x2.c +++ b/TSCP/src/MSCP/SFM/SFM_2x2.c @@ -35,6 +35,7 @@ #include "Area_state.h" #include "Arb_State.h" #include "Arb.h" +#include "Area_Arb_Common.h" /*通信中断时间和同步超时时间可以相同,此时优先执行通信中断切系*/ @@ -1183,14 +1184,7 @@ void SFM_4x2_ChangeState(void) 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交换 */ /**获取区域状态 */ - if(0x55u == g_PFM_Cfg.M_Arb_Enable) - { - AreaArb_Get_All_State(&Area_State); - } - else - { - Area_Get_All_State(&Area_State); - } + Area_Arb_Common_Get_All_State(&Area_State); /*- 切系完成*/ if(ENUM_2x2_AIDSWITCH_OVER == s_2x2_state_Ctrl.LocalAIDSwitchState) @@ -1276,7 +1270,7 @@ void SFM_4x2_ChangeState(void) 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_Arb_Common_Slave_Is_Exist(); /*- 2x线程->更新主线程热备状态*/ s_2x2_Ctrl.LocalState = SFM_2x2_StateDecision(s_2x2_state_Ctrl.LocalAreaState,s_2x2_state_Ctrl.LocalState); /* 判断3乘是离线则将地状态设置为离线, @@ -1417,12 +1411,12 @@ ENUM_4x2_STATE_T SFM_2x2_AreaDecision(ENUM_AREA_STATE PartnerAreaState,CM_BOOL i if (isA == CM_TRUE) { // A系主备配对:0x01<->0x03 - rtn_state = (masterHighByte == Area_GetArea_A_ID())? ENUM_4x2_MASTER : ENUM_4x2_SLAVE; + rtn_state = (masterHighByte == Area_Arb_Common_GetArea_A_ID())? ENUM_4x2_MASTER : ENUM_4x2_SLAVE; } else { // B系主备配对:0x02<->0x04 - rtn_state = (masterHighByte == Area_GetArea_B_ID())? ENUM_4x2_MASTER : ENUM_4x2_SLAVE; + rtn_state = (masterHighByte == Area_Arb_Common_GetArea_B_ID())? ENUM_4x2_MASTER : ENUM_4x2_SLAVE; } break; default: