<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>