#ifndef HAP_FARF_H #define HAP_FARF_H /** * Copyright (c) 2019, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of The Linux Foundation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AEEStdDef.h" #include "HAP_debug.h" /** * FARF macro used for logging * * Compile time logging options * ----------------------------- * * Logging is controlled via conditional compilation. A FARF * level should be defined to 1 for FARF macros to be compiled * in. For example: * * #define FARF_LOW 1 * #include "HAP_farf.h" * * FARF(LOW, "something happened: %s", (const char*)string); * * If FARF_LOW is defined to 0, as it is by default, the above * FARF string will not be compiled in, if it is defined to 1 it * will be compiled in. Users can also define their own custom * levels. For example: * * #include "HAP_farf.h" * #define FARF_MYTRACE 1 * #define FARF_MYTRACE_LEVEL HAP_LEVEL_LOW * * FARF(MYTRACE, "custom trace in file %s on line %d", __FILE__, __LINE__); * * The LEVEL define tells FARF what logging level to * use. These are mapped to their diag level counterparts, in * the above example the message will be logged to diag's LOW * level. * * Messages logged with ALWAYS level are always compiled in and logged * ------ * * When building the Debug variant or builds defining _DEBUG the * following FARF levels will be enabled: * * HIGH * ERROR * FATAL * * * * Run time logging options * -------------------------- * * In order to enable run-time logging (logging that can be enabled / disabled * at run-time), the FARF_RUNTIME_* macros should be used. * * Log messages sent with these macros are compiled in by default. However by * these messages WILL NOT be logged by default. In order to enable logging, * the FASTRPC process will need to either call the * HAP_SetFARFRuntimeLoggingParams() API, or by adding a .farf * file to the HLOS file system with the appropriate contents. * * #include "HAP_farf.h" * FARF(RUNTIME_HIGH, "something happened: %s", (const char*)string); * */ /* * @param x, the FARF level defined to either 0 to disable compilation or 1 to enable. * @param ..., format string and arguments. */ #define FARF(x, ...) _FARF_PASTE(_FARF_,_FARF_VAL(FARF_##x))(x, ##__VA_ARGS__) /* by default _DEBUG turns on ALWAYS, HIGH, ERROR, FATAL * */ #ifdef _DEBUG #ifndef FARF_HIGH #define FARF_HIGH 1 #endif #ifndef FARF_ERROR #define FARF_ERROR 1 #endif #ifndef FARF_FATAL #define FARF_FATAL 1 #endif #endif /* Compile time macros. Set these to 1 to enable logging at that level. Setting them to 0 will cause them to be COMPILED out . Example Usage: #define FARF_HIGH 1 FARF(HIGH,"Log message"); Defining _DEBUG will automatically enable compiled log messages with priority higher than HIGH. The ALWAYS macro will cause log messages to be ALWAYS compiled in. FARF(ALWAYS,"Log message") */ #ifndef FARF_ALWAYS #define FARF_ALWAYS 1 /* 0 turns me off */ #endif #define FARF_ALWAYS_LEVEL HAP_LEVEL_HIGH #ifndef FARF_LOW #define FARF_LOW 0 /* 0 turns me off */ #endif #define FARF_LOW_LEVEL HAP_LEVEL_LOW #ifndef FARF_MEDIUM #define FARF_MEDIUM 0 /* 0 turns me off */ #endif #define FARF_MEDIUM_LEVEL HAP_LEVEL_MEDIUM #ifndef FARF_HIGH #define FARF_HIGH 0 /* 0 turns me off */ #endif #define FARF_HIGH_LEVEL HAP_LEVEL_HIGH #ifndef FARF_ERROR #define FARF_ERROR 0 /* 0 turns me off */ #endif #define FARF_ERROR_LEVEL HAP_LEVEL_ERROR #ifndef FARF_FATAL #define FARF_FATAL 0 /* 0 turns me off */ #endif #define FARF_FATAL_LEVEL HAP_LEVEL_FATAL /* Runtime FARF macros. FARFs with these levels can be enabled at runtime. They are turned OFF by default. Example Usage: FARF(RUNTIME_HIGH,"Log message"); */ #ifndef FARF_RUNTIME_LOW #define FARF_RUNTIME_LOW 1 /* 0 turns me off */ #endif #define FARF_RUNTIME_LOW_LEVEL (HAP_LEVEL_RUNTIME | HAP_LEVEL_LOW) #ifndef FARF_RUNTIME_MEDIUM #define FARF_RUNTIME_MEDIUM 1 /* 0 turns me off */ #endif #define FARF_RUNTIME_MEDIUM_LEVEL (HAP_LEVEL_RUNTIME | HAP_LEVEL_MEDIUM) #ifndef FARF_RUNTIME_HIGH #define FARF_RUNTIME_HIGH 1 /* 0 turns me off */ #endif #define FARF_RUNTIME_HIGH_LEVEL (HAP_LEVEL_RUNTIME | HAP_LEVEL_HIGH) #ifndef FARF_RUNTIME_ERROR #define FARF_RUNTIME_ERROR 1 /* 0 turns me off */ #endif #define FARF_RUNTIME_ERROR_LEVEL (HAP_LEVEL_RUNTIME | HAP_LEVEL_ERROR) #ifndef FARF_RUNTIME_FATAL #define FARF_RUNTIME_FATAL 1 /* 0 turns me off */ #endif #define FARF_RUNTIME_FATAL_LEVEL (HAP_LEVEL_RUNTIME | HAP_LEVEL_FATAL) //internal macros #define _FARF_PASTE(a,b) _FARF_PASTE_(a,b) #define _FARF_PASTE_(a,b) a##b #define _FARF_VAL(a) a //internal macro //this one is used when farfs are not compiled in #define _FARF_0(x, ...) #ifndef __FILENAME__ #define __FILENAME__ __FILE__ #endif //lint -emacro(506,FARF) Constant Boolean Value //lint -emacro(774,FARF) Boolean within always evaluates to True //this one is used when farfs are compiled in #define _FARF_1(x, ...) \ do { \ if(0 == (HAP_debug_v2)) { \ _HAP_debug_v2(FARF_##x##_LEVEL, __FILENAME__, __LINE__, ##__VA_ARGS__); \ } else { \ if (FARF_##x##_LEVEL & HAP_LEVEL_RUNTIME) { \ if (0 != HAP_debug_runtime) { \ HAP_debug_runtime(FARF_##x##_LEVEL ^ HAP_LEVEL_RUNTIME , __FILENAME__, __LINE__, ##__VA_ARGS__); \ } else { \ break; \ } \ } else { \ HAP_debug_v2(FARF_##x##_LEVEL, __FILENAME__, __LINE__, ##__VA_ARGS__); \ } \ } \ } while (0) #endif /* #ifndef HAP_FARF_H */