#ifndef PEM_LOG_H
#define PEM_LOG_H
#include "CM_Types.h"
#include <string.h>

#if WIN32
#include "cp_interface.h"
#endif
#ifdef __cplusplus
extern "C"
{
#endif

#define TSCP_DARK_NULL          (0x00u)
#define TSCP_DARK_CYC      	    (0x01u)
#define TSCP_DARK_LOCAL     	(0x02u)
#define TSCP_DARK_PARTNER  	 	(0x03u)
#define TSCP_DARK_BOARDID  		(0x05u)
#define TSCP_DARK_CPUID  		(0x06u)
#define TSCP_DARK_DRVINIT  		(0x07u)
#define TSCP_DARK_TSCPINIT      (0x08u)
#define TSCP_DARK_SOFTTNIT  	(0x09u)
#define TSCP_DARK_ETHERNET      (0x0au)
#define TSCP_DARK_TMP 			(0x0bu)
#define TSCP_DARK_VOLTAGE       (0x0cu)
#define TSCP_DARK_2oo2INIT  	(0x0du)
#define TSCP_DARK_INPUTTIME  	(0x0eu)
#define TSCP_DARK_APPTIME    	(0x0fu)
#define TSCP_DARK_OUTTIME    	(0x10u)
#define TSCP_DARK_2OO2  		(0x11u)
#define TSCP_DARK_2x2  			(0x12u)
#define TSCP_DARK_VERION  		(0x19u)
#define TSCP_DARK_EEPROMCPU     (0x1au)
#define TSCP_DARK_EEPROMIO12S  	(0x1bu)
#define TSCP_DARK_EEPROM8S  	(0x1cu)
#define TSCP_DARK_CCSTATE    	(0x1du)
#define TSCP_DARK_SEBSTATE  	(0x1eu)
#define TSCP_DARK_PSLIGHT  		(0x1fu)
#define TSCP_DARK_RUNLIGHT  	(0x20u)
#define TSCP_DARK_2OLIGHT  		(0x21u)
#define TSCP_DARK_2XLIGHT  		(0x22u)
#define TSCP_DARK_CHANNEL_1_SHUNT (0x23u)
#define TSCP_DARK_CHANNEL_1_BUS   (0x24u)
#define TSCP_DARK_CHANNEL_2_SHUNT (0x25u)
#define TSCP_DARK_CHANNEL_2_BUS   (0x26u)
#define TSCP_DARK_CHANNEL_3_SHUNT (0x27u)
#define TSCP_DARK_CHANNEL_3_BUS   (0x28u)
#define TSCP_DARK_SWITCHBUTTON    (0x29u)
#define TSCP_DARK_IOTMP         (0x2Au)
#define TSCP_DARK_BASEVERION    (0x2Bu)
#define TSCP_DARK_IOOUTPUT      (0x2Cu)
#define TSCP_DARK_IOINPUT       (0x2Du)
#define TSCP_DARK_DRVVERION  	(0x2Eu)
#define TSCP_DARK_QNXVERION   	(0x2Fu)
#define TSCP_DARK_2OO2ETHSPI  	(0x30u)
#define TSCP_DARK_2X2ETH422  	(0x31u)
#define TSCP_DARK_DOCVERION  	(0x32u)
#define TSCP_DARK_CPUMEMUSAGE  	(0x33u)
#define TSCP_DARK_ENDTIME	  	(0x35u)
#define TSCP_DARK_CFMNET_ININTSYNC_TIMEOUT	(0x36u)
#define TSCP_DARK_CFMNET_UDPRAWRECVTHREAD_UPDATAEOR1	(0x37u)
#define TSCP_DARK_CFMNET_UDPRAWRECVTHREAD_UPDATAEOR2	(0x38u)
#define TSCP_DARK_CFMNET_UDPRAWRECVTHREAD_UPDATAEOR3	(0x39u)
#define TSCP_DARK_CFMNET_UDPRAWRECVTHREAD_UPDATAEOR4	(0x3Au)
#define TSCP_DARK_CFMNET_UDPRAWRECVTHREAD_UPDATAEOR5	(0x3Bu)
#define TSCP_DARK_CFMNET_UDPRAWRECVTHREAD_UPDATAEOR6	(0x3Cu)
#define TSCP_DARK_CFMNET_UDPRAWRECVTHREAD_UPDATAEOR7	(0x3Du)
#define TSCP_DARK_CFMNET_REMOTEUPDATETHREAD_LENEOR		(0x3Eu)
#define TSCP_DARK_CFMNET_INNETSAFE_RECVLEN				(0x3Fu)
#define TSCP_DARK_CFMNET_INNETSAFERM_RECVLEN			(0x40u)
#define TSCP_DARK_CFMNET_INNETREMOTEUPDATE_RECVLEN		(0x41u)
#define TSCP_DARK_CFMNET_INNETRAW_RECVLEN				(0x42u)
#define TSCP_DARK_CFMNET_OUTNETSAFE_RECVLENERO			(0x43u)
#define TSCP_DARK_CFMNET_OUTNETRAW_RECVLENERO			(0x44u)
#define TSCP_DARK_CFMNET_OUTNETHEART_RECVLENERO			(0x45u)
#define TSCP_DARK_PFMCFG_INIT1							(0x46u)
#define TSCP_DARK_PFMCFG_INIT2							(0x47u)  //47 48 49 4A
#define TSCP_DARK_PFMCFG_INIT3							(0x4Bu)
#define TSCP_DARK_PFMCFG_INIT4							(0x4Cu)
#define TSCP_DARK_PFMCFG_SENDDARKCFG					(0x4Du)
#define TSCP_DARK_PFMCONTROFLOWCHECK_MONITOR1			(0x4Eu)
#define TSCP_DARK_PFMCONTROFLOWCHECK_MONITOR2			(0x4Fu)
#define TSCP_DARK_PFMCONTROFLOWCHECK_WATCHDOG			(0x50u)
#define TSCP_DARK_PFMINPUTOUTPUT_INPUT2oo2SYNC			(0x51u)
//#define TSCP_DARK_PFMINPUTOUTPUT_ENDPROC				(0x52u)
#define TSCP_DARK_PFMINPUTOUTPUT_RXOUTNETTOSFM			(0x53u)
#define TSCP_DARK_PFMREMOTEUPDATE_FILEUPDATEREQUEST1	(0x54u)
#define TSCP_DARK_PFMREMOTEUPDATE_FILEUPDATEREQUEST2	(0x55u)

/*2取模块*/
#define TSCP_DARK_2OO2_RCV_ERR      	 (0x60u)
#define TSCP_DARK_2OO2_RCV_ARQ      	 (0x61u)
#define TSCP_DARK_2OO2_SYNC_TIME    	 (0x62u)
#define TSCP_DARK_2OO2_ALIGN_TIME   	 (0x63u)
#define TSCP_DARK_2OO2_CRASH_RCVOK  	 (0x64u)
#define TSCP_DARK_2OO2_CRASH_RCVERR 	 (0x65u)
/*2x模块*/
#define TSCP_DARK_2X2_ANALYSIS_DATA      (0x70u)
#define TSCP_DARK_2X2_ANALYSIS_TIME      (0x71u)
#define TSCP_DARK_2X2_COM_STATE          (0x72u)
#define TSCP_DARK_2X2_FOLLOW_STATE       (0x73u)
#define TSCP_DARK_2X2_THREAD_SHOWTIME    (0x74u)
#define TSCP_DARK_2X2_SYNC_TIME          (0x75u)
#define TSCP_DARK_2X2_RCV_BASE_STATE     (0x76u)
#define TSCP_DARK_2X2_RCV_APP_STATE      (0x77u)
#define TSCP_DARK_2X2_RCV_CHECK_STATE    (0x78u)
#define TSCP_DARK_2X2_RCV_INPUT_STATE    (0x79u)
#define TSCP_DARK_2X2_BASE_FOLLOW_HANDLE (0x7Au)
#define TSCP_DARK_2X2_OUT_CHECK_FAIL     (0x7Bu)
#define TSCP_DARK_2X2_APP_FOLLOW_HANDLE  (0x7Cu)
#define TSCP_DARK_2X2_INPUT_SYNC_SIZE    (0x7Du)
#define TSCP_DARK_2X2_APPSET_FOLLOW 	 (0x7Eu)
#define TSCP_DARK_2X2_RCV_APP_STATE_CRC  (0x7Fu)
/*分帧接收*/
#define TSCP_DARK_SFM_2OO2FRAME (0x80u)
#define TSCP_DARK_SFM_2X2FRAME  (0x81u)
/*警告标志定义*/
#define TSCP_DARK_WARNING	  	(0x1FFEu)
/** 初始化阶段标志 */
typedef enum {
	ENUM_ERROR = 0 ,        /**< 保留值，禁止使用 */
	ENUM_INIT_DRV ,			/**< 初始化 硬件*/
	ENUM_INIT_MAIN_QUEUE_NET ,	/**< 初始化 维护网*/
	ENUM_INIT_API_DATA ,	/**< 初始化 应用数据*/
	ENUM_INIT_CFG ,			/**< 初始化 配置文件*/
	ENUM_INIT_NETCARD ,		/**< 初始化 网卡ip*/
	ENUM_INIT_MAIN_NET ,	/**< 初始化 维护网*/
	ENUM_INIT_CFC ,			/**< 初始化 控制流*/
	ENUM_INIT_COM ,			/**< 初始化 串口422*/
	ENUM_INIT_MICROCYCLE ,	/**< 初始化 微周期*/
	ENUM_INIT_PRTCL_SFP ,	/**< 初始化 SFP协议*/
	ENUM_INIT_UPDATE_NET,   /**< 初始化 远程部署与2取网络通信*/
	ENUM_INIT_2OO2_DATA ,	/**< 初始化 2取数据*/
	ENUM_INIT_NET ,			/**< 初始化 网络通信*/
	ENUM_INIT_SELFCHECK ,	/**< 初始化 自检*/
	ENUM_INIT_APP ,			/**< 初始化 应用*/
	ENUM_INIT_PRTCL_RSSP ,	/**< 初始化 外网协议*/
	ENUM_INIT_APP_CTRL ,	/**< 初始化 应用调度*/
	ENUM_INIT_2X2USART ,	/**< 初始化 2X串口接收开关*/
	ENUM_INIT_2OO2 ,		/**< 初始化 2取*/
	ENUM_INIT_2X2 ,			/**< 初始化 2X*/
	ENUM_INIT_OVER ,		/**< 初始化 结束*/
} ENUM_INIT_STAGE_FLAG;
extern ENUM_INIT_STAGE_FLAG g_InitUpdateFlag;

#define TSCP_DARK_INFO_ERR_TYPE (0x1fffu) /*暗文故障码  错误信息  类型*/

extern CM_UINT8 g_AutoRebootVersion[4];/*自动重启版本号*/
/**
* @brief 设置初始化阶段标志
* @param ENUM_INIT_STAGE_FLAG stage 设置初始化阶段
*/
void PFM_LOG_SET_INIT_STAGE(ENUM_INIT_STAGE_FLAG stage);
ENUM_INIT_STAGE_FLAG PFM_LOG_GET_INIT_STAGE(void);
/**
* @brief 设置暗文日志阶段参数
* @param value 设置暗文日志阶段参数 取值范围：0~0xffff
*/
void PFM_LOG_SET_STOPTIMER(CM_UINT16 value);

/* 记录格式化字符串日志 */

#define FILENAME(name) ((NULL != strrchr(name, (CM_INT32)'/')) ? (strrchr(name, (CM_INT32)'/') + 1) : name)

#define MSCP_LOG_MSG(fmt, ...) (MSCP_PFM_LOG_MSG(FILENAME(__FILE__),(CM_INT32)__LINE__,(fmt), ##__VA_ARGS__))
#define MSCP_LOG_MSG_UTC(fmt, ...) (MSCP_PFM_LOG_MSG_UTC(__FILE__,__FUNCTION__,(CM_INT32)__LINE__,(fmt), ##__VA_ARGS__))
/* 函数实现 */
void MSCP_PFM_LOG_MSG(IN const CM_CHAR *filename, IN CM_INT32 line, IN const CM_CHAR* fmt, ...);

/* 记录二进制日志 */
#define MSCP_LOG_BIN(buf,len)  (MSCP_PFM_LOG_BIN(__FILE__,__FUNCTION__,(CM_INT32)__LINE__,(buf),(len)))
#define PFM_MAX_TRACE_COUNT (10u)      
#define PFM_BASE_TRACE_NAME "trace_log_" // 文件名前缀 (trace_crash_1.kev)
#define PFM_LATEST_TRACE_NAME "trace_log_latest.kev"
#define PFM_BASE_THREADS_NAME "threads_state_" // 文件名前缀 (threads_state_1.txt)
#define PFM_LATEST_THREADS_NAME "threads_state_latest.txt"
#define PFM_RECORD_TIME_S (5u)
#define PFM_RECORD_BUF (1024)		/* 1024 * 16KB = 16MB*/
/* 函数实现 */
void MSCP_PFM_LOG_BIN(IN const CM_CHAR *filename, IN const CM_CHAR *func, IN CM_INT32 line, IN const CM_UINT8 *Buf, IN CM_UINT32 Len);

/*获取自动重启次数*/
CM_UINT8 MSCP_Get_AutoRbootCut(void);
/*重置自动重启次数*/
CM_UINT8 MSCP_Reset_AutoRbootCut(CM_UINT8 Cut);
/**
* @brief 获取自动重启次数
* @return 重启次数 取值范围:0~0xff
*/
CM_UINT8 RM_Get_FaultRbootCut(void);
/**
* @brief 重置自动重启次数
* @param Cut 重启次数
*/
void RM_Reset_FaultRbootCut(CM_UINT8 Cut);
/**
* @brief 上电读取和删除本地日志文件
* @return 无
*/
void MSCP_Read_Del_Logfile(void);

/* 打印数据和长度 */
void MSCP_LOG_DATALEN(IN CM_UINT8 *Buf, IN CM_UINT32 Len, IN char *Annotation);
/**
* @brief 获取宕机标志位
* @param 无
* @return 宕机标志位状态
*/
CM_UINT8 PFM_LOG_GET_STOP_FLAG(void);

void PFM_SendLastAssertLog(void);
void MSCP_ASSERT_TraceLog(void);
CM_UINT32 *PFM_DarkLogGenerate(CM_UINT16 mode, CM_UINT16 fault, CM_UINT16 num);
#define DARK_FAULT_CODE_MERGE(Mode,faultCode,funNum) (PFM_DarkLogGenerate(Mode,faultCode,funNum))
/***************************暗文日志故障码信息编码表****************************/


/*******************模块编码*****************/
#define NET_MODE               	(0x01u) /*网络模块*/
#define RAW_MODE          		(0x02u) /*透传模块*/
#define COM_MODE          		(0x03u) /*串口模块*/
#define INIFILE_MODE      		(0x04u) /*配置文件读取模块*/
#define TCP_MODE          		(0x05u) /*TCP模块*/
#define UDP_MODE     			(0x06u) /*UDP模块*/
#define QNX_DRV_MODE 			(0x07u) /*QNX驱动模块*/
#define CFG_MODE     			(0x08u) /*配置文件管理模块*/
#define CONTROL_FLOW_CHECK_MODE (0x09u) /*控制流状态监督*/
#define CPU_CHECK_MODE 			(0x0Au) /*CPU自检模块*/
#define CPU_USAGE_MODE 			(0x0Bu) /*CPU使用率模块*/
#define FS_MODE      			(0x0Cu) /*FS文件模块*/
#define IN_OUT_MODE  			(0x0Du) /*输入输出管理模块*/
#define MEMORY_CHECK_MODE 		(0x0Eu) /*内存自检模块*/
#define SELF_CHECK_MODE 		(0x0Fu) /*自检模块*/
#define SFM_2oo2_MODE   		(0x10u) /*2oo2模块*/
#define SFM_2x2_MODE    		(0x11u) /*2x2模块*/
#define PACKAGE_MODE    		(0x12u) /*分帧协议模块*/
#define PRTCL_MODE      		(0x13u) /*安全协议模块*/
#define APP_API_MODE    		(0x14u) /*应用接口模块*/
#define MAIN_MODE       		(0x15u) /*平台主函数模块*/
#define TIME_MODE       		(0x16u) /*时钟相关模块*/
#define LOG_MODE                (0x17u) /*日志相关模块*/
#define REMOTE_UPDATE           (0x18u) /*维护软件升级模块*/

/*************模块内函数顺序编码*************/

#define DARK_FAULT_CODE_FUN_ORDER_1  (0x01u)
#define DARK_FAULT_CODE_FUN_ORDER_2  (0x02u)
#define DARK_FAULT_CODE_FUN_ORDER_3  (0x03u)
#define DARK_FAULT_CODE_FUN_ORDER_4  (0x04u)
#define DARK_FAULT_CODE_FUN_ORDER_5  (0x05u)
#define DARK_FAULT_CODE_FUN_ORDER_6  (0x06u)
#define DARK_FAULT_CODE_FUN_ORDER_7  (0x07u)
#define DARK_FAULT_CODE_FUN_ORDER_8  (0x08u)
#define DARK_FAULT_CODE_FUN_ORDER_9  (0x09u)
#define DARK_FAULT_CODE_FUN_ORDER_10 (0x0Au)
#define DARK_FAULT_CODE_FUN_ORDER_11 (0x0Bu)
#define DARK_FAULT_CODE_FUN_ORDER_12 (0x0Cu)
#define DARK_FAULT_CODE_FUN_ORDER_13 (0x0Du)
#define DARK_FAULT_CODE_FUN_ORDER_14 (0x0Eu)
#define DARK_FAULT_CODE_FUN_ORDER_15 (0x0Fu)
#define DARK_FAULT_CODE_FUN_ORDER_16 (0x10u)
#define DARK_FAULT_CODE_FUN_ORDER_17 (0x11u)
#define DARK_FAULT_CODE_FUN_ORDER_18 (0x12u)
#define DARK_FAULT_CODE_FUN_ORDER_19 (0x13u)
#define DARK_FAULT_CODE_FUN_ORDER_20 (0x14u)
#define DARK_FAULT_CODE_FUN_ORDER_21 (0x15u)
#define DARK_FAULT_CODE_FUN_ORDER_22 (0x16u)
#define DARK_FAULT_CODE_FUN_ORDER_23 (0x17u)
#define DARK_FAULT_CODE_FUN_ORDER_24 (0x18u)
#define DARK_FAULT_CODE_FUN_ORDER_25 (0x19u)
#define DARK_FAULT_CODE_FUN_ORDER_26 (0x1Au)
#define DARK_FAULT_CODE_FUN_ORDER_27 (0x1Bu)
#define DARK_FAULT_CODE_FUN_ORDER_28 (0x1Cu)
#define DARK_FAULT_CODE_FUN_ORDER_29 (0x1Du)
#define DARK_FAULT_CODE_FUN_ORDER_30 (0x1Eu)
#define DARK_FAULT_CODE_FUN_ORDER_31 (0x1Fu)
#define DARK_FAULT_CODE_FUN_ORDER_32 (0x20u)
#define DARK_FAULT_CODE_FUN_ORDER_33 (0x21u)
#define DARK_FAULT_CODE_FUN_ORDER_34 (0x22u)
#define DARK_FAULT_CODE_FUN_ORDER_35 (0x23u)
#define DARK_FAULT_CODE_FUN_ORDER_36 (0x24u)
#define DARK_FAULT_CODE_FUN_ORDER_37 (0x25u)
#define DARK_FAULT_CODE_FUN_ORDER_38 (0x26u)
#define DARK_FAULT_CODE_FUN_ORDER_39 (0x27u)
#define DARK_FAULT_CODE_FUN_ORDER_40 (0x28u)


/**************具体宕机原因编码（函数内的宕机顺序）***************/
#define TSCP_DARK_ASSERT_1   (0x01u)
#define TSCP_DARK_ASSERT_2   (0x02u)
#define TSCP_DARK_ASSERT_3   (0x03u)
#define TSCP_DARK_ASSERT_4   (0x04u)
#define TSCP_DARK_ASSERT_5   (0x05u)
#define TSCP_DARK_ASSERT_6   (0x06u)
#define TSCP_DARK_ASSERT_7   (0x07u)
#define TSCP_DARK_ASSERT_8   (0x08u)
#define TSCP_DARK_ASSERT_9   (0x09u)
#define TSCP_DARK_ASSERT_10  (0x0Au)
#define TSCP_DARK_ASSERT_11  (0x0Bu)
#define TSCP_DARK_ASSERT_12  (0x0Cu)
#define TSCP_DARK_ASSERT_13  (0x0Du)
#define TSCP_DARK_ASSERT_14  (0x0Eu)
#define TSCP_DARK_ASSERT_15  (0x0Fu)
#define TSCP_DARK_ASSERT_16  (0x10u)
#define TSCP_DARK_ASSERT_17  (0x11u)
#define TSCP_DARK_ASSERT_18  (0x12u)
#define TSCP_DARK_ASSERT_19  (0x13u)
#define TSCP_DARK_ASSERT_20  (0x14u)
#define TSCP_DARK_ASSERT_21  (0x15u)
#define TSCP_DARK_ASSERT_22  (0x16u)
#define TSCP_DARK_ASSERT_23  (0x17u)
#define TSCP_DARK_ASSERT_24  (0x18u)
#define TSCP_DARK_ASSERT_25  (0x19u)
#define TSCP_DARK_ASSERT_26  (0x1Au)
#define TSCP_DARK_ASSERT_27  (0x1Bu)
#define TSCP_DARK_ASSERT_28  (0x1Cu)
#define TSCP_DARK_ASSERT_29  (0x1Du)
#define TSCP_DARK_ASSERT_30  (0x1Eu)
#define TSCP_DARK_ASSERT_31  (0x1Fu)
#define TSCP_DARK_ASSERT_32  (0x20u)
#define TSCP_DARK_ASSERT_33  (0x21u)
#define TSCP_DARK_ASSERT_34  (0x22u)
#define TSCP_DARK_ASSERT_35  (0x23u)
#define TSCP_DARK_ASSERT_36  (0x24u)
#define TSCP_DARK_ASSERT_37  (0x25u)
#define TSCP_DARK_ASSERT_38  (0x26u)
#define TSCP_DARK_ASSERT_39  (0x27u)
#define TSCP_DARK_ASSERT_40  (0x28u)
#define TSCP_DARK_ASSERT_41  (0x29u)

#ifdef __cplusplus
}
#endif
#endif
