diff --git a/include/villas/signal.h b/include/villas/signal.h index e75cefff5..ca550c8d4 100644 --- a/include/villas/signal.h +++ b/include/villas/signal.h @@ -32,6 +32,7 @@ extern "C" { /* Forward declarations */ struct list; struct node; +struct mapping_entry; enum signal_format { SIGNAL_FORMAT_FLOAT = 0, @@ -50,6 +51,8 @@ struct signal { int signal_init(struct signal *s); +int signal_init_from_mapping(struct signal *s, const struct mapping_entry *me, unsigned index); + int signal_destroy(struct signal *s); int signal_parse(struct signal *s, json_t *cfg); diff --git a/lib/signal.c b/lib/signal.c index 4b7304014..773ffd917 100644 --- a/lib/signal.c +++ b/lib/signal.c @@ -26,6 +26,7 @@ #include #include #include +#include int signal_init(struct signal *s) { @@ -34,6 +35,58 @@ int signal_init(struct signal *s) return 0; } +int signal_init_from_mapping(struct signal *s, const struct mapping_entry *me, unsigned index) +{ + int ret; + + ret = signal_init(s); + if (ret) + return ret; + + ret = mapping_to_str(me, index, &s->name); + if (ret) + return ret; + + switch (me->type) { + case MAPPING_TYPE_STATS: + switch (me->stats.type) { + case MAPPING_STATS_TYPE_TOTAL: + s->format = SIGNAL_FORMAT_INT; + break; + + case MAPPING_STATS_TYPE_LAST: + case MAPPING_STATS_TYPE_LOWEST: + case MAPPING_STATS_TYPE_HIGHEST: + case MAPPING_STATS_TYPE_MEAN: + case MAPPING_STATS_TYPE_VAR: + case MAPPING_STATS_TYPE_STDDEV: + s->format = SIGNAL_FORMAT_FLOAT; + break; + } + break; + + case MAPPING_TYPE_HEADER: + switch (me->hdr.type) { + case MAPPING_HEADER_TYPE_LENGTH: + case MAPPING_HEADER_TYPE_SEQUENCE: + s->format = SIGNAL_FORMAT_INT; + break; + } + break; + + case MAPPING_TYPE_TIMESTAMP: + s->format = SIGNAL_FORMAT_INT; + break; + + case MAPPING_TYPE_DATA: + s->format = me->signal->format; + s->unit = me->signal->unit; + break; + } + + return 0; +} + int signal_destroy(struct signal *s) { if (s->name)