diff options
author | Sylvain Munaut <tnt@246tNt.com> | 2016-10-29 21:36:10 +0200 |
---|---|---|
committer | Sylvain Munaut <tnt@246tNt.com> | 2019-08-31 08:15:37 +0200 |
commit | 714b9fbd1e7a3d6689254d5bd5aace7b4670b592 (patch) | |
tree | 8a167ab234aa8729af851b6b7eb82a96aa5ab6f4 | |
parent | a00ca1f53daf7aeb34afad80fef658e83c0a33a9 (diff) |
[hack] First attempt at a status reporting screen
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
-rw-r--r-- | src/gmr1_rx_live.c | 46 | ||||
-rw-r--r-- | src/rtfwk/common.h | 4 | ||||
-rw-r--r-- | src/rtfwk/sa_bcch_ccch.c | 21 | ||||
-rw-r--r-- | src/rtfwk/sa_fcch.c | 1 | ||||
-rw-r--r-- | src/rtfwk/sa_file.c | 2 | ||||
-rw-r--r-- | src/rtfwk/sa_tch3.c | 1 | ||||
-rw-r--r-- | src/rtfwk/sa_tch9.c | 1 | ||||
-rw-r--r-- | src/rtfwk/sampbuf.c | 54 | ||||
-rw-r--r-- | src/rtfwk/sampbuf.h | 7 |
9 files changed, 108 insertions, 29 deletions
diff --git a/src/gmr1_rx_live.c b/src/gmr1_rx_live.c index 361b711..808db89 100644 --- a/src/gmr1_rx_live.c +++ b/src/gmr1_rx_live.c @@ -21,6 +21,9 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> #include <osmocom/core/gsmtap.h> #include <osmocom/core/gsmtap_util.h> @@ -38,6 +41,7 @@ int main(int argc, char *argv[]) { struct app_state *as; + struct stat ss; int rv = 0, i; /* Args */ @@ -62,6 +66,11 @@ int main(int argc, char *argv[]) as->gti = gsmtap_source_init("127.0.0.1", GSMTAP_UDP_PORT, 0); gsmtap_source_add_sink(as->gti); + /* Open status */ + rv = stat("/tmp/gmr_rx_status", &ss); + if (!rv && (ss.st_mode & S_IFIFO)) + as->status = fopen("/tmp/gmr_rx_status", "w"); + /* Buffer */ as->buf = sbuf_alloc(as->n_chans); if (!as->buf) { @@ -116,7 +125,42 @@ int main(int argc, char *argv[]) } /* Go forth and process ! */ - sbuf_work(as->buf); + int iter = 0; + while (sbuf_work(as->buf)) + { + if (iter++ < 100) + continue; + + iter = 0; + + if (!as->status) + continue; + + fprintf(as->status, "\033c"); + fprintf(as->status, "GMR-1 RX status\n"); + fprintf(as->status, "---------------\n"); + fprintf(as->status, "\n"); + + for (i=0; i<as->buf->n_chans; i++) + { + struct sample_actor *sact, *tmp; + + llist_for_each_entry_safe(sact, tmp, &as->buf->chans[i].consumers, list) + { + fprintf(as->status, "ARFCN %4d: Task %s (%p)\n", + as->chans[i].arfcn, + sact->desc->name, + sact + ); + if (sact->desc->stat) + sact->desc->stat(sact, as->status); + fprintf(as->status, "\n"); + } + } + + fprintf(as->status, "\n"); + fflush(as->status); + } /* Done ! */ rv = 0; diff --git a/src/rtfwk/common.h b/src/rtfwk/common.h index c444185..ec123c2 100644 --- a/src/rtfwk/common.h +++ b/src/rtfwk/common.h @@ -21,6 +21,7 @@ #define __RTFWK_COMMON_H__ #include <math.h> +#include <stdio.h> #include <osmocom/dsp/cxvec.h> #include <osmocom/dsp/cxvec_math.h> @@ -46,6 +47,9 @@ struct app_state /* GSMTap */ struct gsmtap_inst *gti; + /* Status */ + FILE *status; + /* Per-Channel data */ struct { int arfcn; diff --git a/src/rtfwk/sa_bcch_ccch.c b/src/rtfwk/sa_bcch_ccch.c index cafbcb1..a5ad95c 100644 --- a/src/rtfwk/sa_bcch_ccch.c +++ b/src/rtfwk/sa_bcch_ccch.c @@ -57,6 +57,9 @@ struct bcch_sink_priv { float bcch_energy; int bcch_err; + int bcch_stat_tot; + int bcch_stat_err; + float bcch_stat_conv; int la_arfcn; int la_tn; @@ -187,6 +190,10 @@ _rx_bcch(struct sample_actor *sa, else priv->bcch_err++; + priv->bcch_stat_tot++; + priv->bcch_stat_err += (crc != 0); + priv->bcch_stat_conv = 0.99f * priv->bcch_stat_conv + 0.01f * conv; + /* Send to GSMTap if correct */ if (!crc) gsmtap_sendmsg(priv->as->gti, gmr1_gsmtap_makemsg( @@ -384,9 +391,23 @@ bcch_sink_work(struct sample_actor *sa, return frame_len; } +static void +bcch_sink_stat(struct sample_actor *sa, + FILE *out) +{ + struct bcch_sink_priv *priv = sa->priv; + + fprintf(out, "\tbcch_tot : %d\n", priv->bcch_stat_tot); + fprintf(out, "\tbcch_err : %d (%.1f %%)\n", priv->bcch_stat_err, + (100.0f * (float)priv->bcch_stat_err) / (float)priv->bcch_stat_tot); + fprintf(out, "\tbcch_conv : %d\n", (int)priv->bcch_stat_conv); +} + const struct sample_actor_desc bcch_sink = { + .name = "BCCH/CCCH", .init = bcch_sink_init, .fini = bcch_sink_fini, .work = bcch_sink_work, + .stat = bcch_sink_stat, .priv_size = sizeof(struct bcch_sink_priv), }; diff --git a/src/rtfwk/sa_fcch.c b/src/rtfwk/sa_fcch.c index 6ea2b08..a02ee0e 100644 --- a/src/rtfwk/sa_fcch.c +++ b/src/rtfwk/sa_fcch.c @@ -261,6 +261,7 @@ fcch_sink_work(struct sample_actor *sa, } const struct sample_actor_desc fcch_sink = { + .name = "FCCH", .init = fcch_sink_init, .fini = fcch_sink_fini, .work = fcch_sink_work, diff --git a/src/rtfwk/sa_file.c b/src/rtfwk/sa_file.c index 030013d..a92231d 100644 --- a/src/rtfwk/sa_file.c +++ b/src/rtfwk/sa_file.c @@ -101,6 +101,7 @@ sa_file_sink_work(struct sample_actor *sc, const struct sample_actor_desc sa_file_src = { + .name = "File Source", .init = sa_file_src_init, .fini = sa_file_fini, .work = sa_file_src_work, @@ -108,6 +109,7 @@ const struct sample_actor_desc sa_file_src = { }; const struct sample_actor_desc sa_file_sink = { + .name = "File Sink", .init = sa_file_sink_init, .fini = sa_file_fini, .work = sa_file_sink_work, diff --git a/src/rtfwk/sa_tch3.c b/src/rtfwk/sa_tch3.c index 66ebaba..46af46a 100644 --- a/src/rtfwk/sa_tch3.c +++ b/src/rtfwk/sa_tch3.c @@ -464,6 +464,7 @@ done: } const struct sample_actor_desc tch3_sink = { + .name = "TCH3", .init = tch3_sink_init, .fini = tch3_sink_fini, .work = tch3_sink_work, diff --git a/src/rtfwk/sa_tch9.c b/src/rtfwk/sa_tch9.c index f826547..4aee850 100644 --- a/src/rtfwk/sa_tch9.c +++ b/src/rtfwk/sa_tch9.c @@ -251,6 +251,7 @@ tch9_sink_work(struct sample_actor *sa, } const struct sample_actor_desc tch9_sink = { + .name = "TCH9", .init = tch9_sink_init, .fini = tch9_sink_fini, .work = tch9_sink_work, diff --git a/src/rtfwk/sampbuf.c b/src/rtfwk/sampbuf.c index 900462f..f4ae8af 100644 --- a/src/rtfwk/sampbuf.c +++ b/src/rtfwk/sampbuf.c @@ -323,39 +323,39 @@ _sbuf_consume(struct sample_buf *sbuf) return work_done; } -void +int sbuf_work(struct sample_buf *sbuf) { int i, rv; int has_produced, has_consumed; int has_producers, has_consumers; - while (1) { - /* Produce / Consume */ - has_produced = _sbuf_produce(sbuf); - - has_consumed = 0; - do { - rv = _sbuf_consume(sbuf); - has_consumed |= rv; - } while (rv); - - /* Check if there is any producers left */ - has_producers = 0; - for (i=0; i<sbuf->n_chans; i++) - has_producers |= (sbuf->chans[i].producer != NULL); - - /* Check if there is any consumer left */ - for (i=0; i<sbuf->n_chans; i++) - if (!llist_empty(&sbuf->chans[i].consumers)) - break; - has_consumers = (i != sbuf->n_chans); - - /* Check exit conditions */ - if (!has_consumers) - break; + /* Produce / Consume */ + has_produced = _sbuf_produce(sbuf); - if (!has_consumed && !has_producers) + has_consumed = 0; + do { + rv = _sbuf_consume(sbuf); + has_consumed |= rv; + } while (rv); + + /* Check if there is any producers left */ + has_producers = 0; + for (i=0; i<sbuf->n_chans; i++) + has_producers |= (sbuf->chans[i].producer != NULL); + + /* Check if there is any consumer left */ + for (i=0; i<sbuf->n_chans; i++) + if (!llist_empty(&sbuf->chans[i].consumers)) break; - } + has_consumers = (i != sbuf->n_chans); + + /* Check exit conditions */ + if (!has_consumers) + return 0; + + if (!has_consumed && !has_producers) + return 0; + + return 1; } diff --git a/src/rtfwk/sampbuf.h b/src/rtfwk/sampbuf.h index a320974..356f178 100644 --- a/src/rtfwk/sampbuf.h +++ b/src/rtfwk/sampbuf.h @@ -22,6 +22,7 @@ #include <complex.h> +#include <stdio.h> #include <stdint.h> #include <osmocom/core/linuxlist.h> @@ -35,10 +36,14 @@ struct sample_actor; struct sample_actor_desc { + const char *name; + int (*init)(struct sample_actor *sc, void *params); void (*fini)(struct sample_actor *sc); int (*work)(struct sample_actor *sc, float complex *data, unsigned int len); + void (*stat)(struct sample_actor *sc, FILE *fh); + int priv_size; }; @@ -107,7 +112,7 @@ sbuf_add_consumer(struct sample_buf *sbuf, int chan_id, const struct sample_actor_desc *desc, void *params); -void sbuf_work(struct sample_buf *sbuf); +int sbuf_work(struct sample_buf *sbuf); #endif /* __RTFWK_SAMPBUF_H__ */ |