29#if __STDC_VERSION__ >= 201112L && ! defined __cplusplus
32 #define static_assert _Static_assert
36#define MAX_NUMBER_OF_ERRORS 30
40#define ERROR_STACK_OVERFLOW 0x80000000
43#define ERROR_SYSTEM_VERSION 2
126#define ERR_VAR_NAME_SRT(x, y) x ## y
128#define ERR_VAR_NAME(x, y) ERR_VAR_NAME_SRT(x, y)
131#define xstr(s) str(s)
136#define ASSERT_REACTION_NAME(NAME) static_assert(sizeof(NAME) > MIN_ERR_REACTION_NAME_LENTH, \
137"Error reaction name to short must be at least "xstr(MIN_ERR_REACTION_NAME_LENTH)" characters long!") \
140#define ASSERT_DESCRIPTION(DESCRIPTION) static_assert(sizeof(DESCRIPTION) > MIN_ERR_DESCRIPTION_LENTH, \
141"Error description text to short must be at least "xstr(MIN_ERR_DESCRIPTION_LENTH)" characters long!") \
144#define ASSERT_HELP(HELP) static_assert(sizeof(HELP) > MIN_ERR_HELP_LENTH, \
145"Error help text to short must be at least "xstr(MIN_ERR_HELP_LENTH)" characters long!") \
148#ifdef ERROR_TEXTS_IN_FILE
152 const uint16_t ui16ErrorID;
153 const uint32_t ui32Length;
157#define ERROR_HELP_TEXT_COMBINE(x)
158#define ERROR_HELP_TEXT_SECTION(ERROR_ID, HELP) static const tErrorHelpText g_tErrorHelpText##PARA_ID __attribute__((section("para_help_strings"), used)) = {ERROR_ID, sizeof(HELP) - 1, HELP};
160#define ERROR_HELP_TEXT_COMBINE(x) x
161#define ERROR_HELP_TEXT_SECTION(ERROR_ID, HELP)
164#ifdef INCLUDE_ENGLISH_HELP
165#define INCLUDE_HELP_EN(HELP) HELP
167#define INCLUDE_HELP_EN(HELP) ""
170#ifdef INCLUDE_GERMAN_HELP
171#define INCLUDE_HELP_DE(HELP) HELP
173#define INCLUDE_HELP_DE(HELP) ""
187#define DefineError(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE) \
188 ASSERT_DESCRIPTION(DESCRIPTION); \
189 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
190 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
191 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
192 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
194 const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
198 g_s##ID##Description, \
199 sizeof(DESCRIPTION) - 1, \
201 sizeof(g_s##ID##Help) - 1, \
203 &g_t##ON_ERROR_RESET, \
218#define DefineErrorData(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, DATA_COUNT) \
219 ASSERT_DESCRIPTION(DESCRIPTION); \
220 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
221 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
222 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
223 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
225 const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
229 g_s##ID##Description, \
230 sizeof(g_s##ID##Description) - 1, \
232 sizeof(g_s##ID##Help) - 1, \
234 &g_t##ON_ERROR_RESET, \
242#define DeclareError(ID) const tError g_t##ID
255#define SetError(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE) \
258 ASSERT_DESCRIPTION(DESCRIPTION); \
259 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
260 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
261 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
262 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
263 static const tErrorSource g_t##ID##Source __attribute__((section("error_sources"), used)) = { \
266 sizeof(g_sFileName) - 1 \
269 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
273 g_s##ID##Description, \
274 sizeof(DESCRIPTION) - 1, \
276 sizeof(g_s##ID##Help) - 1, \
278 &g_t##ON_ERROR_RESET, \
280 _SetErrorX(&g_t##ID, &g_t##ID##Source); \
295#define SetErrorSource(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, SOURCE) \
298 ASSERT_DESCRIPTION(DESCRIPTION); \
299 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
300 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
301 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
302 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
304 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
308 g_s##ID##Description, \
309 sizeof(DESCRIPTION) - 1, \
311 sizeof(g_s##ID##Help) - 1, \
313 &g_t##ON_ERROR_RESET, \
315 _SetErrorX(&g_t##ID, SOURCE); \
330#define SetErrorData1(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, DATA1) \
333 ASSERT_DESCRIPTION(DESCRIPTION); \
334 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
335 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
336 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
337 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
338 static const tErrorSource g_t##ID##Source __attribute__((section("error_sources"), used)) = { \
341 sizeof(g_sFileName) - 1 \
344 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
348 g_s##ID##Description, \
349 sizeof(DESCRIPTION) - 1, \
351 sizeof(g_s##ID##Help) - 1, \
353 &g_t##ON_ERROR_RESET, \
355 if(sizeof(DATA1) < 4) \
357 int32_t ERR_VAR_NAME(DataTemp, __LINE__) = DATA1; \
358 _SetErrorX(&g_t##ID, &g_t##ID##Source, ERR_VAR_NAME(DataTemp, __LINE__)); \
362 _SetErrorX(&g_t##ID, &g_t##ID##Source, *(uint32_t*)&DATA1); \
381#define SetErrorData1Compare(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, DATA1, COMPARE1) \
384 ASSERT_DESCRIPTION(DESCRIPTION); \
385 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
386 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
387 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
388 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
389 static const tErrorSource g_t##ID##Source __attribute__((section("error_sources"), used)) = { \
392 sizeof(g_sFileName) - 1 \
395 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
399 g_s##ID##Description, \
400 sizeof(DESCRIPTION) - 1, \
402 sizeof(g_s##ID##Help) - 1, \
404 &g_t##ON_ERROR_RESET, \
407 tErrorListItem* ERR_VAR_NAME(ptError, __LINE__); \
408 if(sizeof(DATA1) < 4) \
410 int32_t ERR_VAR_NAME(DataTemp, __LINE__) = DATA1; \
411 ERR_VAR_NAME(ptError, __LINE__) = _SetErrorX(&g_t##ID, &g_t##ID##Source, ERR_VAR_NAME(DataTemp, __LINE__)); \
415 ERR_VAR_NAME(ptError, __LINE__) = _SetErrorX(&g_t##ID, &g_t##ID##Source, *(uint32_t*)&DATA1); \
417 COMPARE1(ERR_VAR_NAME(ptError, __LINE__)->Data, DATA1); \
433#define SetErrorData2(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, DATA1, DATA2) \
436 ASSERT_DESCRIPTION(DESCRIPTION); \
437 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
438 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
439 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
440 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
441 static const tErrorSource g_t##ID##Source __attribute__((section("error_sources"), used)) = { \
444 sizeof(g_sFileName) - 1 \
447 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
451 g_s##ID##Description, \
452 sizeof(DESCRIPTION) - 1, \
454 sizeof(g_s##ID##Help) - 1, \
456 &g_t##ON_ERROR_RESET, \
459 int32_t* ERR_VAR_NAME(pDataTemp1, __LINE__); \
460 if(sizeof(DATA1) < 4) \
462 int32_t ERR_VAR_NAME(DataTemp1, __LINE__) = DATA1; \
463 ERR_VAR_NAME(pDataTemp1, __LINE__) = &ERR_VAR_NAME(DataTemp1, __LINE__); \
467 ERR_VAR_NAME(pDataTemp1, __LINE__) = (int32_t*)&(DATA1); \
469 int32_t* ERR_VAR_NAME(pDataTemp2, __LINE__); \
470 if(sizeof(DATA2) < 4) \
472 int32_t ERR_VAR_NAME(DataTemp2, __LINE__) = DATA2; \
473 ERR_VAR_NAME(pDataTemp2, __LINE__) = &ERR_VAR_NAME(DataTemp2, __LINE__); \
477 ERR_VAR_NAME(pDataTemp2, __LINE__) = (int32_t*)&(DATA2); \
479 _SetErrorX(&g_t##ID, &g_t##ID##Source, *ERR_VAR_NAME(pDataTemp1, __LINE__), *ERR_VAR_NAME(pDataTemp2, __LINE__)); \
499#define SetErrorData2Compare(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, DATA1, COMPARE1, DATA2, COMPARE2) \
502 ASSERT_DESCRIPTION(DESCRIPTION); \
503 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
504 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
505 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
506 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
507 static const tErrorSource g_t##ID##Source __attribute__((section("error_sources"), used)) = { \
510 sizeof(g_sFileName) - 1 \
513 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
517 g_s##ID##Description, \
518 sizeof(DESCRIPTION) - 1, \
520 sizeof(g_s##ID##Help) - 1, \
522 &g_t##ON_ERROR_RESET, \
525 int32_t* ERR_VAR_NAME(pDataTemp1, __LINE__); \
526 if(sizeof(DATA1) < 4) \
528 int32_t ERR_VAR_NAME(DataTemp1, __LINE__) = DATA1; \
529 ERR_VAR_NAME(pDataTemp1, __LINE__) = &ERR_VAR_NAME(DataTemp1, __LINE__); \
533 ERR_VAR_NAME(pDataTemp1, __LINE__) = (int32_t*)&(DATA1); \
535 int32_t* ERR_VAR_NAME(pDataTemp2, __LINE__); \
536 if(sizeof(DATA2) < 4) \
538 int32_t ERR_VAR_NAME(DataTemp2, __LINE__) = DATA2; \
539 ERR_VAR_NAME(pDataTemp2, __LINE__) = &ERR_VAR_NAME(DataTemp2, __LINE__); \
543 ERR_VAR_NAME(pDataTemp2, __LINE__) = (int32_t*)&(DATA2); \
545 tErrorListItem* ERR_VAR_NAME(ptError, __LINE__) = _SetErrorX(&g_t##ID, &g_t##ID##Source, *ERR_VAR_NAME(pDataTemp1, __LINE__), \
546 *ERR_VAR_NAME(pDataTemp2, __LINE__)); \
547 if((ERR_VAR_NAME(ptError, __LINE__) != 0) && (ERR_VAR_NAME(ptError, __LINE__)->Data != 0)) \
549 COMPARE1(ERR_VAR_NAME(ptError, __LINE__)->Data, DATA1); \
550 COMPARE2(ERR_VAR_NAME(ptError, __LINE__)->Data + 4, DATA2); \
568#define SetErrorData3(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, DATA1, DATA2, DATA3) \
571 ASSERT_DESCRIPTION(DESCRIPTION); \
572 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
573 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
574 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
575 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
576 static const tErrorSource g_t##ID##Source __attribute__((section("error_sources"), used)) = { \
579 sizeof(g_sFileName) - 1 \
582 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
586 g_s##ID##Description, \
587 sizeof(DESCRIPTION) - 1, \
589 sizeof(g_s##ID##Help) - 1, \
591 &g_t##ON_ERROR_RESET, \
594 int32_t* ERR_VAR_NAME(pDataTemp1, __LINE__); \
595 if(sizeof(DATA1) < 4) \
597 int32_t ERR_VAR_NAME(DataTemp1, __LINE__) = DATA1; \
598 ERR_VAR_NAME(pDataTemp1, __LINE__) = &ERR_VAR_NAME(DataTemp1, __LINE__); \
602 ERR_VAR_NAME(pDataTemp1, __LINE__) = (int32_t*)&(DATA1); \
604 int32_t* ERR_VAR_NAME(pDataTemp2, __LINE__); \
605 if(sizeof(DATA2) < 4) \
607 int32_t ERR_VAR_NAME(DataTemp2, __LINE__) = DATA2; \
608 ERR_VAR_NAME(pDataTemp2, __LINE__) = &ERR_VAR_NAME(DataTemp2, __LINE__); \
612 ERR_VAR_NAME(pDataTemp2, __LINE__) = (int32_t*)&(DATA2); \
614 int32_t* ERR_VAR_NAME(pDataTemp3, __LINE__); \
615 if(sizeof(DATA3) < 4) \
617 int32_t ERR_VAR_NAME(DataTemp3, __LINE__) = DATA3; \
618 ERR_VAR_NAME(pDataTemp3, __LINE__) = &ERR_VAR_NAME(DataTemp3, __LINE__); \
622 ERR_VAR_NAME(pDataTemp3, __LINE__) = (int32_t*)&(DATA3); \
624 _SetErrorX(&g_t##ID, &g_t##ID##Source, *ERR_VAR_NAME(pDataTemp1, __LINE__), *ERR_VAR_NAME(pDataTemp2, __LINE__), \
625 *ERR_VAR_NAME(pDataTemp3, __LINE__)); \
643#define SetErrorData4(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, DATA1, DATA2, DATA3, DATA4) \
646 ASSERT_DESCRIPTION(DESCRIPTION); \
647 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
648 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
649 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
650 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
651 static const tErrorSource g_t##ID##Source __attribute__((section("error_sources"), used)) = { \
654 sizeof(g_sFileName) - 1 \
657 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
661 g_s##ID##Description, \
662 sizeof(DESCRIPTION) - 1, \
664 sizeof(g_s##ID##Help) - 1, \
666 &g_t##ON_ERROR_RESET, \
669 int32_t* ERR_VAR_NAME(pDataTemp1, __LINE__); \
670 if(sizeof(DATA1) < 4) \
672 int32_t ERR_VAR_NAME(DataTemp1, __LINE__) = DATA1; \
673 ERR_VAR_NAME(pDataTemp1, __LINE__) = &ERR_VAR_NAME(DataTemp1, __LINE__); \
677 ERR_VAR_NAME(pDataTemp1, __LINE__) = (int32_t*)&(DATA1); \
679 int32_t* ERR_VAR_NAME(pDataTemp2, __LINE__); \
680 if(sizeof(DATA2) < 4) \
682 int32_t ERR_VAR_NAME(DataTemp2, __LINE__) = DATA2; \
683 ERR_VAR_NAME(pDataTemp2, __LINE__) = &ERR_VAR_NAME(DataTemp2, __LINE__); \
687 ERR_VAR_NAME(pDataTemp2, __LINE__) = (int32_t*)&(DATA2); \
689 int32_t* ERR_VAR_NAME(pDataTemp3, __LINE__); \
690 if(sizeof(DATA3) < 4) \
692 int32_t ERR_VAR_NAME(DataTemp3, __LINE__) = DATA3; \
693 ERR_VAR_NAME(pDataTemp3, __LINE__) = &ERR_VAR_NAME(DataTemp3, __LINE__); \
697 ERR_VAR_NAME(pDataTemp3, __LINE__) = (int32_t*)&(DATA3); \
699 int32_t* ERR_VAR_NAME(pDataTemp4, __LINE__); \
700 if(sizeof(DATA4) < 4) \
702 int32_t ERR_VAR_NAME(DataTemp4, __LINE__) = DATA4; \
703 ERR_VAR_NAME(pDataTemp4, __LINE__) = &ERR_VAR_NAME(DataTemp4, __LINE__); \
707 ERR_VAR_NAME(pDataTemp4, __LINE__) = (int32_t*)&(DATA4); \
709 _SetErrorX(&g_t##ID, &g_t##ID##Source, *ERR_VAR_NAME(pDataTemp1, __LINE__), *ERR_VAR_NAME(pDataTemp2, __LINE__), \
710 *ERR_VAR_NAME(pDataTemp3, __LINE__), *ERR_VAR_NAME(pDataTemp4, __LINE__)); \
717#define SetErrorId(ID) \
720 static const tErrorSource ERR_VAR_NAME(g_t##ID##Source, __LINE__) __attribute__((section("error_sources"), used)) = { \
723 sizeof(g_sFileName) - 1 \
726 _SetErrorX(&g_t##ID, &ERR_VAR_NAME(g_t##ID##Source, __LINE__)); \
734#define SetErrorIdData1(ID, DATA1) \
737 static const tErrorSource ERR_VAR_NAME(g_t##ID##Source, __LINE__) __attribute__((section("error_sources"), used)) = { \
740 sizeof(g_sFileName) - 1 \
743 if(sizeof(DATA1) < 4) \
745 int32_t ERR_VAR_NAME(DataTemp, __LINE__) = DATA1; \
746 _SetErrorX(&g_t##ID, &ERR_VAR_NAME(g_t##ID##Source, __LINE__), ERR_VAR_NAME(DataTemp, __LINE__)); \
750 _SetErrorX(&g_t##ID, &ERR_VAR_NAME(g_t##ID##Source, __LINE__), DATA1); \
760#define SetErrorIdData2(ID, DATA1, DATA2) \
763 static const tErrorSource ERR_VAR_NAME(g_t##ID##Source, __LINE__) __attribute__((section("error_sources"), used)) = { \
766 sizeof(g_sFileName) - 1 \
769 int32_t* ERR_VAR_NAME(pDataTemp1, __LINE__); \
770 if(sizeof(DATA1) < 4) \
772 int32_t ERR_VAR_NAME(DataTemp1, __LINE__) = DATA1; \
773 ERR_VAR_NAME(pDataTemp1, __LINE__) = &ERR_VAR_NAME(DataTemp1, __LINE__); \
777 ERR_VAR_NAME(pDataTemp1, __LINE__) = (int32_t*)&(DATA1); \
779 int32_t* ERR_VAR_NAME(pDataTemp2, __LINE__); \
780 if(sizeof(DATA2) < 4) \
782 int32_t ERR_VAR_NAME(DataTemp2, __LINE__) = DATA2; \
783 ERR_VAR_NAME(pDataTemp2, __LINE__) = &ERR_VAR_NAME(DataTemp2, __LINE__); \
787 ERR_VAR_NAME(pDataTemp2, __LINE__) = (int32_t*)&(DATA2); \
789 _SetErrorX(&g_t##ID, &ERR_VAR_NAME(g_t##ID##Source, __LINE__), *ERR_VAR_NAME(pDataTemp1, __LINE__), \
790 *ERR_VAR_NAME(pDataTemp2, __LINE__)); \
800#define SetErrorIdData3(ID, DATA1, DATA2, DATA3) \
803 static const tErrorSource ERR_VAR_NAME(g_t##ID##Source, __LINE__) __attribute__((section("error_sources"), used)) = { \
806 sizeof(g_sFileName) - 1 \
809 int32_t* ERR_VAR_NAME(pDataTemp1, __LINE__); \
810 if(sizeof(DATA1) < 4) \
812 int32_t ERR_VAR_NAME(DataTemp1, __LINE__) = DATA1; \
813 ERR_VAR_NAME(pDataTemp1, __LINE__) = &ERR_VAR_NAME(DataTemp1, __LINE__); \
817 ERR_VAR_NAME(pDataTemp1, __LINE__) = (int32_t*)&(DATA1); \
819 int32_t* ERR_VAR_NAME(pDataTemp2, __LINE__); \
820 if(sizeof(DATA2) < 4) \
822 int32_t ERR_VAR_NAME(DataTemp2, __LINE__) = DATA2; \
823 ERR_VAR_NAME(pDataTemp2, __LINE__) = &ERR_VAR_NAME(DataTemp2, __LINE__); \
827 ERR_VAR_NAME(pDataTemp2, __LINE__) = (int32_t*)&(DATA2); \
829 int32_t* ERR_VAR_NAME(pDataTemp3, __LINE__); \
830 if(sizeof(DATA3) < 4) \
832 int32_t ERR_VAR_NAME(DataTemp3, __LINE__) = DATA3; \
833 ERR_VAR_NAME(pDataTemp3, __LINE__) = &ERR_VAR_NAME(DataTemp3, __LINE__); \
837 ERR_VAR_NAME(pDataTemp3, __LINE__) = (int32_t*)&(DATA3); \
839 _SetErrorX(&g_t##ID, &ERR_VAR_NAME(g_t##ID##Source, __LINE__), *ERR_VAR_NAME(pDataTemp1, __LINE__), \
840 *ERR_VAR_NAME(pDataTemp2, __LINE__), \
841 *ERR_VAR_NAME(pDataTemp3, __LINE__)); \
852#define SetErrorIdData4(ID, DATA1, DATA2, DATA3, DATA4) \
855 static const tErrorSource ERR_VAR_NAME(g_t##ID##Source, __LINE__) __attribute__((section("error_sources"), used)) = { \
858 sizeof(g_sFileName) - 1 \
861 int32_t* ERR_VAR_NAME(pDataTemp1, __LINE__); \
862 if(sizeof(DATA1) < 4) \
864 int32_t ERR_VAR_NAME(DataTemp1, __LINE__) = DATA1; \
865 ERR_VAR_NAME(pDataTemp1, __LINE__) = &ERR_VAR_NAME(DataTemp1, __LINE__); \
869 ERR_VAR_NAME(pDataTemp1, __LINE__) = (int32_t*)&(DATA1); \
871 int32_t* ERR_VAR_NAME(pDataTemp2, __LINE__); \
872 if(sizeof(DATA2) < 4) \
874 int32_t ERR_VAR_NAME(DataTemp2, __LINE__) = DATA2; \
875 ERR_VAR_NAME(pDataTemp2, __LINE__) = &ERR_VAR_NAME(DataTemp2, __LINE__); \
879 ERR_VAR_NAME(pDataTemp2, __LINE__) = (int32_t*)&(DATA2); \
881 int32_t* ERR_VAR_NAME(pDataTemp3, __LINE__); \
882 if(sizeof(DATA3) < 4) \
884 int32_t ERR_VAR_NAME(DataTemp3, __LINE__) = DATA3; \
885 ERR_VAR_NAME(pDataTemp3, __LINE__) = &ERR_VAR_NAME(DataTemp3, __LINE__); \
889 ERR_VAR_NAME(pDataTemp3, __LINE__) = (int32_t*)&(DATA3); \
891 int32_t* ERR_VAR_NAME(pDataTemp4, __LINE__); \
892 if(sizeof(DATA4) < 4) \
894 int32_t ERR_VAR_NAME(DataTemp4, __LINE__) = DATA4; \
895 ERR_VAR_NAME(pDataTemp4, __LINE__) = &ERR_VAR_NAME(DataTemp4, __LINE__); \
899 ERR_VAR_NAME(pDataTemp4, __LINE__) = (int32_t*)&(DATA4); \
901 _SetErrorX(&g_t##ID, &ERR_VAR_NAME(g_t##ID##Source, __LINE__), *ERR_VAR_NAME(pDataTemp1, __LINE__), \
902 *ERR_VAR_NAME(pDataTemp2, __LINE__), \
903 *ERR_VAR_NAME(pDataTemp3, __LINE__), \
904 *ERR_VAR_NAME(pDataTemp4, __LINE__)); \
915#define DefineOnErrorReaction(ERROR_REACTION, NAME, HELP_EN, HELP_DE) \
916ASSERT_REACTION_NAME(NAME); \
917ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
918static const char ERR_VAR_NAME(g_s##ERROR_REACTION##Name, __LINE__)[] __attribute__((section("error_strings"), used)) = NAME; \
919static const char ERR_VAR_NAME(g_s##ERROR_REACTION##Help, __LINE__)[] __attribute__((section("error_strings"), used)) = \
920ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
921const tOnErrorReaction g_t##ERROR_REACTION __attribute__((section("error_reactions"), used)) = { \
923 ERR_VAR_NAME(g_s##ERROR_REACTION##Name, __LINE__), \
924 sizeof(ERR_VAR_NAME(g_s##ERROR_REACTION##Name, __LINE__)) - 1, \
925 ERR_VAR_NAME(g_s##ERROR_REACTION##Help, __LINE__), \
926 sizeof(ERR_VAR_NAME(g_s##ERROR_REACTION##Help, __LINE__)) - 1 \
934#define DeclareOnErrorReaction(ERROR_REACTION) \
935 const tOnErrorReaction g_t##ERROR_REACTION; \
936 void ERROR_REACTION(void)
946#define DefineOnErrorResetReaction(ERROR_REACTION, NAME, HELP_EN, HELP_DE) \
947ASSERT_REACTION_NAME(NAME); \
948ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
949static const char ERR_VAR_NAME(g_s##ERROR_REACTION##Name, __LINE__)[] __attribute__((section("error_strings"), used)) = NAME; \
950static const char ERR_VAR_NAME(g_s##ERROR_REACTION##Help, __LINE__)[] __attribute__((section("error_strings"), used)) = \
951ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
952const tOnErrorResetReaction g_t##ERROR_REACTION __attribute__((section("error_reactions"), used)) = { \
954 ERR_VAR_NAME(g_s##ERROR_REACTION##Name, __LINE__), \
955 sizeof(ERR_VAR_NAME(g_s##ERROR_REACTION##Name, __LINE__)) - 1, \
956 ERR_VAR_NAME(g_s##ERROR_REACTION##Help, __LINE__), \
957 sizeof(ERR_VAR_NAME(g_s##ERROR_REACTION##Help, __LINE__)) - 1 \
965#define DeclareOnErrorResetReaction(ERROR_REACTION) \
966 const tOnErrorResetReaction g_t##ERROR_REACTION; \
967 bool ERROR_REACTION(void)
970extern DeclareOnErrorResetReaction(NoOnErrorResetReaction);
978static const char g_sFileName[] __attribute__((section(
"error_strings"), used)) = __BASE_FILE__;
991void ErrorResetX(uint8_t ui8AccessLevel);
992void ResetErrorIdRange(uint16_t ui16ErrorIdStart, uint16_t ui16ErrorIdEnd, uint8_t ui8AccessLevel);
993void ErrorClear(uint8_t ui8AccessLevel);
994bool ErrorsPending(
void);
995void MaxFloat(
void* DataOld,
float DataNew);
996void MinFloat(
void* DataOld,
float DataNew);
997void MaxAbsFloat(
void* DataOld,
float DataNew);
998void MaxInt(
void* DataOld, int32_t DataNew);
999void MinInt(
void* DataOld, int32_t DataNew);
1000void MaxUInt(
void* DataOld, uint32_t DataNew);
1001void MinUInt(
void* DataOld, uint32_t DataNew);
1002void NoDataUpdate(
void* DataOld, ...);
1003bool IsErrorPending(uint32_t position);
1004bool IsErrorIdPending(uint16_t ui16ErrorId);
1005bool IsErrorIdRangePending(uint16_t ui16ErrorIdStart, uint16_t ui16ErrorIdEnd);
1006uint16_t GetErrorId(uint32_t position);
1007uint32_t PendingErrosSortedByTime(
tErrorListItem* pptPendingErrorList[]);
void(* fpOnErrorX)(void)
Structure used in tError to describe a function to be called on error set.
Definition: Error.h:61
ERROR_FLAGS
Flags used for errors.
Definition: Error.h:50
@ VIEWER_RESET
Can be reset by user with Viewer access level.
Definition: Error.h:51
@ PLC_RESET
Can be reset by the PLC.
Definition: Error.h:55
@ CODE_RESET
Can be reset by the program it-selve e.g. after Init.
Definition: Error.h:56
@ DEVELOPER_RESET
Can be reset by user with Developer access level.
Definition: Error.h:54
@ PROFESSIONAL_RESET
Can be reset by user with Professional access level.
Definition: Error.h:53
@ USER_RESET
Can be reset by user with User access level.
Definition: Error.h:52
@ NV_STORED
Stored in Non-Volatile RAM.
Definition: Error.h:57
uint32_t g_u32ErrorPending
#define MAX_NUMBER_OF_ERRORS
Size of the error stack.
Definition: Error.h:36
bool(* fpOnErrorResetX)(void)
Structure used in tError to describe a function to be called on error reset.
Definition: Error.h:77
DeclareOnErrorReaction(TestErrorReaction)
Definition of a timestamp type.
Definition: timestamp.h:33
Main error structure.
Definition: Error.h:93
const uint16_t ui16Id
Error-ID.
Definition: Error.h:94
const uint16_t ui16DataCount
Number of attached variables (not byte). See Details on Page Data appended to errors.
Definition: Error.h:95
const uint32_t ui32Flags
Flags from enum ERROR_FLAGS e.g. error reset permissions.
Definition: Error.h:96
const uint32_t ui32HelpLength
Strlen of Help.
Definition: Error.h:100
const char * Help
Long help text explaining the cause and maybe how to solve the error. See Page Help-texts in Errors f...
Definition: Error.h:99
const tOnErrorReaction * OnError
Function to be called on first time setting the error. See Page Actions on Error set and reset for de...
Definition: Error.h:101
const tOnErrorResetReaction * OnErrorReset
Function to be called on reseting the error. See Page Actions on Error set and reset for details.
Definition: Error.h:102
const uint32_t ui32DescriptionLength
Strlen of Description.
Definition: Error.h:98
const char * Description
Short Description of the error.
Definition: Error.h:97
Structure used in the error stack.
Definition: Error.h:116
Type_Timestamp tTimestampFirst
Time when the error was set the first time.
Definition: Error.h:119
Type_Timestamp tTimestampLast
Time when the error was set the last time.
Definition: Error.h:120
void * Data
Pointer to the attached data the number is stored on ptError. The length is defined in Error-Definiti...
Definition: Error.h:122
const tErrorSource * ptErrorSource
Location of the error in source code.
Definition: Error.h:118
const tError * ptError
Pointer to the error itself.
Definition: Error.h:117
uint32_t ui32ErrorCount
Number of occurrences. Starts with 1 and increments on every occurence.
Definition: Error.h:121
Structure used in tError holding source-code file an line.
Definition: Error.h:107
const uint32_t ui32Line
Source-code line.
Definition: Error.h:108
const char * File
Source-code filename and path.
Definition: Error.h:109
const uint32_t ui32FileLength
Strlen of filename.
Definition: Error.h:110
The error reaction is called on occurence of the error.
Definition: Error.h:67
const uint32_t ui32HelpSize
StrLen of Help.
Definition: Error.h:72
const fpOnErrorX fpErrorReaction
Function to be called.
Definition: Error.h:68
const char * cHelp
Help Text. See Page Help-texts in Errors for details.
Definition: Error.h:71
const char * cName
Name of the Function.
Definition: Error.h:69
const uint32_t ui32NameSize
StrLen of Name.
Definition: Error.h:70
The error reset reaction is called on reset of the error.
Definition: Error.h:83
const fpOnErrorResetX fpErrorReaction
Function to be called.
Definition: Error.h:84
const uint32_t ui32HelpSize
StrLen of Help.
Definition: Error.h:88
const char * cHelp
Help Text. See Page Help-texts in Errors for details.
Definition: Error.h:87
const char * cName
Name of the Function.
Definition: Error.h:85
const uint32_t ui32NameSize
StrLen of Name.
Definition: Error.h:86
Definition of timestamp data-structs.