MIP_SDK  v4.0.0-224-g55f11fa2
MicroStrain Communications Library for embedded systems
logging.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <stdarg.h>
4 #include <stdbool.h>
5 #include <stddef.h>
6 #include <stdint.h>
7 
8 #ifdef __cplusplus
9 extern "C" {
10 #endif // __cplusplus
11 
29 
36 
37 #define MICROSTRAIN_LOGGING_LEVEL_OFF_ 0
38 #define MICROSTRAIN_LOGGING_LEVEL_FATAL_ 1
39 #define MICROSTRAIN_LOGGING_LEVEL_ERROR_ 2
40 #define MICROSTRAIN_LOGGING_LEVEL_WARN_ 3
41 #define MICROSTRAIN_LOGGING_LEVEL_INFO_ 4
42 #define MICROSTRAIN_LOGGING_LEVEL_DEBUG_ 5
43 #define MICROSTRAIN_LOGGING_LEVEL_TRACE_ 6
44 
45 #ifndef MICROSTRAIN_LOGGING_MAX_LEVEL
46 // Define a default logging level
47 #define MICROSTRAIN_LOGGING_MAX_LEVEL MICROSTRAIN_LOGGING_LEVEL_OFF_
48 #endif // !MICROSTRAIN_LOGGING_MAX_LEVEL
49 
50 #if MICROSTRAIN_LOGGING_MAX_LEVEL > MICROSTRAIN_LOGGING_LEVEL_OFF_
51 #define MICROSTRAIN_LOGGING_ENABLED
52 #endif // MICROSTRAIN_LOGGING_MAX_LEVEL > MICROSTRAIN_LOGGING_LEVEL_OFF_
53 
54 #if MICROSTRAIN_LOGGING_MAX_LEVEL >= MICROSTRAIN_LOGGING_LEVEL_FATAL_
55 #define MICROSTRAIN_LOGGING_ENABLED_FATAL
56 #endif // MICROSTRAIN_LOGGING_MAX_LEVEL >= MICROSTRAIN_LOGGING_LEVEL_FATAL_
57 
58 #if MICROSTRAIN_LOGGING_MAX_LEVEL >= MICROSTRAIN_LOGGING_LEVEL_ERROR_
59 #define MICROSTRAIN_LOGGING_ENABLED_ERROR
60 #endif // MICROSTRAIN_LOGGING_MAX_LEVEL >= MICROSTRAIN_LOGGING_LEVEL_ERROR_
61 
62 #if MICROSTRAIN_LOGGING_MAX_LEVEL >= MICROSTRAIN_LOGGING_LEVEL_WARN_
63 #define MICROSTRAIN_LOGGING_ENABLED_WARN
64 #endif // MICROSTRAIN_LOGGING_MAX_LEVEL >= MICROSTRAIN_LOGGING_LEVEL_WARN_
65 
66 #if MICROSTRAIN_LOGGING_MAX_LEVEL >= MICROSTRAIN_LOGGING_LEVEL_INFO_
67 #define MICROSTRAIN_LOGGING_ENABLED_INFO
68 #endif // MICROSTRAIN_LOGGING_MAX_LEVEL >= MICROSTRAIN_LOGGING_LEVEL_INFO_
69 
70 #if MICROSTRAIN_LOGGING_MAX_LEVEL >= MICROSTRAIN_LOGGING_LEVEL_DEBUG_
71 #define MICROSTRAIN_LOGGING_ENABLED_DEBUG
72 #endif // MICROSTRAIN_LOGGING_MAX_LEVEL >= MICROSTRAIN_LOGGING_LEVEL_DEBUG_
73 
74 #if MICROSTRAIN_LOGGING_MAX_LEVEL >= MICROSTRAIN_LOGGING_LEVEL_TRACE_
75 #define MICROSTRAIN_LOGGING_ENABLED_TRACE
76 #endif // MICROSTRAIN_LOGGING_MAX_LEVEL >= MICROSTRAIN_LOGGING_LEVEL_TRACE_
77 
78 // Helper function to avoid unused parameter warnings
79 static inline void microstrain_log_unused_v(const char* fmt, ...)
80 {
81  (void)fmt;
82 }
83 
88 {
97 
106 typedef void (*microstrain_log_callback)(void* user, const microstrain_log_level level, const char* fmt, va_list args);
107 
108 void microstrain_logging_init(const microstrain_log_callback callback, const microstrain_log_level level, void* user);
109 
111 
113 
115 
116 void microstrain_logging_log_v(const microstrain_log_level level, const char* fmt, va_list args);
117 
118 void microstrain_logging_log(const microstrain_log_level level, const char* fmt, ...);
119 
121 
122 void microstrain_log_bytes(const microstrain_log_level level, const char* msg, const uint8_t* data, size_t length);
123 
134 #ifdef MICROSTRAIN_LOGGING_ENABLED
135 #define MICROSTRAIN_LOG_INIT(callback, level, user) microstrain_logging_init(callback, level, user)
136 #else // !MICROSTRAIN_LOGGING_ENABLED
137 #define MICROSTRAIN_LOG_INIT(callback, level, user) (void)callback; (void)level; (void)user
138 #endif // MICROSTRAIN_LOGGING_ENABLED
139 
146 #ifdef MICROSTRAIN_LOGGING_ENABLED
147 #define MICROSTRAIN_LOG_LOG(level, ...) microstrain_logging_log(level, __VA_ARGS__)
148 #define MICROSTRAIN_LOG_LOG_V(level, fmt, args) microstrain_logging_log_v(level, fmt, args)
149 #else // !MICROSTRAIN_LOGGING_ENABLED
150 #define MICROSTRAIN_LOG_LOG(level, ...) microstrain_log_unused_v(__VA_ARGS__)
151 #define MICROSTRAIN_LOG_LOG_V(level, fmt, args) (void)fmt; (void)args
152 #endif // MICROSTRAIN_LOGGING_ENABLED
153 
163 #ifdef MICROSTRAIN_LOGGING_ENABLED_FATAL
164 #define MICROSTRAIN_LOG_FATAL(...) MICROSTRAIN_LOG_LOG(MICROSTRAIN_LOG_LEVEL_FATAL, __VA_ARGS__)
165 #define MICROSTRAIN_LOG_FATAL_V(fmt, args) MICROSTRAIN_LOG_LOG_V(MICROSTRAIN_LOG_LEVEL_FATAL, fmt, args)
166 #else // !MICROSTRAIN_LOGGING_ENABLED_FATAL
167 #define MICROSTRAIN_LOG_FATAL(...) microstrain_log_unused_v(__VA_ARGS__)
168 #define MICROSTRAIN_LOG_FATAL_V(fmt, args) (void)fmt; (void)args
169 #endif // MICROSTRAIN_LOGGING_ENABLED_FATAL
170 
176 #ifdef MICROSTRAIN_LOGGING_ENABLED_ERROR
177 #define MICROSTRAIN_LOG_ERROR(...) MICROSTRAIN_LOG_LOG(MICROSTRAIN_LOG_LEVEL_ERROR, __VA_ARGS__)
178 #define MICROSTRAIN_LOG_ERROR_V(fmt, args) MICROSTRAIN_LOG_LOG_V(MICROSTRAIN_LOG_LEVEL_ERROR, fmt, args)
179 #else // !MICROSTRAIN_LOGGING_ENABLED_ERROR
180 #define MICROSTRAIN_LOG_ERROR(...) microstrain_log_unused_v(__VA_ARGS__)
181 #define MICROSTRAIN_LOG_ERROR_V(fmt, args) (void)fmt; (void)args
182 #endif // MICROSTRAIN_LOGGING_ENABLED_ERROR
183 
188 #ifdef MICROSTRAIN_LOGGING_ENABLED_WARN
189 #define MICROSTRAIN_LOG_WARN(...) MICROSTRAIN_LOG_LOG(MICROSTRAIN_LOG_LEVEL_WARN, __VA_ARGS__)
190 #define MICROSTRAIN_LOG_WARN_V(fmt, args) MICROSTRAIN_LOG_LOG_V(MICROSTRAIN_LOG_LEVEL_WARN, fmt, args)
191 #else // !MICROSTRAIN_LOGGING_ENABLED_WARN
192 #define MICROSTRAIN_LOG_WARN(...) microstrain_log_unused_v(__VA_ARGS__)
193 #define MICROSTRAIN_LOG_WARN_V(fmt, args) (void)fmt; (void)args
194 #endif // MICROSTRAIN_LOGGING_ENABLED_WARN
195 
200 #ifdef MICROSTRAIN_LOGGING_ENABLED_INFO
201 #define MICROSTRAIN_LOG_INFO(...) MICROSTRAIN_LOG_LOG(MICROSTRAIN_LOG_LEVEL_INFO, __VA_ARGS__)
202 #define MICROSTRAIN_LOG_INFO_V(fmt, args) MICROSTRAIN_LOG_LOG_V(MICROSTRAIN_LOG_LEVEL_INFO, fmt, args)
203 #else // !MICROSTRAIN_LOGGING_ENABLED_INFO
204 #define MICROSTRAIN_LOG_INFO(...) microstrain_log_unused_v(__VA_ARGS__)
205 #define MICROSTRAIN_LOG_INFO_V(fmt, args) (void)fmt; (void)args
206 #endif // MICROSTRAIN_LOGGING_ENABLED_INFO
207 
213 #ifdef MICROSTRAIN_LOGGING_ENABLED_DEBUG
214 #define MICROSTRAIN_LOG_DEBUG(...) MICROSTRAIN_LOG_LOG(MICROSTRAIN_LOG_LEVEL_DEBUG, __VA_ARGS__)
215 #define MICROSTRAIN_LOG_DEBUG_V(fmt, args) MICROSTRAIN_LOG_LOG_V(MICROSTRAIN_LOG_LEVEL_DEBUG, fmt, args)
216 #else // !MICROSTRAIN_LOGGING_ENABLED_DEBUG
217 #define MICROSTRAIN_LOG_DEBUG(...) microstrain_log_unused_v(__VA_ARGS__)
218 #define MICROSTRAIN_LOG_DEBUG_V(fmt, args) (void)fmt; (void)args
219 #endif // MICROSTRAIN_LOGGING_ENABLED_DEBUG
220 
226 #ifdef MICROSTRAIN_LOGGING_ENABLED_TRACE
227 #define MICROSTRAIN_LOG_TRACE(...) MICROSTRAIN_LOG_LOG(MICROSTRAIN_LOG_LEVEL_TRACE, __VA_ARGS__)
228 #define MICROSTRAIN_LOG_TRACE_V(fmt, args) MICROSTRAIN_LOG_LOG_V(MICROSTRAIN_LOG_LEVEL_TRACE, fmt, args)
229 #else // !MICROSTRAIN_LOGGING_ENABLED_TRACE
230 #define MICROSTRAIN_LOG_TRACE(...) microstrain_log_unused_v(__VA_ARGS__)
231 #define MICROSTRAIN_LOG_TRACE_V(fmt, args) (void)fmt; (void)args
232 #endif // MICROSTRAIN_LOGGING_ENABLED_TRACE
233 
237 #ifdef MICROSTRAIN_LOGGING_ENABLED
238 #define MICROSTRAIN_LOG_BYTES(level, msg, data, length) microstrain_log_bytes(level, msg, data, length)
239 #else // !MICROSTRAIN_LOGGING_ENABLED
240 #define MICROSTRAIN_LOG_BYTES(level, msg, data, length) (void)level; (void)msg; (void)data; (void)length
241 #endif // MICROSTRAIN_LOGGING_ENABLED
242 
249 #ifdef MICROSTRAIN_LOGGING_ENABLED_TRACE
250 #define MICROSTRAIN_LOG_BYTES_TRACE(msg, data, length) microstrain_log_bytes(MICROSTRAIN_LOG_LEVEL_TRACE, msg, data, length)
251 #else // !MICROSTRAIN_LOGGING_ENABLED_TRACE
252 #define MICROSTRAIN_LOG_BYTES_TRACE(msg, data, length) (void)msg; (void)data; (void)length
253 #endif // MICROSTRAIN_LOGGING_ENABLED_TRACE
254 
255 
262 #define MICROSTRAIN_LOG_ERROR_WITH_ERRNO(msg) MICROSTRAIN_LOG_ERROR(msg ": %d %s\n", errno, strerror(errno))
263 
272 #define MICROSTRAIN_LOG_ERROR_WITH_ERRNO_EX(msg, ...) MICROSTRAIN_LOG_ERROR(msg ": %d %s\n", __VA_ARGS__, errno, strerror(errno))
273 
277 
278 #ifdef __cplusplus
279 } // extern "C"
280 #endif // __cplusplus
MICROSTRAIN_LOGGING_LEVEL_INFO_
#define MICROSTRAIN_LOGGING_LEVEL_INFO_
Definition: logging.h:41
microstrain_log_unused_v
static void microstrain_log_unused_v(const char *fmt,...)
Definition: logging.h:79
MICROSTRAIN_LOG_LEVEL_WARN
@ MICROSTRAIN_LOG_LEVEL_WARN
Warning logs are logged when something concerning happens that may or not be a mistake.
Definition: logging.h:92
MICROSTRAIN_LOGGING_LEVEL_OFF_
#define MICROSTRAIN_LOGGING_LEVEL_OFF_
Definition: logging.h:37
microstrain_log_bytes
void microstrain_log_bytes(const microstrain_log_level level, const char *msg, const uint8_t *data, size_t length)
Print bytes in hex to the log.
Definition: logging.c:136
MICROSTRAIN_LOG_LEVEL_INFO
@ MICROSTRAIN_LOG_LEVEL_INFO
Info logs are logged when some general info needs to be conveyed to the user.
Definition: logging.h:93
microstrain_logging_log
void microstrain_logging_log(const microstrain_log_level level, const char *fmt,...)
Internal log function called by logging macros. Call MICROSTRAIN_LOG_* macros instead of using this f...
Definition: logging.c:88
microstrain_logging_callback
microstrain_log_callback microstrain_logging_callback(void)
Gets the currently active logging callback.
Definition: logging.c:43
microstrain_log_level
microstrain_log_level
Logging level enum.
Definition: logging.h:87
MICROSTRAIN_LOG_LEVEL_ERROR
@ MICROSTRAIN_LOG_LEVEL_ERROR
Error logs are logged when an error occurs.
Definition: logging.h:91
microstrain_log_callback
void(* microstrain_log_callback)(void *user, const microstrain_log_level level, const char *fmt, va_list args)
Callback function typedef for custom logging behavior.
Definition: logging.h:106
microstrain_logging_level_name
const char * microstrain_logging_level_name(const microstrain_log_level level)
Returns a string representing the given log level.
Definition: logging.c:104
microstrain_logging_user_data
void * microstrain_logging_user_data(void)
Gets the currently active logging user data.
Definition: logging.c:63
MICROSTRAIN_LOGGING_LEVEL_TRACE_
#define MICROSTRAIN_LOGGING_LEVEL_TRACE_
Definition: logging.h:43
microstrain_logging_level
microstrain_log_level microstrain_logging_level(void)
Gets the currently active logging level.
Definition: logging.c:53
MICROSTRAIN_LOGGING_LEVEL_WARN_
#define MICROSTRAIN_LOGGING_LEVEL_WARN_
Definition: logging.h:40
MICROSTRAIN_LOG_LEVEL_OFF
@ MICROSTRAIN_LOG_LEVEL_OFF
Signifies that the log is turned off.
Definition: logging.h:89
MICROSTRAIN_LOG_LEVEL_FATAL
@ MICROSTRAIN_LOG_LEVEL_FATAL
Fatal logs are logged when an unrecoverable error occurs.
Definition: logging.h:90
MICROSTRAIN_LOGGING_LEVEL_DEBUG_
#define MICROSTRAIN_LOGGING_LEVEL_DEBUG_
Definition: logging.h:42
MICROSTRAIN_LOGGING_LEVEL_FATAL_
#define MICROSTRAIN_LOGGING_LEVEL_FATAL_
Definition: logging.h:38
MICROSTRAIN_LOG_LEVEL_TRACE
@ MICROSTRAIN_LOG_LEVEL_TRACE
Trace logs are logged in similar cases to debug logs but can be logged in tight loops.
Definition: logging.h:95
microstrain_logging_init
void microstrain_logging_init(const microstrain_log_callback callback, const microstrain_log_level level, void *user)
Initializes the logger with a callback and user data. Call MICROSTRAIN_LOG_INIT instead of using this...
Definition: logging.c:31
MICROSTRAIN_LOG_LEVEL_DEBUG
@ MICROSTRAIN_LOG_LEVEL_DEBUG
Debug logs are logged for debug purposes.
Definition: logging.h:94
microstrain_logging_log_v
void microstrain_logging_log_v(const microstrain_log_level level, const char *fmt, va_list args)
Internal log function called by variadic logging macros. Call MICROSTRAIN_LOG_*_V macros instead of u...
Definition: logging.c:74
MICROSTRAIN_LOGGING_LEVEL_ERROR_
#define MICROSTRAIN_LOGGING_LEVEL_ERROR_
Definition: logging.h:39