Merge "Merge branch 'master' into resource-encapsulation" into resource-encapsulation
[platform/upstream/iotivity.git] / resource / csdk / logger / include / logger.h
1 //******************************************************************
2 //
3 // Copyright 2014 Intel Mobile Communications GmbH All Rights Reserved.
4 //
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 //
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
10 //
11 //      http://www.apache.org/licenses/LICENSE-2.0
12 //
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.
18 //
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21 #ifndef LOGGER_H_
22 #define LOGGER_H_
23
24 #include <stdint.h>
25 #include <stdio.h>
26 #include <stdarg.h>
27 #include "oc_logger.h"
28 #include "oc_console_logger.h"
29
30 #ifdef __ANDROID__
31     #include <android/log.h>
32 #elif defined(__TIZEN__)
33 #include <dlog.h>
34 #elif defined ARDUINO
35     #include "Arduino.h"
36     #include <avr/pgmspace.h>
37 #endif
38
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42
43 // Use the PCF macro to wrap strings stored in FLASH on the Arduino
44 // Example:  OC_LOG(INFO, TAG, PCF("Entering function"));
45 #ifdef ARDUINO
46 #ifdef __cplusplus
47 #define PCF(str)  ((PROGMEM const char *)(F(str)))
48 #else
49 #define PCF(str)  ((PROGMEM const char *)(PSTR(str)))
50 #endif //__cplusplus
51 #else
52     #define PCF(str) str
53 #endif
54
55 // Max buffer size used in variable argument log function
56 #define MAX_LOG_V_BUFFER_SIZE (256)
57
58 // Log levels
59 #ifdef __TIZEN__
60 typedef enum {
61     DEBUG = DLOG_DEBUG,
62     INFO = DLOG_INFO,
63     WARNING = DLOG_WARN,
64     ERROR = DLOG_ERROR,
65     FATAL = DLOG_ERROR
66 } LogLevel;
67 #else
68 typedef enum {
69     DEBUG = 0,
70     INFO,
71     WARNING,
72     ERROR,
73     FATAL
74 } LogLevel;
75 #endif
76
77 #ifdef __TIZEN__
78 #define OCLog(level,tag,mes)
79 #define OCLogv(level,tag,fmt,args...)
80 #elif defined(ANDROID) || defined(__linux__) || defined(__APPLE__)
81     /**
82      * Configure logger to use a context that defines a custom logger function
83      *
84      * @param ctx - pointer to oc_log_ctx_t struct that defines custom logging functions
85      */
86     void OCLogConfig(oc_log_ctx_t *ctx);
87
88     /**
89      * Initialize the logger.  Optional on Android and Linux.  Configures serial port on Arduino
90      */
91     void OCLogInit();
92
93     /**
94      * Called to Free dyamically allocated resources used with custom logging.
95      * Not necessary if default logging is used
96      *
97      */
98     void OCLogShutdown();
99
100     /**
101      * Output a variable argument list log string with the specified priority level.
102      * Only defined for Linux and Android
103      *
104      * @param level  - DEBUG, INFO, WARNING, ERROR, FATAL
105      * @param tag    - Module name
106      * @param format - variadic log string
107      */
108     void OCLogv(LogLevel level, const char * tag, const char * format, ...);
109
110     /**
111      * Output a log string with the specified priority level.
112      * Only defined for Linux and Android
113      *
114      * @param level  - DEBUG, INFO, WARNING, ERROR, FATAL
115      * @param tag    - Module name
116      * @param logStr - log string
117      */
118     void OCLog(LogLevel level, const char * tag, const char * logStr);
119
120     /**
121      * Output the contents of the specified buffer (in hex) with the specified priority level.
122      *
123      * @param level      - DEBUG, INFO, WARNING, ERROR, FATAL
124      * @param tag        - Module name
125      * @param buffer     - pointer to buffer of bytes
126      * @param bufferSize - max number of byte in buffer
127      */
128     void OCLogBuffer(LogLevel level, const char * tag, const uint8_t * buffer, uint16_t bufferSize);
129 #else
130     /**
131      * Initialize the serial logger for Arduino
132      * Only defined for Arduino
133      */
134     void OCLogInit();
135
136     /**
137      * Output a log string with the specified priority level.
138      * Only defined for Arduino.  Uses PROGMEM strings
139      *
140      * @param level  - DEBUG, INFO, WARNING, ERROR, FATAL
141      * @param tag    - Module name
142      * @param logStr - log string
143      */
144     void OCLog(LogLevel level, PROGMEM const char * tag, PROGMEM const char * logStr);
145
146     /**
147      * Output the contents of the specified buffer (in hex) with the specified priority level.
148      *
149      * @param level      - DEBUG, INFO, WARNING, ERROR, FATAL
150      * @param tag        - Module name
151      * @param buffer     - pointer to buffer of bytes
152      * @param bufferSize - max number of byte in buffer
153      */
154     void OCLogBuffer(LogLevel level, PROGMEM const char * tag, const uint8_t * buffer, uint16_t bufferSize);
155
156     /**
157      * Output a variable argument list log string with the specified priority level.
158      *
159      * @param level  - DEBUG, INFO, WARNING, ERROR, FATAL
160      * @param tag    - Module name
161      * @param format - variadic log string
162      */
163     void OCLogv(LogLevel level, const char * tag, const char * format, ...);
164 #endif
165
166 #ifdef TB_LOG
167 #ifdef __TIZEN__
168     #define OC_LOG(level,tag,mes) LOG_(LOG_ID_MAIN, level, tag, mes)
169     #define OC_LOG_V(level,tag,fmt,args...) LOG_(LOG_ID_MAIN, level, tag, fmt,##args)
170     #define OC_LOG_BUFFER(level, tag, buffer, bufferSize)
171 #else // These macros are defined for Linux, Android, and Arduino
172     #define OC_LOG_INIT()    OCLogInit()
173     #define OC_LOG_BUFFER(level, tag, buffer, bufferSize)  OCLogBuffer((level), PCF(tag), (buffer), (bufferSize))
174
175     #ifdef ARDUINO
176         #define OC_LOG_CONFIG(ctx)
177         #define OC_LOG_SHUTDOWN()
178         #define OC_LOG(level, tag, logStr)  OCLog((level), PCF(tag), PCF(logStr))
179         // Use full namespace for logInit to avoid function name collision
180         #define OC_LOG_INIT()    OCLogInit()
181         // Don't define variable argument log function for Arduino
182         #define OC_LOG_V(level, tag, format, ...) OCLogv((level), PCF(tag), PCF(format), __VA_ARGS__)
183     #else
184         #define OC_LOG_CONFIG(ctx)    OCLogConfig((ctx))
185         #define OC_LOG(level, tag, logStr)  OCLog((level), (tag), (logStr))
186         #define OC_LOG_SHUTDOWN()     OCLogShutdown()
187         // Define variable argument log function for Linux and Android
188         #define OC_LOG_V(level, tag, ...)  OCLogv((level), (tag), __VA_ARGS__)
189     #endif
190 #endif
191 #else
192     #define OC_LOG_CONFIG(ctx)
193     #define OC_LOG_SHUTDOWN()
194     #define OC_LOG(level, tag, logStr)
195     #define OC_LOG_V(level, tag, ...)
196     #define OC_LOG_BUFFER(level, tag, buffer, bufferSize)
197     #define OC_LOG_INIT()
198 #endif
199
200 #ifdef __cplusplus
201 }
202 #endif // __cplusplus
203
204 #endif /* LOGGER_H_ */