#ifndef PFM_REMOTEUPDATE_H
#define PFM_REMOTEUPDATE_H
#include "CM_Types.h"
#include "MSCP_APP_Interface.h"

#ifdef __cplusplus
extern "C"
{
#endif
#define FILE_NAME_MAX_LEN    (128u) /*文件名最大长度*/
#define FILE_MAX_QUANTITY    (64u) /*文件最大数量*/

#define FAULT_REBOOT_CUT_MAX (3u) /*故障重启次数限制*/

extern CM_UINT16 g_Maintenance_Id;/* 维护终端内网id */
extern CM_UINT8 g_RemoteUpdate_State;/* 远程部署过程状态 */
extern CM_UINT8 s_switch2xFlag;

typedef enum {
    ENUM_TYPE_OTHER = 0,/*- 其他板卡 */
    ENUM_TYPE_PUB,      /*- 主机板 */
    ENUM_TYPE_CCU,      /*- 通控板 */
    ENUM_TYPE_SEB,      /*- 串口板 */
    ENUM_TYPE_ESB,      /*- 交换机 */
    ENUM_TYPE_ALL,      /*- 全部板卡 */
}ENUM_BOARD_TYPE_T;
/*- 硬重启自检状态机 */
typedef enum {
    ENUM_RELAY_1ST_OUTPUT = 0,  /*- 第1个继电器输出 */
    ENUM_RELAY_1ST_SELFCHECK,   /*- 第1个继电器检测 */
    ENUM_RELAY_2ND_OUTPUT,      /*- 第2个继电器输出 */
    ENUM_RELAY_2ND_SELFCHECK,   /*- 第2个继电器检测 */
    ENUM_RELAY_3RD_OUTPUT,      /*- 第3个继电器输出 */
    ENUM_RELAY_3RD_SELFCHECK,   /*- 第3个继电器检测 */
    ENUM_RELAY_4TH_OUTPUT,      /*- 第4个继电器输出 */
    ENUM_RELAY_4TH_SELFCHECK,   /*- 第4个继电器检测 */
    ENUM_RELAY_ALL_OUTPUT,      /*- 全部待检测继电器输出 */
    ENUM_RELAY_BOOT_CHECK,      /*- 检测硬重启结果 */
    ENUM_RELAY_BOOT_RESTART,    /*- 硬重启恢复通信 */
    ENUM_OUTPUT_RESULT,         /*- 反馈结果 */
}ENUM_HARDWARE_BOOT_SELFCHECK_T;


/**
* @brief 文件更新请求命令处理
* @param RequestBuf[] 待处理数据帧
* @param RequestLen 待处理数据帧长度
* @return 处理结果
* - ENUM_CM_TRUE 成功
* - ENUM_CM_FALSE 失败
*/
ENUM_CM_RETURN PFM_FileUpdate_Request(IN CM_UINT8 RequestBuf[],IN CM_UINT16 RequestLen,OUT CM_UINT8 *Result);

/**
* @brief 文件上传完成验证请求命令处理
* @param RequestBuf[] 待处理数据帧
* @param RequestLen 待处理数据帧长度
* @return 处理结果
* - ENUM_CM_TRUE 成功
* - ENUM_CM_FALSE 失败
*/
ENUM_CM_RETURN PFM_FileVerity_Request(IN CM_UINT8 RequestBuf[],IN CM_UINT16 RequestLen);

/**
* @brief 周期将设备状态信息发送给部署工具客户端
* @return 函数执行结果
* - 0x55u成功
* - 0xAAu失败
* @note
* 周期将设备状态信息发送给部署工具客户端
* 组数据->写进协议
* 注：此函数调用必须在周期主线程封装输出数据之前
*/
ENUM_CM_RETURN PFM_DevStateSend(CM_UINT8 ifCyc);

/**
* @brief 获取板卡运行状态
* @return 板卡运行状态
* - ENUM_BOARDSTATE_ERROR = 0,   未知状态
* - ENUM_BOARDSTATE_RUN = 1,     运行状态
* - ENUM_BOARDSTATE_EXIT = 2,    退出运营状态
* - ENUM_BOARDSTATE_UPDATE = 3,  故障可更新文件状态
* - ENUM_BOARDSTATE_DEFAULT = 4, 故障不可更新文件状态
*/
ENUM_BOARD_STATE_T PFM_GetBoardState(void);

/**
* @brief 设置板卡运行状态
* @param state 板卡运行状态
* - ENUM_BOARDSTATE_ERROR = 0,   未知状态
* - ENUM_BOARDSTATE_RUN = 1,     运行状态
* - ENUM_BOARDSTATE_EXIT = 2,    退出运营状态
* - ENUM_BOARDSTATE_UPDATE = 3,  故障可更新文件状态
* - ENUM_BOARDSTATE_DEFAULT = 4, 故障不可更新文件状态
*/
void PFM_SetBoardState(ENUM_BOARD_STATE_T state);
/**
* @brief 应用设置板卡临时运行状态
* @param state 板卡运行状态
* - ENUM_BOARDSTATE_ERROR = 0,   未知状态
* - ENUM_BOARDSTATE_RUN = 1,     运行状态
* - ENUM_BOARDSTATE_EXIT = 2,    退出运营状态
* - ENUM_BOARDSTATE_UPDATE = 3,  故障可更新文件状态
* - ENUM_BOARDSTATE_DEFAULT = 4, 故障不可更新文件状态
*/
void PFM_SetBoardState_APP(ENUM_BOARD_STATE_T state);

/**
* @brief 退出运营模式,进入维护模式
*/
void PFM_MaintenanceMode(void);


/**
* @brief 设置维护终端内网id
* @param dstName 维护终端内网id
*/
void PFM_SetMaintenanceId(IN CM_UINT16 dstName);

/**
* @brief 远程硬件重启\切系命令接收处理
*/
CM_UINT8 PFM_RemoteRun_Data(CM_UINT8 *mData,CM_UINT32 dataLen);
/*硬件重启IO更新*/
void PFM_HardWareBoot_UpData(void);
/*执行硬件重启IO输出*/
void PFM_HardWareBoot_OutPut(void);

CM_UINT8 PFM_GetBoardRebootState(void);

/**
* @brief 硬重启自检状态机
* @param level 待输出IO 取值范围：0x00~0x0F
* @param board_type 当前命令目标重启板卡类型 取值范围：ENUM_BOARD_TYPE_T
* @param reboottype 重启命令类型 取值范围：0xD1~0xD7
* @return ENUM_HARDWARE_BOOT_SELFCHECK_T 当前检测步骤
*/
ENUM_HARDWARE_BOOT_SELFCHECK_T PFM_HardWareBoot_CheckSelf(CM_UINT8 level,ENUM_BOARD_TYPE_T board_type,CM_UINT8 reboottype);
/**
* @brief 识别AB系通信需要计算的板卡通信状态(对系)
* @param type 当前判断板卡通信状态类型 取值范围：ENUM_BOARD_TYPE_T
* @param s_ComState 0代表初始有通信,1代表初始没通信
* @return 0是通信正常，1是通信中断
*/
CM_UINT8 PFM_HardWareBoot_CheckSelf_ComState(ENUM_BOARD_TYPE_T type, CM_UINT8 s_ComState);

/**
* @brief 组包发送硬重启自检与执行结果
* @param boot_result 硬重启结果 取值范围：0x55成功，0xAA失败
* @param *defaultbuf 继电器检测结果数组 取值范围：0x55成功，0xAA故障
* @param reboottype  重启命令类型 取值范围：0xd1~0xd7
* @return 无
*/
void PFM_HardWareBoot_CheckSelf_Response(CM_UINT8 boot_result,CM_UINT8 *defaultbuf,CM_UINT8 reboottype);

/**
* @brief 识别AB系通信需要计算的板卡通信状态
* @param type 当前判断板卡通信状态类型 取值范围：0~5, ch 通信通道 0红 1蓝
* @return 0是通信正常，1是通信中断
*/
CM_UINT8 PFM_CCUSEB_Comstate(CM_UINT8 type);
#ifdef __cplusplus
}
#endif
#endif
