aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2019-09-06 15:01:26 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2019-09-06 15:01:56 +0200
commit6711d581d1deca2ebb4c2931f6c6c15f61638898 (patch)
tree14e8821a9251c649e7f82a06951eb54099a786a0
parent94c52414031904571e7ab1d4b924ea63ce76d8a9 (diff)
Transceiver: Don't stop TRX if pulling from OFF timeslotpespin/master
BTS may have any timeslot disabled, or may have not yet sent initial SETSLOT cmd to properly configure the timeslot. Change-Id: Icf62e5d1200c7a440f255bb46023cdbf61532b7f
-rw-r--r--Transceiver52M/Transceiver.cpp51
-rw-r--r--Transceiver52M/Transceiver.h2
2 files changed, 31 insertions, 22 deletions
diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp
index 079d1d7..a6cc46f 100644
--- a/Transceiver52M/Transceiver.cpp
+++ b/Transceiver52M/Transceiver.cpp
@@ -587,9 +587,11 @@ void writeToFile(radioVector *radio_burst, size_t chan)
/*
* Pull bursts from the FIFO and handle according to the slot
* and burst correlation type. Equalzation is currently disabled.
- * returns true on success (bi filled), false on error (bi content undefined).
+ * returns 0 on success (bi filled), negative on error (bi content undefined):
+ * -1: timeslot is off (fn and tn in bi are filled),
+ * -2: read error
*/
-bool Transceiver::pullRadioVector(size_t chan, struct trx_ul_burst_ind *bi)
+int Transceiver::pullRadioVector(size_t chan, struct trx_ul_burst_ind *bi)
{
int rc;
struct estim_burst_params ebp;
@@ -605,25 +607,11 @@ bool Transceiver::pullRadioVector(size_t chan, struct trx_ul_burst_ind *bi)
radioVector *radio_burst = mReceiveFIFO[chan]->read();
if (!radio_burst) {
LOGCHAN(chan, DMAIN, ERROR) << "ReceiveFIFO->read() returned no burst";
- return false;
+ return -2;
}
/* Set time and determine correlation type */
burstTime = radio_burst->getTime();
- CorrType type = expectedCorrType(burstTime, chan);
-
- /* Debug: dump bursts to disk */
- /* bits 0-7 - chan 0 timeslots
- * bits 8-15 - chan 1 timeslots */
- if (mWriteBurstToDiskMask & ((1<<bi->tn) << (8*chan)))
- writeToFile(radio_burst, chan);
-
- /* No processing if the timeslot is off.
- * Not even power level or noise calculation. */
- if (type == OFF) {
- delete radio_burst;
- return false;
- }
/* Initialize struct bi */
bi->nbits = 0;
@@ -638,6 +626,21 @@ bool Transceiver::pullRadioVector(size_t chan, struct trx_ul_burst_ind *bi)
bi->tsc = 0;
bi->ci = 0.0;
+ CorrType type = expectedCorrType(burstTime, chan);
+
+ /* Debug: dump bursts to disk */
+ /* bits 0-7 - chan 0 timeslots
+ * bits 8-15 - chan 1 timeslots */
+ if (mWriteBurstToDiskMask & ((1<<bi->tn) << (8*chan)))
+ writeToFile(radio_burst, chan);
+
+ /* No processing if the timeslot is off.
+ * Not even power level or noise calculation. */
+ if (type == OFF) {
+ delete radio_burst;
+ return -1;
+ }
+
/* Select the diversity channel with highest energy */
for (size_t i = 0; i < radio_burst->chans(); i++) {
float pow = energyDetect(*radio_burst->getVector(i), 20 * mSPSRx);
@@ -702,12 +705,12 @@ bool Transceiver::pullRadioVector(size_t chan, struct trx_ul_burst_ind *bi)
delete rxBurst;
delete radio_burst;
- return true;
+ return 0;
ret_idle:
bi->idle = true;
delete radio_burst;
- return true;
+ return 0;
}
void Transceiver::reset()
@@ -1032,9 +1035,15 @@ void Transceiver::logRxBurst(size_t chan, const struct trx_ul_burst_ind *bi)
bool Transceiver::driveReceiveFIFO(size_t chan)
{
struct trx_ul_burst_ind bi;
+ int rc;
- if (!pullRadioVector(chan, &bi))
- return false;
+ if ((rc = pullRadioVector(chan, &bi)) < 0) {
+ if (rc == -1) { /* timeslot off, warn and continue processing */
+ LOGCHAN(chan, DMAIN, NOTICE) << unsigned(bi.tn) << ":" << bi.fn << " timeslot is off";
+ return true;
+ }
+ return false; /* other errors: we want to stop the process */
+ }
if (!bi.idle)
logRxBurst(chan, &bi);
diff --git a/Transceiver52M/Transceiver.h b/Transceiver52M/Transceiver.h
index 0d09854..30f6a60 100644
--- a/Transceiver52M/Transceiver.h
+++ b/Transceiver52M/Transceiver.h
@@ -182,7 +182,7 @@ private:
void pushRadioVector(GSM::Time &nowTime);
/** Pull and demodulate a burst from the receive FIFO */
- bool pullRadioVector(size_t chan, struct trx_ul_burst_ind *ind);
+ int pullRadioVector(size_t chan, struct trx_ul_burst_ind *ind);
/** Set modulus for specific timeslot */
void setModulus(size_t timeslot, size_t chan);