<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/14630">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Transceiver: refactor: gather uplink burst parameters in struct<br><br>A new struct trx_ul_burst_ind is introduced, which will handle<br>information filled by lower layers upon decoding of uplink bursts.<br><br>Methods pullRadioVector() and logRxBurst() are adapted to use that<br>struct. This way it's easier to understand in/out parameters and it's<br>also easier to add further parameters to be filled in in the future.<br><br>Related: OS#4006<br>Change-Id: I7e590fb1c0901de627e782f183251c20f4f68d48<br>---<br>M Transceiver52M/Transceiver.cpp<br>M Transceiver52M/Transceiver.h<br>2 files changed, 48 insertions(+), 53 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/30/14630/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp</span><br><span>index de4b622..08b9e4f 100644</span><br><span>--- a/Transceiver52M/Transceiver.cpp</span><br><span>+++ b/Transceiver52M/Transceiver.cpp</span><br><span>@@ -551,27 +551,24 @@</span><br><span> * Pull bursts from the FIFO and handle according to the slot</span><br><span> * and burst correlation type. Equalzation is currently disabled.</span><br><span> */</span><br><span style="color: hsl(0, 100%, 40%);">-SoftVector *Transceiver::pullRadioVector(GSM::Time &wTime, double &RSSI, bool &isRssiValid,</span><br><span style="color: hsl(0, 100%, 40%);">- double &timingOffset, double &noise,</span><br><span style="color: hsl(0, 100%, 40%);">- size_t chan)</span><br><span style="color: hsl(120, 100%, 40%);">+bool Transceiver::pullRadioVector(size_t chan, struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span> int rc;</span><br><span> complex amp;</span><br><span> float toa, max = -1.0, avg = 0.0;</span><br><span> int max_i = -1;</span><br><span> signalVector *burst;</span><br><span style="color: hsl(0, 100%, 40%);">- SoftVector *bits = NULL;</span><br><span> TransceiverState *state = &mStates[chan];</span><br><span style="color: hsl(0, 100%, 40%);">- isRssiValid = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ bi->rssi_valid = false;</span><br><span> </span><br><span> /* Blocking FIFO read */</span><br><span> radioVector *radio_burst = mReceiveFIFO[chan]->read();</span><br><span> if (!radio_burst)</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</span><br><span> </span><br><span> /* Set time and determine correlation type */</span><br><span style="color: hsl(0, 100%, 40%);">- GSM::Time time = radio_burst->getTime();</span><br><span style="color: hsl(0, 100%, 40%);">- CorrType type = expectedCorrType(time, chan);</span><br><span style="color: hsl(120, 100%, 40%);">+ bi->burstTime = radio_burst->getTime();</span><br><span style="color: hsl(120, 100%, 40%);">+ CorrType type = expectedCorrType(bi->burstTime, chan);</span><br><span> </span><br><span> /* Enable 8-PSK burst detection if EDGE is enabled */</span><br><span> if (mEdge && (type == TSC))</span><br><span>@@ -580,14 +577,14 @@</span><br><span> /* Debug: dump bursts to disk */</span><br><span> /* bits 0-7 - chan 0 timeslots</span><br><span> * bits 8-15 - chan 1 timeslots */</span><br><span style="color: hsl(0, 100%, 40%);">- if (mWriteBurstToDiskMask & ((1<<time.TN()) << (8*chan)))</span><br><span style="color: hsl(120, 100%, 40%);">+ if (mWriteBurstToDiskMask & ((1<<bi->burstTime.TN()) << (8*chan)))</span><br><span> writeToFile(radio_burst, chan);</span><br><span> </span><br><span> /* No processing if the timeslot is off.</span><br><span> * Not even power level or noise calculation. */</span><br><span> if (type == OFF) {</span><br><span> delete radio_burst;</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</span><br><span> }</span><br><span> </span><br><span> /* Select the diversity channel with highest energy */</span><br><span>@@ -603,30 +600,29 @@</span><br><span> if (max_i < 0) {</span><br><span> LOG(ALERT) << "Received empty burst";</span><br><span> delete radio_burst;</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</span><br><span> }</span><br><span> </span><br><span> /* Average noise on diversity paths and update global levels */</span><br><span> burst = radio_burst->getVector(max_i);</span><br><span> avg = sqrt(avg / radio_burst->chans());</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- wTime = time;</span><br><span style="color: hsl(0, 100%, 40%);">- RSSI = 20.0 * log10(rxFullScale / avg);</span><br><span style="color: hsl(120, 100%, 40%);">+ bi->rssi = 20.0 * log10(rxFullScale / avg);</span><br><span> </span><br><span> /* RSSI estimation are valid */</span><br><span style="color: hsl(0, 100%, 40%);">- isRssiValid = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ bi->rssi_valid = true;</span><br><span> </span><br><span> if (type == IDLE) {</span><br><span> /* Update noise levels */</span><br><span> state->mNoises.insert(avg);</span><br><span> state->mNoiseLev = state->mNoises.avg();</span><br><span style="color: hsl(0, 100%, 40%);">- noise = 20.0 * log10(rxFullScale / state->mNoiseLev);</span><br><span style="color: hsl(120, 100%, 40%);">+ bi->noise = 20.0 * log10(rxFullScale / state->mNoiseLev);</span><br><span> </span><br><span> delete radio_burst;</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</span><br><span> } else {</span><br><span> /* Do not update noise levels */</span><br><span style="color: hsl(0, 100%, 40%);">- noise = 20.0 * log10(rxFullScale / state->mNoiseLev);</span><br><span style="color: hsl(120, 100%, 40%);">+ bi->noise = 20.0 * log10(rxFullScale / state->mNoiseLev);</span><br><span> }</span><br><span> </span><br><span> unsigned max_toa = (type == RACH || type == EXT_RACH) ?</span><br><span>@@ -645,15 +641,14 @@</span><br><span> }</span><br><span> </span><br><span> delete radio_burst;</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- timingOffset = toa;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- bits = demodAnyBurst(*burst, mSPSRx, amp, toa, type);</span><br><span style="color: hsl(120, 100%, 40%);">+ bi->toa = toa;</span><br><span style="color: hsl(120, 100%, 40%);">+ bi->rxBurst = demodAnyBurst(*burst, mSPSRx, amp, toa, type);</span><br><span> </span><br><span> delete radio_burst;</span><br><span style="color: hsl(0, 100%, 40%);">- return bits;</span><br><span style="color: hsl(120, 100%, 40%);">+ return true;</span><br><span> }</span><br><span> </span><br><span> void Transceiver::reset()</span><br><span>@@ -909,63 +904,57 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void Transceiver::logRxBurst(size_t chan, SoftVector *burst, GSM::Time time, double dbm,</span><br><span style="color: hsl(0, 100%, 40%);">- double rssi, double noise, double toa)</span><br><span style="color: hsl(120, 100%, 40%);">+void Transceiver::logRxBurst(size_t chan, struct trx_ul_burst_ind *bi, double dbm)</span><br><span> {</span><br><span> LOG(DEBUG) << std::fixed << std::right</span><br><span> << " chan: " << chan</span><br><span style="color: hsl(0, 100%, 40%);">- << " time: " << time</span><br><span style="color: hsl(0, 100%, 40%);">- << " RSSI: " << std::setw(5) << std::setprecision(1) << rssi</span><br><span style="color: hsl(120, 100%, 40%);">+ << " time: " << bi->burstTime</span><br><span style="color: hsl(120, 100%, 40%);">+ << " RSSI: " << std::setw(5) << std::setprecision(1) << bi->rssi</span><br><span> << "dBFS/" << std::setw(6) << -dbm << "dBm"</span><br><span style="color: hsl(0, 100%, 40%);">- << " noise: " << std::setw(5) << std::setprecision(1) << noise</span><br><span style="color: hsl(0, 100%, 40%);">- << "dBFS/" << std::setw(6) << -(noise + rssiOffset) << "dBm"</span><br><span style="color: hsl(0, 100%, 40%);">- << " TOA: " << std::setw(5) << std::setprecision(2) << toa</span><br><span style="color: hsl(0, 100%, 40%);">- << " bits: " << *burst;</span><br><span style="color: hsl(120, 100%, 40%);">+ << " noise: " << std::setw(5) << std::setprecision(1) << bi->noise</span><br><span style="color: hsl(120, 100%, 40%);">+ << "dBFS/" << std::setw(6) << -(bi->noise + rssiOffset) << "dBm"</span><br><span style="color: hsl(120, 100%, 40%);">+ << " TOA: " << std::setw(5) << std::setprecision(2) << bi->toa</span><br><span style="color: hsl(120, 100%, 40%);">+ << " bits: " << *(bi->rxBurst);</span><br><span> }</span><br><span> </span><br><span> void Transceiver::driveReceiveFIFO(size_t chan)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- SoftVector *rxBurst = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- double RSSI; // in dBFS</span><br><span> double dBm; // in dBm</span><br><span style="color: hsl(0, 100%, 40%);">- double TOA; // in symbols</span><br><span> int TOAint; // in 1/256 symbols</span><br><span style="color: hsl(0, 100%, 40%);">- double noise; // noise level in dBFS</span><br><span style="color: hsl(0, 100%, 40%);">- GSM::Time burstTime;</span><br><span style="color: hsl(0, 100%, 40%);">- bool isRssiValid; // are RSSI, noise and burstTime valid</span><br><span> unsigned nbits = gSlotLen;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- rxBurst = pullRadioVector(burstTime, RSSI, isRssiValid, TOA, noise, chan);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!rxBurst)</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct trx_ul_burst_ind bi;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!pullRadioVector(chan, &bi))</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span> </span><br><span> // Convert -1..+1 soft bits to 0..1 soft bits</span><br><span style="color: hsl(0, 100%, 40%);">- vectorSlicer(rxBurst);</span><br><span style="color: hsl(120, 100%, 40%);">+ vectorSlicer(bi.rxBurst);</span><br><span> </span><br><span> /*</span><br><span> * EDGE demodulator returns 444 (148 * 3) bits</span><br><span> */</span><br><span style="color: hsl(0, 100%, 40%);">- if (rxBurst->size() == gSlotLen * 3)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bi.rxBurst->size() == gSlotLen * 3)</span><br><span> nbits = gSlotLen * 3;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- dBm = RSSI + rssiOffset;</span><br><span style="color: hsl(0, 100%, 40%);">- logRxBurst(chan, rxBurst, burstTime, dBm, RSSI, noise, TOA);</span><br><span style="color: hsl(120, 100%, 40%);">+ dBm = bi.rssi + rssiOffset;</span><br><span style="color: hsl(120, 100%, 40%);">+ logRxBurst(chan, &bi, dBm);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TOAint = (int) (TOA * 256.0 + 0.5); // round to closest integer</span><br><span style="color: hsl(120, 100%, 40%);">+ TOAint = (int) (bi.toa * 256.0 + 0.5); // round to closest integer</span><br><span> </span><br><span> char burstString[nbits + 10];</span><br><span> struct trxd_hdr_v0* pkt = (struct trxd_hdr_v0*)burstString;</span><br><span style="color: hsl(0, 100%, 40%);">- pkt->common.tn = burstTime.TN();</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_store32be(burstTime.FN(), &pkt->common.fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ pkt->common.tn = bi.burstTime.TN();</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_store32be(bi.burstTime.FN(), &pkt->common.fn);</span><br><span> pkt->v0.rssi = dBm;</span><br><span> osmo_store16be(TOAint, &pkt->v0.toa);</span><br><span style="color: hsl(0, 100%, 40%);">- SoftVector::iterator burstItr = rxBurst->begin();</span><br><span style="color: hsl(120, 100%, 40%);">+ SoftVector::iterator burstItr = bi.rxBurst->begin();</span><br><span> </span><br><span> for (unsigned i = 0; i < nbits; i++)</span><br><span> pkt->soft_bits[i] = (char) round((*burstItr++) * 255.0);</span><br><span> </span><br><span> pkt->soft_bits[nbits] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">- delete rxBurst;</span><br><span style="color: hsl(120, 100%, 40%);">+ delete bi.rxBurst;</span><br><span> </span><br><span> mDataSockets[chan]->write(burstString, sizeof(struct trxd_hdr_v0) + nbits + 1);</span><br><span> }</span><br><span>diff --git a/Transceiver52M/Transceiver.h b/Transceiver52M/Transceiver.h</span><br><span>index ceb8c4a..5ef6bbb 100644</span><br><span>--- a/Transceiver52M/Transceiver.h</span><br><span>+++ b/Transceiver52M/Transceiver.h</span><br><span>@@ -35,6 +35,15 @@</span><br><span> #include "config_defs.h"</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct trx_ul_burst_ind {</span><br><span style="color: hsl(120, 100%, 40%);">+ SoftVector *rxBurst;</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM::Time burstTime;</span><br><span style="color: hsl(120, 100%, 40%);">+ double rssi; // in dBFS</span><br><span style="color: hsl(120, 100%, 40%);">+ double toa; // in symbols</span><br><span style="color: hsl(120, 100%, 40%);">+ double noise; // noise level in dBFS</span><br><span style="color: hsl(120, 100%, 40%);">+ bool rssi_valid; // are RSSI, noise and burstTime valid</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> class Transceiver;</span><br><span> </span><br><span> /** Channel descriptor for transceiver object and channel number pair */</span><br><span>@@ -191,9 +200,7 @@</span><br><span> void pushRadioVector(GSM::Time &nowTime);</span><br><span> </span><br><span> /** Pull and demodulate a burst from the receive FIFO */</span><br><span style="color: hsl(0, 100%, 40%);">- SoftVector *pullRadioVector(GSM::Time &wTime, double &RSSI, bool &isRssiValid,</span><br><span style="color: hsl(0, 100%, 40%);">- double &timingOffset, double &noise,</span><br><span style="color: hsl(0, 100%, 40%);">- size_t chan = 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ bool pullRadioVector(size_t chan, struct trx_ul_burst_ind *ind);</span><br><span> </span><br><span> /** Set modulus for specific timeslot */</span><br><span> void setModulus(size_t timeslot, size_t chan);</span><br><span>@@ -264,8 +271,7 @@</span><br><span> /** set priority on current thread */</span><br><span> void setPriority(float prio = 0.5) { mRadioInterface->setPriority(prio); }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- void logRxBurst(size_t chan, SoftVector *burst, GSM::Time time, double dbm,</span><br><span style="color: hsl(0, 100%, 40%);">- double rssi, double noise, double toa);</span><br><span style="color: hsl(120, 100%, 40%);">+ void logRxBurst(size_t chan, struct trx_ul_burst_ind *bi, double dbm);</span><br><span> };</span><br><span> </span><br><span> void *RxUpperLoopAdapter(TransceiverChannel *);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/14630">change 14630</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-trx/+/14630"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-trx </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I7e590fb1c0901de627e782f183251c20f4f68d48 </div>
<div style="display:none"> Gerrit-Change-Number: 14630 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>