#ifndef __MODULE_LOG_H
#define __MODULE_LOG_H

#include <pthread.h>
#define MB_LOG  (MODULE_LOG <<16)

typedef enum LogLevel {
  kNone = 0,
  kFatal,
  kError,
  kWarning,
  kInfo,
  kDebug,
} LogLevel;

extern pthread_mutex_t result_mutex;
extern pthread_mutex_t result_comm_mutex;

/*********************************** 线程编号 ***********************************/
enum
{
	TLOG_SUPERVISOR   = 0,  //主线程编号固定为0
	TLOG_COUNT,
};

/*********************************** 模块异常 ***********************************/
#define EXCEPTION_LOG_0                 (MB_LOG | 0x0)


/*********************************** 模块消息 ***********************************/
//[src param ] 
//[src tail  ] 
//[ack param ]
//[ack tail  ]
//[function  ]

void* logger_supervisor(void *param);
void init_logger(LogLevel level, const char *filename);

void log_internal(LogLevel level,const char *file,int line, void *p,int l, const char *fmt, ...) ;
void log_print(LogLevel level, const char *fmt, ...);

void log_comm_internal(LogLevel level, void *p,int l,char *operation,const char *fmt, ...) ;

#define log_info(s...) do {\
    pthread_mutex_lock(&result_mutex);\
    log_print(kInfo, "\033[m"); \
    log_internal(kInfo,__FILE__,__LINE__,NULL,0,s);\
    log_print(kInfo, "\033[m\n"); \
    pthread_mutex_unlock(&result_mutex);\
}while(0)

#define log_warning(s...) do {\
    pthread_mutex_lock(&result_mutex);\
    log_print(kWarning, "\033[33m"); \
    log_internal(kWarning, __FILE__,__LINE__,NULL,0,s);\
    log_print(kWarning,"\033[m\n"); \
    pthread_mutex_unlock(&result_mutex);\
}while(0)

#define log_error(s...) do {\
    pthread_mutex_lock(&result_mutex);\
    log_print(kDebug,"\033[31m"); \
    log_internal(kError, __FILE__,__LINE__,NULL,0,s);\
    log_print(kError,"\033[m\n"); \
    pthread_mutex_unlock(&result_mutex);\
}while(0)

#define log_fatal(s...) do {\
    pthread_mutex_lock(&result_mutex);\
    log_print(kFatal,"\033[31m"); \
    log_internal(kFatal, __FILE__,__LINE__,NULL,0,s);\
    log_print(kFatal,"\033[m\n"); \
    pthread_mutex_unlock(&result_mutex);\
    exit(1);\
}while(0)

#define log_debug(s...) do {\
    pthread_mutex_lock(&result_mutex);\
    log_print(kDebug,"\033[m"); \
    log_internal(kDebug, __FILE__,__LINE__,NULL,0,s);\
    log_print(kDebug,"\033[m\n"); \
    pthread_mutex_unlock(&result_mutex);\
}while(0)

#define log_hex(p,l,s...) do {\
    pthread_mutex_lock(&result_mutex);\
    log_print(kDebug,"\033[m"); \
    log_internal(kDebug,__FILE__,__LINE__,p,l, s);\
    log_print(kDebug,"\033[m\n"); \
    pthread_mutex_unlock(&result_mutex);\
}while(0)

#define log_comm_gw2node(p,l,s...) do {\
    pthread_mutex_lock(&result_comm_mutex);\
    log_print(kDebug,"\033[m"); \
    log_comm_internal(kDebug,p,l,"网关->设备",s);\
    log_print(kDebug,"\033[m\n"); \
    pthread_mutex_unlock(&result_comm_mutex);\
}while(0)

#define log_comm_node2gw(p,l,s...) do {\
    pthread_mutex_lock(&result_comm_mutex);\
    log_print(kDebug,"\033[m"); \
    log_comm_internal(kDebug,p,l,"网关<-设备",s);\
    log_print(kDebug,"\033[m\n"); \
    pthread_mutex_unlock(&result_comm_mutex);\
}while(0)

/********************************* 消息数据结构 ********************************/



#endif /* __MODULE_LOG_H */


