<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/20639">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Calculate RSSI offset based on RxGain configuration<br><br>Prior to this patch, osmo-trx relied totally on proper VTY configuration<br>being set in "rssi-offset" together with the RxGain set through TRXC in<br>order to provide correct Uplink RSSI measurements to bts-trx.<br><br>With this patch, RSSI is now by default calculated (in LMS and UHD<br>backends) based on the currently set RxGain, by providing empirically<br>discovered values. Still, for backward compatibility, the old<br>"rssi-offset" command will overwrite completely the per-default<br>calculated rssi offset.<br>A new optional parameter "relative" is added at the end of the<br>"rssi-offset" VTY command to flag the value as relative to the newly<br>per-default calculated value. This way specific setups (like adding a<br>LNA / RF fronted) can still be expressed while still keeping the<br>automatic per-default offset.<br><br>Related: OS#4468<br>Change-Id: I8ef78fd20c22c60d61bfb18d80a4a36df4fd6c20<br>---<br>M CommonLibs/trx_vty.c<br>M CommonLibs/trx_vty.h<br>M Transceiver52M/Transceiver.cpp<br>M Transceiver52M/Transceiver.h<br>M Transceiver52M/device/common/radioDevice.h<br>M Transceiver52M/device/ipc/IPCDevice.h<br>M Transceiver52M/device/lms/LMSDevice.cpp<br>M Transceiver52M/device/lms/LMSDevice.h<br>M Transceiver52M/device/uhd/UHDDevice.cpp<br>M Transceiver52M/device/uhd/UHDDevice.h<br>M Transceiver52M/device/usrp1/USRPDevice.h<br>M Transceiver52M/osmo-trx.cpp<br>M Transceiver52M/radioInterface.cpp<br>M Transceiver52M/radioInterface.h<br>M Transceiver52M/radioInterfaceMulti.cpp<br>M doc/examples/osmo-trx-uhd/osmo-trx-usrp_b200.cfg<br>16 files changed, 187 insertions(+), 70 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/39/20639/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/CommonLibs/trx_vty.c b/CommonLibs/trx_vty.c</span><br><span>index cf36547..fd6faed 100644</span><br><span>--- a/CommonLibs/trx_vty.c</span><br><span>+++ b/CommonLibs/trx_vty.c</span><br><span>@@ -231,13 +231,15 @@</span><br><span> }</span><br><span> </span><br><span> DEFUN(cfg_rssi_offset, cfg_rssi_offset_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-       "rssi-offset FLOAT",</span><br><span style="color: hsl(120, 100%, 40%);">+        "rssi-offset FLOAT [relative]",</span><br><span>    "Set the RSSI to dBm offset in dB (default=0)\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "RSSI to dBm offset in dB\n")</span><br><span style="color: hsl(120, 100%, 40%);">+       "RSSI to dBm offset in dB\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "Add to the default rssi-offset value instead of completely replacing it\n")</span><br><span> {</span><br><span>  struct trx_ctx *trx = trx_from_vty(vty);</span><br><span> </span><br><span>         trx->cfg.rssi_offset = atof(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+      trx->cfg.force_rssi_offset = (argc == 1);</span><br><span> </span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span>@@ -580,8 +582,9 @@</span><br><span>       vty_out(vty, " multi-arfcn %s%s", trx->cfg.multi_arfcn ? "enable" : "disable", VTY_NEWLINE);</span><br><span>        if (trx->cfg.offset != 0)</span><br><span>                 vty_out(vty, " offset %f%s", trx->cfg.offset, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (trx->cfg.rssi_offset != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-               vty_out(vty, " rssi-offset %f%s", trx->cfg.rssi_offset, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!(trx->cfg.rssi_offset == 0 && !trx->cfg.force_rssi_offset))</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, " rssi-offset %f%s%s", trx->cfg.rssi_offset,</span><br><span style="color: hsl(120, 100%, 40%);">+                        trx->cfg.force_rssi_offset ? " relative": "", VTY_NEWLINE);</span><br><span>   vty_out(vty, " swap-channels %s%s", trx->cfg.swap_channels ? "enable" : "disable", VTY_NEWLINE);</span><br><span>    vty_out(vty, " egprs %s%s", trx->cfg.egprs ? "enable" : "disable", VTY_NEWLINE);</span><br><span>    vty_out(vty, " ext-rach %s%s", trx->cfg.ext_rach ? "enable" : "disable", VTY_NEWLINE);</span><br><span>@@ -716,6 +719,7 @@</span><br><span>        trx->cfg.tx_sps = DEFAULT_TX_SPS;</span><br><span>         trx->cfg.rx_sps = DEFAULT_RX_SPS;</span><br><span>         trx->cfg.filler = FILLER_ZERO;</span><br><span style="color: hsl(120, 100%, 40%);">+     trx->cfg.rssi_offset = 0.0f;</span><br><span> </span><br><span>  return trx;</span><br><span> }</span><br><span>diff --git a/CommonLibs/trx_vty.h b/CommonLibs/trx_vty.h</span><br><span>index fcbc8eb..b7c753e 100644</span><br><span>--- a/CommonLibs/trx_vty.h</span><br><span>+++ b/CommonLibs/trx_vty.h</span><br><span>@@ -58,6 +58,7 @@</span><br><span>    bool multi_arfcn;</span><br><span>    double offset;</span><br><span>       double rssi_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+   bool force_rssi_offset; /* Force value set in VTY? */</span><br><span>        bool swap_channels;</span><br><span>  bool ext_rach;</span><br><span>       bool egprs;</span><br><span>diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp</span><br><span>index ff0b95b..c5fe8f6 100644</span><br><span>--- a/Transceiver52M/Transceiver.cpp</span><br><span>+++ b/Transceiver52M/Transceiver.cpp</span><br><span>@@ -612,6 +612,13 @@</span><br><span>   outfile.close();</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+double Transceiver::rssiOffset(size_t chan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  if (cfg->force_rssi_offset)</span><br><span style="color: hsl(120, 100%, 40%);">+        return cfg->rssi_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+  return mRadioInterface->rssiOffset(chan) + cfg->rssi_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*</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>@@ -631,6 +638,7 @@</span><br><span>   SoftVector *rxBurst;</span><br><span>   TransceiverState *state = &mStates[chan];</span><br><span>   bool ctr_changed = false;</span><br><span style="color: hsl(120, 100%, 40%);">+  double rssi_offset;</span><br><span> </span><br><span>   /* Blocking FIFO read */</span><br><span>   radioVector *radio_burst = mReceiveFIFO[chan]->read();</span><br><span>@@ -700,8 +708,9 @@</span><br><span>     state->mNoiseLev = state->mNoises.avg();</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  bi->rssi = 20.0 * log10(rxFullScale / avg) + cfg->rssi_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-  bi->noise = 20.0 * log10(rxFullScale / state->mNoiseLev) + cfg->rssi_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+  rssi_offset = rssiOffset(chan);</span><br><span style="color: hsl(120, 100%, 40%);">+  bi->rssi = 20.0 * log10(rxFullScale / avg) + rssi_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+  bi->noise = 20.0 * log10(rxFullScale / state->mNoiseLev) + rssi_offset;</span><br><span> </span><br><span>   if (type == IDLE)</span><br><span>     goto ret_idle;</span><br><span>@@ -1153,11 +1162,13 @@</span><br><span>     else os << "-";</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  double rssi_offset = rssiOffset(chan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   LOGCHAN(chan, DTRXDUL, DEBUG) << std::fixed << std::right</span><br><span>     << " time: "   << unsigned(bi->tn) << ":" << bi->fn</span><br><span style="color: hsl(0, 100%, 40%);">-    << " RSSI: "   << std::setw(5) << std::setprecision(1) << (bi->rssi - cfg->rssi_offset)</span><br><span style="color: hsl(120, 100%, 40%);">+    << " RSSI: "   << std::setw(5) << std::setprecision(1) << (bi->rssi - rssi_offset)</span><br><span>                    << "dBFS/" << std::setw(6) << -bi->rssi << "dBm"</span><br><span style="color: hsl(0, 100%, 40%);">-    << " noise: "  << std::setw(5) << std::setprecision(1) << (bi->noise - cfg->rssi_offset)</span><br><span style="color: hsl(120, 100%, 40%);">+    << " noise: "  << std::setw(5) << std::setprecision(1) << (bi->noise - rssi_offset)</span><br><span>                    << "dBFS/" << std::setw(6) << -bi->noise << "dBm"</span><br><span>     << " TOA: "    << std::setw(5) << std::setprecision(2) << bi->toa</span><br><span>     << " C/I: "    << std::setw(5) << std::setprecision(2) << bi->ci << "dB"</span><br><span>diff --git a/Transceiver52M/Transceiver.h b/Transceiver52M/Transceiver.h</span><br><span>index 4a4b85b..a870903 100644</span><br><span>--- a/Transceiver52M/Transceiver.h</span><br><span>+++ b/Transceiver52M/Transceiver.h</span><br><span>@@ -268,7 +268,7 @@</span><br><span>   friend void *RxLowerLoopAdapter(Transceiver *transceiver);</span><br><span>   friend void *TxLowerLoopAdapter(Transceiver *transceiver);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+  double rssiOffset(size_t chan);</span><br><span>   void reset();</span><br><span> </span><br><span>   void logRxBurst(size_t chan, const struct trx_ul_burst_ind *bi);</span><br><span>diff --git a/Transceiver52M/device/common/radioDevice.h b/Transceiver52M/device/common/radioDevice.h</span><br><span>index 45fcdad..3f5da1f 100644</span><br><span>--- a/Transceiver52M/device/common/radioDevice.h</span><br><span>+++ b/Transceiver52M/device/common/radioDevice.h</span><br><span>@@ -125,6 +125,9 @@</span><br><span>   /** return minimum Rx Gain **/</span><br><span>   virtual double minRxGain(void) = 0;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /** return base RSSI offset to apply for received samples **/</span><br><span style="color: hsl(120, 100%, 40%);">+  virtual double rssiOffset(size_t chan) = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   /** returns the Nominal transmit output power of the transceiver in dBm, negative on error **/</span><br><span>   virtual int getNominalTxPower(size_t chan = 0) = 0;</span><br><span> </span><br><span>diff --git a/Transceiver52M/device/ipc/IPCDevice.h b/Transceiver52M/device/ipc/IPCDevice.h</span><br><span>index a7618f9..35279a2 100644</span><br><span>--- a/Transceiver52M/device/ipc/IPCDevice.h</span><br><span>+++ b/Transceiver52M/device/ipc/IPCDevice.h</span><br><span>@@ -198,6 +198,9 @@</span><br><span>       /** return minimum Rx Gain **/</span><br><span>       virtual double minRxGain(void) override;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /* FIXME: return rx_gains[chan] ? receive factor from IPC Driver? */</span><br><span style="color: hsl(120, 100%, 40%);">+  double rssiOffset(size_t chan) { return 0.0f; };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   double setPowerAttenuation(int atten, size_t chan) override;</span><br><span>         double getPowerAttenuation(size_t chan = 0) override;</span><br><span> </span><br><span>diff --git a/Transceiver52M/device/lms/LMSDevice.cpp b/Transceiver52M/device/lms/LMSDevice.cpp</span><br><span>index 20b9856..ac7323e 100644</span><br><span>--- a/Transceiver52M/device/lms/LMSDevice.cpp</span><br><span>+++ b/Transceiver52M/device/lms/LMSDevice.cpp</span><br><span>@@ -85,27 +85,20 @@</span><br><span> };</span><br><span> </span><br><span> typedef std::tuple<lms_dev_type, enum gsm_band> dev_band_key;</span><br><span style="color: hsl(0, 100%, 40%);">-/* Maximum LimeSuite Tx Gain which can be set/used without distorting the output</span><br><span style="color: hsl(0, 100%, 40%);">- * signal, and the resulting real output power measured when that gain is used.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-struct dev_band_desc {</span><br><span style="color: hsl(0, 100%, 40%);">-       double nom_lms_tx_gain;  /* dB */</span><br><span style="color: hsl(0, 100%, 40%);">-       double nom_out_tx_power; /* dBm */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span> typedef std::map<dev_band_key, dev_band_desc>::const_iterator dev_band_map_it;</span><br><span> static const std::map<dev_band_key, dev_band_desc> dev_band_nom_power_param_map {</span><br><span style="color: hsl(0, 100%, 40%);">- { std::make_tuple(LMS_DEV_SDR_USB, GSM_BAND_850),       { 73.0, 11.2 } },</span><br><span style="color: hsl(0, 100%, 40%);">-       { std::make_tuple(LMS_DEV_SDR_USB, GSM_BAND_900),       { 73.0, 10.8 } },</span><br><span style="color: hsl(0, 100%, 40%);">-       { std::make_tuple(LMS_DEV_SDR_USB, GSM_BAND_1800),      { 65.0, -3.5 } }, /* FIXME: OS#4583: 1800Mhz is failing above TxGain=65, which is around -3.5dBm (already < 0 dBm) */</span><br><span style="color: hsl(0, 100%, 40%);">-        { std::make_tuple(LMS_DEV_SDR_USB, GSM_BAND_1900),      { 73.0, 1.7 } }, /* FIXME: OS#4583: 1900MHz is failing in all TxGain values */</span><br><span style="color: hsl(0, 100%, 40%);">-  { std::make_tuple(LMS_DEV_SDR_MINI, GSM_BAND_850),      { 66.0, 3.1 } }, /* FIXME: OS#4583: Ensure BAND2 is used at startup */</span><br><span style="color: hsl(0, 100%, 40%);">-  { std::make_tuple(LMS_DEV_SDR_MINI, GSM_BAND_900),      { 66.0, 2.8 } }, /* FIXME: OS#4583: Ensure BAND2 is used at startup */</span><br><span style="color: hsl(0, 100%, 40%);">-  { std::make_tuple(LMS_DEV_SDR_MINI, GSM_BAND_1800),     { 66.0, -11.6 } }, /* OS#4583: Any of BAND1 or BAND2 is fine */</span><br><span style="color: hsl(0, 100%, 40%);">- { std::make_tuple(LMS_DEV_SDR_MINI, GSM_BAND_1900),     { 66.0, -9.2 } }, /* FIXME: OS#4583: Ensure BAND1 is used at startup */</span><br><span style="color: hsl(0, 100%, 40%);">- { std::make_tuple(LMS_DEV_NET_MICRO, GSM_BAND_850),     { 71.0, 6.8 } },</span><br><span style="color: hsl(0, 100%, 40%);">-        { std::make_tuple(LMS_DEV_NET_MICRO, GSM_BAND_900),     { 71.0, 6.8 } },</span><br><span style="color: hsl(0, 100%, 40%);">-        { std::make_tuple(LMS_DEV_NET_MICRO, GSM_BAND_1800),    { 65.0, -10.5 } }, /* OS#4583: TxGain=71 (-4.4dBm) FAIL rms phase errors ~10° */</span><br><span style="color: hsl(0, 100%, 40%);">-       { std::make_tuple(LMS_DEV_NET_MICRO, GSM_BAND_1900),    { 71.0, -6.3 } }, /* FIXME: OS#4583: all FAIL, BAND1/BAND2 rms phase errors >23° */</span><br><span style="color: hsl(120, 100%, 40%);">+       { std::make_tuple(LMS_DEV_SDR_USB, GSM_BAND_850),       { 73.0, 11.2,  -6.0  } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(LMS_DEV_SDR_USB, GSM_BAND_900),       { 73.0, 10.8,  -6.0  } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(LMS_DEV_SDR_USB, GSM_BAND_1800),      { 65.0, -3.5,  -17.0 } }, /* FIXME: OS#4583: 1800Mhz is failing above TxGain=65, which is around -3.5dBm (already < 0 dBm) */</span><br><span style="color: hsl(120, 100%, 40%);">+      { std::make_tuple(LMS_DEV_SDR_USB, GSM_BAND_1900),      { 73.0, 1.7,   -17.0 } }, /* FIXME: OS#4583: 1900MHz is failing in all TxGain values */</span><br><span style="color: hsl(120, 100%, 40%);">+       { std::make_tuple(LMS_DEV_SDR_MINI, GSM_BAND_850),      { 66.0, 3.1,   -6.0  } }, /* FIXME: OS#4583: Ensure BAND2 is used at startup */</span><br><span style="color: hsl(120, 100%, 40%);">+       { std::make_tuple(LMS_DEV_SDR_MINI, GSM_BAND_900),      { 66.0, 2.8,   -6.0  } }, /* FIXME: OS#4583: Ensure BAND2 is used at startup */</span><br><span style="color: hsl(120, 100%, 40%);">+       { std::make_tuple(LMS_DEV_SDR_MINI, GSM_BAND_1800),     { 66.0, -11.6, -17.0 } }, /* OS#4583: Any of BAND1 or BAND2 is fine */</span><br><span style="color: hsl(120, 100%, 40%);">+        { std::make_tuple(LMS_DEV_SDR_MINI, GSM_BAND_1900),     { 66.0, -9.2,  -17.0 } }, /* FIXME: OS#4583: Ensure BAND1 is used at startup */</span><br><span style="color: hsl(120, 100%, 40%);">+       { std::make_tuple(LMS_DEV_NET_MICRO, GSM_BAND_850),     { 71.0, 6.8,   -6.0  } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(LMS_DEV_NET_MICRO, GSM_BAND_900),     { 71.0, 6.8,   -6.0  } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(LMS_DEV_NET_MICRO, GSM_BAND_1800),    { 65.0, -10.5, -17.0 } }, /* OS#4583: TxGain=71 (-4.4dBm) FAIL rms phase errors ~10° */</span><br><span style="color: hsl(120, 100%, 40%);">+      { std::make_tuple(LMS_DEV_NET_MICRO, GSM_BAND_1900),    { 71.0, -6.3,  -17.0 } }, /* FIXME: OS#4583: all FAIL, BAND1/BAND2 rms phase errors >23° */</span><br><span> };</span><br><span> </span><br><span> /* So far measurements done for B210 show really close to linear relationship</span><br><span>@@ -231,15 +224,10 @@</span><br><span>   return -1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void LMSDevice::get_dev_band_desc(dev_band_desc& desc)</span><br><span style="color: hsl(120, 100%, 40%);">+void LMSDevice::assign_band_desc(enum gsm_band req_band)</span><br><span> {</span><br><span>         dev_band_map_it it;</span><br><span style="color: hsl(0, 100%, 40%);">-     enum gsm_band req_band = band;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      if (req_band == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGC(DDEV, ERROR) << "Nominal Tx Power requested before Tx Frequency was set! Providing band 900 by default... ";</span><br><span style="color: hsl(0, 100%, 40%);">-               req_band = GSM_BAND_900;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span>    it = dev_band_nom_power_param_map.find(dev_band_key(m_dev_type, req_band));</span><br><span>  if (it == dev_band_nom_power_param_map.end()) {</span><br><span>              dev_desc desc = dev_param_map.at(m_dev_type);</span><br><span>@@ -249,7 +237,29 @@</span><br><span>                 it = dev_band_nom_power_param_map.find(dev_band_key(LMS_DEV_SDR_USB, req_band));</span><br><span>     }</span><br><span>    OSMO_ASSERT(it != dev_band_nom_power_param_map.end())</span><br><span style="color: hsl(0, 100%, 40%);">-   desc = it->second;</span><br><span style="color: hsl(120, 100%, 40%);">+ band_desc = it->second;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool LMSDevice::set_band(enum gsm_band req_band)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  if (band != 0 && req_band != band) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGC(DDEV, ALERT) << "Requesting band " << gsm_band_name(req_band)</span><br><span style="color: hsl(120, 100%, 40%);">+                                << " different from previous band " << gsm_band_name(band);</span><br><span style="color: hsl(120, 100%, 40%);">+           return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   band = req_band;</span><br><span style="color: hsl(120, 100%, 40%);">+      assign_band_desc(band);</span><br><span style="color: hsl(120, 100%, 40%);">+       return true;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void LMSDevice::get_dev_band_desc(dev_band_desc& desc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      if (band == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGC(DDEV, ERROR) << "Power parameters requested before Tx Frequency was set! Providing band 900 by default...";</span><br><span style="color: hsl(120, 100%, 40%);">+              assign_band_desc(GSM_BAND_900);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     desc = band_desc;</span><br><span> }</span><br><span> </span><br><span> int LMSDevice::open(const std::string &args, int ref, bool swap_channels)</span><br><span>@@ -561,6 +571,21 @@</span><br><span>   return rx_gains[chan];</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+double LMSDevice::rssiOffset(size_t chan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ double rssiOffset;</span><br><span style="color: hsl(120, 100%, 40%);">+    dev_band_desc desc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (chan >= rx_gains.size()) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGC(DDEV, ALERT) << "Requested non-existent channel " << chan;</span><br><span style="color: hsl(120, 100%, 40%);">+         return 0.0f;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   get_dev_band_desc(desc);</span><br><span style="color: hsl(120, 100%, 40%);">+      rssiOffset = rx_gains[chan] + desc.rxgain2rssioffset_rel;</span><br><span style="color: hsl(120, 100%, 40%);">+     return rssiOffset;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> double LMSDevice::setPowerAttenuation(int atten, size_t chan)</span><br><span> {</span><br><span>        double tx_power, dB;</span><br><span>diff --git a/Transceiver52M/device/lms/LMSDevice.h b/Transceiver52M/device/lms/LMSDevice.h</span><br><span>index 7af09e2..4ce8ed6 100644</span><br><span>--- a/Transceiver52M/device/lms/LMSDevice.h</span><br><span>+++ b/Transceiver52M/device/lms/LMSDevice.h</span><br><span>@@ -52,7 +52,22 @@</span><br><span>   LMS_DEV_UNKNOWN,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct dev_band_desc;</span><br><span style="color: hsl(120, 100%, 40%);">+struct dev_band_desc {</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Maximum LimeSuite Tx Gain which can be set/used without distorting</span><br><span style="color: hsl(120, 100%, 40%);">+    the output * signal, and the resulting real output power measured</span><br><span style="color: hsl(120, 100%, 40%);">+     when that gain is used.</span><br><span style="color: hsl(120, 100%, 40%);">+     */</span><br><span style="color: hsl(120, 100%, 40%);">+   double nom_lms_tx_gain;  /* dB */</span><br><span style="color: hsl(120, 100%, 40%);">+     double nom_out_tx_power; /* dBm */</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Factor used to infer base real RSSI offset on the Rx path based on current</span><br><span style="color: hsl(120, 100%, 40%);">+    configured RxGain. The resulting rssiOffset is added to the per burst</span><br><span style="color: hsl(120, 100%, 40%);">+         calculated energy in upper layers. These values were empirically</span><br><span style="color: hsl(120, 100%, 40%);">+      found and may change based on multiple factors, see OS#4468.</span><br><span style="color: hsl(120, 100%, 40%);">+          Correct measured values only provided for LimeSDR-USB so far.</span><br><span style="color: hsl(120, 100%, 40%);">+         rssiOffset = rxGain + rxgain2rssioffset_rel;</span><br><span style="color: hsl(120, 100%, 40%);">+       */</span><br><span style="color: hsl(120, 100%, 40%);">+    double rxgain2rssioffset_rel; /* dB */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span> </span><br><span> /** A class to handle a LimeSuite supported device */</span><br><span> class LMSDevice:public RadioDevice {</span><br><span>@@ -73,6 +88,7 @@</span><br><span> </span><br><span>      std::vector<double> tx_gains, rx_gains;</span><br><span>        enum gsm_band band;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct dev_band_desc band_desc;</span><br><span> </span><br><span>  enum lms_dev_type m_dev_type;</span><br><span> </span><br><span>@@ -85,7 +101,8 @@</span><br><span>       void update_stream_stats_tx(size_t chan, bool *underrun);</span><br><span>    bool do_clock_src_freq(enum ReferenceType ref, double freq);</span><br><span>         void get_dev_band_desc(dev_band_desc& desc);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+      bool set_band(enum gsm_band req_band);</span><br><span style="color: hsl(120, 100%, 40%);">+        void assign_band_desc(enum gsm_band req_band);</span><br><span> public:</span><br><span> </span><br><span>        /** Object constructor */</span><br><span>@@ -173,6 +190,7 @@</span><br><span>      /** return minimum Rx Gain **/</span><br><span>       double minRxGain(void);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   double rssiOffset(size_t chan);</span><br><span> </span><br><span>  double setPowerAttenuation(int atten, size_t chan);</span><br><span>  double getPowerAttenuation(size_t chan = 0);</span><br><span>diff --git a/Transceiver52M/device/uhd/UHDDevice.cpp b/Transceiver52M/device/uhd/UHDDevice.cpp</span><br><span>index 143a061..010fa8c 100644</span><br><span>--- a/Transceiver52M/device/uhd/UHDDevice.cpp</span><br><span>+++ b/Transceiver52M/device/uhd/UHDDevice.cpp</span><br><span>@@ -130,23 +130,16 @@</span><br><span> };</span><br><span> </span><br><span> typedef std::tuple<uhd_dev_type, enum gsm_band> dev_band_key;</span><br><span style="color: hsl(0, 100%, 40%);">-/* Maximum UHD Tx Gain which can be set/used without distorting the</span><br><span style="color: hsl(0, 100%, 40%);">-   output signal, and the resulting real output power measured when that</span><br><span style="color: hsl(0, 100%, 40%);">-   gain is used. Correct measured values only provided for B210 so far. */</span><br><span style="color: hsl(0, 100%, 40%);">-struct dev_band_desc {</span><br><span style="color: hsl(0, 100%, 40%);">-       double nom_uhd_tx_gain;  /* dB */</span><br><span style="color: hsl(0, 100%, 40%);">-       double nom_out_tx_power; /* dBm */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span> typedef std::map<dev_band_key, dev_band_desc>::const_iterator dev_band_map_it;</span><br><span> static const std::map<dev_band_key, dev_band_desc> dev_band_nom_power_param_map {</span><br><span style="color: hsl(0, 100%, 40%);">- { std::make_tuple(B200, GSM_BAND_850),  { 89.75, 13.3 } },</span><br><span style="color: hsl(0, 100%, 40%);">-      { std::make_tuple(B200, GSM_BAND_900),  { 89.75, 13.3 } },</span><br><span style="color: hsl(0, 100%, 40%);">-      { std::make_tuple(B200, GSM_BAND_1800), { 89.75, 7.5 } },</span><br><span style="color: hsl(0, 100%, 40%);">-       { std::make_tuple(B200, GSM_BAND_1900), { 89.75, 7.7 } },</span><br><span style="color: hsl(0, 100%, 40%);">-       { std::make_tuple(B210, GSM_BAND_850),  { 89.75, 13.3 } },</span><br><span style="color: hsl(0, 100%, 40%);">-      { std::make_tuple(B210, GSM_BAND_900),  { 89.75, 13.3 } },</span><br><span style="color: hsl(0, 100%, 40%);">-      { std::make_tuple(B210, GSM_BAND_1800), { 89.75, 7.5 } },</span><br><span style="color: hsl(0, 100%, 40%);">-       { std::make_tuple(B210, GSM_BAND_1900), { 89.75, 7.7 } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(B200, GSM_BAND_850),  { 89.75, 13.3, -7.5  } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(B200, GSM_BAND_900),  { 89.75, 13.3, -7.5  } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(B200, GSM_BAND_1800), { 89.75, 7.5,  -11.0 } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(B200, GSM_BAND_1900), { 89.75, 7.7,  -11.0 } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(B210, GSM_BAND_850),  { 89.75, 13.3, -7.5  } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(B210, GSM_BAND_900),  { 89.75, 13.3, -7.5  } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(B210, GSM_BAND_1800), { 89.75, 7.5,  -11.0 } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(B210, GSM_BAND_1900), { 89.75, 7.7,  -11.0 } },</span><br><span> };</span><br><span> </span><br><span> void *async_event_loop(uhd_device *dev)</span><br><span>@@ -247,25 +240,42 @@</span><br><span>               delete rx_buffers[i];</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void uhd_device::get_dev_band_desc(dev_band_desc& desc)</span><br><span style="color: hsl(120, 100%, 40%);">+void uhd_device::assign_band_desc(enum gsm_band req_band)</span><br><span> {</span><br><span>    dev_band_map_it it;</span><br><span style="color: hsl(0, 100%, 40%);">-     enum gsm_band req_band = band;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      if (req_band == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGC(DDEV, ERROR) << "Nominal Tx Power requested before Tx Frequency was set! Providing band 900 by default... ";</span><br><span style="color: hsl(0, 100%, 40%);">-               req_band = GSM_BAND_900;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span>    it = dev_band_nom_power_param_map.find(dev_band_key(dev_type, req_band));</span><br><span>    if (it == dev_band_nom_power_param_map.end()) {</span><br><span>              dev_desc desc = dev_param_map.at(dev_key(dev_type, tx_sps, rx_sps));</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGC(DDEV, ERROR) << "No Tx Power measurements exist for device "</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGC(DDEV, ERROR) << "No Power parameters exist for device "</span><br><span>                                     << desc.str << " on band " << gsm_band_name(req_band)</span><br><span>                                    << ", using B210 ones as fallback";</span><br><span>              it = dev_band_nom_power_param_map.find(dev_band_key(B210, req_band));</span><br><span>        }</span><br><span>    OSMO_ASSERT(it != dev_band_nom_power_param_map.end())</span><br><span style="color: hsl(0, 100%, 40%);">-   desc = it->second;</span><br><span style="color: hsl(120, 100%, 40%);">+ band_desc = it->second;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool uhd_device::set_band(enum gsm_band req_band)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ if (band != 0 && req_band != band) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGC(DDEV, ALERT) << "Requesting band " << gsm_band_name(req_band)</span><br><span style="color: hsl(120, 100%, 40%);">+                                << " different from previous band " << gsm_band_name(band);</span><br><span style="color: hsl(120, 100%, 40%);">+           return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   band = req_band;</span><br><span style="color: hsl(120, 100%, 40%);">+      assign_band_desc(band);</span><br><span style="color: hsl(120, 100%, 40%);">+       return true;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void uhd_device::get_dev_band_desc(dev_band_desc& desc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     if (band == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGC(DDEV, ERROR) << "Power parameters requested before Tx Frequency was set! Providing band 900 by default...";</span><br><span style="color: hsl(120, 100%, 40%);">+              assign_band_desc(GSM_BAND_900);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     desc = band_desc;</span><br><span> }</span><br><span> </span><br><span> void uhd_device::init_gains()</span><br><span>@@ -360,6 +370,21 @@</span><br><span>   return rx_gains[chan];</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+double uhd_device::rssiOffset(size_t chan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        double rssiOffset;</span><br><span style="color: hsl(120, 100%, 40%);">+    dev_band_desc desc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (chan >= rx_gains.size()) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGC(DDEV, ALERT) << "Requested non-existent channel " << chan;</span><br><span style="color: hsl(120, 100%, 40%);">+         return 0.0f;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   get_dev_band_desc(desc);</span><br><span style="color: hsl(120, 100%, 40%);">+      rssiOffset = rx_gains[chan] + desc.rxgain2rssioffset_rel;</span><br><span style="color: hsl(120, 100%, 40%);">+     return rssiOffset;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> double uhd_device::setPowerAttenuation(int atten, size_t chan) {</span><br><span>  double tx_power, db;</span><br><span>         dev_band_desc desc;</span><br><span>@@ -1052,16 +1077,12 @@</span><br><span>                return false;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (band != 0 && req_band != band) {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGCHAN(chan, DDEV, ALERT) << "Requesting Tx Frequency " << wFreq</span><br><span style="color: hsl(0, 100%, 40%);">-                                    << " Hz different from previous band " << gsm_band_name(band);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!set_band(req_band))</span><br><span>             return false;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span> </span><br><span>        if (!set_freq(wFreq, chan, true))</span><br><span>            return false;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       band = req_band;</span><br><span>     return true;</span><br><span> }</span><br><span> </span><br><span>diff --git a/Transceiver52M/device/uhd/UHDDevice.h b/Transceiver52M/device/uhd/UHDDevice.h</span><br><span>index c159e63..995b43c 100644</span><br><span>--- a/Transceiver52M/device/uhd/UHDDevice.h</span><br><span>+++ b/Transceiver52M/device/uhd/UHDDevice.h</span><br><span>@@ -56,7 +56,20 @@</span><br><span>  LIMESDR,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct dev_band_desc;</span><br><span style="color: hsl(120, 100%, 40%);">+struct dev_band_desc {</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Maximum UHD Tx Gain which can be set/used without distorting the</span><br><span style="color: hsl(120, 100%, 40%);">+      output signal, and the resulting real output power measured when that</span><br><span style="color: hsl(120, 100%, 40%);">+         gain is used. Correct measured values only provided for B210 so far. */</span><br><span style="color: hsl(120, 100%, 40%);">+    double nom_uhd_tx_gain;  /* dB */</span><br><span style="color: hsl(120, 100%, 40%);">+     double nom_out_tx_power; /* dBm */</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Factor used to infer base real RSSI offset on the Rx path based on current</span><br><span style="color: hsl(120, 100%, 40%);">+    configured RxGain. The resulting rssiOffset is added to the per burst</span><br><span style="color: hsl(120, 100%, 40%);">+         calculated energy in upper layers. These values were empirically</span><br><span style="color: hsl(120, 100%, 40%);">+      found and may change based on multiple factors, see OS#4468.</span><br><span style="color: hsl(120, 100%, 40%);">+          rssiOffset = rxGain + rxgain2rssioffset_rel;</span><br><span style="color: hsl(120, 100%, 40%);">+       */</span><br><span style="color: hsl(120, 100%, 40%);">+    double rxgain2rssioffset_rel; /* dB */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span> </span><br><span> /*</span><br><span>     uhd_device - UHD implementation of the Device interface. Timestamped samples</span><br><span>@@ -100,6 +113,7 @@</span><br><span>       double getRxGain(size_t chan);</span><br><span>       double maxRxGain(void) { return rx_gain_max; }</span><br><span>       double minRxGain(void) { return rx_gain_min; }</span><br><span style="color: hsl(120, 100%, 40%);">+        double rssiOffset(size_t chan);</span><br><span> </span><br><span>  double setPowerAttenuation(int atten, size_t chan);</span><br><span>  double getPowerAttenuation(size_t chan = 0);</span><br><span>@@ -147,6 +161,7 @@</span><br><span>   std::vector<double> tx_gains, rx_gains;</span><br><span>        std::vector<double> tx_freqs, rx_freqs;</span><br><span>        enum gsm_band band;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct dev_band_desc band_desc;</span><br><span>      size_t tx_spp, rx_spp;</span><br><span> </span><br><span>   bool started;</span><br><span>@@ -176,6 +191,8 @@</span><br><span>  uhd::tune_request_t select_freq(double wFreq, size_t chan, bool tx);</span><br><span>         bool set_freq(double freq, size_t chan, bool tx);</span><br><span>    void get_dev_band_desc(dev_band_desc& desc);</span><br><span style="color: hsl(120, 100%, 40%);">+      bool set_band(enum gsm_band req_band);</span><br><span style="color: hsl(120, 100%, 40%);">+        void assign_band_desc(enum gsm_band req_band);</span><br><span> </span><br><span>   Thread *async_event_thrd;</span><br><span>    Mutex tune_lock;</span><br><span>diff --git a/Transceiver52M/device/usrp1/USRPDevice.h b/Transceiver52M/device/usrp1/USRPDevice.h</span><br><span>index f761dc0..aa8dc69 100644</span><br><span>--- a/Transceiver52M/device/usrp1/USRPDevice.h</span><br><span>+++ b/Transceiver52M/device/usrp1/USRPDevice.h</span><br><span>@@ -174,6 +174,8 @@</span><br><span>   /** return minimum Rx Gain **/</span><br><span>   double minRxGain(void);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  double rssiOffset(size_t chan) { return 0.0f;  } /* FIXME: not implemented */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   double setPowerAttenuation(int atten, size_t chan);</span><br><span>   double getPowerAttenuation(size_t chan=0);</span><br><span> </span><br><span>diff --git a/Transceiver52M/osmo-trx.cpp b/Transceiver52M/osmo-trx.cpp</span><br><span>index ec949c8..ec1d660 100644</span><br><span>--- a/Transceiver52M/osmo-trx.cpp</span><br><span>+++ b/Transceiver52M/osmo-trx.cpp</span><br><span>@@ -354,6 +354,7 @@</span><br><span>              case 'R':</span><br><span>                    print_deprecated(option);</span><br><span>                    trx->cfg.rssi_offset = atof(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                       trx->cfg.force_rssi_offset = true;</span><br><span>                        break;</span><br><span>               case 'S':</span><br><span>                    print_deprecated(option);</span><br><span>@@ -477,7 +478,7 @@</span><br><span>      ost << "   Filler Burst RACH Delay. " << trx->cfg.rach_delay << std::endl;</span><br><span>    ost << "   Multi-Carrier........... " << trx->cfg.multi_arfcn << std::endl;</span><br><span>   ost << "   Tuning offset........... " << trx->cfg.offset << std::endl;</span><br><span style="color: hsl(0, 100%, 40%);">-   ost << "   RSSI to dBm offset...... " << trx->cfg.rssi_offset << std::endl;</span><br><span style="color: hsl(120, 100%, 40%);">+    ost << "   RSSI to dBm offset...... " << trx->cfg.rssi_offset << (trx->cfg.force_rssi_offset ? "" : " (relative)") << std::endl;</span><br><span>         ost << "   Swap channels........... " << trx->cfg.swap_channels << std::endl;</span><br><span>         ost << "   Tx Antennas.............";</span><br><span>        for (i = 0; i < trx->cfg.num_chans; i++) {</span><br><span>diff --git a/Transceiver52M/radioInterface.cpp b/Transceiver52M/radioInterface.cpp</span><br><span>index 64a6f21..875245d 100644</span><br><span>--- a/Transceiver52M/radioInterface.cpp</span><br><span>+++ b/Transceiver52M/radioInterface.cpp</span><br><span>@@ -322,6 +322,11 @@</span><br><span>   return mDevice->setRxGain(dB, chan);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+double RadioInterface::rssiOffset(size_t chan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     return mDevice->rssiOffset(chan);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Receive a timestamped chunk from the device */</span><br><span> int RadioInterface::pullBuffer()</span><br><span> {</span><br><span>diff --git a/Transceiver52M/radioInterface.h b/Transceiver52M/radioInterface.h</span><br><span>index 8e5f4c1..efe5606 100644</span><br><span>--- a/Transceiver52M/radioInterface.h</span><br><span>+++ b/Transceiver52M/radioInterface.h</span><br><span>@@ -109,6 +109,9 @@</span><br><span>   /** set receive gain */</span><br><span>   virtual double setRxGain(double dB, size_t chan = 0);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /** return base RSSI offset to apply for received samples **/</span><br><span style="color: hsl(120, 100%, 40%);">+  virtual double rssiOffset(size_t chan = 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   /** drive transmission of GSM bursts */</span><br><span>   void driveTransmitRadio(std::vector<signalVector *> &bursts,</span><br><span>                           std::vector<bool> &zeros);</span><br><span>@@ -190,4 +193,5 @@</span><br><span>   bool tuneTx(double freq, size_t chan);</span><br><span>   bool tuneRx(double freq, size_t chan);</span><br><span>   virtual double setRxGain(double dB, size_t chan);</span><br><span style="color: hsl(120, 100%, 40%);">+  virtual double rssiOffset(size_t chan = 0);</span><br><span> };</span><br><span>diff --git a/Transceiver52M/radioInterfaceMulti.cpp b/Transceiver52M/radioInterfaceMulti.cpp</span><br><span>index 1ca3fbb..465fd41 100644</span><br><span>--- a/Transceiver52M/radioInterfaceMulti.cpp</span><br><span>+++ b/Transceiver52M/radioInterfaceMulti.cpp</span><br><span>@@ -446,6 +446,11 @@</span><br><span>                return mDevice->getRxGain();</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+double RadioInterfaceMulti::rssiOffset(size_t chan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      return mDevice->rssiOffset(0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int RadioInterfaceMulti::setPowerAttenuation(int atten, size_t chan)</span><br><span> {</span><br><span>  return RadioInterface::setPowerAttenuation(atten, 0);</span><br><span>diff --git a/doc/examples/osmo-trx-uhd/osmo-trx-usrp_b200.cfg b/doc/examples/osmo-trx-uhd/osmo-trx-usrp_b200.cfg</span><br><span>index a924122..9eeb395 100644</span><br><span>--- a/doc/examples/osmo-trx-uhd/osmo-trx-usrp_b200.cfg</span><br><span>+++ b/doc/examples/osmo-trx-uhd/osmo-trx-usrp_b200.cfg</span><br><span>@@ -15,9 +15,6 @@</span><br><span>  bind-ip 127.0.0.1</span><br><span>  remote-ip 127.0.0.1</span><br><span>  egprs disable</span><br><span style="color: hsl(0, 100%, 40%);">- ! 28 dB offset below is valid only for the B2xx in 1800 MHz band, see</span><br><span style="color: hsl(0, 100%, 40%);">- ! https://osmocom.org/issues/4468 for more details</span><br><span style="color: hsl(0, 100%, 40%);">- rssi-offset 28.000000</span><br><span>  tx-sps 4</span><br><span>  rx-sps 4</span><br><span>  clock-ref external</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/20639">change 20639</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/+/20639"/><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: I8ef78fd20c22c60d61bfb18d80a4a36df4fd6c20 </div>
<div style="display:none"> Gerrit-Change-Number: 20639 </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>