From 937d4f0aae542690547f1600898c90f3b1f6f57a Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 19 Feb 2021 06:37:21 +0100 Subject: [PATCH] signal_data: only use type not complete signal struct --- include/villas/signal_data.h | 12 ++++++------ lib/formats/csv.cpp | 4 ++-- lib/formats/json.cpp | 4 ++-- lib/formats/value.cpp | 4 ++-- lib/formats/villas_human.cpp | 4 ++-- lib/hooks/cast.cpp | 2 +- lib/nodes/ngsi.cpp | 8 ++++---- lib/signal.cpp | 6 +++--- lib/signal_data.cpp | 35 +++++++++++++++++------------------ lib/signal_list.cpp | 4 ++-- tests/unit/signal.cpp | 19 +++++++++---------- 11 files changed, 50 insertions(+), 52 deletions(-) diff --git a/include/villas/signal_data.h b/include/villas/signal_data.h index 4ff96d7fa..4217a0369 100644 --- a/include/villas/signal_data.h +++ b/include/villas/signal_data.h @@ -60,15 +60,15 @@ union signal_data { }; /** Convert signal data from one description/format to another. */ -void signal_data_cast(union signal_data *data, const struct signal *from, const struct signal *to); +void signal_data_cast(union signal_data *data, enum SignalType from, enum SignalType to); /** Print value of a signal to a character buffer. */ -int signal_data_print_str(const union signal_data *data, const struct signal *sig, char *buf, size_t len); +int signal_data_print_str(const union signal_data *data, enum SignalType type, char *buf, size_t len); -int signal_data_parse_str(union signal_data *data, const struct signal *sig, const char *ptr, char **end); +int signal_data_parse_str(union signal_data *data, enum SignalType type, const char *ptr, char **end); -int signal_data_parse_json(union signal_data *data, const struct signal *sig, json_t *cfg); +int signal_data_parse_json(union signal_data *data, enum SignalType type, json_t *cfg); -json_t * signal_data_to_json(union signal_data *data, const struct signal *sig); +json_t * signal_data_to_json(union signal_data *data, enum SignalType type); -void signal_data_set(union signal_data *data, const struct signal *sig, double val); +void signal_data_set(union signal_data *data, enum SignalType type, double val); diff --git a/lib/formats/csv.cpp b/lib/formats/csv.cpp index cb30ef414..04c4de7fa 100644 --- a/lib/formats/csv.cpp +++ b/lib/formats/csv.cpp @@ -60,7 +60,7 @@ static size_t csv_sprint_single(struct io *io, char *buf, size_t len, const stru break; off += snprintf(buf + off, len - off, "%c", io->separator); - off += signal_data_print_str(&smp->data[i], sig, buf + off, len - off); + off += signal_data_print_str(&smp->data[i], sig->type, buf + off, len - off); } off += snprintf(buf + off, len - off, "%c", io->delimiter); @@ -118,7 +118,7 @@ static size_t csv_sscan_single(struct io *io, const char *buf, size_t len, struc if (!sig) goto out; - ret = signal_data_parse_str(&smp->data[i], sig, ptr, &end); + ret = signal_data_parse_str(&smp->data[i], sig->type, ptr, &end); if (ret || end == ptr) /* There are no valid values anymore. */ goto out; } diff --git a/lib/formats/json.cpp b/lib/formats/json.cpp index af3a7c9cb..b014a0a9d 100644 --- a/lib/formats/json.cpp +++ b/lib/formats/json.cpp @@ -127,7 +127,7 @@ static int json_pack_sample(struct io *io, json_t **j, struct sample *smp) if (!sig) return -1; - json_t *json_value = signal_data_to_json(&smp->data[i], sig); + json_t *json_value = signal_data_to_json(&smp->data[i], sig->type); json_array_append(json_data, json_value); } @@ -209,7 +209,7 @@ static int json_unpack_sample(struct io *io, json_t *json_smp, struct sample *sm return -2; } - ret = signal_data_parse_json(&smp->data[i], sig, json_value); + ret = signal_data_parse_json(&smp->data[i], sig->type, json_value); if (ret) return -3; diff --git a/lib/formats/value.cpp b/lib/formats/value.cpp index 18f3da704..ce57a7e8c 100644 --- a/lib/formats/value.cpp +++ b/lib/formats/value.cpp @@ -45,7 +45,7 @@ int value_sprint(struct io *io, char *buf, size_t len, size_t *wbytes, struct sa if (!sig) return -1; - off += signal_data_print_str(&smp->data[i], sig, buf, len); + off += signal_data_print_str(&smp->data[i], sig->type, buf, len); off += snprintf(buf + off, len - off, "\n"); } @@ -72,7 +72,7 @@ int value_sscan(struct io *io, const char *buf, size_t len, size_t *rbytes, stru if (!sig) return -1; - ret = signal_data_parse_str(&smp->data[i], sig, ptr, &end); + ret = signal_data_parse_str(&smp->data[i], sig->type, ptr, &end); if (ret || end == ptr) /* There are no valid values anymore. */ goto out; diff --git a/lib/formats/villas_human.cpp b/lib/formats/villas_human.cpp index af7534522..1786af822 100644 --- a/lib/formats/villas_human.cpp +++ b/lib/formats/villas_human.cpp @@ -62,7 +62,7 @@ static size_t villas_human_sprint_single(struct io *io, char *buf, size_t len, c break; off += snprintf(buf + off, len - off, "%c", io->separator); - off += signal_data_print_str(&smp->data[i], sig, buf + off, len - off); + off += signal_data_print_str(&smp->data[i], sig->type, buf + off, len - off); } } @@ -140,7 +140,7 @@ static size_t villas_human_sscan_single(struct io *io, const char *buf, size_t l if (!sig) goto out; - ret = signal_data_parse_str(&smp->data[i], sig, ptr, &end); + ret = signal_data_parse_str(&smp->data[i], sig->type, ptr, &end); if (ret || end == ptr) /* There are no valid values anymore. */ goto out; } diff --git a/lib/hooks/cast.cpp b/lib/hooks/cast.cpp index 200122792..1f1203bd2 100644 --- a/lib/hooks/cast.cpp +++ b/lib/hooks/cast.cpp @@ -159,7 +159,7 @@ public: struct signal *orig_sig = (struct signal *) vlist_at(smp->signals, signal_index); struct signal *new_sig = (struct signal *) vlist_at(&signals, signal_index); - signal_data_cast(&smp->data[signal_index], orig_sig, new_sig); + signal_data_cast(&smp->data[signal_index], orig_sig->type, new_sig->type); return Reason::OK; } diff --git a/lib/nodes/ngsi.cpp b/lib/nodes/ngsi.cpp index 546612af1..2987d8e41 100644 --- a/lib/nodes/ngsi.cpp +++ b/lib/nodes/ngsi.cpp @@ -196,7 +196,7 @@ public: json_array_append_new(json_value, json_pack("[ f, o, i ]", time_to_double(smp->ts.origin), - signal_data_to_json(sd, sig), + signal_data_to_json(sd, sig->type), smp->sequence )); } @@ -206,7 +206,7 @@ public: union signal_data *sd = &smp->data[index]; struct signal *sig = (struct signal *) vlist_at_safe(smp->signals, index); - json_t *json_value = signal_data_to_json(sd, sig); + json_t *json_value = signal_data_to_json(sd, sig->type); #endif json_object_set(json_attribute, "value", json_value); @@ -361,7 +361,7 @@ static int ngsi_parse_entity(struct vnode *n, json_t *json_entity, struct sample if (value[0] == '\0') /* No data on Orion CB? -> Use init value */ *sd = sig->init; else { - signal_data_parse_str(sd, sig, value, &end); + signal_data_parse_str(sd, sig->type, value, &end); if (value == end) return -10; } @@ -383,7 +383,7 @@ static int ngsi_parse_entity(struct vnode *n, json_t *json_entity, struct sample if (value[0] == '\0') /* No data on Orion CB? -> Use init value */ *sd = sig->init; else { - signal_data_parse_str(sd, sig, value, &end); + signal_data_parse_str(sd, sig->type, value, &end); if (value == end) return -10; } diff --git a/lib/signal.cpp b/lib/signal.cpp index 199a4fdbb..fbbd6df88 100644 --- a/lib/signal.cpp +++ b/lib/signal.cpp @@ -219,12 +219,12 @@ int signal_parse(struct signal *s, json_t *cfg) } if (json_init) { - ret = signal_data_parse_json(&s->init, s, json_init); + ret = signal_data_parse_json(&s->init, s->type, json_init); if (ret) return ret; } else - signal_data_set(&s->init, s, 0); + signal_data_set(&s->init, s->type, 0); return 0; } @@ -234,7 +234,7 @@ json_t * signal_to_json(struct signal *s) json_t *json_sig = json_pack("{ s: s, s: b, s: o }", "type", signal_type_to_str(s->type), "enabled", s->enabled, - "init", signal_data_to_json(&s->init, s) + "init", signal_data_to_json(&s->init, s->type) ); if (s->name) diff --git a/lib/signal_data.cpp b/lib/signal_data.cpp index 78cae14de..bcb822bd9 100644 --- a/lib/signal_data.cpp +++ b/lib/signal_data.cpp @@ -23,13 +23,12 @@ #include #include -#include #include #include -void signal_data_set(union signal_data *data, const struct signal *sig, double val) +void signal_data_set(union signal_data *data, enum SignalType type, double val) { - switch (sig->type) { + switch (type) { case SignalType::BOOLEAN: data->b = val; break; @@ -52,14 +51,14 @@ void signal_data_set(union signal_data *data, const struct signal *sig, double v } } -void signal_data_cast(union signal_data *data, const struct signal *from, const struct signal *to) +void signal_data_cast(union signal_data *data, enum SignalType from, enum SignalType to) { - if (from->type == to->type) /* Nothing to do */ + if (from == to) /* Nothing to do */ return; - switch (to->type) { + switch (to) { case SignalType::BOOLEAN: - switch(from->type) { + switch(from) { case SignalType::BOOLEAN: break; @@ -80,7 +79,7 @@ void signal_data_cast(union signal_data *data, const struct signal *from, const break; case SignalType::INTEGER: - switch(from->type) { + switch(from) { case SignalType::BOOLEAN: data->i = data->b; break; @@ -101,7 +100,7 @@ void signal_data_cast(union signal_data *data, const struct signal *from, const break; case SignalType::FLOAT: - switch(from->type) { + switch(from) { case SignalType::BOOLEAN: data->f = data->b; break; @@ -122,7 +121,7 @@ void signal_data_cast(union signal_data *data, const struct signal *from, const break; case SignalType::COMPLEX: - switch(from->type) { + switch(from) { case SignalType::BOOLEAN: data->z = data->b; break; @@ -146,9 +145,9 @@ void signal_data_cast(union signal_data *data, const struct signal *from, const } } -int signal_data_parse_str(union signal_data *data, const struct signal *sig, const char *ptr, char **end) +int signal_data_parse_str(union signal_data *data, enum SignalType type, const char *ptr, char **end) { - switch (sig->type) { + switch (type) { case SignalType::FLOAT: data->f = strtod(ptr, end); break; @@ -198,11 +197,11 @@ int signal_data_parse_str(union signal_data *data, const struct signal *sig, con return 0; } -int signal_data_parse_json(union signal_data *data, const struct signal *sig, json_t *cfg) +int signal_data_parse_json(union signal_data *data, enum SignalType type, json_t *cfg) { int ret; - switch (sig->type) { + switch (type) { case SignalType::FLOAT: data->f = json_real_value(cfg); break; @@ -237,9 +236,9 @@ int signal_data_parse_json(union signal_data *data, const struct signal *sig, js return 0; } -json_t * signal_data_to_json(union signal_data *data, const struct signal *sig) +json_t * signal_data_to_json(union signal_data *data, enum SignalType type) { - switch (sig->type) { + switch (type) { case SignalType::INTEGER: return json_integer(data->i); @@ -262,9 +261,9 @@ json_t * signal_data_to_json(union signal_data *data, const struct signal *sig) return nullptr; } -int signal_data_print_str(const union signal_data *data, const struct signal *sig, char *buf, size_t len) +int signal_data_print_str(const union signal_data *data, enum SignalType type, char *buf, size_t len) { - switch (sig->type) { + switch (type) { case SignalType::FLOAT: return snprintf(buf, len, "%.6f", data->f); diff --git a/lib/signal_list.cpp b/lib/signal_list.cpp index faccbe555..687be5cef 100644 --- a/lib/signal_list.cpp +++ b/lib/signal_list.cpp @@ -159,7 +159,7 @@ void signal_list_dump(const struct vlist *list, const union signal_data *data, u if (data && i < len) { char val[32]; - signal_data_print_str(&data[i], sig, val, sizeof(val)); + signal_data_print_str(&data[i], sig->type, val, sizeof(val)); strcatf(&buf, " = %s", val); } @@ -204,7 +204,7 @@ json_t * signal_list_to_json(struct vlist *list) json_object_set_new(json_signal, "unit", json_string(sig->unit)); if (!sig->init.is_nan()) - json_object_set_new(json_signal, "init", signal_data_to_json(&sig->init, sig)); + json_object_set_new(json_signal, "init", signal_data_to_json(&sig->init, sig->type)); json_array_append_new(json_signals, json_signal); } diff --git a/tests/unit/signal.cpp b/tests/unit/signal.cpp index 4fc5032f2..abfbde73a 100644 --- a/tests/unit/signal.cpp +++ b/tests/unit/signal.cpp @@ -27,18 +27,17 @@ extern void init_memory(); // cppcheck-suppress unknownMacro -Test(signal, parse, .init = init_memory) { +Test(signal_data, parse, .init = init_memory) { int ret; - struct signal sig; + enum SignalType type; union signal_data sd; const char *str; char *end; - str = "1"; - sig.type = SignalType::INTEGER; + type = SignalType::INTEGER; - ret = signal_data_parse_str(&sd, &sig, str, &end); + ret = signal_data_parse_str(&sd, type, str, &end); cr_assert_eq(ret, 0); cr_assert_eq(end, str + strlen(str)); cr_assert_eq(sd.i, 1); @@ -46,7 +45,7 @@ Test(signal, parse, .init = init_memory) { str = "1.2"; sig.type = SignalType::FLOAT; - ret = signal_data_parse_str(&sd, &sig, str, &end); + ret = signal_data_parse_str(&sd, type, str, &end); cr_assert_eq(ret, 0); cr_assert_eq(end, str + strlen(str)); cr_assert_float_eq(sd.f, 1.2, 1e-6); @@ -54,7 +53,7 @@ Test(signal, parse, .init = init_memory) { str = "1"; sig.type = SignalType::BOOLEAN; - ret = signal_data_parse_str(&sd, &sig, str, &end); + ret = signal_data_parse_str(&sd, type, str, &end); cr_assert_eq(ret, 0); cr_assert_eq(end, str + strlen(str)); cr_assert_eq(sd.b, 1); @@ -62,7 +61,7 @@ Test(signal, parse, .init = init_memory) { str = "1"; sig.type = SignalType::COMPLEX; - ret = signal_data_parse_str(&sd, &sig, str, &end); + ret = signal_data_parse_str(&sd, type, str, &end); cr_assert_eq(ret, 0); cr_assert_eq(end, str + strlen(str)); cr_assert_float_eq(std::real(sd.z), 1, 1e-6); @@ -71,7 +70,7 @@ Test(signal, parse, .init = init_memory) { str = "-1-3i"; sig.type = SignalType::COMPLEX; - ret = signal_data_parse_str(&sd, &sig, str, &end); + ret = signal_data_parse_str(&sd, type, str, &end); cr_assert_eq(ret, 0); cr_assert_eq(end, str + strlen(str)); cr_assert_float_eq(std::real(sd.z), -1, 1e-6); @@ -80,7 +79,7 @@ Test(signal, parse, .init = init_memory) { str = "-3i"; sig.type = SignalType::COMPLEX; - ret = signal_data_parse_str(&sd, &sig, str, &end); + ret = signal_data_parse_str(&sd, type, str, &end); cr_assert_eq(ret, 0); cr_assert_eq(end, str + strlen(str)); cr_assert_float_eq(std::real(sd.z), 0, 1e-6);