#ifndef AREA_H_
#define AREA_H_

#include "Area.h"
#include "Area_Net.h"
#include "Arb_Net.h"
#include "SFM_2x2.h"

#define AREA_BASIC_CFG_PTR       (&g_area_with_arb_cfg.Basic_CFG)       /**< 仲裁模式下使用，区域模块的基本配置（ID） */
#define AREA_THREAD_CTRL_PTR     (&g_area_with_arb_cfg.Thread_CTRL)     /**< 仲裁模式下使用，区域模块的线程控制（信号量） */
#define AREA_STATE_CTRL_PTR      (&g_area_with_arb_cfg.State_CTRL)      /**< 仲裁模式下使用，区域模块的状态控制 */
#define AREA_COMM_STATUS_PTR     (&g_area_with_arb_cfg.Comm_Status)     /**< 仲裁模式下使用，区域模块的通信状态记录 */
#define AREA_ARB_CTRL_PTR        (&g_area_with_arb_cfg.Arb_CTRL)        /**< 仲裁模式下使用，区域模块的仲裁控制 */
#define AREA_FLAGS_CTRL_PTR      (&g_area_with_arb_cfg.Flag_CTRL)       /**< 仲裁模式下使用，区域模块使用的标志位 */

/*仲裁模式下，区域间所有通信相关配置*/
typedef struct 
{
    STR_Area_IP_Cfg COMM_CFG_AREA;
    STRU_ARB_COMM_CFG_T COMM_CFG_ARB;
    STRU_AREA_MULTICAST_COMM_T COMM_CFG_AREA_MULTICAST;
}STRU_AREA_WITH_ARB_COMM_CFG_T;

/*仲裁模式下，区域间通信状态记录(接收到的SN号/周期号) */
typedef struct
{
    CM_UINT32 LocalSN;   /**< 本地周期号 */
    CM_UINT32 PatnerSN;  /**< 接收的对系周期号 */
    CM_BOOL Patner_RcvFlag; /**< 本周期是否接收到了对系的数据包，CM_TRUE接收到，CM_FALSE未接收到 */
    CM_UINT32 Area_A_SN; /**< 接收的另一地A系周期号 */
    CM_BOOL Area_A_RcvFlag; /**< 本周期是否接收到了另一地A系的数据包，CM_TRUE接收到，CM_FALSE未接收到 */
    CM_UINT32 Area_B_SN; /**< 接收的另一地B系周期号 */
    CM_BOOL Area_B_RcvFlag; /**< 本周期是否接收到了另一地B系的数据包，CM_TRUE接收到，CM_FALSE未接收到 */
}STRU_AREA_WITH_ARB_COMM_STATUS_T;

/*仲裁模式下，记录仲裁的回复*/
typedef struct
{
    CM_UINT8 Arb_Send_Flag; /**< 仲裁请求发送标志位，记录本周期是否发送了仲裁请求 */
    CM_UINT8 Arb_Ack; /**< 记录仲裁的回复 */
}STRU_AREA_WITH_ARB_REQ_T;

/*仲裁模式下，记录各种同步标志（时间/数据同步） */
typedef struct
{
    CM_BOOL Time_Sync_Flag;     /**< 时间同步标志 */
    CM_BOOL Sync_Health_Flag;   /**< 同步健康标志 */
    CM_BOOL Sync_Fail_Flag;     /**< 同步失败标志 CM_FALSE-同步失败 CM_TRUE-同步成功*/
}STRU_AREA_WITH_ARB_FLAGS_T;

/*仲裁模式下，区域线程控制*/
typedef struct
{
    CM_SEM_T m_AreaWithArbStart;
    CM_SEM_T m_AreaWithArbStop;
}STRU_AREA_WITH_ARB_THREAD_CTRL_T;

/*仲裁模式下，区域间所有的基础配置（ID）*/
typedef struct 
{
    CM_UINT8 BoardID;  /**< 板卡ID 插箱id */
    CM_UINT8 Cpuid;  /**< cpu id */
    CM_UINT8 Partner_BoardID;  /**< 对系板卡id */
    CM_UINT8 Partner_Area_A_BoardID;  /**< 对系id */
    CM_UINT8 Partner_Area_B_BoardID;  /**< 对系id */
    CM_UINT16 OutnetID; /**<外网ID */
    CM_UINT8 AreaID; /**< 区域ID，A地或B地 */
}STRU_AREA_WITH_ARB_BASIC_CFG_T;

/*仲裁模式下，记录2乘状态结构体*/
typedef struct
{
    ENUM_2x2_STATE_T LocalState;   /**< 本系2x状态*/
    ENUM_2x2_STATE_T PartnerState; /**< 对系2x状态 */
    ENUM_2x2_STATE_T Area_A_State; /**< 另一地A系2x状态 */
    ENUM_2x2_STATE_T Area_B_State; /**< 另一地B系2x状态 */
}STRU_AREA_2X_STATE_T;

/*仲裁模式下，区域状态控制结构体*/
typedef struct
{
    STR_Area_State StateArea;     /**< 区域状态汇总 */
    STRU_AREA_2X_STATE_T State2x; /**< 2x状态汇总 */
}STRU_AREA_WITH_ARB_STATE_CTRL_T;

/**仲裁模式下，区域模块的所有配置与控制汇总 */
typedef struct
{
    STRU_AREA_WITH_ARB_BASIC_CFG_T Basic_CFG;  /**< 基础配置(ID) */
    STRU_AREA_WITH_ARB_COMM_CFG_T COMM_CFG; /**< 通信配置 */
    STRU_AREA_WITH_ARB_THREAD_CTRL_T Thread_CTRL;   /**< 线程状态控制 */
    STRU_AREA_WITH_ARB_STATE_CTRL_T State_CTRL; /**<状态控制  */
    STRU_AREA_WITH_ARB_COMM_STATUS_T Comm_Status; /**<通信状态记录 */
    STRU_AREA_WITH_ARB_REQ_T Arb_CTRL; /**< 与仲裁的交互 */
    STRU_AREA_WITH_ARB_FLAGS_T Flag_CTRL; /**< 记录各种标志 */
}STRU_AREA_WITH_ARB_CFG_ALL_T;

extern STRU_AREA_WITH_ARB_CFG_ALL_T g_area_with_arb_cfg;


/**
 * @brief 区域初始化，包含第三方仲裁的初始化(仲裁模式使用)
 */
void Area_With_Arb_Init(void);
/**
 * @brief 区域开始
 * 
 */
void Area_Arb_Start();
/**
 * @brief 等待区域开始
 * 
 */
void Area_Arb_Wait_Start();

/**
 * @brief 区域停止
 * 
 */
void Area_Arb_Stop();
/**
 * @brief 等待区域停止
 * 
 */
void Area_Arb_Wait_Stop();
/**
 * @brief 根据ID设置接收状态
 */
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