ErrorLib 1.0.12-master SHA: f73ac03fda
LogMessage.h
Go to the documentation of this file.
1
14#ifndef LOG_MESSAGE_h
15#define LOG_MESSAGE_h
16
17
18//---------------------------------------------------------------------------------
19// Includes
20//---------------------------------------------------------------------------------
21#include <stdint.h>
22#include <stdbool.h>
23
24#ifdef __cplusplus
25extern "C" {
26#endif
27//---------------------------------------------------------------------------------
28// Defines
29//---------------------------------------------------------------------------------
31#define LOGMESSAGE_OPTION_NONE 0x00000000
33#define LOGMESSAGE_OPTION_TIMESTAMP 0x00000100
35#define LOGMESSAGE_OPTION_CONTAINS_DATA 0x00000200
37#define LOGMESSAGE_OPTION_ALERT 0x00000400
39#define LOGMESSAGE_OPTION_DEBUG 0x00000800
41#define LOGMESSAGE_OPTION_UNDEFINED1 0x00001000
43#define LOGMESSAGE_OPTION_UNDEFINED2 0x00002000
45#define LOGMESSAGE_OPTION_UNDEFINED3 0x00004000
47#define LOGMESSAGE_OPTION_UNDEFINED4 0x00008000
48
50#define USER_LOGMESSAGE_OPTIONS (LOGMESSAGE_OPTION_ALERT | LOGMESSAGE_OPTION_DEBUG)
51
53#define CONCATENATE_DETAIL(x, y) x##y
55#define CONCATENATE(x, y) CONCATENATE_DETAIL(x, y)
57#define MAKE_UNIQUE(x) CONCATENATE(x, __LINE__)
58
59
63#define MSG(message) \
64do { \
65 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
66 _LogMessage((char*)MAKE_UNIQUE(Message), LOGMESSAGE_OPTION_TIMESTAMP); \
67} while(0)
68
69
74#define LogMessage(message, Options) \
75do { \
76 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
77 _LogMessage((char*)MAKE_UNIQUE(Message), ((Options) & USER_LOGMESSAGE_OPTIONS) | LOGMESSAGE_OPTION_TIMESTAMP); \
78} while(0)
79
80
84#define LogMessageAlert(message) \
85do { \
86 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
87 _LogMessage((char*)MAKE_UNIQUE(Message), LOGMESSAGE_OPTION_TIMESTAMP | LOGMESSAGE_OPTION_ALERT); \
88} while(0)
89
90
95#define LogMessageAppendLine(message) \
96do { \
97 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
98 _LogMessage((char*)MAKE_UNIQUE(Message), 0); \
99} while(0)
100
101
106#define LogMessageDyn(message, Options) DynamicString(message, ((Options) & USER_LOGMESSAGE_OPTIONS) | LOGMESSAGE_OPTION_TIMESTAMP)
107
108
113#define LogMessageDyn_appendLine(message) DynamicString(message, LOGMESSAGE_OPTION_NONE)
114
115
116
122#define LogMessageData1(message, dat1, Options) \
123do { \
124 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
125 if(sizeof(dat1) < 4) \
126 { \
127 int32_t MAKE_UNIQUE(DataTemp) = dat1; \
128 _LogmessageData((char*)MAKE_UNIQUE(Message), (Options) & USER_LOGMESSAGE_OPTIONS, 1, MAKE_UNIQUE(DataTemp)); \
129 } \
130 else \
131 { \
132 _LogmessageData((char*)MAKE_UNIQUE(Message), (Options) & USER_LOGMESSAGE_OPTIONS, 1, *(int32_t*)&(dat1)); \
133 } \
134} while(0)
135
136
143#define LogMessageData2(message, dat1, dat2, Options) \
144do { \
145 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
146 int32_t* MAKE_UNIQUE(pDataTemp1); int32_t* MAKE_UNIQUE(pDataTemp2); \
147 int32_t MAKE_UNIQUE(DataTemp1), MAKE_UNIQUE(DataTemp2); \
148 if(sizeof(dat1) < 4) \
149 { \
150 MAKE_UNIQUE(DataTemp1) = dat1; \
151 MAKE_UNIQUE(pDataTemp1) = &MAKE_UNIQUE(DataTemp1); \
152 } \
153 else \
154 { \
155 MAKE_UNIQUE(pDataTemp1) = (int32_t*)&dat1; \
156 } \
157 if(sizeof(dat2) < 4) \
158 { \
159 MAKE_UNIQUE(DataTemp2) = dat2; \
160 MAKE_UNIQUE(pDataTemp2) = &MAKE_UNIQUE(DataTemp2); \
161 } \
162 else \
163 { \
164 MAKE_UNIQUE(pDataTemp2) = (int32_t*)&dat2; \
165 } \
166 _LogmessageData((char*)MAKE_UNIQUE(Message), (Options) & USER_LOGMESSAGE_OPTIONS, 2, *MAKE_UNIQUE(pDataTemp1), *MAKE_UNIQUE(pDataTemp2)); \
167} while(0)
168
169
177#define LogMessageData3(message, dat1, dat2, dat3, Options) \
178do { \
179 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
180 int32_t* MAKE_UNIQUE(pDataTemp1); int32_t* MAKE_UNIQUE(pDataTemp2); int32_t* MAKE_UNIQUE(pDataTemp3); \
181 int32_t MAKE_UNIQUE(DataTemp1), MAKE_UNIQUE(DataTemp2), MAKE_UNIQUE(DataTemp3); \
182 if(sizeof(dat1) < 4) \
183 { \
184 MAKE_UNIQUE(DataTemp1) = dat1; \
185 MAKE_UNIQUE(pDataTemp1) = &MAKE_UNIQUE(DataTemp1); \
186 } \
187 else \
188 { \
189 MAKE_UNIQUE(pDataTemp1) = (int32_t*)&dat1; \
190 } \
191 if(sizeof(dat2) < 4) \
192 { \
193 MAKE_UNIQUE(DataTemp2) = dat2; \
194 MAKE_UNIQUE(pDataTemp2) = &MAKE_UNIQUE(DataTemp2); \
195 } \
196 else \
197 { \
198 MAKE_UNIQUE(pDataTemp2) = (int32_t*)&dat2; \
199 } \
200 if(sizeof(dat3) < 4) \
201 { \
202 MAKE_UNIQUE(DataTemp3) = dat3; \
203 MAKE_UNIQUE(pDataTemp3) = &MAKE_UNIQUE(DataTemp3); \
204 } \
205 else \
206 { \
207 MAKE_UNIQUE(pDataTemp3) = (void*)&dat3; \
208 } \
209 _LogmessageData((char*)MAKE_UNIQUE(Message), (Options) & USER_LOGMESSAGE_OPTIONS, 3, *MAKE_UNIQUE(pDataTemp1), *MAKE_UNIQUE(pDataTemp2), *MAKE_UNIQUE(pDataTemp3)); \
210} while(0)
211
212
221#define LogMessageData4(message, dat1, dat2, dat3, dat4, Options) \
222do { \
223 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
224 int32_t* MAKE_UNIQUE(pDataTemp1); int32_t* MAKE_UNIQUE(pDataTemp2); int32_t* MAKE_UNIQUE(pDataTemp3); int32_t* MAKE_UNIQUE(pDataTemp4); \
225 int32_t MAKE_UNIQUE(DataTemp1), MAKE_UNIQUE(DataTemp2), MAKE_UNIQUE(DataTemp3), MAKE_UNIQUE(DataTemp4); \
226 if(sizeof(dat1) < 4) \
227 { \
228 MAKE_UNIQUE(DataTemp1) = dat1; \
229 MAKE_UNIQUE(pDataTemp1) = &MAKE_UNIQUE(DataTemp1); \
230 } \
231 else \
232 { \
233 MAKE_UNIQUE(pDataTemp1) = (int32_t*)&dat1; \
234 } \
235 if(sizeof(dat2) < 4) \
236 { \
237 MAKE_UNIQUE(DataTemp2) = dat2; \
238 MAKE_UNIQUE(pDataTemp2) = &MAKE_UNIQUE(DataTemp2); \
239 } \
240 else \
241 { \
242 MAKE_UNIQUE(pDataTemp2) = (int32_t*)&dat2; \
243 } \
244 if(sizeof(dat3) < 4) \
245 { \
246 MAKE_UNIQUE(DataTemp3) = dat3; \
247 MAKE_UNIQUE(pDataTemp3) = &MAKE_UNIQUE(DataTemp3); \
248 } \
249 else \
250 { \
251 MAKE_UNIQUE(pDataTemp3) = (int32_t*)&dat3; \
252 } \
253 if(sizeof(dat4) < 4) \
254 { \
255 MAKE_UNIQUE(DataTemp4) = dat4; \
256 MAKE_UNIQUE(pDataTemp4) = &MAKE_UNIQUE(DataTemp4); \
257 } \
258 else \
259 { \
260 MAKE_UNIQUE(pDataTemp4) = (int32_t*)&dat4; \
261 } \
262 _LogmessageData((char*)MAKE_UNIQUE(Message), (Options) & USER_LOGMESSAGE_OPTIONS, 4, *MAKE_UNIQUE(pDataTemp1), *MAKE_UNIQUE(pDataTemp2), *MAKE_UNIQUE(pDataTemp3), *MAKE_UNIQUE(pDataTemp4)); \
263} while(0)
264
265//---------------------------------------------------------------------------------
266// Global function prototypes
267//---------------------------------------------------------------------------------
268void _LogMessage(const char str[], uint32_t ui32Options);
269void _LogmessageData(const char* Message, uint32_t ui32Options, uint32_t ui32DataCount, ...);
270void LogMessage_Init(void);
271void DynamicString(char* str, uint32_t ui32Options);
272
273
274//---------------------------------------------------------------------------------
275// Global data
276//---------------------------------------------------------------------------------
277extern uint32_t g_ui32LogmessageBufferPosition;
279extern uint32_t g_pui32LogmessageBuffer[];
280extern uint32_t g_ui32LogmessageAlertAddress;
281extern const uint32_t cui32_LogmessageBufferSize;
282
283#ifdef __cplusplus
284}
285#endif
286#endif
#define str(s)
Helper Macro to convert to string.
Definition: Error.h:139
uint32_t g_pui32LogmessageBuffer[]
Buffer for storing the logmessages.
Definition: LogMessage.c:148
const uint32_t cui32_LogmessageBufferSize
Size of the Logmessage buffer.
Definition: LogMessage.c:142
uint32_t g_ui32LogmessageBufferOverflowCounter
Number of overflows of the logmessage buffer.
Definition: LogMessage.c:154
void LogMessage_Init(void)
Init the Logmessage System.
Definition: LogMessage.c:175
void _LogMessage(const char str[], uint32_t ui32Options)
Add a static String to the Message Buffer.
Definition: LogMessage.c:195
void DynamicString(char *str, uint32_t ui32Options)
Add a dynamic String to the Message Buffer.
Definition: LogMessage.c:268
void _LogmessageData(const char *Message, uint32_t ui32Options, uint32_t ui32DataCount,...)
Add a const String to the Message Buffer and adds additional Data.
Definition: LogMessage.c:330
uint32_t g_ui32LogmessageBufferPosition
Actual position in the logmessage buffer.
Definition: LogMessage.c:151
uint32_t g_ui32LogmessageAlertAddress
Address of an alert message.
Definition: LogMessage.c:157