29#if __STDC_VERSION__ >= 201112L && ! defined __cplusplus
32 #define static_assert _Static_assert
36#define MAX_NUMBER_OF_ERRORS 30
39#define MIN_ERR_REACTION_NAME_LENTH 10
41#define MIN_DESCRIPTION_LENTH 10
43#define MIN_HELP_LENTH 20
46#define ERROR_STACK_OVERFLOW 0x80000000
49#define ERROR_SYSTEM_VERSION 2
132#define ERR_VAR_NAME_SRT(x, y) x ## y
134#define ERR_VAR_NAME(x, y) ERR_VAR_NAME_SRT(x, y)
137#define xstr(s) str(s)
142#define ASSERT_REACTION_NAME(NAME) static_assert(sizeof(NAME) > MIN_ERR_REACTION_NAME_LENTH, \
143"Error reaction name to short must be at least "xstr(MIN_ERR_REACTION_NAME_LENTH)" characters long!") \
146#define ASSERT_DESCRIPTION(DESCRIPTION) static_assert(sizeof(DESCRIPTION) > MIN_DESCRIPTION_LENTH, \
147"Error description text to short must be at least "xstr(MIN_DESCRIPTION_LENTH)" characters long!") \
150#define ASSERT_HELP(HELP) static_assert(sizeof(HELP) > MIN_HELP_LENTH, \
151"Error help text to short must be at least "xstr(MIN_HELP_LENTH)" characters long!") \
154#ifdef ERROR_TEXTS_IN_FILE
158 const uint16_t ui16ErrorID;
159 const uint32_t ui32Length;
163#define ERROR_HELP_TEXT_COMBINE(x)
164#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};
166#define ERROR_HELP_TEXT_COMBINE(x) x
167#define ERROR_HELP_TEXT_SECTION(ERROR_ID, HELP)
170#ifdef INCLUDE_ENGLISH_HELP
171#define INCLUDE_HELP_EN(HELP) HELP
173#define INCLUDE_HELP_EN(HELP)
176#ifdef INCLUDE_GERMAN_HELP
177#define INCLUDE_HELP_DE(HELP) HELP
179#define INCLUDE_HELP_DE(HELP)
193#define DefineError(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE) \
194 ASSERT_DESCRIPTION(DESCRIPTION); \
195 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
196 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
197 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
198 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
200 const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
204 g_s##ID##Description, \
205 sizeof(DESCRIPTION) - 1, \
207 sizeof(g_s##ID##Help) - 1, \
209 &g_t##ON_ERROR_RESET, \
224#define DefineErrorData(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, DATA_COUNT) \
225 ASSERT_DESCRIPTION(DESCRIPTION); \
226 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
227 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
228 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
229 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
231 const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
235 g_s##ID##Description, \
236 sizeof(g_s##ID##Description) - 1, \
238 sizeof(g_s##ID##Help) - 1, \
240 &g_t##ON_ERROR_RESET, \
248#define DeclareError(ID) const tError g_t##ID
261#define SetError(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE) \
264 ASSERT_DESCRIPTION(DESCRIPTION); \
265 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
266 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
267 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
268 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
269 static const tErrorSource g_t##ID##Source __attribute__((section("error_sources"), used)) = { \
272 sizeof(g_sFileName) - 1 \
275 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
279 g_s##ID##Description, \
280 sizeof(DESCRIPTION) - 1, \
282 sizeof(g_s##ID##Help) - 1, \
284 &g_t##ON_ERROR_RESET, \
286 _SetErrorX(&g_t##ID, &g_t##ID##Source); \
301#define SetErrorSource(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, SOURCE) \
304 ASSERT_DESCRIPTION(DESCRIPTION); \
305 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
306 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
307 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
308 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
310 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
314 g_s##ID##Description, \
315 sizeof(DESCRIPTION) - 1, \
317 sizeof(g_s##ID##Help) - 1, \
319 &g_t##ON_ERROR_RESET, \
321 _SetErrorX(&g_t##ID, SOURCE); \
336#define SetErrorData1(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, DATA1) \
339 ASSERT_DESCRIPTION(DESCRIPTION); \
340 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
341 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
342 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
343 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
344 static const tErrorSource g_t##ID##Source __attribute__((section("error_sources"), used)) = { \
347 sizeof(g_sFileName) - 1 \
350 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
354 g_s##ID##Description, \
355 sizeof(DESCRIPTION) - 1, \
357 sizeof(g_s##ID##Help) - 1, \
359 &g_t##ON_ERROR_RESET, \
361 if(sizeof(DATA1) < 4) \
363 int32_t ERR_VAR_NAME(DataTemp, __LINE__) = DATA1; \
364 _SetErrorX(&g_t##ID, &g_t##ID##Source, ERR_VAR_NAME(DataTemp, __LINE__)); \
368 _SetErrorX(&g_t##ID, &g_t##ID##Source, *(uint32_t*)&DATA1); \
387#define SetErrorData1Compare(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, DATA1, COMPARE1) \
390 ASSERT_DESCRIPTION(DESCRIPTION); \
391 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
392 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
393 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
394 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
395 static const tErrorSource g_t##ID##Source __attribute__((section("error_sources"), used)) = { \
398 sizeof(g_sFileName) - 1 \
401 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
405 g_s##ID##Description, \
406 sizeof(DESCRIPTION) - 1, \
408 sizeof(g_s##ID##Help) - 1, \
410 &g_t##ON_ERROR_RESET, \
413 tErrorListItem* ERR_VAR_NAME(ptError, __LINE__); \
414 if(sizeof(DATA1) < 4) \
416 int32_t ERR_VAR_NAME(DataTemp, __LINE__) = DATA1; \
417 ERR_VAR_NAME(ptError, __LINE__) = _SetErrorX(&g_t##ID, &g_t##ID##Source, ERR_VAR_NAME(DataTemp, __LINE__)); \
421 ERR_VAR_NAME(ptError, __LINE__) = _SetErrorX(&g_t##ID, &g_t##ID##Source, *(uint32_t*)&DATA1); \
423 COMPARE1(ERR_VAR_NAME(ptError, __LINE__)->Data, DATA1); \
439#define SetErrorData2(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, DATA1, DATA2) \
442 ASSERT_DESCRIPTION(DESCRIPTION); \
443 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
444 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
445 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
446 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
447 static const tErrorSource g_t##ID##Source __attribute__((section("error_sources"), used)) = { \
450 sizeof(g_sFileName) - 1 \
453 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
457 g_s##ID##Description, \
458 sizeof(DESCRIPTION) - 1, \
460 sizeof(g_s##ID##Help) - 1, \
462 &g_t##ON_ERROR_RESET, \
465 int32_t* ERR_VAR_NAME(pDataTemp1, __LINE__); \
466 if(sizeof(DATA1) < 4) \
468 int32_t ERR_VAR_NAME(DataTemp1, __LINE__) = DATA1; \
469 ERR_VAR_NAME(pDataTemp1, __LINE__) = &ERR_VAR_NAME(DataTemp1, __LINE__); \
473 ERR_VAR_NAME(pDataTemp1, __LINE__) = (int32_t*)&(DATA1); \
475 int32_t* ERR_VAR_NAME(pDataTemp2, __LINE__); \
476 if(sizeof(DATA2) < 4) \
478 int32_t ERR_VAR_NAME(DataTemp2, __LINE__) = DATA2; \
479 ERR_VAR_NAME(pDataTemp2, __LINE__) = &ERR_VAR_NAME(DataTemp2, __LINE__); \
483 ERR_VAR_NAME(pDataTemp2, __LINE__) = (int32_t*)&(DATA2); \
485 _SetErrorX(&g_t##ID, &g_t##ID##Source, *ERR_VAR_NAME(pDataTemp1, __LINE__), *ERR_VAR_NAME(pDataTemp2, __LINE__)); \
505#define SetErrorData2Compare(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, DATA1, COMPARE1, DATA2, COMPARE2) \
508 ASSERT_DESCRIPTION(DESCRIPTION); \
509 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
510 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
511 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
512 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
513 static const tErrorSource g_t##ID##Source __attribute__((section("error_sources"), used)) = { \
516 sizeof(g_sFileName) - 1 \
519 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
523 g_s##ID##Description, \
524 sizeof(DESCRIPTION) - 1, \
526 sizeof(g_s##ID##Help) - 1, \
528 &g_t##ON_ERROR_RESET, \
531 int32_t* ERR_VAR_NAME(pDataTemp1, __LINE__); \
532 if(sizeof(DATA1) < 4) \
534 int32_t ERR_VAR_NAME(DataTemp1, __LINE__) = DATA1; \
535 ERR_VAR_NAME(pDataTemp1, __LINE__) = &ERR_VAR_NAME(DataTemp1, __LINE__); \
539 ERR_VAR_NAME(pDataTemp1, __LINE__) = (int32_t*)&(DATA1); \
541 int32_t* ERR_VAR_NAME(pDataTemp2, __LINE__); \
542 if(sizeof(DATA2) < 4) \
544 int32_t ERR_VAR_NAME(DataTemp2, __LINE__) = DATA2; \
545 ERR_VAR_NAME(pDataTemp2, __LINE__) = &ERR_VAR_NAME(DataTemp2, __LINE__); \
549 ERR_VAR_NAME(pDataTemp2, __LINE__) = (int32_t*)&(DATA2); \
551 tErrorListItem* ERR_VAR_NAME(ptError, __LINE__) = _SetErrorX(&g_t##ID, &g_t##ID##Source, *ERR_VAR_NAME(pDataTemp1, __LINE__), \
552 *ERR_VAR_NAME(pDataTemp2, __LINE__)); \
553 if((ERR_VAR_NAME(ptError, __LINE__) != 0) && (ERR_VAR_NAME(ptError, __LINE__)->Data != 0)) \
555 COMPARE1(ERR_VAR_NAME(ptError, __LINE__)->Data, DATA1); \
556 COMPARE2(ERR_VAR_NAME(ptError, __LINE__)->Data + 4, DATA2); \
574#define SetErrorData3(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, DATA1, DATA2, DATA3) \
577 ASSERT_DESCRIPTION(DESCRIPTION); \
578 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
579 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
580 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
581 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
582 static const tErrorSource g_t##ID##Source __attribute__((section("error_sources"), used)) = { \
585 sizeof(g_sFileName) - 1 \
588 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
592 g_s##ID##Description, \
593 sizeof(DESCRIPTION) - 1, \
595 sizeof(g_s##ID##Help) - 1, \
597 &g_t##ON_ERROR_RESET, \
600 int32_t* ERR_VAR_NAME(pDataTemp1, __LINE__); \
601 if(sizeof(DATA1) < 4) \
603 int32_t ERR_VAR_NAME(DataTemp1, __LINE__) = DATA1; \
604 ERR_VAR_NAME(pDataTemp1, __LINE__) = &ERR_VAR_NAME(DataTemp1, __LINE__); \
608 ERR_VAR_NAME(pDataTemp1, __LINE__) = (int32_t*)&(DATA1); \
610 int32_t* ERR_VAR_NAME(pDataTemp2, __LINE__); \
611 if(sizeof(DATA2) < 4) \
613 int32_t ERR_VAR_NAME(DataTemp2, __LINE__) = DATA2; \
614 ERR_VAR_NAME(pDataTemp2, __LINE__) = &ERR_VAR_NAME(DataTemp2, __LINE__); \
618 ERR_VAR_NAME(pDataTemp2, __LINE__) = (int32_t*)&(DATA2); \
620 int32_t* ERR_VAR_NAME(pDataTemp3, __LINE__); \
621 if(sizeof(DATA3) < 4) \
623 int32_t ERR_VAR_NAME(DataTemp3, __LINE__) = DATA3; \
624 ERR_VAR_NAME(pDataTemp3, __LINE__) = &ERR_VAR_NAME(DataTemp3, __LINE__); \
628 ERR_VAR_NAME(pDataTemp3, __LINE__) = (int32_t*)&(DATA3); \
630 _SetErrorX(&g_t##ID, &g_t##ID##Source, *ERR_VAR_NAME(pDataTemp1, __LINE__), *ERR_VAR_NAME(pDataTemp2, __LINE__), \
631 *ERR_VAR_NAME(pDataTemp3, __LINE__)); \
649#define SetErrorData4(ID, PERMISSION, ON_ERROR, ON_ERROR_RESET, DESCRIPTION, HELP_EN, HELP_DE, DATA1, DATA2, DATA3, DATA4) \
652 ASSERT_DESCRIPTION(DESCRIPTION); \
653 ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
654 static const char g_s##ID##Description[] __attribute__((section("error_strings"), used)) = DESCRIPTION; \
655 static const char g_s##ID##Help[] __attribute__((section("error_strings"), used)) = \
656 ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
657 static const tErrorSource g_t##ID##Source __attribute__((section("error_sources"), used)) = { \
660 sizeof(g_sFileName) - 1 \
663 static const tError g_t##ID __attribute__((section("error_descriptor"), used)) = { \
667 g_s##ID##Description, \
668 sizeof(DESCRIPTION) - 1, \
670 sizeof(g_s##ID##Help) - 1, \
672 &g_t##ON_ERROR_RESET, \
675 int32_t* ERR_VAR_NAME(pDataTemp1, __LINE__); \
676 if(sizeof(DATA1) < 4) \
678 int32_t ERR_VAR_NAME(DataTemp1, __LINE__) = DATA1; \
679 ERR_VAR_NAME(pDataTemp1, __LINE__) = &ERR_VAR_NAME(DataTemp1, __LINE__); \
683 ERR_VAR_NAME(pDataTemp1, __LINE__) = (int32_t*)&(DATA1); \
685 int32_t* ERR_VAR_NAME(pDataTemp2, __LINE__); \
686 if(sizeof(DATA2) < 4) \
688 int32_t ERR_VAR_NAME(DataTemp2, __LINE__) = DATA2; \
689 ERR_VAR_NAME(pDataTemp2, __LINE__) = &ERR_VAR_NAME(DataTemp2, __LINE__); \
693 ERR_VAR_NAME(pDataTemp2, __LINE__) = (int32_t*)&(DATA2); \
695 int32_t* ERR_VAR_NAME(pDataTemp3, __LINE__); \
696 if(sizeof(DATA3) < 4) \
698 int32_t ERR_VAR_NAME(DataTemp3, __LINE__) = DATA3; \
699 ERR_VAR_NAME(pDataTemp3, __LINE__) = &ERR_VAR_NAME(DataTemp3, __LINE__); \
703 ERR_VAR_NAME(pDataTemp3, __LINE__) = (int32_t*)&(DATA3); \
705 int32_t* ERR_VAR_NAME(pDataTemp4, __LINE__); \
706 if(sizeof(DATA4) < 4) \
708 int32_t ERR_VAR_NAME(DataTemp4, __LINE__) = DATA4; \
709 ERR_VAR_NAME(pDataTemp4, __LINE__) = &ERR_VAR_NAME(DataTemp4, __LINE__); \
713 ERR_VAR_NAME(pDataTemp4, __LINE__) = (int32_t*)&(DATA4); \
715 _SetErrorX(&g_t##ID, &g_t##ID##Source, *ERR_VAR_NAME(pDataTemp1, __LINE__), *ERR_VAR_NAME(pDataTemp2, __LINE__), \
716 *ERR_VAR_NAME(pDataTemp3, __LINE__), *ERR_VAR_NAME(pDataTemp4, __LINE__)); \
723#define SetErrorId(ID) \
726 static const tErrorSource ERR_VAR_NAME(g_t##ID##Source, __LINE__) __attribute__((section("error_sources"), used)) = { \
729 sizeof(g_sFileName) - 1 \
732 _SetErrorX(&g_t##ID, &ERR_VAR_NAME(g_t##ID##Source, __LINE__)); \
740#define SetErrorIdData1(ID, DATA1) \
743 static const tErrorSource ERR_VAR_NAME(g_t##ID##Source, __LINE__) __attribute__((section("error_sources"), used)) = { \
746 sizeof(g_sFileName) - 1 \
749 if(sizeof(DATA1) < 4) \
751 int32_t ERR_VAR_NAME(DataTemp, __LINE__) = DATA1; \
752 _SetErrorX(&g_t##ID, &ERR_VAR_NAME(g_t##ID##Source, __LINE__), ERR_VAR_NAME(DataTemp, __LINE__)); \
756 _SetErrorX(&g_t##ID, &ERR_VAR_NAME(g_t##ID##Source, __LINE__), DATA1); \
766#define SetErrorIdData2(ID, DATA1, DATA2) \
769 static const tErrorSource ERR_VAR_NAME(g_t##ID##Source, __LINE__) __attribute__((section("error_sources"), used)) = { \
772 sizeof(g_sFileName) - 1 \
775 int32_t* ERR_VAR_NAME(pDataTemp1, __LINE__); \
776 if(sizeof(DATA1) < 4) \
778 int32_t ERR_VAR_NAME(DataTemp1, __LINE__) = DATA1; \
779 ERR_VAR_NAME(pDataTemp1, __LINE__) = &ERR_VAR_NAME(DataTemp1, __LINE__); \
783 ERR_VAR_NAME(pDataTemp1, __LINE__) = (int32_t*)&(DATA1); \
785 int32_t* ERR_VAR_NAME(pDataTemp2, __LINE__); \
786 if(sizeof(DATA2) < 4) \
788 int32_t ERR_VAR_NAME(DataTemp2, __LINE__) = DATA2; \
789 ERR_VAR_NAME(pDataTemp2, __LINE__) = &ERR_VAR_NAME(DataTemp2, __LINE__); \
793 ERR_VAR_NAME(pDataTemp2, __LINE__) = (int32_t*)&(DATA2); \
795 _SetErrorX(&g_t##ID, &ERR_VAR_NAME(g_t##ID##Source, __LINE__), *ERR_VAR_NAME(pDataTemp1, __LINE__), \
796 *ERR_VAR_NAME(pDataTemp2, __LINE__)); \
806#define SetErrorIdData3(ID, DATA1, DATA2, DATA3) \
809 static const tErrorSource ERR_VAR_NAME(g_t##ID##Source, __LINE__) __attribute__((section("error_sources"), used)) = { \
812 sizeof(g_sFileName) - 1 \
815 int32_t* ERR_VAR_NAME(pDataTemp1, __LINE__); \
816 if(sizeof(DATA1) < 4) \
818 int32_t ERR_VAR_NAME(DataTemp1, __LINE__) = DATA1; \
819 ERR_VAR_NAME(pDataTemp1, __LINE__) = &ERR_VAR_NAME(DataTemp1, __LINE__); \
823 ERR_VAR_NAME(pDataTemp1, __LINE__) = (int32_t*)&(DATA1); \
825 int32_t* ERR_VAR_NAME(pDataTemp2, __LINE__); \
826 if(sizeof(DATA2) < 4) \
828 int32_t ERR_VAR_NAME(DataTemp2, __LINE__) = DATA2; \
829 ERR_VAR_NAME(pDataTemp2, __LINE__) = &ERR_VAR_NAME(DataTemp2, __LINE__); \
833 ERR_VAR_NAME(pDataTemp2, __LINE__) = (int32_t*)&(DATA2); \
835 int32_t* ERR_VAR_NAME(pDataTemp3, __LINE__); \
836 if(sizeof(DATA3) < 4) \
838 int32_t ERR_VAR_NAME(DataTemp3, __LINE__) = DATA3; \
839 ERR_VAR_NAME(pDataTemp3, __LINE__) = &ERR_VAR_NAME(DataTemp3, __LINE__); \
843 ERR_VAR_NAME(pDataTemp3, __LINE__) = (int32_t*)&(DATA3); \
845 _SetErrorX(&g_t##ID, &ERR_VAR_NAME(g_t##ID##Source, __LINE__), *ERR_VAR_NAME(pDataTemp1, __LINE__), \
846 *ERR_VAR_NAME(pDataTemp2, __LINE__), \
847 *ERR_VAR_NAME(pDataTemp3, __LINE__)); \
858#define SetErrorIdData4(ID, DATA1, DATA2, DATA3, DATA4) \
861 static const tErrorSource ERR_VAR_NAME(g_t##ID##Source, __LINE__) __attribute__((section("error_sources"), used)) = { \
864 sizeof(g_sFileName) - 1 \
867 int32_t* ERR_VAR_NAME(pDataTemp1, __LINE__); \
868 if(sizeof(DATA1) < 4) \
870 int32_t ERR_VAR_NAME(DataTemp1, __LINE__) = DATA1; \
871 ERR_VAR_NAME(pDataTemp1, __LINE__) = &ERR_VAR_NAME(DataTemp1, __LINE__); \
875 ERR_VAR_NAME(pDataTemp1, __LINE__) = (int32_t*)&(DATA1); \
877 int32_t* ERR_VAR_NAME(pDataTemp2, __LINE__); \
878 if(sizeof(DATA2) < 4) \
880 int32_t ERR_VAR_NAME(DataTemp2, __LINE__) = DATA2; \
881 ERR_VAR_NAME(pDataTemp2, __LINE__) = &ERR_VAR_NAME(DataTemp2, __LINE__); \
885 ERR_VAR_NAME(pDataTemp2, __LINE__) = (int32_t*)&(DATA2); \
887 int32_t* ERR_VAR_NAME(pDataTemp3, __LINE__); \
888 if(sizeof(DATA3) < 4) \
890 int32_t ERR_VAR_NAME(DataTemp3, __LINE__) = DATA3; \
891 ERR_VAR_NAME(pDataTemp3, __LINE__) = &ERR_VAR_NAME(DataTemp3, __LINE__); \
895 ERR_VAR_NAME(pDataTemp3, __LINE__) = (int32_t*)&(DATA3); \
897 int32_t* ERR_VAR_NAME(pDataTemp4, __LINE__); \
898 if(sizeof(DATA4) < 4) \
900 int32_t ERR_VAR_NAME(DataTemp4, __LINE__) = DATA4; \
901 ERR_VAR_NAME(pDataTemp4, __LINE__) = &ERR_VAR_NAME(DataTemp4, __LINE__); \
905 ERR_VAR_NAME(pDataTemp4, __LINE__) = (int32_t*)&(DATA4); \
907 _SetErrorX(&g_t##ID, &ERR_VAR_NAME(g_t##ID##Source, __LINE__), *ERR_VAR_NAME(pDataTemp1, __LINE__), \
908 *ERR_VAR_NAME(pDataTemp2, __LINE__), \
909 *ERR_VAR_NAME(pDataTemp3, __LINE__), \
910 *ERR_VAR_NAME(pDataTemp4, __LINE__)); \
921#define DefineOnErrorReaction(ERROR_REACTION, NAME, HELP_EN, HELP_DE) \
922ASSERT_REACTION_NAME(NAME); \
923ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
924static const char ERR_VAR_NAME(g_s##ERROR_REACTION##Name, __LINE__)[] __attribute__((section("error_strings"), used)) = NAME; \
925static const char ERR_VAR_NAME(g_s##ERROR_REACTION##Help, __LINE__)[] __attribute__((section("error_strings"), used)) = \
926ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
927const tOnErrorReaction g_t##ERROR_REACTION __attribute__((section("error_reactions"), used)) = { \
929 ERR_VAR_NAME(g_s##ERROR_REACTION##Name, __LINE__), \
930 sizeof(ERR_VAR_NAME(g_s##ERROR_REACTION##Name, __LINE__)) - 1, \
931 ERR_VAR_NAME(g_s##ERROR_REACTION##Help, __LINE__), \
932 sizeof(ERR_VAR_NAME(g_s##ERROR_REACTION##Help, __LINE__)) - 1 \
940#define DeclareOnErrorReaction(ERROR_REACTION) \
941 const tOnErrorReaction g_t##ERROR_REACTION; \
942 void ERROR_REACTION(void)
952#define DefineOnErrorResetReaction(ERROR_REACTION, NAME, HELP_EN, HELP_DE) \
953ASSERT_REACTION_NAME(NAME); \
954ASSERT_HELP(INCLUDE_HELP_EN(HELP_EN) INCLUDE_HELP_DE(HELP_DE)); \
955static const char ERR_VAR_NAME(g_s##ERROR_REACTION##Name, __LINE__)[] __attribute__((section("error_strings"), used)) = NAME; \
956static const char ERR_VAR_NAME(g_s##ERROR_REACTION##Help, __LINE__)[] __attribute__((section("error_strings"), used)) = \
957ERROR_HELP_TEXT_COMBINE(INCLUDE_HELP_EN("DOC_E " HELP_EN) INCLUDE_HELP_DE("DOC_D " HELP_DE)); \
958const tOnErrorResetReaction g_t##ERROR_REACTION __attribute__((section("error_reactions"), used)) = { \
960 ERR_VAR_NAME(g_s##ERROR_REACTION##Name, __LINE__), \
961 sizeof(ERR_VAR_NAME(g_s##ERROR_REACTION##Name, __LINE__)) - 1, \
962 ERR_VAR_NAME(g_s##ERROR_REACTION##Help, __LINE__), \
963 sizeof(ERR_VAR_NAME(g_s##ERROR_REACTION##Help, __LINE__)) - 1 \
971#define DeclareOnErrorResetReaction(ERROR_REACTION) \
972 const tOnErrorResetReaction g_t##ERROR_REACTION; \
973 bool ERROR_REACTION(void)
976extern DeclareOnErrorResetReaction(NoOnErrorResetReaction);
984static const char g_sFileName[] __attribute__((section(
"error_strings"), used)) = __BASE_FILE__;
998void ResetErrorIdRange(uint16_t ui16ErrorIdStart, uint16_t ui16ErrorIdEnd, uint8_t
ui8AccessLevel);
1000bool ErrorsPending(
void);
1001void MaxFloat(
void* DataOld,
float DataNew);
1002void MinFloat(
void* DataOld,
float DataNew);
1003void MaxAbsFloat(
void* DataOld,
float DataNew);
1004void MaxInt(
void* DataOld, int32_t DataNew);
1005void MinInt(
void* DataOld, int32_t DataNew);
1006void MaxUInt(
void* DataOld, uint32_t DataNew);
1007void MinUInt(
void* DataOld, uint32_t DataNew);
1008void NoDataUpdate(
void* DataOld, ...);
1009bool IsErrorPending(uint32_t position);
1010bool IsErrorIdPending(uint16_t ui16ErrorId);
1011bool IsErrorIdRangePending(uint16_t ui16ErrorIdStart, uint16_t ui16ErrorIdEnd);
1012uint16_t GetErrorId(uint32_t position);
1013uint32_t PendingErrosSortedByTime(
tErrorListItem* pptPendingErrorList[]);
void(* fpOnErrorX)(void)
Structure used in tError to describe a function to be called on error set.
Definition: Error.h:67
ERROR_FLAGS
Flags used for errors.
Definition: Error.h:56
@ VIEWER_RESET
Can be reset by user with Viewer access level.
Definition: Error.h:57
@ PLC_RESET
Can be reset by the PLC.
Definition: Error.h:61
@ CODE_RESET
Can be reset by the program it-selve e.g. after Init.
Definition: Error.h:62
@ DEVELOPER_RESET
Can be reset by user with Developer access level.
Definition: Error.h:60
@ PROFESSIONAL_RESET
Can be reset by user with Professional access level.
Definition: Error.h:59
@ USER_RESET
Can be reset by user with User access level.
Definition: Error.h:58
@ NV_STORED
Stored in Non-Volatile RAM.
Definition: Error.h:63
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:83
uint16_t void int32_t uint32_t ParameterAccessSource uint8_t ui8AccessLevel
Definition: PARA_Timestamp.c:63
DeclareOnErrorReaction(TestErrorReaction)
Definition of a timestamp type.
Definition: timestamp.h:33
Main error structure.
Definition: Error.h:99
const uint16_t ui16Id
Error-ID.
Definition: Error.h:100
const uint16_t ui16DataCount
Number of attached variables (not byte). See Details on Page Data appended to errors.
Definition: Error.h:101
const uint32_t ui32Flags
Flags from enum ERROR_FLAGS e.g. error reset permissions.
Definition: Error.h:102
const uint32_t ui32HelpLength
Strlen of Help.
Definition: Error.h:106
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:105
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:107
const tOnErrorResetReaction * OnErrorReset
Function to be called on reseting the error. See Page Actions on Error set and reset for details.
Definition: Error.h:108
const uint32_t ui32DescriptionLength
Strlen of Description.
Definition: Error.h:104
const char * Description
Short Description of the error.
Definition: Error.h:103
Structure used in the error stack.
Definition: Error.h:122
Type_Timestamp tTimestampFirst
Time when the error was set the first time.
Definition: Error.h:125
Type_Timestamp tTimestampLast
Time when the error was set the last time.
Definition: Error.h:126
void * Data
Pointer to the attached data the number is stored on ptError. The length is defined in Error-Definiti...
Definition: Error.h:128
const tErrorSource * ptErrorSource
Location of the error in source code.
Definition: Error.h:124
const tError * ptError
Pointer to the error itself.
Definition: Error.h:123
uint32_t ui32ErrorCount
Number of occurrences. Starts with 1 and increments on every occurence.
Definition: Error.h:127
Structure used in tError holding source-code file an line.
Definition: Error.h:113
const uint32_t ui32Line
Source-code line.
Definition: Error.h:114
const char * File
Source-code filename and path.
Definition: Error.h:115
const uint32_t ui32FileLength
Strlen of filename.
Definition: Error.h:116
The error reaction is called on occurence of the error.
Definition: Error.h:73
const uint32_t ui32HelpSize
StrLen of Help.
Definition: Error.h:78
const fpOnErrorX fpErrorReaction
Function to be called.
Definition: Error.h:74
const char * cHelp
Help Text. See Page Help-texts in Errors for details.
Definition: Error.h:77
const char * cName
Name of the Function.
Definition: Error.h:75
const uint32_t ui32NameSize
StrLen of Name.
Definition: Error.h:76
The error reset reaction is called on reset of the error.
Definition: Error.h:89
const fpOnErrorResetX fpErrorReaction
Function to be called.
Definition: Error.h:90
const uint32_t ui32HelpSize
StrLen of Help.
Definition: Error.h:94
const char * cHelp
Help Text. See Page Help-texts in Errors for details.
Definition: Error.h:93
const char * cName
Name of the Function.
Definition: Error.h:91
const uint32_t ui32NameSize
StrLen of Name.
Definition: Error.h:92
Definition of timestamp data-structs.