From 357df1600f1aec65067e9d9b5070dad999ab6d74 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 23 Jan 2019 00:49:28 +0100 Subject: [PATCH] sample: add function to dump sample details --- include/villas/sample.h | 3 +++ include/villas/signal.h | 6 +++--- lib/io.c | 2 +- lib/node.c | 6 +++--- lib/sample.c | 17 +++++++++++++++++ lib/signal.c | 30 +++++++++++++++++++++++------- tests/unit/io.cpp | 4 ++-- 7 files changed, 52 insertions(+), 16 deletions(-) diff --git a/include/villas/sample.h b/include/villas/sample.h index 493be1ae1..f5bc0d35f 100644 --- a/include/villas/sample.h +++ b/include/villas/sample.h @@ -123,6 +123,9 @@ int sample_decref(struct sample *s); int sample_copy(struct sample *dst, struct sample *src); +/** Dump all details about a sample to debug log */ +void sample_dump(struct sample *s); + /** Compare two samples */ int sample_cmp(struct sample *a, struct sample *b, double epsilon, int flags); diff --git a/include/villas/signal.h b/include/villas/signal.h index 9edc48236..d57f85851 100644 --- a/include/villas/signal.h +++ b/include/villas/signal.h @@ -106,11 +106,11 @@ int signal_parse(struct signal *s, json_t *cfg); /** Initialize signal from a mapping_entry. */ int signal_init_from_mapping(struct signal *s, const struct mapping_entry *me, unsigned index); -int signal_vlist_parse(struct vlist *list, json_t *cfg); +int signal_list_parse(struct vlist *list, json_t *cfg); -int signal_vlist_generate(struct vlist *list, unsigned len, enum signal_type fmt); +int signal_list_generate(struct vlist *list, unsigned len, enum signal_type fmt); -void signal_vlist_dump(const struct vlist *list); +void signal_list_dump(const struct vlist *list, const union signal_data *data, int len); enum signal_type signal_type_from_str(const char *str); diff --git a/lib/io.c b/lib/io.c index 99ab52d4f..740d08cb8 100644 --- a/lib/io.c +++ b/lib/io.c @@ -122,7 +122,7 @@ int io_init_auto(struct io *io, const struct format_type *fmt, int len, int flag if (ret) return ret; - ret = signal_vlist_generate(signals, len, SIGNAL_TYPE_AUTO); + ret = signal_list_generate(signals, len, SIGNAL_TYPE_AUTO); if (ret) return ret; diff --git a/lib/node.c b/lib/node.c index 3a85d7bf1..33020dc5a 100644 --- a/lib/node.c +++ b/lib/node.c @@ -274,7 +274,7 @@ int node_parse(struct node *n, json_t *json, const char *name) } else if (json_signals) { if (json_is_array(json_signals)) { - ret = signal_vlist_parse(&n->signals, json_signals); + ret = signal_list_parse(&n->signals, json_signals); if (ret) error("Failed to parse signal definition of node %s", node_name(n)); } @@ -291,13 +291,13 @@ int node_parse(struct node *n, json_t *json, const char *name) if (type < 0) error("Invalid signal type %s", type_str); - signal_vlist_generate(&n->signals, count, type); + signal_list_generate(&n->signals, count, type); } } else { warning("No signal definition found for node %s. Using the default config of %d floating point signals.", node_name(n), DEFAULT_SAMPLE_LENGTH); - signal_vlist_generate(&n->signals, DEFAULT_SAMPLE_LENGTH, SIGNAL_TYPE_FLOAT); + signal_list_generate(&n->signals, DEFAULT_SAMPLE_LENGTH, SIGNAL_TYPE_FLOAT); } struct { diff --git a/lib/sample.c b/lib/sample.c index dbf005bca..87c177b00 100644 --- a/lib/sample.c +++ b/lib/sample.c @@ -284,3 +284,20 @@ enum signal_type sample_format(const struct sample *s, unsigned idx) return sig ? sig->type : SIGNAL_TYPE_AUTO; } + +void sample_dump(struct sample *s) +{ + debug(5, "Sample: sequence=%zu, length=%d, capacity=%d, flags=%#x, signals=%p, #signals=%zu, " + "refcnt=%d, pool_off=%zd", + s->sequence, s->length, s->capacity, s->flags, s->signals, + s->signals ? vlist_length(s->signals) : 0, atomic_load(&s->refcnt), s->pool_off); + + if (s->flags & SAMPLE_HAS_TS_ORIGIN) + debug(5, " ts.origin=%ld.%ld", s->ts.origin.tv_sec, s->ts.origin.tv_nsec); + + if (s->flags & SAMPLE_HAS_TS_RECEIVED) + debug(5, " ts.received=%ld.%ld", s->ts.received.tv_sec, s->ts.received.tv_nsec); + + if (s->signals) + signal_list_dump(s->signals, s->data, s->length); +} diff --git a/lib/signal.c b/lib/signal.c index 65cc17aa9..f8c59ceb7 100644 --- a/lib/signal.c +++ b/lib/signal.c @@ -223,7 +223,7 @@ int signal_parse(struct signal *s, json_t *cfg) /* Signal list */ -int signal_vlist_parse(struct vlist *list, json_t *cfg) +int signal_list_parse(struct vlist *list, json_t *cfg) { int ret; struct signal *s; @@ -252,7 +252,7 @@ int signal_vlist_parse(struct vlist *list, json_t *cfg) return 0; } -int signal_vlist_generate(struct vlist *list, unsigned len, enum signal_type fmt) +int signal_list_generate(struct vlist *list, unsigned len, enum signal_type fmt) { for (int i = 0; i < len; i++) { char name[32]; @@ -268,17 +268,33 @@ int signal_vlist_generate(struct vlist *list, unsigned len, enum signal_type fmt return 0; } -void signal_vlist_dump(const struct vlist *list) +void signal_list_dump(const struct vlist *list, const union signal_data *data, int len) { - info ("Signals:"); + debug(5, " Signals:"); for (int i = 0; i < vlist_length(list); i++) { struct signal *sig = vlist_at(list, i); + char *buf = strf(" %d:", i); + + if (sig->name) + strcatf(&buf, " %s", sig->name); + if (sig->unit) - info(" %d: %s [%s] = %s", i, sig->name, sig->unit, signal_type_to_str(sig->type)); - else - info(" %d: %s = %s", i, sig->name, signal_type_to_str(sig->type)); + strcatf(&buf, " [%s]", sig->unit); + + strcatf(&buf, "(%s)", signal_type_to_str(sig->type)); + + if (data && i < len) { + char val[32]; + + signal_data_snprint(&data[i], sig, val, sizeof(val)); + + strcatf(&buf, " = %s", val); + } + + debug(5, buf); + free(buf); } } diff --git a/tests/unit/io.cpp b/tests/unit/io.cpp index 35bcf0635..3fa75bf96 100644 --- a/tests/unit/io.cpp +++ b/tests/unit/io.cpp @@ -231,7 +231,7 @@ ParameterizedTest(struct param *p, io, lowlevel, .init = init_memory) cr_assert_eq(ret, 0); vlist_init(&signals); - signal_vlist_generate(&signals, NUM_VALUES, SIGNAL_TYPE_FLOAT); + signal_list_generate(&signals, NUM_VALUES, SIGNAL_TYPE_FLOAT); ret = sample_alloc_many(&pool, smps, p->cnt); cr_assert_eq(ret, p->cnt); @@ -307,7 +307,7 @@ ParameterizedTest(struct param *p, io, highlevel, .init = init_memory) cr_assert_eq(ret, p->cnt); vlist_init(&signals); - signal_vlist_generate(&signals, NUM_VALUES, SIGNAL_TYPE_FLOAT); + signal_list_generate(&signals, NUM_VALUES, SIGNAL_TYPE_FLOAT); fill_sample_data(&signals, smps, p->cnt);