From 6a65868ab2d9656f40832de490227d9df056fe4c Mon Sep 17 00:00:00 2001 From: drechsler Date: Fri, 27 Nov 2020 09:59:41 +0100 Subject: [PATCH 1/6] first draft of modules & &logger --- .../lifesensor_common/include/logger.h | 77 +++++++++++++++++++ .../lifesensor_common/include/module.h | 34 ++++++++ .../lifesensor_common/src/module.c | 53 +++++++++++++ 3 files changed, 164 insertions(+) create mode 100644 parts/esp32-components/lifesensor_common/include/logger.h create mode 100644 parts/esp32-components/lifesensor_common/include/module.h create mode 100644 parts/esp32-components/lifesensor_common/src/module.c diff --git a/parts/esp32-components/lifesensor_common/include/logger.h b/parts/esp32-components/lifesensor_common/include/logger.h new file mode 100644 index 0000000..8bcef3b --- /dev/null +++ b/parts/esp32-components/lifesensor_common/include/logger.h @@ -0,0 +1,77 @@ +#ifndef LIFESENSOR_COMMON_LOGGER_H +#define LIFESENSOR_COMMON_LOGGER_H + +#include + +#define LOG_UINT(LOGGER,SCOPE,PTR,NAME) LOGGER->log_uint(SCOPE,#NAME,(PTR)->NAME) +#define LOG_INT(LOGGER,SCOPE,PTR,NAME) LOGGER->log_int(SCOPE,#NAME,(PTR)->NAME) +#define LOG_FLOAT(LOGGER,SCOPE,PTR,NAME) LOGGER->log_float(SCOPE,#NAME,(PTR)->NAME) +#define LOG_CHAR(LOGGER,SCOPE,PTR,NAME) LOGGER->log_char(SCOPE,#NAME,(PTR)->NAME) +#define LOG_STR(LOGGER,SCOPE,PTR,NAME) LOGGER->log_str(SCOPE,#NAME,(PTR)->NAME) +#define LOG_PTR(LOGGER,SCOPE,PTR,NAME) LOGGER->log_ptr(SCOPE,#NAME,(PTR)->NAME) + +enum lifesensor_logger_scope_type { + LIFESENSOR_LOGGER_SCOPE_LIST, + LIFESENSOR_LOGGER_SCOPE_MAP +}; + +struct lifesensor_logger_scope { + struct lifesensor_logger_scope *parent; + enum lifesensor_logger_scope_type type; + size_t entries; + size_t level; +}; +typedef struct lifesensor_logger_scope Lifesensor_logger_scope; + +struct lifesensor_logger { + void (*enter_map)( + struct lifesensor_logger_scope* scope, + struct lifesensor_logger_scope* subscope, + char *name, + ); + void (*enter_list)( + struct lifesensor_logger_scope* scope, + struct lifesensor_logger_scope* subscope, + char *name, + ); + void (*exit)( + struct lifesensor_logger_scope* scope, + struct lifesensor_logger_scope* subscope, + char *name, + ); + + void (*log_uint)( + struct lifesensor_logger_scope* scope, + char *name, + unsigned long int value + ); + void (*log_int)( + struct lifesensor_logger_scope* scope, + char *name, + long int value + ); + void (*log_float)( + struct lifesensor_logger_scope* scope, + char *name, + float value + ); + void (*log_char)( + struct lifesensor_logger_scope* scope, + char *name, + char value + ); + void (*log_str)( + struct lifesensor_logger_scope* scope, + char *name, + char *value + ); + void (*log_ptr)( + struct lifesensor_logger_scope* scope, + char *name, + void *value + ); +}; +typedef struct lifesensor_logger Lifesensor_logger; + + +#endif diff --git a/parts/esp32-components/lifesensor_common/include/module.h b/parts/esp32-components/lifesensor_common/include/module.h new file mode 100644 index 0000000..7459917 --- /dev/null +++ b/parts/esp32-components/lifesensor_common/include/module.h @@ -0,0 +1,34 @@ +#ifndef LIFESENSOR_COMMON_MODULE_H +#define LIFESENSOR_COMMON_MODULE_H + +#include "logger.h" +#include + +#define INIT_LIFESENSOR_MODULE(TYPE, NAME, INIT, DUMP, /* SUBMODULES */...) \ + { \ + .parent = NULL, \ + .type = #TYPE, \ + .name = (NAME), \ + .init(INIT), \ + .dump(DUMP), \ + .submodule_offsets = (ptrdiff_t[]){__VA_OPT__(MAP1(offsetof, TYPE, __VA_ARGS__), ) 0}, \ + } + +struct lifesensor_module +{ + struct lifesensor_module *parent; + char *name; + char *type; + void (*dump)( + struct lifesensor_module *module, + Lifesensor_logger *logger, + Lifesensor_logger_scope *scope); + void (*init)( + struct lifesensor_module *module); + ptrdiff_t *submodule_offsets; +}; +typedef struct lifesensor_module Lifesensor_module; + +void lifesensor_module_init(Lifesensor_module *module); +void lifesensor_module_dump(Lifesensor_module *module, Lifesensor_logger *logger, Lifesensor_logger_scope *scope); +#endif \ No newline at end of file diff --git a/parts/esp32-components/lifesensor_common/src/module.c b/parts/esp32-components/lifesensor_common/src/module.c new file mode 100644 index 0000000..45b06ee --- /dev/null +++ b/parts/esp32-components/lifesensor_common/src/module.c @@ -0,0 +1,53 @@ + +#include "module.h" +#include "logger.h" + +void lifesensor_module_init(Lifesensor_module *module) +{ + for (ptrdiff_t *offset = module->submodule_offsets; *offset; offset++) + { + Lifesensor_module *submodule = ((void *)module) + *offset; + if (submodule->init) + { + submodule->init(submodule); + } + } + if (module->init) + { + module->init(module); + } +} + +void lifesensor_module_dump(Lifesensor_module *module, Lifesensor_logger *logger, Lifesensor_logger_scope *scope) { + Lifesensor_logger_scope subscope; + Lifesensor_logger_scope subsubscope; + + LOG_PTR(logger, scope, module, parent); + LOG_STR(logger, scope, module, type); + LOG_STR(logger, scope, module, name); + LOG_PTR(logger, scope, module, init); + LOG_PTR(logger, scope, module, dump); + + logger->enter_list(scope, &subscope, "submodule_offsets"); + for (ptrdiff_t *offset = module->submodule_offsets; *offset; offset++) + { + logger->log_uint(logger, &subscope, NULL, *offset); + } + logger->exit(scope, &subscope); + + logger->enter_map(scope, &subscope, "locals"); + if (module->dump) { + module->dump(module, logger, &subscope); + } + logger->exit(scope, &subscope); + + logger->enter_map(scope, &subscope, "submodules"); + for (ptrdiff_t *offset = module->submodule_offsets; *offset; offset++) + { + Lifesensor_module *submodule = ((void *)module) + *offset; + logger->enter_map(&subscope ,&subsubscope, submodule->name); + lifesensor_module_dump(submodule, logger, &subsubscope); + logger->exit(&subscope, &subsubscope); + } + logger->exit(scope, &subscope); +} From a3d39390319b781f6e4288e6c67a2426640500f2 Mon Sep 17 00:00:00 2001 From: drechsler Date: Fri, 27 Nov 2020 20:43:11 +0100 Subject: [PATCH 2/6] partial added logger --- .../lifesensor_common/include/logger.h | 10 +- .../lifesensor_common/src/logger_json.c | 154 ++++++++++++++++++ 2 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 parts/esp32-components/lifesensor_common/src/logger_json.c diff --git a/parts/esp32-components/lifesensor_common/include/logger.h b/parts/esp32-components/lifesensor_common/include/logger.h index 8bcef3b..51a1b6c 100644 --- a/parts/esp32-components/lifesensor_common/include/logger.h +++ b/parts/esp32-components/lifesensor_common/include/logger.h @@ -11,12 +11,13 @@ #define LOG_PTR(LOGGER,SCOPE,PTR,NAME) LOGGER->log_ptr(SCOPE,#NAME,(PTR)->NAME) enum lifesensor_logger_scope_type { + LIFESENSOR_LOGGER_SCOPE_NONE, LIFESENSOR_LOGGER_SCOPE_LIST, LIFESENSOR_LOGGER_SCOPE_MAP }; struct lifesensor_logger_scope { - struct lifesensor_logger_scope *parent; + void (*printf)(const char *fmt, ...); enum lifesensor_logger_scope_type type; size_t entries; size_t level; @@ -27,17 +28,16 @@ struct lifesensor_logger { void (*enter_map)( struct lifesensor_logger_scope* scope, struct lifesensor_logger_scope* subscope, - char *name, + char *name ); void (*enter_list)( struct lifesensor_logger_scope* scope, struct lifesensor_logger_scope* subscope, - char *name, + char *name ); void (*exit)( struct lifesensor_logger_scope* scope, - struct lifesensor_logger_scope* subscope, - char *name, + struct lifesensor_logger_scope* subscope ); void (*log_uint)( diff --git a/parts/esp32-components/lifesensor_common/src/logger_json.c b/parts/esp32-components/lifesensor_common/src/logger_json.c new file mode 100644 index 0000000..0d7d0da --- /dev/null +++ b/parts/esp32-components/lifesensor_common/src/logger_json.c @@ -0,0 +1,154 @@ + +#include "logger.h" + +static inline void +_lifesensor_logger_yaml_comma( + Lifesensor_logger_scope *scope +){ + if (scope->entries++) { + scope->printf(", "); + } +} + +static inline void +_lifesensor_logger_yaml_name( + Lifesensor_logger_scope *scope, + char *name +){ + if (name) { + scope->printf("\"%s\": "); + } +} + +static void +lifesensor_logger_yaml_enter_map( + Lifesensor_logger_scope *scope, + Lifesensor_logger_scope *subscope, + char *name) +{ + subscope->entries = 0; + subscope->level = scope->level + 1; + subscope->type = LIFESENSOR_LOGGER_SCOPE_MAP; + subscope->printf = scope->printf; + + _lifesensor_logger_yaml_comma(scope); + _lifesensor_logger_yaml_name(scope,name); + scope->printf("{ "); +} + +static void +lifesensor_logger_yaml_enter_list( + Lifesensor_logger_scope *scope, + Lifesensor_logger_scope *subscope, + char *name) +{ + subscope->entries = 0; + subscope->level = scope->level + 1; + subscope->type = LIFESENSOR_LOGGER_SCOPE_LIST; + subscope->printf = scope->printf; + + _lifesensor_logger_yaml_comma(scope); + _lifesensor_logger_yaml_name(scope,name); + scope->printf("[ "); +} + +static void +lifesensor_logger_yaml_exit( + Lifesensor_logger_scope *scope, + Lifesensor_logger_scope *subscope) +{ + switch(subscope->type) { + case LIFESENSOR_LOGGER_SCOPE_MAP: + scope->printf(" }"); + break; + case LIFESENSOR_LOGGER_SCOPE_LIST: + scope->printf(" ]"); + break; + } +} + +static void +lifesensor_logger_yaml_log_uint( + Lifesensor_logger_scope *scope, + char *name, + unsigned long int value) +{ + _lifesensor_logger_yaml_comma(scope); + _lifesensor_logger_yaml_name(scope, name); + scope->printf("%+lu", value); +} + +static void +lifesensor_logger_yaml_log_int( + Lifesensor_logger_scope *scope, + char *name, + long int value) +{ + _lifesensor_logger_yaml_comma(scope); + _lifesensor_logger_yaml_name(scope, name); + scope->printf("%+ld", value); +} + +static void +lifesensor_logger_yaml_log_float( + Lifesensor_logger_scope *scope, + char *name, + float value) +{ + _lifesensor_logger_yaml_comma(scope); + _lifesensor_logger_yaml_name(scope, name); + scope->printf("%+G", value); +} + +static void +lifesensor_logger_yaml_log_char( + Lifesensor_logger_scope *scope, + char *name, + char value) +{ + _lifesensor_logger_yaml_comma(scope); + _lifesensor_logger_yaml_name(scope, name); + scope->printf("\"%c\"", value); +} + +static void +lifesensor_logger_yaml_log_str( + Lifesensor_logger_scope *scope, + char *name, + char *value) +{ + _lifesensor_logger_yaml_comma(scope); + _lifesensor_logger_yaml_name(scope, name); + scope->printf("\"%s\"", value); +} + +static void +lifesensor_logger_yaml_log_ptr( + Lifesensor_logger_scope *scope, + char *name, + void *value) +{ + _lifesensor_logger_yaml_comma(scope); + _lifesensor_logger_yaml_name(scope, name); + scope->printf("\"0x%x\"", value); +} + +static void +lifesensor_logger_yaml_init( + Lifesensor_logger *logger, + Lifesensor_logger_scope *scope) +{ + logger->enter_map = &lifesensor_logger_yaml_enter_map; + logger->enter_list = &lifesensor_logger_yaml_enter_list; + logger->exit = &lifesensor_logger_yaml_exit; + logger->log_uint = &lifesensor_logger_yaml_log_uint; + logger->log_int = &lifesensor_logger_yaml_log_int; + logger->log_float = &lifesensor_logger_yaml_log_float; + logger->log_char = &lifesensor_logger_yaml_log_char; + logger->log_str = &lifesensor_logger_yaml_log_str; + logger->log_ptr = &lifesensor_logger_yaml_log_ptr; + + scope->type = LIFESENSOR_LOGGER_SCOPE_NONE; + scope->entries = 0; + scope->level = 0; +} From 8f4532d59b67bd8294d4762850d33082450f4d9f Mon Sep 17 00:00:00 2001 From: drechsler Date: Fri, 27 Nov 2020 20:49:22 +0100 Subject: [PATCH 3/6] adder json logger header --- .../lifesensor_common/include/logger_json.h | 10 ++++++++++ .../lifesensor_common/src/logger_json.c | 6 ++++-- 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 parts/esp32-components/lifesensor_common/include/logger_json.h diff --git a/parts/esp32-components/lifesensor_common/include/logger_json.h b/parts/esp32-components/lifesensor_common/include/logger_json.h new file mode 100644 index 0000000..b7f7f87 --- /dev/null +++ b/parts/esp32-components/lifesensor_common/include/logger_json.h @@ -0,0 +1,10 @@ +#ifndef LIFESENSOR_COMMON_LOGGER_JSON_H +#define LIFESENSOR_COMMON_LOGGER_JSON_H + +#include "logger_json.h" + +lifesensor_logger_yaml_init( + Lifesensor_logger *logger, + Lifesensor_logger_scope *scope); + +#endif \ No newline at end of file diff --git a/parts/esp32-components/lifesensor_common/src/logger_json.c b/parts/esp32-components/lifesensor_common/src/logger_json.c index 0d7d0da..cc34d96 100644 --- a/parts/esp32-components/lifesensor_common/src/logger_json.c +++ b/parts/esp32-components/lifesensor_common/src/logger_json.c @@ -133,10 +133,11 @@ lifesensor_logger_yaml_log_ptr( scope->printf("\"0x%x\"", value); } -static void +void lifesensor_logger_yaml_init( Lifesensor_logger *logger, - Lifesensor_logger_scope *scope) + Lifesensor_logger_scope *scope, + void (*printf)(const char* fmt, ...)) { logger->enter_map = &lifesensor_logger_yaml_enter_map; logger->enter_list = &lifesensor_logger_yaml_enter_list; @@ -151,4 +152,5 @@ lifesensor_logger_yaml_init( scope->type = LIFESENSOR_LOGGER_SCOPE_NONE; scope->entries = 0; scope->level = 0; + scope->printf = printf; } From d0596349fcf309b871e345eea54283ef35eebcb6 Mon Sep 17 00:00:00 2001 From: drechsler Date: Sat, 28 Nov 2020 12:07:17 +0100 Subject: [PATCH 4/6] added map macros --- .../lifesensor_common/include/macro/map.h | 177 ++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 parts/esp32-components/lifesensor_common/include/macro/map.h diff --git a/parts/esp32-components/lifesensor_common/include/macro/map.h b/parts/esp32-components/lifesensor_common/include/macro/map.h new file mode 100644 index 0000000..0100d23 --- /dev/null +++ b/parts/esp32-components/lifesensor_common/include/macro/map.h @@ -0,0 +1,177 @@ +#ifndef LIFESENSOR_COMMON_MAP_H +#define LIFESENSOR_COMMON_MAP_H + +/** + * macro _MAP_EVAL*(...) + * these macros let the preprocessor expand the inital arguments multiple times, + * which results in multiple evaluation runs of the initial arguments. + */ +#define _MAP_EVAL1(...) __VA_ARGS__ +#define _MAP_EVAL2(...) _MAP_EVAL1(_MAP_EVAL1(__VA_ARGS__)) +#define _MAP_EVAL4(...) _MAP_EVAL2(_MAP_EVAL2(__VA_ARGS__)) +#define _MAP_EVAL16(...) _MAP_EVAL4(_MAP_EVAL4(__VA_ARGS__)) +#define _MAP_EVAL256(...) _MAP_EVAL16(_MAP_EVAL16(__VA_ARGS__)) + +/** + * macro _MAP_NOP + * this macro expands to nothing and can be used to break up another macro from + * its arguments to stop the preprocessor from expanding the macro. + */ +#define _MAP_NOP /*empty*/ + +/** + * macros _MAP_POP{0,1}(F, X, ...) + * these macros are called as _MAP_POP{0,1}(F, ...) and take the first argument + * of the variadic arguments and apply the function F to it. + * If any variadic arguments remain they call their sibling macro which does + * the same. The use of the sibling and _MAP_NOP macro ensures that the + * preprocessor does not detect a recursion call and stops processing. + */ +#define _MAP_POP0(F, X, ...) \ + F(X) \ + __VA_OPT__(, _MAP_POP1 _MAP_NOP(F, __VA_ARGS__)) +#define _MAP_POP1(F, X, ...) \ + F(X) \ + __VA_OPT__(, _MAP_POP0 _MAP_NOP(F, __VA_ARGS__)) + +/** + * macro MAP(F, ...) + * Maps the function F to each of the variadic arguments and uses a comma as + * delimiter. + * I.e. MAP(F,1,2,3) results in F(1), F(2), F(3) + */ +#define MAP(F, ...) __VA_OPT__(_MAP_EVAL256(_MAP_POP0(F, __VA_ARGS__))) + +/** + * see _MAP_POP{0,1} + */ +#define _MAP1_POP0(F, P0, X, ...) \ + F(P0, X) \ + __VA_OPT__(, _MAP1_POP1 _MAP_NOP(F, P0, __VA_ARGS__)) +#define _MAP1_POP1(F, P0, X, ...) \ + F(P0, X) \ + __VA_OPT__(, _MAP1_POP0 _MAP_NOP(F, P0, __VA_ARGS__)) + +/** + * macro MAP1(F, P0, ...) + * Maps the parameterized function F to each of the variadic arguments + * and uses a comma as delimiter. + * I.e. MAP1(F,A,1,2,3) results in F(A,1), F(A,2), F(A,3) + */ +#define MAP1(F, P0, ...) \ + __VA_OPT__(_MAP_EVAL256(_MAP1_POP0(F, P0, __VA_ARGS__))) + +/** + * see _MAP_POP{0,1} + */ +#define _MAP2_POP0(F, P0, P1, X, ...) \ + F(P0, P1, X) \ + __VA_OPT__(, _MAP2_POP1 _MAP_NOP(F, P0, P1, __VA_ARGS__)) +#define _MAP2_POP1(F, P0, P1, X, ...) \ + F(P0, P1, X) \ + __VA_OPT__(, _MAP2_POP0 _MAP_NOP(F, P0, P1, __VA_ARGS__)) + +/** + * macro MAP2(F, P0, P1, ...) + * Maps the parameterized function F to each of the variadic arguments + * and uses a comma as delimiter. + * I.e. MAP2(F,A,B,1,2,3) results in F(A,B,1), F(A,B,2), F(A,B,3) + */ +#define MAP2(F, P0, P1, ...) \ + __VA_OPT__(_MAP_EVAL256(_MAP2_POP0(F, P0, P1, __VA_ARGS__))) + +/** + * see _MAP_POP{0,1} + */ +#define _MAP3_POP0(F, P0, P1, P2, X, ...) \ + F(P0, P1, P2, X) \ + __VA_OPT__(, _MAP3_POP1 _MAP_NOP(F, P0, P1, P2, __VA_ARGS__)) +#define _MAP3_POP1(F, P0, P1, P2, X, ...) \ + F(P0, P1, P2, X) \ + __VA_OPT__(, _MAP3_POP0 _MAP_NOP(F, P0, P1, P2, __VA_ARGS__)) + +/** + * macro MAP3(F, P0, P1, P2, ...) + * Maps the parameterized function F to each of the variadic arguments + * and uses a comma as delimiter. + * I.e. MAP3(F,A,B,C,1,2,3) results in F(A,B,C,1), F(A,B,C,2), F(A,B,C,3) + */ +#define MAP3(F, P0, P1, P2, ...) \ + __VA_OPT__(_MAP_EVAL256(_MAP3_POP0(F, P0, P1, P2, __VA_ARGS__))) + +/** + * see _MAP_POP{0,1} + */ +#define _MAPD_POP0(D, F, X, ...) \ + F(X) \ + __VA_OPT__(D _MAPD_POP1 _MAP_NOP(D, F, __VA_ARGS__)) +#define _MAPD_POP1(D, F, X, ...) \ + F(X) \ + __VA_OPT__(D _MAPD_POP0 _MAP_NOP(D, F, __VA_ARGS__)) + +/** + * macro MAP(D, F, ...) + * Maps the function F to each of the variadic arguments and uses D as + * delimiter. + * I.e. MAP(+,F,1,2,3) results in F(1) + F(2) + F(3) + */ +#define MAPD(D, F, ...) __VA_OPT__(_MAP_EVAL256(_MAPD_POP0(D, F, __VA_ARGS__))) + +/** + * see _MAP_POP{0,1} + */ +#define _MAPD1_POP0(D, F, P0, X, ...) \ + F(P0, X) \ + __VA_OPT__(D _MAPD1_POP1 _MAP_NOP(D, F, P0, __VA_ARGS__)) +#define _MAPD1_POP1(D, F, P0, X, ...) \ + F(P0, X) \ + __VA_OPT__(D _MAPD1_POP0 _MAP_NOP(D, F, P0, __VA_ARGS__)) + +/** + * macro MAPD1(D, F, P0, ...) + * Maps the parameterized function F to each of the variadic arguments + * and uses D as delimiter. + * I.e. MAPD1(+,F,A,1,2,3) results in F(A,1) + F(A,2) + F(A,3) + */ +#define MAPD1(D, F, P0, ...) \ + __VA_OPT__(_MAP_EVAL256(_MAPD1_POP0(D, F, P0, __VA_ARGS__))) + +/** + * see _MAP_POP{0,1} + */ +#define _MAPD2_POP0(D, F, P0, P1, X, ...) \ + F(P0, P1, X) \ + __VA_OPT__(D _MAPD2_POP1 _MAP_NOP(D, F, P0, P1, __VA_ARGS__)) +#define _MAPD2_POP1(D, F, P0, P1, X, ...) \ + F(P0, P1, X) \ + __VA_OPT__(D _MAPD2_POP0 _MAP_NOP(D, F, P0, P1, __VA_ARGS__)) + +/** + * macro MAPD2(D, F, P0, P1, ...) + * Maps the parameterized function F to each of the variadic arguments + * and uses D as delimiter. + * I.e. MAPD2(+,F,A,B,1,2,3) results in F(A,B,1) + F(A,B,2) + F(A,B,3) + */ +#define MAPD2(D, F, P0, P1, ...) \ + __VA_OPT__(_MAP_EVAL256(_MAPD2_POP0(D, F, P0, P1, __VA_ARGS__))) + +/** + * see _MAP_POP{0,1} + */ +#define _MAPD3_POP0(D, F, P0, P1, P2, X, ...) \ + F(P0, P1, P2, X) \ + __VA_OPT__(D _MAPD3_POP1 _MAP_NOP(D, F, P0, P1, P2, __VA_ARGS__)) +#define _MAPD3_POP1(D, F, P0, P1, P2, X, ...) \ + F(P0, P1, P2, X) \ + __VA_OPT__(D _MAPD3_POP0 _MAP_NOP(D, F, P0, P1, P2, __VA_ARGS__)) + +/** + * macro MAPD3(D, F, P0, P1, P2, ...) + * Maps the parameterized function F to each of the variadic arguments + * and uses D as delimiter. + * I.e. MAPD3(+,F,A,B,C,1,2,3) results in F(A,B,C,1) + F(A,B,C,2) + F(A,B,C,3) + */ +#define MAPD3(D, F, P0, P1, P2, ...) \ + __VA_OPT__(_MAP_EVAL256(_MAPD3_POP0(D, F, P0, P1, P2, __VA_ARGS__))) + +#endif \ No newline at end of file From 4fbb83d69c320930025fef709c34bf9ed7d14403 Mon Sep 17 00:00:00 2001 From: drechsler Date: Sat, 28 Nov 2020 13:22:20 +0100 Subject: [PATCH 5/6] fixed some bugs --- .../lifesensor_common/include/logger.h | 33 ++-- .../lifesensor_common/include/logger_json.h | 8 +- .../lifesensor_common/include/logger_yaml.h | 12 ++ .../lifesensor_common/include/module.h | 5 +- .../lifesensor_common/src/logger_json.c | 156 +++++++++-------- .../lifesensor_common/src/logger_yaml.c | 161 ++++++++++++++++++ .../lifesensor_common/src/module.c | 28 +-- 7 files changed, 292 insertions(+), 111 deletions(-) create mode 100644 parts/esp32-components/lifesensor_common/include/logger_yaml.h create mode 100644 parts/esp32-components/lifesensor_common/src/logger_yaml.c diff --git a/parts/esp32-components/lifesensor_common/include/logger.h b/parts/esp32-components/lifesensor_common/include/logger.h index 51a1b6c..220704f 100644 --- a/parts/esp32-components/lifesensor_common/include/logger.h +++ b/parts/esp32-components/lifesensor_common/include/logger.h @@ -3,13 +3,6 @@ #include -#define LOG_UINT(LOGGER,SCOPE,PTR,NAME) LOGGER->log_uint(SCOPE,#NAME,(PTR)->NAME) -#define LOG_INT(LOGGER,SCOPE,PTR,NAME) LOGGER->log_int(SCOPE,#NAME,(PTR)->NAME) -#define LOG_FLOAT(LOGGER,SCOPE,PTR,NAME) LOGGER->log_float(SCOPE,#NAME,(PTR)->NAME) -#define LOG_CHAR(LOGGER,SCOPE,PTR,NAME) LOGGER->log_char(SCOPE,#NAME,(PTR)->NAME) -#define LOG_STR(LOGGER,SCOPE,PTR,NAME) LOGGER->log_str(SCOPE,#NAME,(PTR)->NAME) -#define LOG_PTR(LOGGER,SCOPE,PTR,NAME) LOGGER->log_ptr(SCOPE,#NAME,(PTR)->NAME) - enum lifesensor_logger_scope_type { LIFESENSOR_LOGGER_SCOPE_NONE, LIFESENSOR_LOGGER_SCOPE_LIST, @@ -17,7 +10,7 @@ enum lifesensor_logger_scope_type { }; struct lifesensor_logger_scope { - void (*printf)(const char *fmt, ...); + int (*printf)(const char *fmt, ...); enum lifesensor_logger_scope_type type; size_t entries; size_t level; @@ -42,33 +35,33 @@ struct lifesensor_logger { void (*log_uint)( struct lifesensor_logger_scope* scope, - char *name, - unsigned long int value + unsigned long int value, + char *name ); void (*log_int)( struct lifesensor_logger_scope* scope, - char *name, - long int value + long int value, + char *name ); void (*log_float)( struct lifesensor_logger_scope* scope, - char *name, - float value + float value, + char *name ); void (*log_char)( struct lifesensor_logger_scope* scope, - char *name, - char value + char value, + char *name ); void (*log_str)( struct lifesensor_logger_scope* scope, - char *name, - char *value + char *value, + char *name ); void (*log_ptr)( struct lifesensor_logger_scope* scope, - char *name, - void *value + void *value, + char *name ); }; typedef struct lifesensor_logger Lifesensor_logger; diff --git a/parts/esp32-components/lifesensor_common/include/logger_json.h b/parts/esp32-components/lifesensor_common/include/logger_json.h index b7f7f87..68d1549 100644 --- a/parts/esp32-components/lifesensor_common/include/logger_json.h +++ b/parts/esp32-components/lifesensor_common/include/logger_json.h @@ -1,10 +1,12 @@ #ifndef LIFESENSOR_COMMON_LOGGER_JSON_H #define LIFESENSOR_COMMON_LOGGER_JSON_H -#include "logger_json.h" +#include "logger.h" -lifesensor_logger_yaml_init( +void +lifesensor_logger_json_init( Lifesensor_logger *logger, - Lifesensor_logger_scope *scope); + Lifesensor_logger_scope *scope, + int (*printf)(const char *fmt, ...)); #endif \ No newline at end of file diff --git a/parts/esp32-components/lifesensor_common/include/logger_yaml.h b/parts/esp32-components/lifesensor_common/include/logger_yaml.h new file mode 100644 index 0000000..1dd0b98 --- /dev/null +++ b/parts/esp32-components/lifesensor_common/include/logger_yaml.h @@ -0,0 +1,12 @@ +#ifndef LIFESENSOR_COMMON_LOGGER_YAML_H +#define LIFESENSOR_COMMON_LOGGER_YAML_H + +#include "logger.h" + +void +lifesensor_logger_yaml_init( + Lifesensor_logger *logger, + Lifesensor_logger_scope *scope, + int (*printf)(const char *fmt, ...)); + +#endif \ No newline at end of file diff --git a/parts/esp32-components/lifesensor_common/include/module.h b/parts/esp32-components/lifesensor_common/include/module.h index 7459917..37590d8 100644 --- a/parts/esp32-components/lifesensor_common/include/module.h +++ b/parts/esp32-components/lifesensor_common/include/module.h @@ -2,6 +2,7 @@ #define LIFESENSOR_COMMON_MODULE_H #include "logger.h" +#include "macro/map.h" #include #define INIT_LIFESENSOR_MODULE(TYPE, NAME, INIT, DUMP, /* SUBMODULES */...) \ @@ -9,8 +10,8 @@ .parent = NULL, \ .type = #TYPE, \ .name = (NAME), \ - .init(INIT), \ - .dump(DUMP), \ + .init = (INIT), \ + .dump = (DUMP), \ .submodule_offsets = (ptrdiff_t[]){__VA_OPT__(MAP1(offsetof, TYPE, __VA_ARGS__), ) 0}, \ } diff --git a/parts/esp32-components/lifesensor_common/src/logger_json.c b/parts/esp32-components/lifesensor_common/src/logger_json.c index cc34d96..96e6fbc 100644 --- a/parts/esp32-components/lifesensor_common/src/logger_json.c +++ b/parts/esp32-components/lifesensor_common/src/logger_json.c @@ -2,152 +2,160 @@ #include "logger.h" static inline void -_lifesensor_logger_yaml_comma( - Lifesensor_logger_scope *scope -){ - if (scope->entries++) { +_lifesensor_logger_json_comma( + Lifesensor_logger_scope *scope) +{ + if (scope->entries++) + { scope->printf(", "); } } static inline void -_lifesensor_logger_yaml_name( +_lifesensor_logger_json_name( Lifesensor_logger_scope *scope, - char *name -){ - if (name) { + char *name) +{ + if (name) + { scope->printf("\"%s\": "); } } static void -lifesensor_logger_yaml_enter_map( +lifesensor_logger_json_enter_map( Lifesensor_logger_scope *scope, Lifesensor_logger_scope *subscope, char *name) { - subscope->entries = 0; - subscope->level = scope->level + 1; + if (scope) { + subscope->entries = 0; + subscope->level = scope->level + 1; + subscope->printf = scope->printf; + + _lifesensor_logger_json_comma(scope); + _lifesensor_logger_json_name(scope, name); + } + subscope->type = LIFESENSOR_LOGGER_SCOPE_MAP; - subscope->printf = scope->printf; - - _lifesensor_logger_yaml_comma(scope); - _lifesensor_logger_yaml_name(scope,name); - scope->printf("{ "); + subscope->printf("{ "); } static void -lifesensor_logger_yaml_enter_list( +lifesensor_logger_json_enter_list( Lifesensor_logger_scope *scope, Lifesensor_logger_scope *subscope, char *name) { - subscope->entries = 0; - subscope->level = scope->level + 1; + if (scope) { + subscope->entries = 0; + subscope->level = scope->level + 1; + subscope->printf = scope->printf; + + _lifesensor_logger_json_comma(scope); + _lifesensor_logger_json_name(scope, name); + } + subscope->type = LIFESENSOR_LOGGER_SCOPE_LIST; - subscope->printf = scope->printf; - - _lifesensor_logger_yaml_comma(scope); - _lifesensor_logger_yaml_name(scope,name); - scope->printf("[ "); + subscope->printf("[ "); } static void -lifesensor_logger_yaml_exit( +lifesensor_logger_json_exit( Lifesensor_logger_scope *scope, Lifesensor_logger_scope *subscope) { - switch(subscope->type) { - case LIFESENSOR_LOGGER_SCOPE_MAP: - scope->printf(" }"); - break; - case LIFESENSOR_LOGGER_SCOPE_LIST: - scope->printf(" ]"); - break; + switch (subscope->type) + { + case LIFESENSOR_LOGGER_SCOPE_MAP: + subscope->printf(" }"); + break; + case LIFESENSOR_LOGGER_SCOPE_LIST: + subscope->printf(" ]"); + break; } } static void -lifesensor_logger_yaml_log_uint( +lifesensor_logger_json_log_uint( Lifesensor_logger_scope *scope, - char *name, - unsigned long int value) + unsigned long int value, + char *name) { - _lifesensor_logger_yaml_comma(scope); - _lifesensor_logger_yaml_name(scope, name); + _lifesensor_logger_json_comma(scope); + _lifesensor_logger_json_name(scope, name); scope->printf("%+lu", value); } static void -lifesensor_logger_yaml_log_int( +lifesensor_logger_json_log_int( Lifesensor_logger_scope *scope, - char *name, - long int value) + long int value, + char *name) { - _lifesensor_logger_yaml_comma(scope); - _lifesensor_logger_yaml_name(scope, name); + _lifesensor_logger_json_comma(scope); + _lifesensor_logger_json_name(scope, name); scope->printf("%+ld", value); } static void -lifesensor_logger_yaml_log_float( +lifesensor_logger_json_log_float( Lifesensor_logger_scope *scope, - char *name, - float value) + float value, + char *name) { - _lifesensor_logger_yaml_comma(scope); - _lifesensor_logger_yaml_name(scope, name); + _lifesensor_logger_json_comma(scope); + _lifesensor_logger_json_name(scope, name); scope->printf("%+G", value); } static void -lifesensor_logger_yaml_log_char( +lifesensor_logger_json_log_char( Lifesensor_logger_scope *scope, - char *name, - char value) + char value, + char *name) { - _lifesensor_logger_yaml_comma(scope); - _lifesensor_logger_yaml_name(scope, name); + _lifesensor_logger_json_comma(scope); + _lifesensor_logger_json_name(scope, name); scope->printf("\"%c\"", value); } static void -lifesensor_logger_yaml_log_str( +lifesensor_logger_json_log_str( Lifesensor_logger_scope *scope, - char *name, - char *value) + char *value, + char *name) { - _lifesensor_logger_yaml_comma(scope); - _lifesensor_logger_yaml_name(scope, name); + _lifesensor_logger_json_comma(scope); + _lifesensor_logger_json_name(scope, name); scope->printf("\"%s\"", value); } static void -lifesensor_logger_yaml_log_ptr( +lifesensor_logger_json_log_ptr( Lifesensor_logger_scope *scope, - char *name, - void *value) + void *value, + char *name) { - _lifesensor_logger_yaml_comma(scope); - _lifesensor_logger_yaml_name(scope, name); + _lifesensor_logger_json_comma(scope); + _lifesensor_logger_json_name(scope, name); scope->printf("\"0x%x\"", value); } -void -lifesensor_logger_yaml_init( +void lifesensor_logger_json_init( Lifesensor_logger *logger, Lifesensor_logger_scope *scope, - void (*printf)(const char* fmt, ...)) + int (*printf)(const char *fmt, ...)) { - logger->enter_map = &lifesensor_logger_yaml_enter_map; - logger->enter_list = &lifesensor_logger_yaml_enter_list; - logger->exit = &lifesensor_logger_yaml_exit; - logger->log_uint = &lifesensor_logger_yaml_log_uint; - logger->log_int = &lifesensor_logger_yaml_log_int; - logger->log_float = &lifesensor_logger_yaml_log_float; - logger->log_char = &lifesensor_logger_yaml_log_char; - logger->log_str = &lifesensor_logger_yaml_log_str; - logger->log_ptr = &lifesensor_logger_yaml_log_ptr; + logger->enter_map = &lifesensor_logger_json_enter_map; + logger->enter_list = &lifesensor_logger_json_enter_list; + logger->exit = &lifesensor_logger_json_exit; + logger->log_uint = &lifesensor_logger_json_log_uint; + logger->log_int = &lifesensor_logger_json_log_int; + logger->log_float = &lifesensor_logger_json_log_float; + logger->log_char = &lifesensor_logger_json_log_char; + logger->log_str = &lifesensor_logger_json_log_str; + logger->log_ptr = &lifesensor_logger_json_log_ptr; scope->type = LIFESENSOR_LOGGER_SCOPE_NONE; scope->entries = 0; diff --git a/parts/esp32-components/lifesensor_common/src/logger_yaml.c b/parts/esp32-components/lifesensor_common/src/logger_yaml.c new file mode 100644 index 0000000..73fdd2d --- /dev/null +++ b/parts/esp32-components/lifesensor_common/src/logger_yaml.c @@ -0,0 +1,161 @@ + +#include "logger.h" + +static inline void +_lifesensor_logger_yaml_prefix( + Lifesensor_logger_scope *scope, + char *name) +{ + scope->printf("\n%*s", 4 * scope->level, ""); + scope->entries++; + switch (scope->type) + { + case LIFESENSOR_LOGGER_SCOPE_LIST: + scope->printf("- "); + break; + case LIFESENSOR_LOGGER_SCOPE_MAP: + if (name) + { + scope->printf("%s: ", name); + } + break; + } +} + +static void +lifesensor_logger_yaml_enter_map( + Lifesensor_logger_scope *scope, + Lifesensor_logger_scope *subscope, + char *name) +{ + subscope->type = LIFESENSOR_LOGGER_SCOPE_MAP; + + if (!scope) { + return; + } + + subscope->entries = 0; + subscope->level = scope->level + 1; + subscope->printf = scope->printf; + + _lifesensor_logger_yaml_prefix(scope, name); +} + +static void +lifesensor_logger_yaml_enter_list( + Lifesensor_logger_scope *scope, + Lifesensor_logger_scope *subscope, + char *name) +{ + subscope->type = LIFESENSOR_LOGGER_SCOPE_LIST; + + if (!scope) { + return; + } + + subscope->entries = 0; + subscope->level = scope->level + 1; + subscope->printf = scope->printf; + + _lifesensor_logger_yaml_prefix(scope, name); +} + +static void +lifesensor_logger_yaml_exit( + Lifesensor_logger_scope *scope, + Lifesensor_logger_scope *subscope) +{ + if (!subscope->entries) + { + switch (subscope->type) + { + case LIFESENSOR_LOGGER_SCOPE_MAP: + subscope->printf("{}"); + break; + case LIFESENSOR_LOGGER_SCOPE_LIST: + subscope->printf("[]"); + break; + } + } +} + +static void +lifesensor_logger_yaml_log_uint( + Lifesensor_logger_scope *scope, + unsigned long int value, + char *name) +{ + _lifesensor_logger_yaml_prefix(scope, name); + scope->printf("%+lu", value); +} + +static void +lifesensor_logger_yaml_log_int( + Lifesensor_logger_scope *scope, + long int value, + char *name) +{ + _lifesensor_logger_yaml_prefix(scope, name); + scope->printf("%+ld", value); +} + +static void +lifesensor_logger_yaml_log_float( + Lifesensor_logger_scope *scope, + float value, + char *name) +{ + _lifesensor_logger_yaml_prefix(scope, name); + scope->printf("%+G", value); +} + +static void +lifesensor_logger_yaml_log_char( + Lifesensor_logger_scope *scope, + char value, + char *name) +{ + _lifesensor_logger_yaml_prefix(scope, name); + scope->printf("\"%c\"", value); +} + +static void +lifesensor_logger_yaml_log_str( + Lifesensor_logger_scope *scope, + char *value, + char *name) +{ + _lifesensor_logger_yaml_prefix(scope, name); + scope->printf("\"%s\"", value); +} + +static void +lifesensor_logger_yaml_log_ptr( + Lifesensor_logger_scope *scope, + void *value, + char *name) +{ + _lifesensor_logger_yaml_prefix(scope, name); + scope->printf("0x%x", value); +} + +void lifesensor_logger_yaml_init( + Lifesensor_logger *logger, + Lifesensor_logger_scope *scope, + int (*printf)(const char *fmt, ...)) +{ + logger->enter_map = &lifesensor_logger_yaml_enter_map; + logger->enter_list = &lifesensor_logger_yaml_enter_list; + logger->exit = &lifesensor_logger_yaml_exit; + logger->log_uint = &lifesensor_logger_yaml_log_uint; + logger->log_int = &lifesensor_logger_yaml_log_int; + logger->log_float = &lifesensor_logger_yaml_log_float; + logger->log_char = &lifesensor_logger_yaml_log_char; + logger->log_str = &lifesensor_logger_yaml_log_str; + logger->log_ptr = &lifesensor_logger_yaml_log_ptr; + + scope->type = LIFESENSOR_LOGGER_SCOPE_NONE; + scope->entries = 0; + scope->level = 0; + scope->printf = printf; +} diff --git a/parts/esp32-components/lifesensor_common/src/module.c b/parts/esp32-components/lifesensor_common/src/module.c index 45b06ee..de19382 100644 --- a/parts/esp32-components/lifesensor_common/src/module.c +++ b/parts/esp32-components/lifesensor_common/src/module.c @@ -7,6 +7,7 @@ void lifesensor_module_init(Lifesensor_module *module) for (ptrdiff_t *offset = module->submodule_offsets; *offset; offset++) { Lifesensor_module *submodule = ((void *)module) + *offset; + submodule->parent = module; if (submodule->init) { submodule->init(submodule); @@ -18,34 +19,37 @@ void lifesensor_module_init(Lifesensor_module *module) } } -void lifesensor_module_dump(Lifesensor_module *module, Lifesensor_logger *logger, Lifesensor_logger_scope *scope) { +void lifesensor_module_dump(Lifesensor_module *module, Lifesensor_logger *logger, Lifesensor_logger_scope *scope) +{ Lifesensor_logger_scope subscope; Lifesensor_logger_scope subsubscope; - LOG_PTR(logger, scope, module, parent); - LOG_STR(logger, scope, module, type); - LOG_STR(logger, scope, module, name); - LOG_PTR(logger, scope, module, init); - LOG_PTR(logger, scope, module, dump); - + logger->log_ptr(scope, module, "address"); + logger->log_ptr(scope, module->parent, "parent"); + logger->log_str(scope, module->type, "type"); + logger->log_str(scope, module->name, "name"); + logger->log_ptr(scope, module->init, "init"); + logger->log_ptr(scope, module->dump, "dump"); + logger->enter_list(scope, &subscope, "submodule_offsets"); for (ptrdiff_t *offset = module->submodule_offsets; *offset; offset++) { - logger->log_uint(logger, &subscope, NULL, *offset); + logger->log_int(&subscope, *offset, NULL); } logger->exit(scope, &subscope); - + logger->enter_map(scope, &subscope, "locals"); - if (module->dump) { + if (module->dump) + { module->dump(module, logger, &subscope); } logger->exit(scope, &subscope); - + logger->enter_map(scope, &subscope, "submodules"); for (ptrdiff_t *offset = module->submodule_offsets; *offset; offset++) { Lifesensor_module *submodule = ((void *)module) + *offset; - logger->enter_map(&subscope ,&subsubscope, submodule->name); + logger->enter_map(&subscope, &subsubscope, submodule->name); lifesensor_module_dump(submodule, logger, &subsubscope); logger->exit(&subscope, &subsubscope); } From e9fea556cc3c4434d7f95d8f0b58a1791d8501fe Mon Sep 17 00:00:00 2001 From: nopeslide Date: Thu, 28 Jan 2021 00:25:02 +0100 Subject: [PATCH 6/6] added static_alloc macro --- .../lifesensor_common/include/macro/static_alloc.h | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 parts/esp32-components/lifesensor_common/include/macro/static_alloc.h diff --git a/parts/esp32-components/lifesensor_common/include/macro/static_alloc.h b/parts/esp32-components/lifesensor_common/include/macro/static_alloc.h new file mode 100644 index 0000000..c9cde40 --- /dev/null +++ b/parts/esp32-components/lifesensor_common/include/macro/static_alloc.h @@ -0,0 +1,6 @@ +#ifndef LIFESENSOR_COMMON_STATIC_ALLOC_H +#define LIFESENSOR_COMMON_STATIC_ALLOC_H + +#define STATIC_ALLOC(TYPE, SIZE, ...) (TYPE[SIZE]){__VA_ARGS__} + +#endif \ No newline at end of file