/******************************************************************************
 *
 * Copyright 2013, Silicon Image, Inc.  All rights reserved.
 * No part of this work may be reproduced, modified, distributed, transmitted,
 * transcribed, or translated into any language or computer format, in any form
 * or by any means without written permission of
 * Silicon Image, Inc., 1140 East Arques Avenue, Sunnyvale, California 94085
 *
 *****************************************************************************/
/**
 * @file si_sys_log_api.h
 *
 * @brief logging library
 *
 *****************************************************************************/

#ifndef SI_SYS_LOG_API_H
#define SI_SYS_LOG_API_H

/***** #include statements ***************************************************/

#include "si_datatypes.h"
#include "si_sys_obj_api.h"

/***** public macro definitions **********************************************/

#define SII_LOG_ENABLE(lev)                      ( lev <= SII_DEBUG )

#define SII_LOG_HEADER(func, obj, str)           { SiiSysLogTimeStamp(sSiiModuleNameStr, (char*)func, (void*)(obj)); SiiSysLogPrintf str; }
#define SII_LOG_STRING(str)                      { SiiSysLogPrintf str; }
#define SII_LOG_ARRAY(p, l)                      { uint16_t _len = l; uint8_t *ptr = (uint8_t*)p; while( _len-- ) { SiiSysLogPrintf("%02X ", (uint16_t)(*(ptr++) & 0xFF)); }; SiiSysLogPrintf("\n"); }
#ifndef SII_DEBUG
  #define SII_LOG1A(func, obj, str)
  #define SII_LOG2A(func, obj, str)
  #define SII_LOG3A(func, obj, str)
  #define SII_LOG1B(str)
  #define SII_LOG2B(str)
  #define SII_LOG3B(str)
  #define SII_LOG1B_ARRAY(p, len)
  #define SII_LOG2B_ARRAY(p, len)
  #define SII_LOG3B_ARRAY(p, len)
  #define SII_LOG1_ENABLE                        (false)
  #define SII_LOG2_ENABLE                        (false)
  #define SII_LOG3_ENABLE                        (false)
#else
  #if( 0 == SII_DEBUG )
    #define SII_LOG1A(func, obj, str)
    #define SII_LOG2A(func, obj, str)
    #define SII_LOG3A(func, obj, str)
    #define SII_LOG1B(str)
    #define SII_LOG2B(str)
    #define SII_LOG3B(str)
    #define SII_LOG1B_ARRAY(p, len)
    #define SII_LOG2B_ARRAY(p, len)
    #define SII_LOG3B_ARRAY(p, len)
    #define SII_LOG1_ENABLE                      (false)
    #define SII_LOG2_ENABLE                      (false)
    #define SII_LOG3_ENABLE                      (false)
  #elif( 1 == SII_DEBUG )
    #define SII_LOG1A(func, obj, str)            SII_LOG_HEADER(func, obj, str)
    #define SII_LOG2A(func, obj, str)
    #define SII_LOG3A(func, obj, str)
    #define SII_LOG1B(str)                       SII_LOG_STRING(str)
    #define SII_LOG2B(str)
    #define SII_LOG3B(str)
    #define SII_LOG1B_ARRAY(p, len)              SII_LOG_ARRAY(p, len) 
    #define SII_LOG2B_ARRAY(p, len)
    #define SII_LOG3B_ARRAY(p, len)
    #define SII_LOG1_ENABLE                      (true)
    #define SII_LOG2_ENABLE                      (false)
    #define SII_LOG3_ENABLE                      (false)
  #elif( 2 == SII_DEBUG )
    #define SII_LOG1A(func, obj, str)            SII_LOG_HEADER(func, obj, str)
    #define SII_LOG2A(func, obj, str)            SII_LOG_HEADER(func, obj, str)
    #define SII_LOG3A(func, obj, str)
    #define SII_LOG1B(str)                       SII_LOG_STRING(str)
    #define SII_LOG2B(str)                       SII_LOG_STRING(str)
    #define SII_LOG3B(str)
    #define SII_LOG1B_ARRAY(p, len)              SII_LOG_ARRAY(p, len)  
    #define SII_LOG2B_ARRAY(p, len)              SII_LOG_ARRAY(p, len) 
    #define SII_LOG3B_ARRAY(p, len)
    #define SII_LOG1_ENABLE                      (true)
    #define SII_LOG2_ENABLE                      (true)
    #define SII_LOG3_ENABLE                      (false)
  #else
    #define SII_LOG1A(func, obj, str)            SII_LOG_HEADER(func, obj, str)
    #define SII_LOG2A(func, obj, str)            SII_LOG_HEADER(func, obj, str)
    #define SII_LOG3A(func, obj, str)            SII_LOG_HEADER(func, obj, str)
    #define SII_LOG1B(str)                       SII_LOG_STRING(str)
    #define SII_LOG2B(str)                       SII_LOG_STRING(str)
    #define SII_LOG3B(str)                       SII_LOG_STRING(str)
    #define SII_LOG1B_ARRAY(p, len)              SII_LOG_ARRAY(p, len) 
    #define SII_LOG2B_ARRAY(p, len)              SII_LOG_ARRAY(p, len) 
    #define SII_LOG3B_ARRAY(p, len)              SII_LOG_ARRAY(p, len) 
    #define SII_LOG1_ENABLE                      (true)
    #define SII_LOG2_ENABLE                      (true)
    #define SII_LOG3_ENABLE                      (true)
  #endif
#endif
 	
/***** public type definitions ***********************************************/

/***** public functions ******************************************************/

void SiiSysLogTimeStamp(const char* pClassStr, const char* pFuncStr, void* pObj);
void SiiSysLogPrintf( const char* pFrm, ...);

#endif /* SI_SYS_LOG_API_H */

/***** end of file ***********************************************************/
