#ifndef APP_INTERFACE_H
#define APP_INTERFACE_H
#include "CM_Types.h"

#ifdef __cplusplus
extern "C"
{
#endif

/** @name 板卡ID
    * @{  */
#define MSCP_MAIN_A (1u)   /**< 主机板A系 */
#define MSCP_MAIN_B (2u)   /**< 主机板B系 */
#define MSCP_CC_R   (3u)   /**< 红网通控 */
#define MSCP_CC_B   (4u)   /**< 蓝网通控 */
    /** @}  */

    /** @name 通信总量限制
     * @{ */
#define MSCP_INNET_BUFF_SIZE   (1024*500)  /**< 内网周期通信总量上限 */
#define MSCP_OUTNET_BUFF_SIZE  (1024*500)  /**< 外网周期通信总量上限 */
#define MSCP_FOLLOW_BUFF_SIZE  (1024*1500) /**< 周期跟随数据上限 */
#define CFM_INNET_LOG_SIZE	(1024u * 5u)  /* 明文日志大小 */
#define CFM_INNET_LOG_BIN_SIZE	(CFM_INNET_LOG_SIZE-3U) /* 明文二进制日志大小 */
#define CFM_INNET_LOG_BIN_TEST_SIZE	((CFM_INNET_LOG_SIZE-10U)/5U)  /* 明文日志大小 */
     /** @} */
/** 2x2oo2的接收通道 */
typedef ENUM_CM_RETURN(*pSetAppfunc)(void); /* 应用周期调用函数 */
    typedef struct
    {
    	pSetAppfunc pApp1;
    	pSetAppfunc pApp2;
    	pSetAppfunc pApp3;
    	pSetAppfunc pApp4;
    	pSetAppfunc pApp5;
    }pTempAppfunc;
    extern pTempAppfunc g_APP_FUNC_SET;
    extern CM_UINT8  *p_gSfpInnetPara;
	extern CM_UINT8  gCpuUsageParaFlag;
     /** 双机热备状态 */
    typedef enum {
        ENUM_2x2_SHUTDOWN = 0, /**< 宕机 */
        ENUM_2x2_OFFLINE,      /**< 离线 */
        ENUM_2x2_PRE_MASTER,   /**< 预升主 */
        ENUM_2x2_MASTER,       /**< 主系 */
        ENUM_2x2_SLAVE         /**< 备系 */
    } ENUM_2x2_STATE_T;

    /** 应用通信通道 */
    typedef enum {
        ENUM_MSG_ERROR = 0,        /**< 保留值，禁止使用 */
        ENUM_MSG_OUTNET_SAFE,      /**< 外网安全通信，协议适配层处理 */
        ENUM_MSG_OUTNET_RAW,	   /* 外网透传通信 */
        ENUM_MSG_INNET_SAFE,       /**< 内网安全通信，SFP协议 */
        ENUM_MSG_INNET_RAW,        /**< 内网透传通信 */
		ENUM_MSG_INNET_MAINTENANCE /**< 远程部署内网安全通信 */
    } ENUM_MSCP_MSG_CHN_T;

    /*- 外网通道类型 */
    typedef enum
    {
        ENUM_OUTNET_ERROR = 0, /**< 保留 */
        ENUM_OUTNET_RED = 3,   /**< 红网 */
        ENUM_OUTNET_BLUE = 4,  /**< 蓝网 */
        ENUM_OUTNET_EXTEND_RED = 5,   /**< 扩展红网 */
        ENUM_OUTNET_EXTEND_BLUE = 6   /**< 扩展蓝网 */
    }ENUM_OUTNET_CHN_T;

    /*- 板卡状态类型 */
    typedef enum
    {
        ENUM_BOARDSTATE_ERROR = 0, /**< 未知状态 */
        ENUM_BOARDSTATE_RUN = 1,   /**< 运行状态 */
        ENUM_BOARDSTATE_EXIT = 2,  /**< 退出运营状态 */
		ENUM_BOARDSTATE_UPDATE = 3,   /**< 故障可更新文件状态 */
        ENUM_BOARDSTATE_DEFAULT = 4,   /**< 故障不可更新文件状态 */
    }ENUM_BOARD_STATE_T;

	/*外网数据发送目的设备，定义枚举型函数返回值*/
	typedef enum
	{
		ENUM_CM_CC =   0,   /**< 通控板 */
		ENUM_CM_SEB = 1,  	/**< 串口板 */
		ENUM_CM_CCSEB = 2   /**< 通控和串口板 */
	}ENUM_CM_RECCUSEB;

    typedef ENUM_CM_RECCUSEB(*SERIAL_ID_FUNC) (CM_UINT16);
    extern SERIAL_ID_FUNC p_Serial_Id_Func;

    typedef void(*STATUS_COMMUNICATION_FUNC) (CM_UINT8*, CM_UINT32, ENUM_OUTNET_CHN_T, CM_UINT16 *, CM_UINT16*);
    extern STATUS_COMMUNICATION_FUNC p_Status_Communication_Func;

    /*- 输出ats转车数据备用通道判断 */
    typedef ENUM_CM_RETURN(*SERIAL_OUT_ATS_VOBC) (CM_UINT16, CM_UINT16 *, CM_UINT16*);
    extern SERIAL_OUT_ATS_VOBC p_Serial_OUT_ATSVOBC_Func;

    /*- 输入ats转车数据备用通道判断 */
    typedef ENUM_CM_RETURN(*SERIAL_IN_VOBC_ATS) (CM_UINT16);
    extern SERIAL_IN_VOBC_ATS p_Serial_IN_VOBC_Func;

    extern CM_UINT32 inParamLen;
	extern CM_UINT8* inParam;
	extern CM_UINT8 gSetTempFlag;
	extern CM_FLOAT32 gMinTemperature;
	extern CM_FLOAT32 gMaxTemperature;
	extern ENUM_BOARD_STATE_T g_boardState;
    /*透传算法函数指针*/
    typedef ENUM_CM_RETURN(*RAW_ALGORITHM)(IN CM_UINT8*,IN CM_INT32,OUT CM_UINT8*,OUT CM_UINT8*);
	/**
	* @brief 应用初始化
	* @param[out] VitalBuf[] 关键数据数组
	* @param[out] *pVitalLen 关键数据长度
	* @return ENUM_CM_RETURN 初始化结果
	* - ENUM_CM_TRUE 成功
	* - ENUM_CM_FALSE 失败（平台立即宕机）
	* @note
	* 2oo2双机的关键数据内容不一致时，2oo2初始化将失败——平台宕机；
	* 2x2双系的关键数据内容不一致时，非主系运行的设备将宕机；
	* 关键数据应尽可能短（如几个版本号或MD5码）总长不得超过200字节。
	*/
	extern ENUM_CM_RETURN APP_API_Init(OUT CM_UINT8 VitalBuf[200], OUT CM_UINT16 *pVitalLen);

	/**
	* @brief 应用数据初始化
	* @details 用来初始化给到平台的数据(以下三点必须在此初始化) 注：逻辑处理不要放到这里初始化
	* @note
	* 1、内网协议数组
	* 2、维护模式上位机设备id
	* 3、版本号
	*/
	extern void APP_API_Data_Init(void);

	 /**
	* @brief 备系跟随接口
	* @param[in] Data[] 跟随数据数组
	* @param[in] Len    跟随数据长度
	* @return ENUM_CM_RETURN 函数执行结果
	* - ENUM_CM_TRUE 成功
	* - ENUM_CM_FALSE 失败（平台立即宕机）
	* @note
	* 当本系热备状态为：ENUM_2x2_OFFLINE，ENUM_2x2_SLAVE，且收到了邻系正确的跟随数据时
	* 本函数将在APP_API_MainFunc()之前执行；
	* 否则，本函数不执行。
	* 应用跟随数据的最大长度不得超过1024*1000字节
	* @see :: MSCP_SetFollowData
	*/
	ENUM_CM_RETURN APP_API_FollowUp(IN const CM_UINT8 Data[MSCP_FOLLOW_BUFF_SIZE], IN CM_UINT32 Len);
/**
	* @brief 平台\应用记录暗文日志
	* @param infoType 数据类型
	* 取值范围：0x55：info为字符串数据方式
	* 		   0xAA：info为十六进制数据方式
	* 		   0xFF：info为十进制数据方式
	* @param code 信息编码/信息类型   取值范围：0~0xffff
	* @param infoLen 数据长度  取值范围：0~0xffff
	* @param info 数据/信息 取值范围：任意类型指针
	*/
	void MSCP_PFM_LOG_DARK(IN const CM_UINT8 infoType, IN const CM_UINT16 code, IN const CM_UINT32 infoLen, IN const void *info);
	/**
	* @brief 获取进入周期运行距今的时间
	* @return 从系统首次进入周期运行值调用时刻经过的时间，单位：us
	*/
	CM_UINT64 DFM_GetUTCBaseTick(void);
#ifdef __cplusplus
}
#endif

#endif
