diff options
Diffstat (limited to 'src/osmo-bts-trx/sched_lchan_tchf.c')
-rw-r--r-- | src/osmo-bts-trx/sched_lchan_tchf.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/src/osmo-bts-trx/sched_lchan_tchf.c b/src/osmo-bts-trx/sched_lchan_tchf.c index d2896203..e29a47e2 100644 --- a/src/osmo-bts-trx/sched_lchan_tchf.c +++ b/src/osmo-bts-trx/sched_lchan_tchf.c @@ -56,6 +56,8 @@ int rx_tchf_fn(struct l1sched_trx *l1t, enum trx_chan_type chan, uint8_t rsl_cmode = chan_state->rsl_cmode; uint8_t tch_mode = chan_state->tch_mode; uint8_t tch_data[128]; /* just to be safe */ + enum sched_meas_avg_mode meas_avg_mode = SCHED_MEAS_AVG_M_OCTO; + struct l1sched_meas_set meas_avg; int rc, amr = 0; int n_errors = 0; int n_bits_total = 0; @@ -89,6 +91,9 @@ int rx_tchf_fn(struct l1sched_trx *l1t, enum trx_chan_type chan, /* update mask */ *mask |= (1 << bid); + /* store measurements */ + trx_sched_meas_push(chan_state, bi); + /* copy burst to end of buffer of 8 bursts */ burst = *bursts_p + bid * 116 + 464; if (bi->burst_len > 0) { @@ -194,6 +199,9 @@ int rx_tchf_fn(struct l1sched_trx *l1t, enum trx_chan_type chan, } memcpy(*bursts_p, *bursts_p + 464, 464); + /* average measurements of the last N (depends on mode) bursts */ + trx_sched_meas_avg(chan_state, &meas_avg, meas_avg_mode); + /* Check if the frame is bad */ if (rc < 0) { LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn, @@ -219,10 +227,9 @@ int rx_tchf_fn(struct l1sched_trx *l1t, enum trx_chan_type chan, fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_FACCH_F); _sched_compose_ph_data_ind(l1t, bi->tn, fn_begin, chan, tch_data + amr, GSM_MACBLOCK_LEN, - /* FIXME: AVG RSSI and ToA256 */ - bi->rssi, bi->toa256, - 0 /* FIXME: AVG C/I */, - ber10k, PRES_INFO_UNKNOWN); + meas_avg.rssi, meas_avg.toa256, + meas_avg.ci_cb, ber10k, + PRES_INFO_UNKNOWN); bfi: if (rsl_cmode == RSL_CMOD_SPD_SPEECH) { /* indicate bad frame */ @@ -277,8 +284,10 @@ bfi: /* TCH or BFI */ compose_l1sap: fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_TCH_F); - return _sched_compose_tch_ind(l1t, bi->tn, fn_begin, chan, - tch_data, rc, bi->toa256, ber10k, bi->rssi, is_sub); + return _sched_compose_tch_ind(l1t, bi->tn, fn_begin, chan, tch_data, rc, + /* FIXME: what should we use for BFI here? */ + bfi_flag ? bi->toa256 : meas_avg.toa256, ber10k, + bfi_flag ? bi->rssi : meas_avg.rssi, is_sub); } /* common section for generation of TCH bursts (TCH/H and TCH/F). @@ -293,9 +302,6 @@ void tx_tch_common(struct l1sched_trx *l1t, uint8_t tn, uint32_t fn, uint8_t rsl_cmode = chan_state->rsl_cmode; uint8_t tch_mode = chan_state->tch_mode; struct osmo_phsap_prim *l1sap; - int32_t *toa256_sum = &chan_state->toa256_sum; - uint8_t *toa_num = &chan_state->toa_num; - int16_t toa256; /* handle loss detection of received TCH frames */ if (rsl_cmode == RSL_CMOD_SPD_SPEECH @@ -343,14 +349,9 @@ inval_mode1: } if (len) { - if (*toa_num == 0) - toa256 = 0; - else - toa256 = *toa256_sum / *toa_num; - - /* Note: RSSI is set to 0 to indicate to the higher + /* Note: RSSI/ToA256 is set to 0 to indicate to the higher * layers that this is a faked tch_ind */ - _sched_compose_tch_ind(l1t, tn, fn, chan, tch_data, len, toa256, 10000, 0, 0); + _sched_compose_tch_ind(l1t, tn, fn, chan, tch_data, len, 0, 10000, 0, 0); } } |