/****************************************************************************/
/* Copyright (c) 2007,许继集团有限公司                                      */
/* All rights reserved.                                                     */
/*                                                                          */
/*  模块描述：                                                              */
/** 实现多种log信息的输出
 *  @file  ai_log.h                                                         */
/*                                                                          */
/* 日期         作者    注释                                                */
/* 2007/07/24   TYJ     创建文件                                            */
/****************************************************************************/
#ifndef IEC61850_AI_LOG_H
#define IEC61850_AI_LOG_H

#include "ai_def.h"
#include "slog.h" 

#ifdef __cplusplus
extern "C"{
#endif

#define AI_LOG_FILE_EN 
//#define AI_LOG_STDOUT_EN
#define AI_LOG_USER_EN

#define AI_LOG_FILE_NAME "iec61850.log"   /**< 默认日志输出的文件名 */
#define AI_LOG_FILE_SIZE 1000000L    /**< 文件最大不超过1M */

#define AI_LOG_ERR     0x00000001    /**< 错误日志信息标志 */
#define AI_LOG_FLOW    0x00000002    /**< 流程日志信息标志 */
#define AI_LOG_DATA    0x00000004    /**< 数据日志信息标志 */
#define AI_LOG_TEST    0x00000008    /**< 测试日志信息标志 */
extern ST_UINT ai_log_sel;    /**< 日志信息类型 */


extern SD_CONST ST_CHAR *SD_CONST ai_log_err_logstr;   /**< 错误日志信息标题描述 */
extern SD_CONST ST_CHAR *SD_CONST ai_log_flow_logstr;  /**< 流程日志信息标题描述 */
extern SD_CONST ST_CHAR *SD_CONST ai_log_data_logstr;  /**< 数据日志信息标题描述 */
extern SD_CONST ST_CHAR *SD_CONST ai_log_test_logstr;  /**< 测试日志信息标题描述 */

/**
 * 用户自定义日志输出接口，产生日志时会调用此接口输出日志
 * @param logStr   要输出的日志信息
 * @return  ST_VOID
 */
extern ST_VOID (*user_log_put)(ST_CHAR *logStr);

/**
 * 输出错误日志信息.
 * 输出包括日志的类型、时间、源文件名以及行数等信息，其中fmt为描述信息，a、b...为参数的值
 */
#if defined(DEBUG_SISCO)   /**< 日志输出编译条件 */
#define AI_LOG_FUN_ERR0(fmt) {\
	if(ai_log_sel & AI_LOG_ERR)  \
	_slog (sLogCtrl, ai_log_err_logstr, thisFileName, __LINE__, fmt);}

#define AI_LOG_FUN_ERR1(fmt,a) {\
	if (ai_log_sel & AI_LOG_ERR) \
	_slog (sLogCtrl, ai_log_err_logstr, thisFileName, __LINE__, fmt,a);}

#define AI_LOG_FUN_ERR2(fmt,a,b) {\
	if (ai_log_sel & AI_LOG_ERR) \
	_slog (sLogCtrl, ai_log_err_logstr, thisFileName, __LINE__, fmt,a, b);}

#define AI_LOG_FUN_ERR3(fmt,a,b,c) {\
	if (ai_log_sel & AI_LOG_ERR) \
	_slog (sLogCtrl, ai_log_err_logstr, thisFileName, __LINE__, fmt,a, b, c);}

#define AI_LOG_FUN_ERR4(fmt,a,b,c,d) {\
	if (ai_log_sel & AI_LOG_ERR) \
	_slog (sLogCtrl, ai_log_err_logstr, thisFileName, __LINE__, fmt,a, b, c, d);} 

#define AI_LOG_FUN_ERR5(fmt,a,b,c,d,e) {\
	if (ai_log_sel & AI_LOG_ERR) \
	_slog (sLogCtrl, ai_log_err_logstr, thisFileName, __LINE__, fmt,a, b, c, d, e);}

#define AI_LOG_FUN_ERR6(fmt,a,b,c,d,e,f) {\
	if (ai_log_sel & AI_LOG_ERR) \
	_slog (sLogCtrl, ai_log_err_logstr, thisFileName, __LINE__, fmt,a, b, c, d, e, f);}

#else
#define AI_LOG_FUN_ERR0(fmt)
#define AI_LOG_FUN_ERR1(fmt,a)
#define AI_LOG_FUN_ERR2(fmt,a,b)
#define AI_LOG_FUN_ERR3(fmt,a,b,c)
#define AI_LOG_FUN_ERR4(fmt,a,b,c,d)
#define AI_LOG_FUN_ERR5(fmt,a,b,c,d,e)
#define AI_LOG_FUN_ERR6(fmt,a,b,c,d,e,f)
#endif

/**
 * 输出流程日志信息.
 * 输出包括日志的类型、时间、源文件名以及行数等信息，其中fmt为描述信息，a、b...为参数的值
 */
#if defined(DEBUG_SISCO)   /**< 日志输出编译条件 */
#define AI_LOG_FUN_FLOW0(fmt) {\
	if(ai_log_sel & AI_LOG_FLOW)  \
	_slog (sLogCtrl, ai_log_flow_logstr, thisFileName, __LINE__, fmt);}

#define AI_LOG_FUN_FLOW1(fmt,a) {\
	if (ai_log_sel & AI_LOG_FLOW) \
	_slog (sLogCtrl, ai_log_flow_logstr, thisFileName, __LINE__, fmt,a);}

#define AI_LOG_FUN_FLOW2(fmt,a,b) {\
	if (ai_log_sel & AI_LOG_FLOW) \
	_slog (sLogCtrl, ai_log_flow_logstr, thisFileName, __LINE__, fmt,a, b);}

#define AI_LOG_FUN_FLOW3(fmt,a,b,c) {\
	if (ai_log_sel & AI_LOG_FLOW) \
	_slog (sLogCtrl, ai_log_flow_logstr, thisFileName, __LINE__, fmt,a, b, c);}

#define AI_LOG_FUN_FLOW4(fmt,a,b,c,d) {\
	if (ai_log_sel & AI_LOG_FLOW) \
	_slog (sLogCtrl, ai_log_flow_logstr, thisFileName, __LINE__, fmt,a, b, c, d);} 

#define AI_LOG_FUN_FLOW5(fmt,a,b,c,d,e) {\
	if (ai_log_sel & AI_LOG_FLOW) \
	_slog (sLogCtrl, ai_log_flow_logstr, thisFileName, __LINE__, fmt,a, b, c, d, e);}

#define AI_LOG_FUN_FLOW6(fmt,a,b,c,d,e,f) {\
	if (ai_log_sel & AI_LOG_FLOW) \
	_slog (sLogCtrl, ai_log_flow_logstr, thisFileName, __LINE__, fmt,a, b, c, d, e, f);}
#else
#define AI_LOG_FUN_FLOW0(fmt)
#define AI_LOG_FUN_FLOW1(fmt,a)
#define AI_LOG_FUN_FLOW2(fmt,a,b)
#define AI_LOG_FUN_FLOW3(fmt,a,b,c)
#define AI_LOG_FUN_FLOW4(fmt,a,b,c,d)
#define AI_LOG_FUN_FLOW5(fmt,a,b,c,d,e)
#define AI_LOG_FUN_FLOW6(fmt,a,b,c,d,e,f)
#endif

/**
 * 输出测试日志信息.
 * 输出包括日志的类型、时间、源文件名以及行数等信息，其中fmt为描述信息，a、b...为参数的值
 */
#if defined(DEBUG_SISCO)   /**< 日志输出编译条件 */
#define AI_LOG_FUN_TEST0(fmt) {\
	if(ai_log_sel & AI_LOG_TEST)  \
	_slog (sLogCtrl, ai_log_test_logstr, thisFileName, __LINE__, fmt);}

#define AI_LOG_FUN_TEST1(fmt,a) {\
	if (ai_log_sel & AI_LOG_TEST) \
	_slog (sLogCtrl, ai_log_test_logstr, thisFileName, __LINE__, fmt,a);}

#define AI_LOG_FUN_TEST2(fmt,a,b) {\
	if (ai_log_sel & AI_LOG_TEST) \
	_slog (sLogCtrl, ai_log_test_logstr, thisFileName, __LINE__, fmt,a, b);}

#define AI_LOG_FUN_TEST3(fmt,a,b,c) {\
	if (ai_log_sel & AI_LOG_TEST) \
	_slog (sLogCtrl, ai_log_test_logstr, thisFileName, __LINE__, fmt,a, b, c);}

#define AI_LOG_FUN_TEST4(fmt,a,b,c,d) {\
	if (ai_log_sel & AI_LOG_TEST) \
	_slog (sLogCtrl, ai_log_test_logstr, thisFileName, __LINE__, fmt,a, b, c, d);} 

#define AI_LOG_FUN_TEST5(fmt,a,b,c,d,e) {\
	if (ai_log_sel & AI_LOG_TEST) \
	_slog (sLogCtrl, ai_log_test_logstr, thisFileName, __LINE__, fmt,a, b, c, d, e);}

#define AI_LOG_FUN_TEST6(fmt,a,b,c,d,e,f) {\
	if (ai_log_sel & AI_LOG_TEST) \
	_slog (sLogCtrl, ai_log_test_logstr, thisFileName, __LINE__, fmt,a, b, c, d, e, f);}
#else
#define AI_LOG_FUN_TEST0(fmt)
#define AI_LOG_FUN_TEST1(fmt,a)
#define AI_LOG_FUN_TEST2(fmt,a,b)
#define AI_LOG_FUN_TEST3(fmt,a,b,c)
#define AI_LOG_FUN_TEST4(fmt,a,b,c,d)
#define AI_LOG_FUN_TEST5(fmt,a,b,c,d,e)
#define AI_LOG_FUN_TEST6(fmt,a,b,c,d,e,f)
#endif


/**
 * 输出数据日志信息.
 * 输出包括日志的类型、时间、源文件名以及行数等信息，其中fmt为描述信息，a、b...为参数的值
 */
#if defined(DEBUG_SISCO)   /**< 日志输出编译条件 */
#define AI_LOG_FUN_DATA0(fmt) {\
	if(ai_log_sel & AI_LOG_DATA)  \
	_slog (sLogCtrl, ai_log_data_logstr, thisFileName, __LINE__, fmt);}

#define AI_LOG_FUN_DATA1(fmt,a) {\
	if (ai_log_sel & AI_LOG_DATA) \
	_slog (sLogCtrl, ai_log_data_logstr, thisFileName, __LINE__, fmt,a);}

#define AI_LOG_FUN_DATA2(fmt,a,b) {\
	if (ai_log_sel & AI_LOG_DATA) \
	_slog (sLogCtrl, ai_log_data_logstr, thisFileName, __LINE__, fmt,a, b);}

#define AI_LOG_FUN_DATA3(fmt,a,b,c) {\
	if (ai_log_sel & AI_LOG_DATA) \
	_slog (sLogCtrl, ai_log_data_logstr, thisFileName, __LINE__, fmt,a, b, c);}

#define AI_LOG_FUN_DATA4(fmt,a,b,c,d) {\
	if (ai_log_sel & AI_LOG_DATA) \
	_slog (sLogCtrl, ai_log_data_logstr, thisFileName, __LINE__, fmt,a, b, c, d);} 

#define AI_LOG_FUN_DATA5(fmt,a,b,c,d,e) {\
	if (ai_log_sel & AI_LOG_DATA) \
	_slog (sLogCtrl, ai_log_data_logstr, thisFileName, __LINE__, fmt,a, b, c, d, e);}

#define AI_LOG_FUN_DATA6(fmt,a,b,c,d,e,f) {\
	if (ai_log_sel & AI_LOG_DATA) \
	_slog (sLogCtrl, ai_log_data_logstr, thisFileName, __LINE__, fmt,a, b, c, d, e, f);}
#else
#define AI_LOG_FUN_DATA0(fmt)
#define AI_LOG_FUN_DATA1(fmt,a)
#define AI_LOG_FUN_DATA2(fmt,a,b)
#define AI_LOG_FUN_DATA3(fmt,a,b,c)
#define AI_LOG_FUN_DATA4(fmt,a,b,c,d)
#define AI_LOG_FUN_DATA5(fmt,a,b,c,d,e)
#define AI_LOG_FUN_DATA6(fmt,a,b,c,d,e,f)
#endif

/**
 * 输出错误日志信息.
 * 输出不再包含日志的类型、时间、源文件名以及行数等信息，直接显示用户数据信息。
 * 其中fmt为描述信息，a、b...为参数的值
 */
#if defined(DEBUG_SISCO)   /**< 日志输出编译条件 */
#define AI_LOG_FUN_ERRC0(fmt) {\
	if(ai_log_sel & AI_LOG_ERR)  _slogc (sLogCtrl, fmt);}

#define AI_LOG_FUN_ERRC1(fmt,a) {\
	if (ai_log_sel & AI_LOG_ERR) _slogc (sLogCtrl, fmt,a);}

#define AI_LOG_FUN_ERRC2(fmt,a,b) {\
	if (ai_log_sel & AI_LOG_ERR) _slogc (sLogCtrl, fmt,a, b);}

#define AI_LOG_FUN_ERRC3(fmt,a,b,c) {\
	if (ai_log_sel & AI_LOG_ERR) _slogc (sLogCtrl, fmt,a, b, c);}

#define AI_LOG_FUN_ERRC4(fmt,a,b,c,d) {\
	if (ai_log_sel & AI_LOG_ERR) _slogc (sLogCtrl, fmt,a, b, c, d);} 

#define AI_LOG_FUN_ERRC5(fmt,a,b,c,d,e) {\
	if (ai_log_sel & AI_LOG_ERR) _slogc (sLogCtrl, fmt,a, b, c, d, e);}

#define AI_LOG_FUN_ERRC6(fmt,a,b,c,d,e,f) {\
	if (ai_log_sel & AI_LOG_ERR) _slogc (sLogCtrl, fmt,a, b, c, d, e, f);}

#else
#define AI_LOG_FUN_ERRC0(fmt)
#define AI_LOG_FUN_ERRC1(fmt,a)
#define AI_LOG_FUN_ERRC2(fmt,a,b)
#define AI_LOG_FUN_ERRC3(fmt,a,b,c)
#define AI_LOG_FUN_ERRC4(fmt,a,b,c,d)
#define AI_LOG_FUN_ERRC5(fmt,a,b,c,d,e)
#define AI_LOG_FUN_ERRC6(fmt,a,b,c,d,e,f)
#endif

/**
 * 输出流程日志信息.
 * 输出不再包含日志的类型、时间、源文件名以及行数等信息，直接显示用户数据信息。
 * 其中fmt为描述信息，a、b...为参数的值
 */
#if defined(DEBUG_SISCO)   /**< 日志输出编译条件 */
#define AI_LOG_FUN_FLOWC0(fmt) {\
	if(ai_log_sel & AI_LOG_FLOW)  _slogc (sLogCtrl, fmt);}

#define AI_LOG_FUN_FLOWC1(fmt,a) {\
	if (ai_log_sel & AI_LOG_FLOW) _slogc (sLogCtrl, fmt,a);}

#define AI_LOG_FUN_FLOWC2(fmt,a,b) {\
	if (ai_log_sel & AI_LOG_FLOW) _slogc (sLogCtrl, fmt,a, b);}

#define AI_LOG_FUN_FLOWC3(fmt,a,b,c) {\
	if (ai_log_sel & AI_LOG_FLOW) _slogc (sLogCtrl, fmt,a, b, c);}

#define AI_LOG_FUN_FLOWC4(fmt,a,b,c,d) {\
	if (ai_log_sel & AI_LOG_FLOW) _slogc (sLogCtrl, fmt,a, b, c, d);} 

#define AI_LOG_FUN_FLOWC5(fmt,a,b,c,d,e) {\
	if (ai_log_sel & AI_LOG_FLOW) _slogc (sLogCtrl, fmt,a, b, c, d, e);}

#define AI_LOG_FUN_FLOWC6(fmt,a,b,c,d,e,f) {\
	if (ai_log_sel & AI_LOG_FLOW) _slogc (sLogCtrl, fmt,a, b, c, d, e, f);}
#else
#define AI_LOG_FUN_FLOWC0(fmt)
#define AI_LOG_FUN_FLOWC1(fmt,a)
#define AI_LOG_FUN_FLOWC2(fmt,a,b)
#define AI_LOG_FUN_FLOWC3(fmt,a,b,c)
#define AI_LOG_FUN_FLOWC4(fmt,a,b,c,d)
#define AI_LOG_FUN_FLOWC5(fmt,a,b,c,d,e)
#define AI_LOG_FUN_FLOWC6(fmt,a,b,c,d,e,f)
#endif

/**
 * 输出测试日志信息.
 * 输出不再包含日志的类型、时间、源文件名以及行数等信息，直接显示用户数据信息。
 * 其中fmt为描述信息，a、b...为参数的值
 */
#if defined(DEBUG_SISCO)   /**< 日志输出编译条件 */
#define AI_LOG_FUN_TESTC0(fmt) {\
	if(ai_log_sel & AI_LOG_TEST)  _slogc (sLogCtrl, fmt);}

#define AI_LOG_FUN_TESTC1(fmt,a) {\
	if (ai_log_sel & AI_LOG_TEST) _slogc (sLogCtrl, fmt,a);}

#define AI_LOG_FUN_TESTC2(fmt,a,b) {\
	if (ai_log_sel & AI_LOG_TEST) _slogc (sLogCtrl, fmt,a, b);}

#define AI_LOG_FUN_TESTC3(fmt,a,b,c) {\
	if (ai_log_sel & AI_LOG_TEST) _slogc (sLogCtrl, fmt,a, b, c);}

#define AI_LOG_FUN_TESTC4(fmt,a,b,c,d) {\
	if (ai_log_sel & AI_LOG_TEST) _slogc (sLogCtrl, fmt,a, b, c, d);} 

#define AI_LOG_FUN_TESTC5(fmt,a,b,c,d,e) {\
	if (ai_log_sel & AI_LOG_TEST) _slogc (sLogCtrl, fmt,a, b, c, d, e);}

#define AI_LOG_FUN_TESTC6(fmt,a,b,c,d,e,f) {\
	if (ai_log_sel & AI_LOG_TEST) _slogc (sLogCtrl, fmt,a, b, c, d, e, f);}
#else
#define AI_LOG_FUN_TESTC0(fmt)
#define AI_LOG_FUN_TESTC1(fmt,a)
#define AI_LOG_FUN_TESTC2(fmt,a,b)
#define AI_LOG_FUN_TESTC3(fmt,a,b,c)
#define AI_LOG_FUN_TESTC4(fmt,a,b,c,d)
#define AI_LOG_FUN_TESTC5(fmt,a,b,c,d,e)
#define AI_LOG_FUN_TESTC6(fmt,a,b,c,d,e,f)
#endif


/**
 * 输出数据日志信息.
 * 输出不再包含日志的类型、时间、源文件名以及行数等信息，直接显示用户数据信息。
 * 其中fmt为描述信息，a、b...为参数的值
 */
#if defined(DEBUG_SISCO)   /**< 日志输出编译条件 */
#define AI_LOG_FUN_DATAC0(fmt) {\
	if(ai_log_sel & AI_LOG_DATA)  \
	_slogc (sLogCtrl,  fmt);}

#define AI_LOG_FUN_DATAC1(fmt,a) {\
	if (ai_log_sel & AI_LOG_DATA) _slogc (sLogCtrl,  fmt,a);}

#define AI_LOG_FUN_DATAC2(fmt,a,b) {\
	if (ai_log_sel & AI_LOG_DATA) _slogc (sLogCtrl,  fmt,a, b);}

#define AI_LOG_FUN_DATAC3(fmt,a,b,c) {\
	if (ai_log_sel & AI_LOG_DATA) _slogc (sLogCtrl,  fmt,a, b, c);}

#define AI_LOG_FUN_DATAC4(fmt,a,b,c,d) {\
	if (ai_log_sel & AI_LOG_DATA) _slogc (sLogCtrl,  fmt,a, b, c, d);} 

#define AI_LOG_FUN_DATAC5(fmt,a,b,c,d,e) {\
	if (ai_log_sel & AI_LOG_DATA) _slogc (sLogCtrl,  fmt,a, b, c, d, e);}

#define AI_LOG_FUN_DATAC6(fmt,a,b,c,d,e,f) {\
	if (ai_log_sel & AI_LOG_DATA) _slogc (sLogCtrl,  fmt,a, b, c, d, e, f);}
#else
#define AI_LOG_FUN_DATAC0(fmt)
#define AI_LOG_FUN_DATAC1(fmt,a)
#define AI_LOG_FUN_DATAC2(fmt,a,b)
#define AI_LOG_FUN_DATAC3(fmt,a,b,c)
#define AI_LOG_FUN_DATAC4(fmt,a,b,c,d)
#define AI_LOG_FUN_DATAC5(fmt,a,b,c,d,e)
#define AI_LOG_FUN_DATAC6(fmt,a,b,c,d,e,f)
#endif

/**
 * 设置用户自定义日志输出接口
 */
ST_VOID ai_init_log(ST_VOID);


#ifdef __cplusplus
}
#endif

#endif

