aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSylvain Munaut <tnt@246tNt.com>2016-10-29 21:36:10 +0200
committerSylvain Munaut <tnt@246tNt.com>2019-08-31 08:15:37 +0200
commit714b9fbd1e7a3d6689254d5bd5aace7b4670b592 (patch)
tree8a167ab234aa8729af851b6b7eb82a96aa5ab6f4
parenta00ca1f53daf7aeb34afad80fef658e83c0a33a9 (diff)
[hack] First attempt at a status reporting screen
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
-rw-r--r--src/gmr1_rx_live.c46
-rw-r--r--src/rtfwk/common.h4
-rw-r--r--src/rtfwk/sa_bcch_ccch.c21
-rw-r--r--src/rtfwk/sa_fcch.c1
-rw-r--r--src/rtfwk/sa_file.c2
-rw-r--r--src/rtfwk/sa_tch3.c1
-rw-r--r--src/rtfwk/sa_tch9.c1
-rw-r--r--src/rtfwk/sampbuf.c54
-rw-r--r--src/rtfwk/sampbuf.h7
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__ */