Home | History | Annotate | Download | only in inc
      1 /* ====================================================================
      2 *             Texas Instruments OMAP(TM) Platform Software
      3 * (c) Copyright Texas Instruments, Incorporated. All Rights Reserved.
      4 *
      5 * Use of this software is controlled by the terms and conditions found
      6 * in the license agreement under which this software has been supplied.
      7 * ==================================================================== */
      8 #ifndef OMX_DEBUG_H
      9 #define OMX_DEBUG_H
     10 
     11 #include "OMX_DebugMem.h"
     12 
     13 #define OMX_NO_MESSAGES    0x00000000
     14 #define OMX_ALL_MESSAGES   0xffff0000
     15 
     16 #define OMX_MASK_FATAL     0x80000000
     17 #define OMX_MASK_ERROR     0x40000000
     18 #define OMX_MASK_WARN      0x20000000
     19 #define OMX_MASK_INFO      0x10000000
     20 #define OMX_MASK_DEBUG     0x08000000
     21 #define OMX_MASK_TRACE     0x04000000
     22 #define OMX_MASK_RESERVE1  0x02000000
     23 #define OMX_MASK_RESERVE2  0x01000000
     24 
     25 #define OMX_MASK_USERMASK  0x00FF0000
     26 
     27 #define OMX_OPTION_FILE    0x00000001
     28 #define OMX_OPTION_FUNC    0x00000002
     29 #define OMX_OPTION_LINE    0x00000004
     30 
     31 #define OMX_MASK_HANDLES   0x0000FFFF
     32 
     33 
     34 
     35 /*
     36  *  ANSI escape sequences for outputing text in various colors
     37  */
     38 #define DBG_TEXT_WHITE   "\x1b[1;37;40m"
     39 #define DBG_TEXT_YELLOW  "\x1b[1;33;40m"
     40 #define DBG_TEXT_MAGENTA "\x1b[1;35;40m"
     41 #define DBG_TEXT_GREEN   "\x1b[1;32;40m"
     42 #define DBG_TEXT_CYAN    "\x1b[1;36;40m"
     43 #define DBG_TEXT_RED     "\x1b[1;31;40m"
     44 
     45 
     46 /* Setup log format (adds newline if no newline provided) */
     47 // do not use this one directly....
     48 #define OMX_LOG_PRINT(HANDLE, STR, ARG...) \
     49     (OMX_Log(HANDLE, __FILE__, __LINE__, __FUNCTION__, STR, ##ARG))
     50 
     51 #ifdef OMX_DEBUG
     52     #define OMX_DPRINT(HANDLE, STR, ARG...) OMX_LOG_PRINT(OMX_MASK_DEBUG | HANDLE, STR, ##ARG)
     53     #define OMX_TPRINT(HANDLE, STR, ARG...) OMX_LOG_PRINT(OMX_MASK_TRACE | HANDLE, STR, ##ARG)
     54 #else
     55     #define OMX_DPRINT(HANDLE, STR, ARG...)
     56     #define OMX_TPRINT(HANDLE, STR, ARG...)
     57 #endif
     58 
     59 /* Later this will be able to be turned on/off separately as a trace */
     60 #define OMX_DENTER(handle) OMX_TPRINT((handle), "+++ENTERING")
     61 #define OMX_DEXIT(handle,retVal) OMX_TPRINT((handle), "---EXITING(0x%x)", (retVal))
     62 
     63 #define OMX_DBG_INT(handle, intVar) OMX_DPRINT(OMX_MASK_DEBUG | (handle), #intVar ": %d", (intVar))
     64 #define OMX_DBG_PTR(handle, ptrVar) OMX_DPRINT(OMX_MASK_DEBUG | (handle), #ptrVar ": 0x%08x", (ptrVar))
     65 #define OMX_DBG_STR(handle, strVar) OMX_DPRINT(OMX_MASK_DEBUG | (handle), #strVar ": %s", (strVar))
     66 
     67 
     68 /* Error/warning printing defines to be used by all sub-components */
     69 #define OMX_INFOPRINT(handle, str,arg...)  (OMX_LOG_PRINT(OMX_MASK_INFO | (handle), "(INFO) "str, ##arg))
     70 #define OMX_WARNPRINT(handle, str,arg...)  (OMX_LOG_PRINT(OMX_MASK_WARN | (handle), "(WARN) "str, ##arg))
     71 #define OMX_ERRPRINT(handle, str,arg...)   (OMX_LOG_PRINT(OMX_MASK_ERROR | (handle), "(ERROR) "str, ##arg))
     72 #define OMX_FATALPRINT(handle, str,arg...)   (OMX_LOG_PRINT(OMX_MASK_FATAL | (handle), "(FATAL) "str, ##arg))
     73 
     74 /* assert macros */
     75 #ifdef OMX_DEBUG
     76     #define OMX_ASSERT(COND) ((!(COND))?OMX_FATALPRINT(0,"OMX_ASSERT("#COND")"),abort():0)
     77 #else
     78     #define OMX_ASSERT(COND)
     79 #endif
     80 
     81 #define OMX_LOG_ADD_MASK(HANDLE,NEW_BITS) (OMX_Log_SetMask((HANDLE), OMX_Log_GetMask(HANDLE) | (NEW_BITS)))
     82 #define OMX_LOG_CLEAR_MASK(HANDLE,NEW_BITS) (OMX_Log_SetMask((HANDLE), OMX_Log_GetMask(HANDLE) & ~(NEW_BITS)))
     83 
     84 #define OMX_LOG_ADD_OPTIONS(HANDLE,NEW_BITS) (OMX_Log_SetOptions((HANDLE), OMX_Log_GetOptions(HANDLE) | (NEW_BITS)))
     85 #define OMX_LOG_CLEAR_OPTIONS(HANDLE,NEW_BITS) (OMX_Log_SetOptions((HANDLE), OMX_Log_GetOptions(HANDLE) & ~(NEW_BITS)))
     86 
     87 typedef unsigned int OMX_DBG_HANDLE;
     88 
     89 OMX_DBG_HANDLE OMX_Log_GetDebugHandle(const char *description);
     90 void           OMX_Log_ReleaseDebugHandle(OMX_DBG_HANDLE hDebug);
     91 unsigned int   OMX_Log_GetMask(OMX_DBG_HANDLE hDebug);
     92 unsigned int   OMX_Log_SetMask(OMX_DBG_HANDLE hDebug, unsigned int uiNewMask);
     93 
     94 unsigned int   OMX_Log_GetOptions(OMX_DBG_HANDLE hDebug);
     95 unsigned int   OMX_Log_SetOptions(OMX_DBG_HANDLE hDebug, unsigned int uiNewOptions);
     96 
     97 void OMX_Log(unsigned int mask, const char *szFileName, int iLineNum,
     98              const char *szFunctionName, const char *strFormat, ...);
     99 
    100 const char *OMX_GetErrorString(OMX_ERRORTYPE error);
    101 
    102 OMX_ERRORTYPE OMX_Log_LoadConfigFile(char* szConfigFile);
    103 
    104 
    105 /*
    106  * The following macros are intended to make accessing a debug handle easier.
    107  *
    108  * For example, for the Util library, you would create a header file called
    109  *   OMX_Util_Private.h.  This file will be included in all source files
    110  *   compiled into the Util library.  The header file uses the 'define' macro
    111  *   to generate a prototype for the getDebugHandle() function:
    112  *
    113  *   DEFINE_DEBUG_HANDLE_FN(UTIL);
    114  *
    115  * Now, in your private header file, define easier macros for printing:
    116  *
    117  *   #define UTIL_DPRINT(str,args...) OMX_DPRINT(ACCESS_DEBUG_HANDLE(UTIL),str,##args)
    118  *   #define UTIL_WARNPRINT(str,args...) OMX_WARNPRINT(ACCESS_DEBUG_HANDLE(UTIL),str,##args)
    119  *   #define UTIL_ERRPRINT(str,args...) OMX_ERRPRINT(ACCESS_DEBUG_HANDLE(UTIL),str,##args)
    120  *
    121  * Finally, in a source file which will be compiled into the lib, for example
    122  *   OMX_Util_Private.c, you implement the function with the 'implement' macro:
    123  *
    124  *   IMPLEMENT_DEBUG_HANDLE_FN(UTIL)
    125  *
    126  */
    127 #define DEFINE_DEBUG_HANDLE_FN(MOD) OMX_DBG_HANDLE getDebugHandle_##MOD(void);
    128 
    129 #define ACCESS_DEBUG_HANDLE(MOD) getDebugHandle_##MOD()
    130 
    131 #define IMPLMENT_DEBUG_HANDLE_FN(MOD) \
    132 OMX_DBG_HANDLE getDebugHandle_##MOD(void)                    \
    133 {                                                            \
    134     static OMX_DBG_HANDLE hDebug = 0;                        \
    135     if(!hDebug) {                                            \
    136         hDebug = OMX_Log_GetDebugHandle(#MOD);               \
    137         OMX_DPRINT(0,"Component "#MOD": hDebug %d",hDebug);  \
    138     }                                                        \
    139     return hDebug;                                           \
    140 }
    141 
    142 
    143 
    144 #endif
    145 
    146