/**
* @file PFM_Cfg.h
* @brief Platform Function Module:配置文件管理
* @details
* 读取平台配置信息
* @author GT-BU
* @date 2021.02.20
* @version V1.0
* @copyright TCT
* @par 修改日志
* <table>
* <tr><th>Date        <th>Version  <th>Author     <th>Description
* <tr><td>2021.02.01  <td>V1.0     <td>GT-BU      <td>创建初始版本
* </table>
*/
#ifndef PFM_CFG_H
#define PFM_CFG_H

#include "CM_Types.h"

#ifdef __cplusplus
extern "C"
{
#endif

extern const CM_UINT8 MSCP_SW_VERION[4];  /**< 平台软件版本 */
extern CM_UINT8 MSCP_DRV_VERION[4];       /**< 驱动软件版本 */
extern CM_UINT16 TSCP_DOC_VERION[2];      /** 与维护一体机接口文档版本号(接口文档发生改变时升级版本号) */
extern CM_UINT8 TSCP_QNX_VERION[10];       /** 操作系统版本号 */
#define MSCP_CPU_1 (1u)  /**< CPU ID: CPU1 */
#define MSCP_CPU_2 (2u)  /**< CPU ID: CPU2 */

#define MSCP_CYC_TIME (g_PFM_Cfg.CYC_TIME)
#define TCP_CONN_MAX (9u)
/*内网透传双通道数量*/
#define INNET_RAW_DOUBLE_PASS_NUM (20u)
/*所有双通道数量*/
#define MSCP_DOUBLE_PASS_ALL_NUM (INNET_RAW_DOUBLE_PASS_NUM + 5u)

#define TSCP_CYC_DATAMAX_LEN (40000u)

    /** 网络通信开关类型 */
	typedef enum
	{
		RAW_COM_DISENABLE = 0,  /**< 网络通信禁用 */
		RAW_COM_UDP       = 1,    /**< 网络通信 UDP*/
		RAW_COM_BROADCAST = 2,    /**< 网络通信 UDP广播*/
		RAW_COM_TCP       = 3     /**< 网络通信 TCP*/
	}RAW_COM_TYPE;
	/** 内网透传通信配置参数 */
	typedef struct
	{
		CM_UINT16 Port_Innet_Raw; 		/**< 内网透明传输端口 */
		RAW_COM_TYPE Port_Type_Enable;  /**< 内网透明tcp传输模式 */
		CM_UINT16 Server_DevId; 		/**< 服务端设备类型和id */
		CM_UINT16 TIME_STAMP_ENABLE;	/**< 2取2乘时间戳使能开关 */
		CM_UINT16 INNET_2oo2_RAW;		/**< 透传通道2取开关 */
		CM_UINT16 INNET_2x2_RAW;		/**< 透传通道2乘开关 */
		CM_CHAR IP_InnetRaw_maddr[32];	/**< 内网透传的组播IP */
	}STRU_PFM_INNET_RAW_T;
    /**< CPU通信配置 */
    typedef struct
    {
        /*注意IP字段必须为32字节*/
        CM_CHAR IP_2oo2[32];      		  /**< 2oo2通信IP */
        CM_UINT16 Port_2oo2_Data; 		  /**< 2oo2数据通信端口 */
		CM_UINT16 Port_2oo2_Data_App; 	  /**< 应用2oo2数据通信端口 */
        CM_UINT16 Port_2oo2_Time; 		  /**< 2oo2校时端口 */
        CM_UINT16 Port_2oo2_Maintenance;  /**< 2oo2维护端口 */
        CM_UINT16 Port_2oo2_2x2_State;    /**< 2oo2 2x状态交互端口 */

        CM_CHAR IP_2x2[32];       /**< 2x2通信IP */
        CM_UINT16 Port_2x2_Data;  /**< 2x2数据通信端口 */
        CM_UINT16 Port_2x2_Time;  /**< 2x2校时端口 */
        CM_UINT16 Port_2x2_Syn;   /**< 2x2同步端口 */
        CM_UINT16 Port_2x2_State;   /**< 2x2状态交互端口 */

        CM_CHAR IP_Com[32];           /**< 通用通信IP */
		CM_CHAR IP_Out[32];           /**< 外网通信IP */
 		CM_CHAR IP_Com_Extend[32];    /**< 通用通信扩展IP */
 		CM_CHAR IP_Maintain[32];      /**< 维护通信IP */
        CM_UINT16 Port_Outnet_Safe;   /**< 外网安全通信端口 */
        CM_UINT16 Port_Innet_Safe;    /**< 内网安全通信端口 */    
        CM_UINT16 Port_Outnet_Raw;    /**< 外网透明传输端口 */
        CM_UINT16 Port_Outnet_Heart;  /**< 外网心跳传输端口 */
        CM_INT32 Port_Innet_Raw_Num; /**< 内网透传端口数量 */
        CM_INT32 Port_Innet_Raw_Extend_Num; /**< 内网透传扩展端口数量 */
        STRU_PFM_INNET_RAW_T Innet_Raw_Parameter[INNET_RAW_DOUBLE_PASS_NUM]; /*内网透传参数*/

        CM_UINT16 Port_Log_Base;    /**< 明文日志记录端口 */
        CM_UINT16 Port_Log_Ciphertext; /**< 暗文日志记录端口 */

		CM_UINT16 Port_Remote_Update;   /**< 远程部署通信端口 */
    }STRU_PFM_CPU_CFG_T;

    /** 内网通信配置 */
    typedef struct
    {
        CM_UINT16 InnetID;      /**< 内网通信ID */
        CM_UINT32 IP_G;         /**< 绿网IP */
        CM_UINT16 Port_Raw_G;   /**< 绿网透传端口 */
        CM_UINT16 Port_Safe_G;  /**< 绿网安全端口 */
        CM_UINT32 IP_P;         /**< 紫网IP */
        CM_UINT16 Port_Raw_P;   /**< 紫网透传端口 */
        CM_UINT16 Port_Safe_P;  /**< 紫网安全端口 */
    }STRU_PFM_INNET_CFG_T;

    /** 平台配置数据 */
    typedef struct
    {
        CM_UINT8 CFG_MD5[16];          /**< 配置数据md5 */
        CM_CHAR APP_NAME[128];          /**< 应用文件名称 */
        CM_UINT8 APP_MD5[16];          /**< 应用文件md5 */

        /*注意IP字段必须为32字节*/
        CM_UINT8 CPU_ID;           /**< CPU ID */
        CM_UINT8 BOARD_ID;         /**< 板卡ID */
        CM_UINT16 OUTNET_ID;       /**< 外网通信ID */
        CM_UINT16 INNET_ID;        /**< 内网通信ID */
		CM_UINT16 INNET_ID_RM;        /**< 远程部署内网通信ID */
        
        CM_UINT32 CYC_TIME;          /**< 系统周期 */
        CM_INT32 app_num;            /**< app任务数 */
        CM_UINT8 CC_VER;             /**< 与CC通信协议版本 */
        CM_UINT32 OutnetSafePack_Len;/**< 外网安全通信最大数据长度(根据周期长度计算) */
        CM_UINT32 M_2oo2_Enable;      /**< 2oo2功能开关 */
        CM_UINT32 M_2x2_Enable;       /**< 2x2功能开关*/
        CM_UINT32 M_InnetSafe_Enable; /**< 内网安全通信功能开关 */
        CM_UINT32 M_InnetRaw_Enable;  /**< 内网透传通信功能开关 */
        CM_UINT32 M_OutnetSafe_Enable;/**< 外网安全通信功能开关 */
		CM_UINT32 M_OutnetRaw_Enable;/**< 外网透传通信功能开关 */
		CM_UINT8 M_CpuUsageGet_Enable;	  /**< CPU使用率获取功能开关 */
		CM_UINT32 M_RemoteUpdate_Enable; /**< 远程部署内网安全通信功能开关 */
		CM_CHAR Start_Path[32];      /**< 程序启动路径 */
		CM_INT32 reboot_replycount;            /**< 重启确认报文回复次数 */
		CM_UINT8 M_AutoReboot_Count;	  /**< 自动重启次数 */
		CM_UINT16 M_AutoClear_Days;	  /**< 连续运行多久清空宕机次数的天数 */
		CM_UINT64 M_AutoClear_Second;	  /**< 连续运行多久清空宕机次数的秒数 */
        STRU_PFM_CPU_CFG_T Local_Cfg;   /*本机通信配置*/
        STRU_PFM_CPU_CFG_T Peer_Cfg;    /*2oo2邻机通信配置*/
        STRU_PFM_CPU_CFG_T Partner_Cfg; /*2x2对机（对系）通信配置*/
        
        CM_CHAR CC_R_IP[32];       /**< 红网通控的内网IP */
        CM_CHAR EXTEND_R_IP[32];       /**< 红网扩展板卡的内网IP */        
        CM_UINT16 CC_R_OutnetSafe_Port; /**< 红网CC的外网安全通信端口 */
		CM_UINT16 CC_R_OutnetRaw_Port; /**< 红网CC的外网透传通信端口 */
        CM_UINT16 CC_R_InnetRaw_Port;   /**< 红网CC的内网透传通信端口 */
        CM_UINT16 CC_R_Heart_Port;   /**< 红网CC的内网透传通信端口 */

        CM_CHAR CC_B_IP[32];       /**< 蓝网通控的内网IP */
        CM_CHAR EXTEND_B_IP[32];       /**< 蓝网扩展板卡的内网IP */
        CM_UINT16 CC_B_OutnetSafe_Port; /**< 蓝网CC的外网安全通信端口 */
		CM_UINT16 CC_B_OutnetRaw_Port; /**< 蓝网CC的外网透传通信端口 */
        CM_UINT16 CC_B_InnetRaw_Port;   /**< 蓝网CC的内网透传通信端口 */
        CM_UINT16 CC_B_Heart_Port;    /**< 蓝网CC的内网透传通信端口 */

        CM_CHAR Logger_IP[32];         /**< 日志记录IP */
        CM_UINT16 Logger_PortBase;     /**< 明文日志对端端口 */
		CM_UINT16 Logger_PortCiphertext; /**< 暗文日志对端端口 */

        /*以下通常仅PFM_CFG内部使用*/
        STRU_PFM_CPU_CFG_T CPU_CFG[5]; /**< 各CPU的通信配置，数组1-4有效 */
        CM_UINT16 INNET_COM_NUM;     /**< 内网通信设备数量 */
        STRU_PFM_INNET_CFG_T INNET_COM_CFG[256]; /**< 内网通信设备通信配置(数组1-INNET_COM_NUM有效) */
    }STRU_PFM_CFG_T;

    /** 维护模式远程部署功能配置数据 */
    typedef struct
    {
        CM_UINT8 CFG_MD5[16];          /**< 配置数据md5 */
        CM_UINT32 CYC_TIME;          /**< 系统周期 */
        CM_CHAR APP_NAME[128];          /**< 应用文件名称 */
        CM_UINT8 APP_MD5[16];          /**< 应用文件md5 */
        CM_UINT8 CPU_ID;           /**< CPU ID */
        CM_UINT8 BOARD_ID;         /**< 板卡ID */
        CM_UINT16 INNET_ID_RM;        /**< 远程部署内网通信设备ID */
        CM_UINT16 OUTNET_ID;          /**< 外网通信设备ID */
        CM_UINT32 M_2oo2_Enable;      /**< 2oo2功能开关 */
		CM_UINT32 M_RemoteUpdate_Enable; /**< 远程部署内网安全通信功能开关 */
		CM_CHAR Start_Path[32];      /**< 程序启动路径 */
		CM_INT32 reboot_replycount;            /**< 重启确认报文回复次数 */
        CM_UINT16 INNET_COM_NUM;     /**< 内网通信设备数量 */
        STRU_PFM_INNET_CFG_T INNET_COM_CFG[256]; /**< 内网通信设备通信配置(数组1-INNET_COM_NUM有效) */
    }STRU_RMUP_CFG_T;

    /** 应用IP配置数据 */
	typedef struct
	{
		/*注意IP字段必须为32字节*/
		CM_CHAR IP_2oo2[32];      /**< 2oo2通信IP */
		CM_CHAR IP_2x2[32];       /**< 2x2通信IP */
		CM_CHAR IP_Out[32];       /**< 外网通信IP */
		CM_CHAR IP_Maintain[32];  /**< 维护通信IP */
		/*适用透传通道-选配*/
		CM_CHAR IP_Com[32];       /**< 通用通信IP */
		CM_CHAR IP_Com_Extend[32];/**< 通用通信扩展IP */
		CM_UINT16 Logger_PortBase;			/**< 明文日志记录端口 */
		CM_UINT16 Logger_PortCiphertext;	/**< 暗文日志记录端口 */
	}STRU_APP_CPU_CFG_T;
	/** 应用外网配置数据 */
	typedef struct
	{
		CM_CHAR CC_G_IP[32];       		/**< 通控的内网IP */
		CM_CHAR CC_P_IP[32];       		/**< 通控的内网IP */
		CM_CHAR EXTEND_G_IP[32];       	/**< 扩展板卡的内网IP */
		CM_CHAR EXTEND_P_IP[32];       	/**< 扩展板卡的内网IP */
		CM_UINT16 OutnetSafe_Port; 		/**< 外网安全通信端口 */
		CM_UINT16 OutnetRaw_Port; 		/**< 外网透传通信端口 */
		CM_UINT16 InnetRaw_Port;   		/**< 内网透传通信端口 */
	}STRU_APP_CC_CFG_T;
	/** 应用配置数据 */
	typedef struct
	{
		/*文件配置*/
		CM_CHAR FS_NAME[128];          	/**< FS文件名称 */
		CM_CHAR APP_NAME[128];          /**< 应用文件名称 */
		/*基本开关配置*/
		CM_UINT32 CYC_TIME;          	/**< 系统周期 */
		CM_INT32  app_num;            	/**< app任务数 */
		CM_UINT32 M_2oo2_Enable;      	/**< 2oo2功能开关 */
		CM_UINT32 M_2x2_Enable;       	/**< 2x2功能开关*/
		CM_UINT32 M_InnetSafe_Enable; 	/**< 内网安全通信功能开关 */
		CM_UINT32 M_InnetRaw_Enable;  	/**< 内网透传通信功能开关 */
		CM_UINT32 M_OutnetSafe_Enable;	/**< 外网安全通信功能开关 */
		CM_UINT32 M_OutnetRaw_Enable;	/**< 外网透传通信功能开关 */
		CM_UINT8  M_CpuUsageGet_Enable;	/**< CPU使用率获取功能开关 */
		CM_UINT32 M_RemoteUpdate_Enable;/**< 远程部署内网安全通信功能开关 */
		CM_UINT16 ID_Maintenance;       /*维护终端ID*/
		CM_CHAR  Start_Path[32];      	/**< 程序启动路径 */
		CM_INT32 reboot_replycount;      /**< 重启确认报文回复次数 */
		CM_UINT8 M_AutoReboot_Count;	 /**< 自动重启次数 */
		CM_UINT16 M_AutoClear_Days;	  	 /**< 连续运行多久清空宕机次数的天数 */
		/*IP配置*/
		STRU_APP_CPU_CFG_T CPU[4];		 /*每个CPU的IP配置*/
		/*通用端口配置*/
		CM_UINT16 Port_Outnet_Safe;   	 /**< 外网安全通信端口 */
		CM_UINT16 Port_Innet_Safe;    	 /**< 内网安全通信端口 */
		CM_UINT16 Port_Outnet_Raw;    	 /**< 外网透明传输端口 */
		CM_UINT16 Port_Remote_Update;   /**< 远程部署通信端口 */
		/*透传配置-选配*/
		CM_INT32 Port_Innet_Raw_Num; 	 /**< 内网透传端口数量 */
		CM_INT32 Port_Innet_Raw_Extend_Num; /**< 内网透传扩展端口数量 */
		STRU_PFM_INNET_RAW_T Innet_Raw_Parameter[INNET_RAW_DOUBLE_PASS_NUM]; /*内网透传参数*/
		/*外网通信配置*/
		STRU_APP_CC_CFG_T OutNetRed; 	/*外网红网通信配置*/
		STRU_APP_CC_CFG_T OutNetBlue; 	/*外网蓝网通信配置*/
		/*日志记录目标设备IP配置*/
		CM_CHAR Logger_G_IP[32];         /**< 绿网日志记录IP */
		CM_CHAR Logger_P_IP[32];         /**< 紫网日志记录IP */
		/*内网通信设备注册最大支持0-254*/
		CM_UINT16 INNET_COM_NUM;     /**< 内网通信设备数量 */
		STRU_PFM_INNET_CFG_T INNET_COM_CFG[255]; /**< 内网通信设备通信配置(数组0-254有效) */
	}STRU_APP_CFG_T;

    typedef struct
    {
    	CM_UINT8 flag;              /**< 应用是否注册该版本号 0代表未注册 1代表注册*/
    	CM_UINT8 versonName;        /**< 注册版本号类别 1代表应用版本号  2代表FS版本号  3代表Scade版本号 */
    	CM_UINT8 verson[4];         /**< 版本号 */
    }STRU_APP_REGISTER_VERSON;

    typedef struct
    {
    	CM_UINT8 versonNumber;      /**< 已注册版本号数量  初始值为0 */
    	STRU_APP_REGISTER_VERSON registerVerson[3];   /**< 版本号信息 */
    }STRU_APP_VERSON;

    /** 需应用注册的版本号 */
    extern STRU_APP_VERSON g_App_Verson;

    /** 平台配置数据 */
    extern STRU_PFM_CFG_T g_PFM_Cfg;

	/** 维护模式远程部署功能配置数据 */
	extern STRU_RMUP_CFG_T g_RMUP_Cfg;
    /** 配置文件路径 */
    extern CM_CHAR FS_FILE_PATH[100];

    /* 配置文件初始化 */
    void PFM_CFG_Init(void);

    /* 根据内网ID查内网通信配置 */
    STRU_PFM_INNET_CFG_T *PFM_INI_InnetID2Addr(IN CM_UINT16 InnetID);
    
    /* 根据内网IP端口查内网通信配置 */
    STRU_PFM_INNET_CFG_T *PFM_INI_InnetIP2Addr(IN CM_UINT32 InnetIP, IN CM_UINT16 InnetPort);
    /**
    * @brief 获取本机外网ID
    * @return 本机外网ID
    * @note 1字节类型+1字节ID，大端格式，来自INI配置文件。
    */
    CM_UINT16 PFM_CFG_GetOutnetID(void);

    /**
    * @brief 获取本机内网ID
    * @return 本机内网ID
    * @note 1字节类型+1字节ID，大端格式，来自INI配置文件。
    */
    CM_UINT16 PFM_CFG_GetInnetID(void);

    /**
    * @brief 获取板卡ID
    * @return 本机的板卡ID
    * @note 板卡ID的宏定义参见本文件头部
    */
    CM_UINT8 PFM_CFG_GetBoardID(void);

    /**
    * @brief 获取CPUID
    * @return CPUID
    * @details
    * CPUID根据配置文件确定
    */
    CM_UINT8 PFM_CFG_GetCpuID(void);
    /**
    * @brief 根据内网IP端口查找设备通信配置(维护模式下使用)
    * @param InnetIP 内网IP
    * @param InnetPort 内网端口
    * @return 查找结果
    * - 非NULL 指向设备通信信息的指针
    * - NULL 查找失败
    */
    STRU_PFM_INNET_CFG_T *PFM_INI_RmInnetIP2Addr(IN CM_UINT32 InnetIP,IN CM_UINT16 InnetPort);
    /**
    * @brief 根据内网ID获取设备通信信息(维护模式下使用)
    * @param InnetID 内网ID
    * @return 查找结果
    * - 非NULL 指向设备通信信息的指针
    * - NULL 查找失败
    */
    STRU_PFM_INNET_CFG_T *PFM_INI_RmInnetID2Addr(IN CM_UINT16 InnetID);

    /**
    * @brief 应用配置ip、端口、使能等可配置变量
    * @param app_data 应用配置结构体 取值范围:非空
    * @details 此配置用来代替main_base.ini
    */
    void PFM_Set_APP_ConfigData(STRU_APP_CFG_T *app_data);

    /**
    * @brief 初始化应用版本号管理结构体
    */
    void PFM_CFG_RegisterVerson_Init(void);

    /* 根据板卡配置维护ip */
    void PFM_CFG_IfconfigIp(void);

    void PFM_CFG_SendDarkCfg(void);
    /**
     * @brief 初始化读取mainid 必须在函数PFM_CFG_Init前执行
     */
    void PFM_CFG_MAINID_Init(void);
#ifdef __cplusplus
}
#endif
#endif
