1 //******************************************************************
3 // Copyright 2014 Intel Mobile Communications GmbH All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
28 #include "logger_types.h"
31 #include <android/log.h>
32 #elif defined(__TIZEN__)
34 #elif defined(ARDUINO)
36 #include "avr/pgmspace.h"
45 * Helper for unused warning.
48 #define UNUSED(x) (void)(x)
52 // Use the PCF macro to wrap strings stored in FLASH on the Arduino
53 // Example: OIC_LOG(INFO, TAG, PCF("Entering function"));
56 #define PCF(str) ((PROGMEM const char *)(F(str)))
58 #define PCF(str) ((PROGMEM const char *)(PSTR(str)))
64 // Max buffer size used in variable argument log function
65 #define MAX_LOG_V_BUFFER_SIZE (256)
70 DEBUG = DLOG_INFO, // DLOG_INFO : 4
72 WARNING = DLOG_WARN, // DLOG_WARN : 5
73 ERROR = DLOG_ERROR, // DLOG_ERROR : 6
75 DEBUG_LITE = DLOG_INFO,
76 INFO_LITE = DLOG_INFO,
81 /** @todo temporary work-around until better names with prefixes are used for the enum values. */
92 DEBUG_LITE, // The DEBUG log for Lite device
93 INFO_LITE, // The INFO log for Lite device
94 INFO_PRIVATE, // The log contained private data
100 #define IF_OC_PRINT_LOG_LEVEL(level) if (DEBUG <= (level))
101 #elif defined(SET_LOG_INFO)
102 #define IF_OC_PRINT_LOG_LEVEL(level) if (INFO <= (level))
103 #elif defined(SET_LOG_ERROR)
104 #define IF_OC_PRINT_LOG_LEVEL(level) if (ERROR <= (level) && INFO_PRIVATE != (level))
105 #elif defined(SET_LOG_WARNING)
106 #define IF_OC_PRINT_LOG_LEVEL(level) if (WARNING <= (level) && INFO_PRIVATE != (level))
107 #elif defined(SET_LOG_FATAL)
108 #define IF_OC_PRINT_LOG_LEVEL(level) if (FATAL <= (level) && INFO_PRIVATE != (level))
110 #define IF_OC_PRINT_LOG_LEVEL(level) if (DEBUG <= (level))
113 #define IF_OC_PRINT_PRIVATE_LOG_LEVEL(level) \
114 if (false == OCGetPrivateLogLevel() || (true == OCGetPrivateLogLevel() && INFO_PRIVATE != (level))) \
116 #define MAX_LOG_BUFFER_SIZE (4096)
119 * Set log level and privacy log to print.
121 * @param level - log level.
122 * @param hidePrivateLogEntries - Hide Private Log.
124 void OCSetLogLevel(LogLevel level, bool hidePrivateLogEntries);
127 * get private log flag.
128 * @return private log flag
130 bool OCGetPrivateLogLevel();
134 * Output the contents of the specified buffer (in hex) with the specified priority level.
136 * @param[in] level DEBUG, INFO, WARNING, ERROR, FATAL
137 * @param[in] tag Module name
138 * @param[in] buffer pointer to buffer of bytes
139 * @param[in] bufferSize max number of byte in buffer
141 void OCLogBuffer(LogLevel level, const char * tag, const uint8_t * buffer, uint16_t bufferSize);
142 void OCPrintCALogBuffer(LogLevel level, const char *tag, const uint8_t *buffer,
143 uint16_t bufferSize, uint8_t isHeader);
145 #define OCLog(level,tag,mes) LOG_(LOG_ID_MAIN, (level), (tag), mes)
146 #define OCLogv(level,tag,fmt,args...) LOG_(LOG_ID_MAIN, (level),tag,fmt,##args)
147 #elif !defined(ARDUINO)
149 * Configure logger to use a context that defines a custom logger function
151 * @param ctx - pointer to oc_log_ctx_t struct that defines custom logging functions
153 void OCLogConfig(oc_log_ctx_t *ctx);
156 * Initialize the logger. Optional on Android and Linux. Configures serial port on Arduino
161 * Called to Free dyamically allocated resources used with custom logging.
162 * Not necessary if default logging is used
165 void OCLogShutdown();
168 * Output a variable argument list log string with the specified priority level.
169 * Only defined for Linux and Android
171 * @param level - DEBUG, INFO, WARNING, ERROR, FATAL
172 * @param tag - Module name
173 * @param format - variadic log string
175 void OCLogv(LogLevel level, const char * tag, const char * format, ...)
176 #if defined(__GNUC__)
177 __attribute__ ((format(printf, 3, 4)))
182 * Output a log string with the specified priority level.
183 * Only defined for Linux and Android
185 * @param level - DEBUG, INFO, WARNING, ERROR, FATAL
186 * @param tag - Module name
187 * @param logStr - log string
189 void OCLog(LogLevel level, const char * tag, const char * logStr);
192 * Output the contents of the specified buffer (in hex) with the specified priority level.
194 * @param level - DEBUG, INFO, WARNING, ERROR, FATAL
195 * @param tag - Module name
196 * @param buffer - pointer to buffer of bytes
197 * @param bufferSize - max number of byte in buffer
199 void OCLogBuffer(LogLevel level, const char * tag, const uint8_t * buffer, uint16_t bufferSize);
201 void OCPrintCALogBuffer(LogLevel level, const char *tag, const uint8_t *buffer,
202 uint16_t bufferSize, uint8_t isHeader);
204 #else // For arduino platforms
206 * Initialize the serial logger for Arduino
207 * Only defined for Arduino
212 * Output a log string with the specified priority level.
213 * Only defined for Arduino. Uses PROGMEM strings
215 * @param level - DEBUG, INFO, WARNING, ERROR, FATAL
216 * @param tag - Module name
217 * @param lineNum- line Number
218 * @param logStr - log string
220 void OCLog(LogLevel level, PROGMEM const char *tag, const int lineNum,
221 PROGMEM const char *logStr);
224 * Output the contents of the specified buffer (in hex) with the specified priority level.
226 * @param level - DEBUG, INFO, WARNING, ERROR, FATAL
227 * @param tag - Module name
228 * @param buffer - pointer to buffer of bytes
229 * @param bufferSize - max number of byte in buffer
231 void OCLogBuffer(LogLevel level, const char *tag, const uint8_t *buffer, size_t bufferSize);
234 * Output a variable argument list log string with the specified priority level.
236 * @param level - DEBUG, INFO, WARNING, ERROR, FATAL
237 * @param tag - Module name
238 * @param lineNum- line Number
239 * @param format - variadic log string
241 void OCLogv(LogLevel level, PROGMEM const char *tag, const int lineNum,
242 PROGMEM const char *format, ...)
243 #if defined(__GNUC__)
244 __attribute__ ((format(printf, 4, 5)))
252 #define OIC_LOG(level,tag,mes) \
254 IF_OC_PRINT_LOG_LEVEL((level)) \
255 IF_OC_PRINT_PRIVATE_LOG_LEVEL((level)) \
257 if ((level) == INFO_PRIVATE) \
258 LOG_(LOG_ID_MAIN, DLOG_INFO, (tag), mes); \
260 LOG_(LOG_ID_MAIN, (level), (tag), mes); \
264 #define OIC_LOG_V(level,tag,fmt,args...) \
266 IF_OC_PRINT_LOG_LEVEL((level)) \
267 IF_OC_PRINT_PRIVATE_LOG_LEVEL((level)) \
269 if ((level) == INFO_PRIVATE) \
270 LOG_(LOG_ID_MAIN, DLOG_INFO, (tag), fmt, ##args); \
272 LOG_(LOG_ID_MAIN, (level), (tag), fmt, ##args); \
276 #define OIC_LOG_BUFFER(level, tag, buffer, bufferSize) \
278 IF_OC_PRINT_LOG_LEVEL((level)) \
279 OCLogBuffer((level), (tag), (buffer), (bufferSize)); \
282 #define OIC_LOG_CA_BUFFER(level, tag, buffer, bufferSize, isHeader) \
284 IF_OC_PRINT_LOG_LEVEL((level)) \
285 OCPrintCALogBuffer((level), (tag), (buffer), (bufferSize), (isHeader)); \
288 #else // NO __TIZEN__ - These macros are defined for Linux, Android, Win32, and Arduino
289 #define OIC_LOG_INIT() OCLogInit()
292 #define OIC_LOG_BUFFER(level, tag, buffer, bufferSize) \
294 IF_OC_PRINT_LOG_LEVEL((level)) \
295 OCLogBuffer((level), PCF(tag), (buffer), (bufferSize)); \
298 // Don't define variable argument log function for Arduino
299 #define OIC_LOG_V(level, tag, format, ...) \
301 IF_OC_PRINT_LOG_LEVEL((level)) \
302 OCLogv((level), PCF(tag), __LINE__, PCF(format),__VA_ARGS__); \
305 #define OIC_LOG_CONFIG(ctx)
306 #define OIC_LOG_SHUTDOWN()
307 #define OIC_LOG(level, tag, logStr) \
309 IF_OC_PRINT_LOG_LEVEL((level)) \
310 OCLog((level), PCF(tag), __LINE__, PCF(logStr)); \
313 #define OIC_LOG_V(level, tag, ...)
316 #define OIC_LOG_BUFFER(level, tag, buffer, bufferSize) \
318 IF_OC_PRINT_LOG_LEVEL((level)) \
319 OCLogBuffer((level), (tag), (buffer), (bufferSize)); \
322 #define OIC_LOG_CA_BUFFER(level, tag, buffer, bufferSize, isHeader) \
324 IF_OC_PRINT_LOG_LEVEL((level)) \
325 OCPrintCALogBuffer((level), (tag), (buffer), (bufferSize), (isHeader)); \
328 #define OIC_LOG_CONFIG(ctx) OCLogConfig((ctx))
329 #define OIC_LOG_SHUTDOWN() OCLogShutdown()
330 #define OIC_LOG(level, tag, logStr) \
332 IF_OC_PRINT_LOG_LEVEL((level)) \
333 OCLog((level), (tag), (logStr)); \
336 // Define variable argument log function for Linux, Android, and Win32
337 #define OIC_LOG_V(level, tag, ...) \
339 IF_OC_PRINT_LOG_LEVEL((level)) \
340 OCLogv((level), (tag), __VA_ARGS__); \
346 #define OIC_LOG_CONFIG(ctx)
347 #define OIC_LOG_SHUTDOWN()
348 #define OIC_LOG(level, tag, logStr)
349 #define OIC_LOG_V(level, tag, ...)
350 #define OIC_LOG_BUFFER(level, tag, buffer, bufferSize)
351 #define OIC_LOG_CA_BUFFER(level, tag, buffer, bufferSize, isHeader)
352 #define OIC_LOG_INIT()
357 #endif // __cplusplus
359 #endif /* LOGGER_H_ */