utils/report.h
changeset 0 10c42ec6c05f
equal deleted inserted replaced
-1:000000000000 0:10c42ec6c05f
       
     1 /*
       
     2  * report.h
       
     3  *
       
     4  * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved.      
       
     5  * All rights reserved.      
       
     6  * 
       
     7  * This program and the accompanying materials are made available under the 
       
     8  * terms of the Eclipse Public License v1.0 or BSD License which accompanies
       
     9  * this distribution. The Eclipse Public License is available at
       
    10  * http://www.eclipse.org/legal/epl-v10.html and the BSD License is as below.                                   
       
    11  *                                                                       
       
    12  * Redistribution and use in source and binary forms, with or without    
       
    13  * modification, are permitted provided that the following conditions    
       
    14  * are met:                                                              
       
    15  *                                                                       
       
    16  *  * Redistributions of source code must retain the above copyright     
       
    17  *    notice, this list of conditions and the following disclaimer.      
       
    18  *  * Redistributions in binary form must reproduce the above copyright  
       
    19  *    notice, this list of conditions and the following disclaimer in    
       
    20  *    the documentation and/or other materials provided with the         
       
    21  *    distribution.                                                      
       
    22  *  * Neither the name Texas Instruments nor the names of its            
       
    23  *    contributors may be used to endorse or promote products derived    
       
    24  *    from this software without specific prior written permission.      
       
    25  *                                                                       
       
    26  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   
       
    27  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     
       
    28  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
       
    29  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  
       
    30  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
       
    31  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      
       
    32  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
       
    33  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
       
    34  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   
       
    35  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
       
    36  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    37  */
       
    38 
       
    39 
       
    40 /***************************************************************************/
       
    41 /*                                                                          */
       
    42 /*    MODULE:   report.h                                                    */
       
    43 /*    PURPOSE:  Report module internal header API                           */
       
    44 /*                                                                          */
       
    45 /***************************************************************************/
       
    46 #ifndef __REPORT_H__
       
    47 #define __REPORT_H__
       
    48 
       
    49 /** \file  report.h 
       
    50  * \brief Report module API	\n
       
    51  * APIs which are used for reporting messages to the User while running. \n\n
       
    52  * 
       
    53  * The report mechanism: Messages are reported per file and severity Level	\n
       
    54  * Therefore, each file has a report flag which indicate if reporting for that file is enabled, \n
       
    55  * and each severity has a severity flag which indicate if reporting for that severity is enabled.	\n
       
    56  * Only if both flags are enabled, the message is printed. \n
       
    57  * The report flags of all file are indicated in a bit map Table which is contained in the report module handle	\n
       
    58  * The report flags of all severities  are indicated in a bit map Table which is contained in the report module handle	\n
       
    59  */
       
    60 
       
    61 #include "osApi.h"
       
    62 #include "commonTypes.h"
       
    63     
       
    64 #define MAX_STRING_LEN         32 
       
    65 
       
    66 
       
    67 /*******************************/
       
    68 /*      Report Files IDs       */
       
    69 /*******************************/
       
    70 
       
    71 typedef enum
       
    72 {
       
    73 	FILE_ID_0	   ,    /*   timer                    */
       
    74 	FILE_ID_1	   ,    /*   measurementMgr			  */
       
    75 	FILE_ID_2	   ,    /*   measurementMgrSM         */
       
    76 	FILE_ID_3	   ,    /*   regulatoryDomain         */
       
    77 	FILE_ID_4	   ,    /*   requestHandler           */
       
    78 	FILE_ID_5	   ,    /*   SoftGemini               */
       
    79 	FILE_ID_6	   ,    /*   spectrumMngmntMgr        */
       
    80 	FILE_ID_7	   ,    /*   SwitchChannel            */
       
    81 	FILE_ID_8	   ,    /*   roamingMngr              */
       
    82 	FILE_ID_9	   ,    /*   scanMngr                 */
       
    83 	FILE_ID_10	   ,    /*   admCtrlXCC               */
       
    84 	FILE_ID_11	   ,    /*   XCCMngr                  */
       
    85 	FILE_ID_12	   ,    /*   XCCRMMngr                */
       
    86 	FILE_ID_13	   ,    /*   XCCTSMngr                */
       
    87 	FILE_ID_14	   ,    /*   rogueAp                  */
       
    88 	FILE_ID_15	   ,    /*   TransmitPowerXCC         */
       
    89 	FILE_ID_16	   ,    /*   admCtrl                  */
       
    90 	FILE_ID_17	   ,    /*   admCtrlNone              */
       
    91 	FILE_ID_18	   ,    /*   admCtrlWep               */
       
    92 	FILE_ID_19	   ,    /*   admCtrlWpa               */
       
    93 	FILE_ID_20	   ,    /*   admCtrlWpa2              */
       
    94 	FILE_ID_21	   ,    /*   apConn                   */
       
    95 	FILE_ID_22	   ,    /*   broadcastKey802_1x       */
       
    96 	FILE_ID_23	   ,    /*   broadcastKeyNone         */
       
    97 	FILE_ID_24	   ,    /*   broadcastKeySM           */
       
    98 	FILE_ID_25	   ,    /*   conn                     */
       
    99 	FILE_ID_26	   ,    /*   connIbss                 */
       
   100 	FILE_ID_27	   ,    /*   connInfra                */
       
   101 	FILE_ID_28	   ,    /*   keyDerive                */
       
   102 	FILE_ID_29	   ,    /*   keyDeriveAes             */
       
   103 	FILE_ID_30	   ,    /*   keyDeriveCkip            */
       
   104 	FILE_ID_31	   ,    /*   keyDeriveTkip            */
       
   105 	FILE_ID_32	   ,    /*   keyDeriveWep             */
       
   106 	FILE_ID_33	   ,    /*   keyParser                */
       
   107 	FILE_ID_34	   ,    /*   keyParserExternal        */
       
   108 	FILE_ID_35	   ,    /*   keyParserWep             */
       
   109 	FILE_ID_36	   ,    /*   mainKeysSm               */
       
   110 	FILE_ID_37	   ,    /*   mainSecKeysOnly          */
       
   111 	FILE_ID_38	   ,    /*   mainSecNull              */
       
   112 	FILE_ID_39	   ,    /*   mainSecSm                */
       
   113 	FILE_ID_40	   ,    /*   rsn                      */
       
   114 	FILE_ID_41	   ,    /*   sme                      */
       
   115 	FILE_ID_42	   ,    /*   smeSelect                */
       
   116 	FILE_ID_43	   ,    /*   smeSm                    */
       
   117 	FILE_ID_44	   ,    /*   unicastKey802_1x         */
       
   118 	FILE_ID_45	   ,    /*   unicastKeyNone           */
       
   119 	FILE_ID_46	   ,    /*   unicastKeySM             */
       
   120 	FILE_ID_47	   ,    /*   CmdDispatcher            */
       
   121 	FILE_ID_48	   ,    /*   CmdHndlr                 */
       
   122 	FILE_ID_49	   ,    /*   DrvMain                  */
       
   123 	FILE_ID_50	   ,    /*   EvHandler                */
       
   124 	FILE_ID_51	   ,    /*   Ctrl                     */
       
   125 	FILE_ID_52	   ,    /*   GeneralUtil              */
       
   126 	FILE_ID_53	   ,    /*   RateAdaptation           */
       
   127 	FILE_ID_54	   ,    /*   rx                       */
       
   128 	FILE_ID_55	   ,    /*   TrafficMonitor           */
       
   129 	FILE_ID_56	   ,    /*   txCtrl                   */
       
   130 	FILE_ID_57	   ,    /*   txCtrlParams             */
       
   131 	FILE_ID_58	   ,    /*   txCtrlServ               */
       
   132 	FILE_ID_59	   ,    /*   TxDataClsfr              */
       
   133 	FILE_ID_60	   ,    /*   txDataQueue              */
       
   134 	FILE_ID_61	   ,    /*   txMgmtQueue              */
       
   135 	FILE_ID_62	   ,    /*   txPort                   */
       
   136 	FILE_ID_63	   ,    /*   assocSM                  */
       
   137 	FILE_ID_64	   ,    /*   authSm                   */
       
   138 	FILE_ID_65	   ,    /*   currBss                  */
       
   139 	FILE_ID_66	   ,    /*   healthMonitor            */
       
   140 	FILE_ID_67	   ,    /*   mlmeBuilder              */
       
   141 	FILE_ID_68	   ,    /*   mlmeParser               */
       
   142 	FILE_ID_69	   ,    /*   mlmeSm                   */
       
   143 	FILE_ID_70	   ,    /*   openAuthSm               */
       
   144 	FILE_ID_71	   ,    /*   PowerMgr                 */
       
   145 	FILE_ID_72	   ,    /*   PowerMgrDbgPrint         */
       
   146 	FILE_ID_73	   ,    /*   PowerMgrKeepAlive        */
       
   147 	FILE_ID_74	   ,    /*   qosMngr                  */
       
   148 	FILE_ID_75	   ,    /*   roamingInt               */
       
   149 	FILE_ID_76	   ,    /*   ScanCncn                 */
       
   150 	FILE_ID_77	   ,    /*   ScanCncnApp              */
       
   151 	FILE_ID_78	   ,    /*   ScanCncnOsSm             */
       
   152 	FILE_ID_79	   ,    /*   ScanCncnSm               */
       
   153 	FILE_ID_80	   ,    /*   ScanCncnSmSpecific       */
       
   154 	FILE_ID_81	   ,    /*   scanResultTable          */
       
   155 	FILE_ID_82	   ,    /*   scr                      */
       
   156 	FILE_ID_83	   ,    /*   sharedKeyAuthSm          */
       
   157 	FILE_ID_84	   ,    /*   siteHash                 */
       
   158 	FILE_ID_85	   ,    /*   siteMgr                  */
       
   159 	FILE_ID_86	   ,    /*   StaCap                   */
       
   160 	FILE_ID_87	   ,    /*   systemConfig             */
       
   161 	FILE_ID_88	   ,    /*   templates                */
       
   162 	FILE_ID_89	   ,    /*   trafficAdmControl        */
       
   163 	FILE_ID_90	   ,    /*   CmdBld                   */
       
   164 	FILE_ID_91	   ,    /*   CmdBldCfg                */
       
   165 	FILE_ID_92	   ,    /*   CmdBldCfgIE              */
       
   166 	FILE_ID_93	   ,    /*   CmdBldCmd                */
       
   167 	FILE_ID_94	   ,    /*   CmdBldCmdIE              */
       
   168 	FILE_ID_95	   ,    /*   CmdBldItr                */
       
   169 	FILE_ID_96	   ,    /*   CmdBldItrIE              */
       
   170 	FILE_ID_97	   ,    /*   CmdQueue                 */
       
   171 	FILE_ID_98	   ,    /*   RxQueue                  */
       
   172 	FILE_ID_99	   ,    /*   txCtrlBlk                */
       
   173 	FILE_ID_100	   ,    /*   txHwQueue                */
       
   174 	FILE_ID_101	   ,    /*   CmdMBox                  */
       
   175 	FILE_ID_102	   ,    /*   eventMbox                */
       
   176 	FILE_ID_103	   ,    /*   fwDebug                  */
       
   177 	FILE_ID_104	   ,    /*   FwEvent                  */
       
   178 	FILE_ID_105	   ,    /*   HwInit                   */
       
   179 	FILE_ID_106	   ,    /*   RxXfer                   */
       
   180 	FILE_ID_107	   ,    /*   txResult                 */
       
   181 	FILE_ID_108	   ,    /*   txXfer                   */
       
   182 	FILE_ID_109	   ,    /*   MacServices              */
       
   183 	FILE_ID_110	   ,    /*   MeasurementSrv           */
       
   184 	FILE_ID_111	   ,    /*   measurementSrvDbgPrint   */
       
   185 	FILE_ID_112	   ,    /*   MeasurementSrvSM         */
       
   186 	FILE_ID_113	   ,    /*   PowerSrv                 */
       
   187 	FILE_ID_114	   ,    /*   PowerSrvSM               */
       
   188 	FILE_ID_115	   ,    /*   ScanSrv                  */
       
   189 	FILE_ID_116	   ,    /*   ScanSrvSM                */
       
   190 	FILE_ID_117	   ,    /*   TWDriver                 */
       
   191 	FILE_ID_118	   ,    /*   TWDriverCtrl             */
       
   192 	FILE_ID_119	   ,    /*   TWDriverRadio            */
       
   193 	FILE_ID_120	   ,    /*   TWDriverTx               */
       
   194 	FILE_ID_121	   ,    /*   TwIf                     */
       
   195 	FILE_ID_122	   ,    /*   SdioBusDrv               */
       
   196 	FILE_ID_123	   ,    /*   TxnQueue                 */
       
   197 	FILE_ID_124	   ,    /*   WspiBusDrv               */
       
   198 	FILE_ID_125	   ,    /*   context                  */
       
   199 	FILE_ID_126	   ,    /*   freq                     */
       
   200 	FILE_ID_127	   ,    /*   fsm                      */
       
   201 	FILE_ID_128	   ,    /*   GenSM                    */
       
   202 	FILE_ID_129	   ,    /*   mem                      */
       
   203 	FILE_ID_130	   ,    /*   queue                    */
       
   204 	FILE_ID_131	   ,    /*   rate                     */
       
   205 	FILE_ID_132	   ,    /*   report                   */
       
   206 	FILE_ID_133	   ,    /*   stack                    */
       
   207 	FILE_ID_134	   ,
       
   208 	FILE_ID_135		,
       
   209 	FILE_ID_136		,
       
   210 	FILE_ID_137		,
       
   211 	FILE_ID_138		,
       
   212 	FILE_ID_139		,
       
   213 	FILE_ID_140		,
       
   214 	FILE_ID_141		,
       
   215 	FILE_ID_142		,
       
   216 	FILE_ID_143		,
       
   217 	FILE_ID_144		,
       
   218 	FILE_ID_145		,
       
   219 	FILE_ID_146		,
       
   220 	FILE_ID_147		,
       
   221 	FILE_ID_148		,
       
   222 
       
   223 	REPORT_FILES_NUM	/*   Number of files with trace reports   */
       
   224 
       
   225 } EReportFiles;
       
   226 
       
   227 
       
   228 /************************************/      
       
   229 /*      Report Severity values      */
       
   230 /************************************/
       
   231 
       
   232 /** \enum EReportSeverity
       
   233  * \brief Report Severity Types
       
   234  * 
       
   235  * \par Description
       
   236  * All available severity Levels of the events which are reported to user.\n
       
   237  * 
       
   238  * \sa
       
   239  */
       
   240 typedef enum
       
   241 {
       
   242     REPORT_SEVERITY_INIT           =  1,	/**< Init Level (event happened during initialization)			*/
       
   243     REPORT_SEVERITY_INFORMATION    =  2,	/**< Information Level											*/
       
   244     REPORT_SEVERITY_WARNING        =  3,	/**< Warning Level												*/
       
   245     REPORT_SEVERITY_ERROR          =  4,	/**< Error Level (error accored)  		 						*/
       
   246     REPORT_SEVERITY_FATAL_ERROR    =  5,	/**< Fatal-Error Level (fatal-error accored)					*/
       
   247     REPORT_SEVERITY_SM             =  6,	/**< State-Machine Level (event happened in State-Machine)		*/
       
   248     REPORT_SEVERITY_CONSOLE        =  7,	/**< Consol Level (event happened in Consol) 					*/
       
   249     REPORT_SEVERITY_MAX            = REPORT_SEVERITY_CONSOLE + 1	/**< Maximum number of report severity levels	*/
       
   250 
       
   251 } EReportSeverity;
       
   252 
       
   253 /** \struct TReport
       
   254  * \brief Report Module Object
       
   255  * 
       
   256  * \par Description
       
   257  * All the Databases and other parameters which are needed for reporting messages to user
       
   258  * 
       
   259  * \sa
       
   260  */
       
   261 typedef struct 
       
   262 {
       
   263     TI_HANDLE       hOs;												/**< Handle to Operating System Object																									*/
       
   264     TI_UINT8        aSeverityTable[REPORT_SEVERITY_MAX];				/**< Severities Table: Table which holds for each severity level a flag which indicates whether the severity is enabled for reporting	*/
       
   265 	char            aSeverityDesc[REPORT_SEVERITY_MAX][MAX_STRING_LEN];	/**< Severities Descriptors Table: Table which holds for each severity a string of its name, which is used in severity's reported messages		*/
       
   266     TI_UINT8        aFileEnable[REPORT_FILES_NUM];					    /**< Files table indicating per file if it is enabled for reporting	 */
       
   267 
       
   268 #ifdef PRINTF_ROLLBACK
       
   269     char            aFileName[REPORT_FILES_NUM][MAX_STRING_LEN];	    /**< Files names table inserted in the file's reported messages		 */
       
   270 #endif
       
   271 
       
   272 } TReport;
       
   273 
       
   274 /** \struct TReportParamInfo
       
   275  * \brief Report Parameter Information
       
   276  * 
       
   277  * \par Description
       
   278  * Struct which defines all the Databases and other parameters which are needed
       
   279  * for reporting messages to user. 
       
   280  * The actual Content of the Report Parameter Could be one of the followed (held in union): 
       
   281  * Severety Table | Module Table | Enable/Disable indication of debug module usage
       
   282  * 
       
   283  * \sa	EExternalParam, ETwdParam
       
   284  */
       
   285 typedef struct
       
   286 {
       
   287     TI_UINT32       paramType;								/**< The reported parameter type - one of External Parameters (which includes Set,Get, Module, internal number etc.)
       
   288 															* of Report Module. Used by user for Setting or Getting Report Module Paramters, for exaple Set/Get severety table
       
   289 															* to/from Report Module
       
   290 															*/
       
   291     TI_UINT32       paramLength;							/**< Length of reported parameter	*/
       
   292 
       
   293     union
       
   294     {
       
   295         TI_UINT8    aSeverityTable[REPORT_SEVERITY_MAX];	/**< Table which holds severity flag for every available LOG severity level. 
       
   296 															* This flag indicates for each severity - whether it is enabled for Logging or not.	
       
   297 															* User can Set/Get this Tabel
       
   298 															*/
       
   299         TI_UINT8    aFileEnable[REPORT_FILES_NUM]; 		/**< Table which holds file flag for every available LOG file.
       
   300 															* This flag indicates for each file - whether it is enabled for Logging or not.				
       
   301 															* User can Set/Get this Tabel
       
   302 															*/															
       
   303         TI_UINT32   uReportPPMode;							/**< Used by user for Indicating if Debug Module should be enabled/disabled																	*/
       
   304 
       
   305     } content;
       
   306 
       
   307 } TReportParamInfo;
       
   308 
       
   309 /** \struct TReportInitParams
       
   310  * \brief Report Init Parameters
       
   311  * 
       
   312  * \par Description
       
   313  * Struct which defines all the Databases needed for init and set the defualts of the Report Module.
       
   314  * 
       
   315  */
       
   316 typedef struct
       
   317 {
       
   318     /* Note: The arrays sizes are aligned to 4 byte to avoid padding added by the compiler! */
       
   319 	TI_UINT8	    aSeverityTable[(REPORT_SEVERITY_MAX + 3) & ~3];	/**< Table in the size of all available LOG severity levels which indicates for each severity - whether it is enabled for Logging or not.	*/
       
   320 	TI_UINT8   aFileEnable   [(REPORT_FILES_NUM    + 3) & ~3];	/**< Table in the size of all available LOG files which indicates for each file - whether it is enabled for Logging or not				*/				
       
   321 
       
   322 } TReportInitParams;
       
   323 
       
   324 
       
   325 
       
   326 /****************************/
       
   327 /* report module Macros		*/
       
   328 /****************************/
       
   329 
       
   330 /* The report mechanism is like that:
       
   331     Each file has a report flag. Each severity has a severity flag.
       
   332     Only if bits are enabled, the message is printed */
       
   333 /* The modules which have their report flag enable are indicated by a bit map in the reportModule 
       
   334     variable contained in the report handle*/
       
   335 /* The severities which have are enabled are indicated by a bit map in the reportSeverity
       
   336     variable contained in the report handle*/
       
   337 /* general trace messages */
       
   338 #ifndef PRINTF_ROLLBACK
       
   339 
       
   340 #define TRACE0(hReport, level, str) \
       
   341 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   342 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 0); } } while(0)
       
   343 
       
   344 #define TRACE1(hReport, level, str, p1) \
       
   345 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   346 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 1, (TI_UINT32)p1); } } while(0)
       
   347 
       
   348 #define TRACE2(hReport, level, str, p1, p2) \
       
   349 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   350 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 2, (TI_UINT32)p1, (TI_UINT32)p2); } } while(0)
       
   351 
       
   352 #define TRACE3(hReport, level, str, p1, p2, p3) \
       
   353 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   354 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 3, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3); } } while(0)
       
   355 
       
   356 #define TRACE4(hReport, level, str, p1, p2, p3, p4) \
       
   357 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   358 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 4, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4); } } while(0)
       
   359 
       
   360 #define TRACE5(hReport, level, str, p1, p2, p3, p4, p5) \
       
   361 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   362 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 5, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5); } } while(0)
       
   363 
       
   364 #define TRACE6(hReport, level, str, p1, p2, p3, p4, p5, p6) \
       
   365 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   366 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 6, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6); } } while(0)
       
   367 
       
   368 #define TRACE7(hReport, level, str, p1, p2, p3, p4, p5, p6, p7) \
       
   369 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   370 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 7, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7); } } while(0)
       
   371 
       
   372 #define TRACE8(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8) \
       
   373 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   374 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 8, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8); } } while(0)
       
   375 
       
   376 #define TRACE9(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9) \
       
   377 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   378 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 9, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9); } } while(0)
       
   379 
       
   380 #define TRACE10(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) \
       
   381 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   382 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 10, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9, (TI_UINT32)p10); } } while(0)
       
   383 
       
   384 #define TRACE11(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) \
       
   385 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   386 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 11, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9, (TI_UINT32)p10, (TI_UINT32)p11); } } while(0)
       
   387 
       
   388 #define TRACE12(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) \
       
   389 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   390 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 12, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9, (TI_UINT32)p10, (TI_UINT32)p11, (TI_UINT32)p12); } } while(0)
       
   391 
       
   392 #define TRACE13(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) \
       
   393 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   394 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 13, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9, (TI_UINT32)p10, (TI_UINT32)p11, (TI_UINT32)p12, (TI_UINT32)p13); } } while(0)
       
   395 
       
   396 #define TRACE14(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14) \
       
   397 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   398 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 14, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9, (TI_UINT32)p10, (TI_UINT32)p11, (TI_UINT32)p12, (TI_UINT32)p13, (TI_UINT32)p14); } } while(0)
       
   399 
       
   400 #define TRACE15(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) \
       
   401 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   402 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 15, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9, (TI_UINT32)p10, (TI_UINT32)p11, (TI_UINT32)p12, (TI_UINT32)p13, (TI_UINT32)p14, (TI_UINT32)p15); } } while(0)
       
   403 
       
   404 #define TRACE16(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16) \
       
   405 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   406 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 16, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9, (TI_UINT32)p10, (TI_UINT32)p11, (TI_UINT32)p12, (TI_UINT32)p13, (TI_UINT32)p14, (TI_UINT32)p15, (TI_UINT32)p16); } } while(0)
       
   407 
       
   408 #define TRACE17(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17) \
       
   409 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   410 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 17, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9, (TI_UINT32)p10, (TI_UINT32)p11, (TI_UINT32)p12, (TI_UINT32)p13, (TI_UINT32)p14, (TI_UINT32)p15, (TI_UINT32)p16, (TI_UINT32)p17); } } while(0)
       
   411 
       
   412 #define TRACE18(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18) \
       
   413 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   414 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 18, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9, (TI_UINT32)p10, (TI_UINT32)p11, (TI_UINT32)p12, (TI_UINT32)p13, (TI_UINT32)p14, (TI_UINT32)p15, (TI_UINT32)p16, (TI_UINT32)p17, (TI_UINT32)p18); } } while(0)
       
   415 
       
   416 #define TRACE19(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19) \
       
   417 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   418 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 19, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9, (TI_UINT32)p10, (TI_UINT32)p11, (TI_UINT32)p12, (TI_UINT32)p13, (TI_UINT32)p14, (TI_UINT32)p15, (TI_UINT32)p16, (TI_UINT32)p17, (TI_UINT32)p18, (TI_UINT32)p19); } } while(0)
       
   419 
       
   420 #define TRACE20(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20) \
       
   421 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   422 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 20, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9, (TI_UINT32)p10, (TI_UINT32)p11, (TI_UINT32)p12, (TI_UINT32)p13, (TI_UINT32)p14, (TI_UINT32)p15, (TI_UINT32)p16, (TI_UINT32)p17, (TI_UINT32)p18, (TI_UINT32)p19, (TI_UINT32)p20); } } while(0)
       
   423 
       
   424 #define TRACE21(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21) \
       
   425 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   426 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 21, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9, (TI_UINT32)p10, (TI_UINT32)p11, (TI_UINT32)p12, (TI_UINT32)p13, (TI_UINT32)p14, (TI_UINT32)p15, (TI_UINT32)p16, (TI_UINT32)p17, (TI_UINT32)p18, (TI_UINT32)p19, (TI_UINT32)p20, (TI_UINT32)p21); } } while(0)
       
   427 
       
   428 #define TRACE22(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22) \
       
   429 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   430 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 22, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9, (TI_UINT32)p10, (TI_UINT32)p11, (TI_UINT32)p12, (TI_UINT32)p13, (TI_UINT32)p14, (TI_UINT32)p15, (TI_UINT32)p16, (TI_UINT32)p17, (TI_UINT32)p18, (TI_UINT32)p19, (TI_UINT32)p20, (TI_UINT32)p21, (TI_UINT32)p22); } } while(0)
       
   431 
       
   432 #define TRACE25(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25) \
       
   433 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   434 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 22, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9, (TI_UINT32)p10, (TI_UINT32)p11, (TI_UINT32)p12, (TI_UINT32)p13, (TI_UINT32)p14, (TI_UINT32)p15, (TI_UINT32)p16, (TI_UINT32)p17, (TI_UINT32)p18, (TI_UINT32)p19, (TI_UINT32)p20, (TI_UINT32)p21, (TI_UINT32)p22, (TI_UINT32)p23, (TI_UINT32)p24, (TI_UINT32)p25); } } while(0)
       
   435 
       
   436 #define TRACE31(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29, p30, p31) \
       
   437 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   438 { os_Trace((((TReport *)hReport)->hOs), level, __FILE_ID__, __LINE__, 22, (TI_UINT32)p1, (TI_UINT32)p2, (TI_UINT32)p3, (TI_UINT32)p4, (TI_UINT32)p5, (TI_UINT32)p6, (TI_UINT32)p7, (TI_UINT32)p8, (TI_UINT32)p9, (TI_UINT32)p10, (TI_UINT32)p11, (TI_UINT32)p12, (TI_UINT32)p13, (TI_UINT32)p14, (TI_UINT32)p15, (TI_UINT32)p16, (TI_UINT32)p17, (TI_UINT32)p18, (TI_UINT32)p19, (TI_UINT32)p20, (TI_UINT32)p21, (TI_UINT32)p22, (TI_UINT32)p23, (TI_UINT32)p24, (TI_UINT32)p25, (TI_UINT32)p26, (TI_UINT32)p27, (TI_UINT32)p28, (TI_UINT32)p29, (TI_UINT32)p30, (TI_UINT32)p31); } } while(0)
       
   439 
       
   440 
       
   441 #else /* PRINTF_ROLLBACK */
       
   442 
       
   443 #define TRACE0(hReport, level, str) \
       
   444 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   445 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str); } } while(0)
       
   446 
       
   447 #define TRACE1(hReport, level, str, p1) \
       
   448 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   449 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1); } } while(0)
       
   450 
       
   451 #define TRACE2(hReport, level, str, p1, p2) \
       
   452 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   453 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2); } } while(0)
       
   454 
       
   455 #define TRACE3(hReport, level, str, p1, p2, p3) \
       
   456 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   457 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3); } } while(0)
       
   458 
       
   459 #define TRACE4(hReport, level, str, p1, p2, p3, p4) \
       
   460 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   461 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4); } } while(0)
       
   462 
       
   463 #define TRACE5(hReport, level, str, p1, p2, p3, p4, p5) \
       
   464 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   465 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5); } } while(0)
       
   466 
       
   467 #define TRACE6(hReport, level, str, p1, p2, p3, p4, p5, p6) \
       
   468 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   469 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6); } } while(0)
       
   470 
       
   471 #define TRACE7(hReport, level, str, p1, p2, p3, p4, p5, p6, p7) \
       
   472 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   473 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7); } } while(0)
       
   474 
       
   475 #define TRACE8(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8) \
       
   476 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   477 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8); } } while(0)
       
   478 
       
   479 #define TRACE9(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9) \
       
   480 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   481 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9); } } while(0)
       
   482 
       
   483 #define TRACE10(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) \
       
   484 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   485 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } } while(0)
       
   486 
       
   487 #define TRACE11(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) \
       
   488 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   489 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } } while(0)
       
   490 
       
   491 #define TRACE12(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) \
       
   492 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   493 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } } while(0)
       
   494 
       
   495 #define TRACE13(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) \
       
   496 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   497 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } } while(0)
       
   498 
       
   499 #define TRACE14(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14) \
       
   500 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   501 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } } while(0)
       
   502 
       
   503 #define TRACE15(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) \
       
   504 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   505 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } } while(0)
       
   506 
       
   507 #define TRACE16(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16) \
       
   508 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   509 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } } while(0)
       
   510 
       
   511 #define TRACE17(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17) \
       
   512 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   513 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } } while(0)
       
   514 
       
   515 #define TRACE18(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18) \
       
   516 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   517 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } } while(0)
       
   518 
       
   519 #define TRACE19(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19) \
       
   520 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   521 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } } while(0)
       
   522 
       
   523 #define TRACE20(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20) \
       
   524 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   525 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } } while(0)
       
   526 
       
   527 #define TRACE21(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21) \
       
   528 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   529 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21); } } while(0)
       
   530 
       
   531 #define TRACE22(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22) \
       
   532 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   533 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22); } } while(0)
       
   534 
       
   535 #define TRACE25(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25) \
       
   536 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   537 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25); } } while(0)
       
   538 
       
   539 #define TRACE31(hReport, level, str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29, p30, p31) \
       
   540 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[level]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   541 { os_printf ("%s, %s:", ((TReport *)hReport)->aFileName[__FILE_ID__], ((TReport *)hReport)->aSeverityDesc[level]); os_printf (str, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p27, p27, p28, p29, p30, p31); } } while(0)
       
   542 
       
   543 #endif /* #ifdef PRINTF_ROLLBACK */
       
   544 
       
   545 
       
   546 /****************************/
       
   547 /* report module Macros		*/
       
   548 /****************************/
       
   549 
       
   550 /* The report mechanism is like that:
       
   551 Each file has a report flag. Each severity has a severity flag.
       
   552 Only if bits are enabled, the message is printed */
       
   553 /* The modules which have their report flag enable are indicated by a bit map in the reportModule 
       
   554 variable contained in the report handle*/
       
   555 /* The severities which have are enabled are indicated by a bit map in the reportSeverity
       
   556 variable contained in the report handle*/
       
   557 
       
   558 #ifdef REPORT_LOG
       
   559 
       
   560 /** \def WLAN_OS_REPORT
       
   561  * \brief Macro which writes a message to user via specific Operating System printf.
       
   562  * E.g. print is done using the relevant used OS printf method.
       
   563  */
       
   564 #define WLAN_OS_REPORT(msg)                                           \
       
   565 	do { os_printf msg;} while(0)
       
   566 
       
   567 
       
   568 #ifdef INIT_MESSAGES
       
   569 /** \def WLAN_INIT_REPORT
       
   570  * \brief Macro which writes a message to user via specific Operating System printf.
       
   571  * E.g. print is done using the relevant used OS printf method.
       
   572  */
       
   573 #define WLAN_INIT_REPORT(msg)                                         \
       
   574     do { os_printf msg;} while(0)
       
   575 #else
       
   576 /** \def WLAN_INIT_REPORT
       
   577  * \brief Macro which writes a message to user via specific Operating System printf.
       
   578  * E.g. print is done using the relevant used OS printf method.
       
   579  */
       
   580 #define WLAN_INIT_REPORT(msg) 
       
   581 #endif
       
   582 
       
   583 #define TRACE_INFO_HEX(hReport, data, datalen) \
       
   584 	do { if (hReport && (((TReport *)hReport)->aSeverityTable[REPORT_SEVERITY_INFORMATION]) && (((TReport *)hReport)->aFileEnable[__FILE_ID__])) \
       
   585 { report_PrintDump (data, datalen); } } while(0)
       
   586 
       
   587 #else   /* REPORT_LOG */
       
   588 
       
   589 /* NOTE: Keep a dummy report function call to treat compilation warnings */
       
   590 
       
   591 /** \def WLAN_OS_REPORT
       
   592  * \brief Dummy macro: Nothing is done 
       
   593  */
       
   594 #define WLAN_OS_REPORT(msg)                                           \
       
   595     do { } while (0)
       
   596 
       
   597 /** \def WLAN_INIT_REPORT
       
   598  * \brief Dummy macro: Nothing is done 
       
   599  */
       
   600 #define WLAN_INIT_REPORT(msg)                                         \
       
   601     do { } while (0)
       
   602 
       
   603                             
       
   604 #define TRACE_INFO_HEX(hReport, data, datalen) \
       
   605    do { } while (0)
       
   606 
       
   607 #endif  /* REPORT_LOG */
       
   608 
       
   609 
       
   610 /****************************/
       
   611 /* report module prototypes */
       
   612 /****************************/
       
   613 
       
   614 /** \brief  Create Report Module Object
       
   615  * \param  hOs   			- OS module object handle
       
   616  * \return Handle to the report module on success, NULL otherwise
       
   617  * 
       
   618  * \par Description
       
   619  * Report module creation function, called by the config mgr in creation phase	\n
       
   620  * performs the following:	\n
       
   621  *	-   Allocate the report handle
       
   622  */ 
       
   623 TI_HANDLE report_Create (TI_HANDLE hOs);
       
   624 /** \brief  Set Report Module Defaults
       
   625  * \param  hReport   	- Report module object handle
       
   626  * \param  pInitParams	- Pointer to Input Init Parameters
       
   627  * \return TI_OK on success or TI_NOK on failure
       
   628  * 
       
   629  * \par Description
       
   630  * Report module configuration function, called by the config mgr in configuration phase	\n
       
   631  * performs the following:	\n
       
   632  *	-   Reset & init local variables
       
   633  *	-   Resets all report modules bits
       
   634  *	-   Resets all severities bits
       
   635  *	-   Init the description strings * 
       
   636  */ 
       
   637 TI_STATUS report_SetDefaults            (TI_HANDLE hReport, TReportInitParams *pInitParams);
       
   638 /** \brief  Unload Report Module
       
   639  * \param  hReport   	- Report module object handle
       
   640  * \return TI_OK on success or TI_NOK on failure
       
   641  * 
       
   642  * \par Description
       
   643  * Report Module unload function, called by the config mgr in the unload phase	\n
       
   644  * performs the following:	\n
       
   645  *	-   Free all memory allocated by the module		
       
   646  */ 
       
   647 TI_STATUS report_Unload                 (TI_HANDLE hReport);
       
   648 /** \brief  Set Report Module
       
   649  * \param  hReport   	- Report module object handle
       
   650  * \return TI_OK on success or TI_NOK on failure
       
   651  * 
       
   652  * \par Description
       
   653  * Enables the relevant module for reporting -  according to the received module index 
       
   654  */ 
       
   655 TI_STATUS report_SetReportModule        (TI_HANDLE hReport, TI_UINT8 module_index);
       
   656 /** \brief  Clear Report Module
       
   657  * \param  hReport   	- Report module object handle
       
   658  * \param  module_index	- Index of file to be disable for reporting 
       
   659  * \return TI_OK on success or TI_NOK on failure
       
   660  * 
       
   661  * \par Description
       
   662  * Disables the relevant module for reporting -  according to the received module index 
       
   663  */ 
       
   664 TI_STATUS report_ClearReportModule      (TI_HANDLE hReport, TI_UINT8 module_index);
       
   665 /** \brief  Get Report files Table
       
   666  * \param  hReport   	- Report module object handle
       
   667  * \param  pFiles		- Pointer to output files Table
       
   668  * \return TI_OK on success or TI_NOK on failure
       
   669  * 
       
   670  * \par Description
       
   671  * Returns the Modules Table (the table which holds Modules reporting indication) held in Report Module Object
       
   672  */ 
       
   673 TI_STATUS report_GetReportFilesTable    (TI_HANDLE hReport, TI_UINT8 *pFiles); 
       
   674 /** \brief  Set Report Files Table
       
   675  * \param  hReport   	- Report module object handle
       
   676  * \param  pFiles		- Pointer to input files Table
       
   677  * \return TI_OK on success or TI_NOK on failure
       
   678  * 
       
   679  * \par Description
       
   680  * Updates the Modules Table: copies the input Modules Table (the table which holds Modules reporting indication) 
       
   681  * to the Modules Table which is held in Report Module Object
       
   682  */ 
       
   683 TI_STATUS report_SetReportFilesTable    (TI_HANDLE hReport, TI_UINT8 *pFiles); 
       
   684 /** \brief  Get Report Severity Table
       
   685  * \param  hReport   	- Report module object handle
       
   686  * \param  pSeverities	- Pointer to input Severity Table
       
   687  * \return TI_OK on success or TI_NOK on failure
       
   688  * 
       
   689  * \par Description
       
   690  * Returns the Severities Table (the table which holds Severities reporting indication) held in Report Module Object
       
   691  */ 
       
   692 TI_STATUS report_GetReportSeverityTable (TI_HANDLE hReport, TI_UINT8 *pSeverities);
       
   693 /** \brief  Set Report Severity Table
       
   694  * \param  hReport   	- Report module object handle
       
   695  * \param  pSeverities	- Pointer to input Severity Table
       
   696  * \return TI_OK on success or TI_NOK on failure
       
   697  * 
       
   698  * \par Description
       
   699  * Updates the Severities Table: copies the input Severities Table (the table which holds Severities reporting indication) 
       
   700  * to the Severities Table which is held in Report Module Object
       
   701  */ 
       
   702 TI_STATUS report_SetReportSeverityTable (TI_HANDLE hReport, TI_UINT8 *pSeverities);
       
   703 /** \brief  Set Report Parameters
       
   704  * \param  hReport   	- Report module object handle
       
   705  * \param  pParam		- Pointer to input Report Parameters Information
       
   706  * \return TI_OK on success or TI_NOK on failure
       
   707  * 
       
   708  * \par Description
       
   709  * Report set param function sets parameter/s to Report Module Object. 
       
   710  * Called by the following:
       
   711  *	-   configuration Manager in order to set a parameter/s from the OS abstraction layer
       
   712  *	-   Form inside the driver 
       
   713  */ 
       
   714 TI_STATUS report_SetParam               (TI_HANDLE hReport, TReportParamInfo *pParam);                   
       
   715 /** \brief  Get Report Parameters
       
   716  * \param  hReport   	- Report module object handle
       
   717  * \param  pParam		- Pointer to output Report Parameters Information
       
   718  * \return TI_OK on success or TI_NOK on failure
       
   719  * 
       
   720  * \par Description
       
   721  * Report get param function gets parameter/s from Report Module Object. 
       
   722  * Called by the following:
       
   723  *	-   configuration Manager in order to get a parameter/s from the OS abstraction layer
       
   724  *	-   from inside the driver 
       
   725  */ 
       
   726 TI_STATUS report_GetParam               (TI_HANDLE hReport, TReportParamInfo *pParam); 
       
   727 /** \brief Report Dump
       
   728  * \param  pBuffer  - Pointer to input HEX buffer
       
   729  * \param  pString	- Pointer to output string
       
   730  * \param  size		- size of output string
       
   731  * \return TI_OK on success or TI_NOK on failure
       
   732  * 
       
   733  * \par Description
       
   734  * Converts hex buffer to string buffer
       
   735  * NOTE:	1. The caller has to make sure that the string size is at lease: ((Size * 2) + 1)
       
   736  * 	      	2. A string terminator is inserted into lase char of the string 
       
   737  */ 
       
   738 TI_STATUS report_Dump 					(TI_UINT8 *pBuffer, char *pString, TI_UINT32 size);
       
   739 /** \brief Report Print Dump
       
   740  * \param  pData  	- Pointer to input data buffer
       
   741  * \param  datalen	- size of input data buffer
       
   742  * \return TI_OK on success or TI_NOK on failure
       
   743  * 
       
   744  * \par Description
       
   745  * Performs HEX dump of input Data buffer. Used for debug only! 
       
   746  */ 
       
   747 TI_STATUS report_PrintDump 				(TI_UINT8 *pData, TI_UINT32 datalen);
       
   748 
       
   749 /** \brief Sets bRedirectOutputToLogger
       
   750 * \param  value  	    - True if to direct output to remote PC
       
   751 * \param  hEvHandler	- Event handler
       
   752 */ 
       
   753 void os_setDebugOutputToLogger(TI_BOOL value);
       
   754 
       
   755 
       
   756 #endif /* __REPORT_H__ */
       
   757 
       
   758