#ifndef ARB_NET_H_
#define ARB_NET_H_
/*区域间的组播配置*/
typedef struct
{
    CM_CHAR IP_Local[32]; /**< 本地IP */
    CM_CHAR IP_Multicast[32]; /**< 组播域*/

    CM_UINT16 Port_Send; /**< 组播发送接口 */
    CM_UINT16 Port_Recv; /**< 组播接收接口 */

    CM_SOCKET Socket_Send; /**< 组播发送socket */
    CM_SOCKET Socket_Recv; /**< 组播接收socket */

    CM_MQ_Struct_T MsgQ; /**< 接收消息队列 */
} STRU_AREA_MULTICAST_COMM_T;

/*与第三方仲裁通信的配置*/
typedef struct
{
    CM_CHAR IP_Local[32];
    CM_CHAR IP_Arb[32];
    CM_SOCKET Socket;
    CM_UINT16 port;      /**< 端口号 */
    CM_MQ_Struct_T MsgQ; /**< 接收消息队列 */
} STRU_ARB_COMM_CFG_T;
/**
 * @brief 仲裁模式下的网络初始化
 */
void Area_Arb_Net_Init(void);

/**
* @brief 第三方仲裁请求发送（仲裁模式使用）
* @param pBuf 发送报文指针 取值范围：非空
* @param BufLen 发送报文长度 取值范围：0~0x7FFFFFFF
* @return 发送结果
* - ENUM_CM_TRUE 成功
* - ENUM_CM_FALSE 失败
*/
ENUM_CM_RETURN Area_Arb_Req_Send(IN const CM_UINT8* pBuf, IN CM_INT32 BufLen);

/**
* @brief 第三方仲裁请求应答接收（仲裁模式使用）
* @param pBuf 接收报文指针 取值范围：非空
* @param BufLen 接收报文缓冲区大小 取值范围：0~0xFFFFFFFF
* @return 接收报文长度
* - 1~0xFFFFFFFF 接收报文长度
* - 0 接收失败
*/
CM_INT32 Area_Arb_Ack_Recv(CM_UINT8* pBuf, IN CM_UINT32 BufSize);

/**
* @brief 区域状态请求单播发送
* @param dstID 发送的目的ID
* @param pBuf 发送报文指针 取值范围：非空
* @param BufLen 发送报文长度 取值范围：0~0x7FFFFFFF
* @return 发送结果
* - ENUM_CM_TRUE 成功
* - ENUM_CM_FALSE 失败
*/
ENUM_CM_RETURN Area_State_Send(IN CM_UINT8 dstID, IN const CM_UINT8* pBuf, IN CM_INT32 BufLen);

/**
* @brief 区域状态请求单播接收（仲裁模式使用）
* @param pBuf 接收报文指针 取值范围：非空
* @param BufLen 接收报文缓冲区大小 取值范围：0~0xFFFFFFFF
* @param timeRcv 接收时的时间戳，单位ms(为空指针时不读取)
* @return 接收报文长度
* - 1~0xFFFFFFFF 接收报文长度
* - 0 接收失败
*/
CM_INT32 Area_State_Recv(CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT CM_UINT32* timeRcv);

/**
* @brief 区域状态请求组播发送（仲裁模式使用）
* @param pBuf 发送报文指针 取值范围：非空
* @param BufLen 发送报文长度 取值范围：0~0x7FFFFFFF
* @return 发送结果
* - ENUM_CM_TRUE 成功
* - ENUM_CM_FALSE 失败
*/
ENUM_CM_RETURN Area_State_Multi_Send(IN const CM_UINT8* pBuf, IN CM_INT32 BufLen);

/**
* @brief 区域状态请求组播接收（仲裁模式使用）
* @param pBuf 接收报文指针 取值范围：非空
* @param BufLen 接收报文缓冲区大小 取值范围：0~0xFFFFFFFF
* @return 接收报文长度
* - 1~0xFFFFFFFF 接收报文长度
* - 0 接收失败
*/
CM_INT32 Area_State_Multi_Recv(CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT CM_UINT32* timeRcv);

/**
 * @brief 仲裁模式下所有的接收缓冲区
 */
void Area_Arb_ClearMsgQ(void);

#endif