summaryrefslogtreecommitdiffstats
path: root/src/host
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2012-11-24 19:36:19 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2012-11-24 19:47:11 +0100
commit20971da499eafd11ce71f61a930ab0c1aa202fa8 (patch)
treefab87de1d3d82d0af3bb1348841235c708f77ded /src/host
parent08bc45147bb58700236c4d455080cdeea9cc27a8 (diff)
rxqual: Begin to implement the rxqual calculationzecke/rxqual-full
* Make num_biterr 16bit because the API is 16bit. * Add the num_bits to count the bits transferred. * Re-order and add manual padding due the increase in size. * Add the bits to struct rx_meas_stat, increment and reset them. * Calculation for the sub_rxqual is missing, so is DTX code in general * Calculation for TCH/F, TCH/H in speech mode might be wrong
Diffstat (limited to 'src/host')
-rw-r--r--src/host/layer23/include/osmocom/bb/common/osmocom_data.h1
-rw-r--r--src/host/layer23/src/common/l1ctl.c1
-rw-r--r--src/host/layer23/src/mobile/gsm322.c2
-rw-r--r--src/host/layer23/src/mobile/gsm48_rr.c34
4 files changed, 34 insertions, 4 deletions
diff --git a/src/host/layer23/include/osmocom/bb/common/osmocom_data.h b/src/host/layer23/include/osmocom/bb/common/osmocom_data.h
index ab7c2502..0a303b9c 100644
--- a/src/host/layer23/include/osmocom/bb/common/osmocom_data.h
+++ b/src/host/layer23/include/osmocom/bb/common/osmocom_data.h
@@ -45,6 +45,7 @@ struct rx_meas_stat {
uint32_t frames;
uint32_t snr;
uint32_t berr;
+ uint32_t bits;
uint32_t rxlev;
/* counters loss criterion */
diff --git a/src/host/layer23/src/common/l1ctl.c b/src/host/layer23/src/common/l1ctl.c
index 521949c1..5fa345f4 100644
--- a/src/host/layer23/src/common/l1ctl.c
+++ b/src/host/layer23/src/common/l1ctl.c
@@ -186,6 +186,7 @@ static int rx_ph_data_ind(struct osmocom_ms *ms, struct msgb *msg)
meas->frames++;
meas->snr += dl->snr;
meas->berr += dl->num_biterr;
+ meas->bits += dl->num_bits;
meas->rxlev += dl->rx_level;
/* counting loss criteria */
diff --git a/src/host/layer23/src/mobile/gsm322.c b/src/host/layer23/src/mobile/gsm322.c
index ce5e1e1d..c44a50b3 100644
--- a/src/host/layer23/src/mobile/gsm322.c
+++ b/src/host/layer23/src/mobile/gsm322.c
@@ -470,7 +470,7 @@ static int gsm322_sync_to_cell(struct gsm322_cellsel *cs,
cs->ccch_mode = CCCH_MODE_NONE;
}
- meas->frames = meas->snr = meas->berr = meas->rxlev = 0;
+ meas->frames = meas->snr = meas->berr = meas->bits = meas->rxlev = 0;
cs->rxlev_dbm = cs->rxlev_count = 0;
cs->neighbour = neighbour;
diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c
index 36488606..02bc73c3 100644
--- a/src/host/layer23/src/mobile/gsm48_rr.c
+++ b/src/host/layer23/src/mobile/gsm48_rr.c
@@ -98,6 +98,33 @@ static int gsm48_rr_rel_cnf(struct osmocom_ms *ms, struct msgb *msg);
#define MIN(a, b) ((a < b) ? a : b)
+static int calc_rxqual(struct rx_meas_stat *stat)
+{
+ uint32_t qual;
+
+ /* no bits transferred, so no error */
+ if (stat->bits == 0)
+ return 0;
+
+ qual = (stat->berr * 500) / stat->bits;
+ if (qual == 0)
+ return 0;
+ if (qual == 1)
+ return 1;
+ if (qual < 4)
+ return 2;
+ if (qual < 8)
+ return 3;
+ if (qual < 16)
+ return 4;
+ if (qual < 32)
+ return 5;
+ if (qual < 64)
+ return 6;
+
+ return 7;
+}
+
/* decode "Power Command" (10.5.2.28) and (10.5.2.28a) */
static int gsm48_decode_power_cmd_acc(struct gsm48_power_cmd *pc,
uint8_t *power_level, uint8_t *atc)
@@ -667,7 +694,7 @@ static void timeout_rr_meas(void *arg)
gsm48_rr_tx_meas_rep(rr->ms);
restart:
- meas->frames = meas->snr = meas->berr = meas->rxlev = 0;
+ meas->frames = meas->snr = meas->berr = meas->bits = meas->rxlev = 0;
start_rr_t_meas(rr, 1, 0);
}
@@ -2757,7 +2784,8 @@ static int gsm48_rr_tx_meas_rep(struct osmocom_ms *ms)
meas_valid = 1;
serv_rxlev_full = serv_rxlev_sub =
(meas->rxlev + (meas->frames / 2)) / meas->frames;
- serv_rxqual_full = serv_rxqual_sub = 0; // FIXME
+ serv_rxqual_full = calc_rxqual(meas);
+ serv_rxqual_sub = 0; // FIXME
}
memset(&rxlev_nc, 0, sizeof(rxlev_nc));
@@ -2987,7 +3015,7 @@ static int gsm48_rr_activate_channel(struct osmocom_ms *ms,
memset(s->si5b_msg, 0, sizeof(s->si5b_msg));
memset(s->si5t_msg, 0, sizeof(s->si5t_msg));
}
- meas->frames = meas->snr = meas->berr = meas->rxlev = 0;
+ meas->frames = meas->snr = meas->berr = meas->bits = meas->rxlev = 0;
rr->meas.nc_num = 0;
stop_rr_t_meas(rr);
start_rr_t_meas(rr, 1, 0);