mirror of
https://git.rwth-aachen.de/acs/public/villas/node/
synced 2025-03-09 00:00:00 +01:00
signal_data: only use type not complete signal struct
This commit is contained in:
parent
dd7fcb4c89
commit
937d4f0aae
11 changed files with 50 additions and 52 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -23,13 +23,12 @@
|
|||
#include <cstring>
|
||||
#include <cinttypes>
|
||||
|
||||
#include <villas/signal.h>
|
||||
#include <villas/signal_type.h>
|
||||
#include <villas/signal_data.h>
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue