ErrorLib 1.0.8-master SHA: 810228da25
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//---------------------------------------------------------------------------------
25// Defines
26//---------------------------------------------------------------------------------
28#define LOGMESSAGE_OPTION_NONE 0x00000000
30#define LOGMESSAGE_OPTION_TIMESTAMP 0x00000100
32#define LOGMESSAGE_OPTION_CONTAINS_DATA 0x00000200
34#define LOGMESSAGE_OPTION_ALERT 0x00000400
36#define LOGMESSAGE_OPTION_DEBUG 0x00000800
38#define LOGMESSAGE_OPTION_UNDEFINED1 0x00001000
40#define LOGMESSAGE_OPTION_UNDEFINED2 0x00002000
42#define LOGMESSAGE_OPTION_UNDEFINED3 0x00004000
44#define LOGMESSAGE_OPTION_UNDEFINED4 0x00008000
45
47#define USER_LOGMESSAGE_OPTIONS (LOGMESSAGE_OPTION_ALERT | LOGMESSAGE_OPTION_DEBUG)
48
50#define CONCATENATE_DETAIL(x, y) x##y
52#define CONCATENATE(x, y) CONCATENATE_DETAIL(x, y)
54#define MAKE_UNIQUE(x) CONCATENATE(x, __LINE__)
55
56
60#define MSG(message) \
61do { \
62 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
63 _LogMessage((char*)MAKE_UNIQUE(Message), LOGMESSAGE_OPTION_TIMESTAMP); \
64} while(0)
65
66
71#define LogMessage(message, Options) \
72do { \
73 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
74 _LogMessage((char*)MAKE_UNIQUE(Message), ((Options) & USER_LOGMESSAGE_OPTIONS) | LOGMESSAGE_OPTION_TIMESTAMP); \
75} while(0)
76
77
81#define LogMessageAlert(message) \
82do { \
83 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
84 _LogMessage((char*)MAKE_UNIQUE(Message), LOGMESSAGE_OPTION_TIMESTAMP | LOGMESSAGE_OPTION_ALERT); \
85} while(0)
86
87
92#define LogMessageAppendLine(message) \
93do { \
94 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
95 _LogMessage((char*)MAKE_UNIQUE(Message), 0); \
96} while(0)
97
98
103#define LogMessageDyn(message, Options) DynamicString(message, ((Options) & USER_LOGMESSAGE_OPTIONS) | LOGMESSAGE_OPTION_TIMESTAMP)
104
105
110#define LogMessageDyn_appendLine(message) DynamicString(message, LOGMESSAGE_OPTION_NONE)
111
112
113
119#define LogMessageData1(message, dat1, Options) \
120do { \
121 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
122 if(sizeof(dat1) < 4) \
123 { \
124 int32_t MAKE_UNIQUE(DataTemp) = dat1; \
125 _LogmessageData((char*)MAKE_UNIQUE(Message), (Options) & USER_LOGMESSAGE_OPTIONS, 1, MAKE_UNIQUE(DataTemp)); \
126 } \
127 else \
128 { \
129 _LogmessageData((char*)MAKE_UNIQUE(Message), (Options) & USER_LOGMESSAGE_OPTIONS, 1, *(int32_t*)&(dat1)); \
130 } \
131} while(0)
132
133
140#define LogMessageData2(message, dat1, dat2, Options) \
141do { \
142 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
143 int32_t* MAKE_UNIQUE(pDataTemp1); int32_t* MAKE_UNIQUE(pDataTemp2); \
144 int32_t MAKE_UNIQUE(DataTemp1), MAKE_UNIQUE(DataTemp2); \
145 if(sizeof(dat1) < 4) \
146 { \
147 MAKE_UNIQUE(DataTemp1) = dat1; \
148 MAKE_UNIQUE(pDataTemp1) = &MAKE_UNIQUE(DataTemp1); \
149 } \
150 else \
151 { \
152 MAKE_UNIQUE(pDataTemp1) = (int32_t*)&dat1; \
153 } \
154 if(sizeof(dat2) < 4) \
155 { \
156 MAKE_UNIQUE(DataTemp2) = dat2; \
157 MAKE_UNIQUE(pDataTemp2) = &MAKE_UNIQUE(DataTemp2); \
158 } \
159 else \
160 { \
161 MAKE_UNIQUE(pDataTemp2) = (int32_t*)&dat2; \
162 } \
163 _LogmessageData((char*)MAKE_UNIQUE(Message), (Options) & USER_LOGMESSAGE_OPTIONS, 2, *MAKE_UNIQUE(pDataTemp1), *MAKE_UNIQUE(pDataTemp2)); \
164} while(0)
165
166
174#define LogMessageData3(message, dat1, dat2, dat3, Options) \
175do { \
176 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
177 int32_t* MAKE_UNIQUE(pDataTemp1); int32_t* MAKE_UNIQUE(pDataTemp2); int32_t* MAKE_UNIQUE(pDataTemp3); \
178 int32_t MAKE_UNIQUE(DataTemp1), MAKE_UNIQUE(DataTemp2), MAKE_UNIQUE(DataTemp3); \
179 if(sizeof(dat1) < 4) \
180 { \
181 MAKE_UNIQUE(DataTemp1) = dat1; \
182 MAKE_UNIQUE(pDataTemp1) = &MAKE_UNIQUE(DataTemp1); \
183 } \
184 else \
185 { \
186 MAKE_UNIQUE(pDataTemp1) = (int32_t*)&dat1; \
187 } \
188 if(sizeof(dat2) < 4) \
189 { \
190 MAKE_UNIQUE(DataTemp2) = dat2; \
191 MAKE_UNIQUE(pDataTemp2) = &MAKE_UNIQUE(DataTemp2); \
192 } \
193 else \
194 { \
195 MAKE_UNIQUE(pDataTemp2) = (int32_t*)&dat2; \
196 } \
197 if(sizeof(dat3) < 4) \
198 { \
199 MAKE_UNIQUE(DataTemp3) = dat3; \
200 MAKE_UNIQUE(pDataTemp3) = &MAKE_UNIQUE(DataTemp3); \
201 } \
202 else \
203 { \
204 MAKE_UNIQUE(pDataTemp3) = (void*)&dat3; \
205 } \
206 _LogmessageData((char*)MAKE_UNIQUE(Message), (Options) & USER_LOGMESSAGE_OPTIONS, 3, *MAKE_UNIQUE(pDataTemp1), *MAKE_UNIQUE(pDataTemp2), *MAKE_UNIQUE(pDataTemp3)); \
207} while(0)
208
209
218#define LogMessageData4(message, dat1, dat2, dat3, dat4, Options) \
219do { \
220 static const char MAKE_UNIQUE(Message)[] __attribute__((section("message"))) = message; \
221 int32_t* MAKE_UNIQUE(pDataTemp1); int32_t* MAKE_UNIQUE(pDataTemp2); int32_t* MAKE_UNIQUE(pDataTemp3); int32_t* MAKE_UNIQUE(pDataTemp4); \
222 int32_t MAKE_UNIQUE(DataTemp1), MAKE_UNIQUE(DataTemp2), MAKE_UNIQUE(DataTemp3), MAKE_UNIQUE(DataTemp4); \
223 if(sizeof(dat1) < 4) \
224 { \
225 MAKE_UNIQUE(DataTemp1) = dat1; \
226 MAKE_UNIQUE(pDataTemp1) = &MAKE_UNIQUE(DataTemp1); \
227 } \
228 else \
229 { \
230 MAKE_UNIQUE(pDataTemp1) = (int32_t*)&dat1; \
231 } \
232 if(sizeof(dat2) < 4) \
233 { \
234 MAKE_UNIQUE(DataTemp2) = dat2; \
235 MAKE_UNIQUE(pDataTemp2) = &MAKE_UNIQUE(DataTemp2); \
236 } \
237 else \
238 { \
239 MAKE_UNIQUE(pDataTemp2) = (int32_t*)&dat2; \
240 } \
241 if(sizeof(dat3) < 4) \
242 { \
243 MAKE_UNIQUE(DataTemp3) = dat3; \
244 MAKE_UNIQUE(pDataTemp3) = &MAKE_UNIQUE(DataTemp3); \
245 } \
246 else \
247 { \
248 MAKE_UNIQUE(pDataTemp3) = (int32_t*)&dat3; \
249 } \
250 if(sizeof(dat4) < 4) \
251 { \
252 MAKE_UNIQUE(DataTemp4) = dat4; \
253 MAKE_UNIQUE(pDataTemp4) = &MAKE_UNIQUE(DataTemp4); \
254 } \
255 else \
256 { \
257 MAKE_UNIQUE(pDataTemp4) = (int32_t*)&dat4; \
258 } \
259 _LogmessageData((char*)MAKE_UNIQUE(Message), (Options) & USER_LOGMESSAGE_OPTIONS, 4, *MAKE_UNIQUE(pDataTemp1), *MAKE_UNIQUE(pDataTemp2), *MAKE_UNIQUE(pDataTemp3), *MAKE_UNIQUE(pDataTemp4)); \
260} while(0)
261
262//---------------------------------------------------------------------------------
263// Global function prototypes
264//---------------------------------------------------------------------------------
265void _LogMessage(const char str[], uint32_t ui32Options);
266void _LogmessageData(const char* Message, uint32_t ui32Options, uint32_t ui32DataCount, ...);
267void LogMessage_Init(void);
268void DynamicString(char* str, uint32_t ui32Options);
269
270
271//---------------------------------------------------------------------------------
272// Global data
273//---------------------------------------------------------------------------------
274extern uint32_t g_ui32LogmessageBufferPosition;
276extern uint32_t g_pui32LogmessageBuffer[];
277extern uint32_t g_ui32LogmessageAlertAddress;
278extern const uint32_t cui32_LogmessageBufferSize;
279#endif
#define str(s)
Helper Macro to convert to string.
Definition: Error.h:136
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