<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/18722">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  neels: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved
  laforge: Looks good to me, but someone else must approve

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">radioInterface: Operate on real Tx power attenuation rather than on device specific gains<br><br>All the Tx gain related APIs are left out of reach from radioInterface,<br>and in there we simply interact with radioDevice passing the attenuation<br>received from TRXC.<br><br>Prior gain logic is moved in base radiodevice class, with the idea that<br>the setTxGain() and related functions will be dropped over time in each<br>sublcass in favour of an specific implementation of the<br>SetPowerAttenuation API.<br><br>Change-Id: I4f8a1bcbed74aa9310306b97b0b1bfb02f7855e6<br>---<br>M Transceiver52M/device/common/radioDevice.h<br>M Transceiver52M/device/lms/LMSDevice.h<br>M Transceiver52M/device/uhd/UHDDevice.h<br>M Transceiver52M/device/usrp1/USRPDevice.h<br>M Transceiver52M/radioInterface.cpp<br>M Transceiver52M/radioInterface.h<br>M Transceiver52M/radioInterfaceMulti.cpp<br>7 files changed, 59 insertions(+), 61 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Transceiver52M/device/common/radioDevice.h b/Transceiver52M/device/common/radioDevice.h</span><br><span>index 8dd8f49..e51527d 100644</span><br><span>--- a/Transceiver52M/device/common/radioDevice.h</span><br><span>+++ b/Transceiver52M/device/common/radioDevice.h</span><br><span>@@ -125,21 +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(0, 100%, 40%);">-  /** sets the transmit chan gain, returns the gain setting **/</span><br><span style="color: hsl(0, 100%, 40%);">-  virtual double setTxGain(double dB, size_t chan = 0) = 0;</span><br><span style="color: hsl(0, 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 style="color: hsl(0, 100%, 40%);">-  /** get transmit gain */</span><br><span style="color: hsl(0, 100%, 40%);">-  virtual double getTxGain(size_t chan = 0) = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /** return maximum Tx Gain **/</span><br><span style="color: hsl(0, 100%, 40%);">-  virtual double maxTxGain(void) = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /** return minimum Tx Gain **/</span><br><span style="color: hsl(0, 100%, 40%);">-  virtual double minTxGain(void) = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   /** sets the RX path to use, returns true if successful and false otherwise */</span><br><span>   virtual bool setRxAntenna(const std::string &ant, size_t chan = 0) = 0;</span><br><span> </span><br><span>@@ -163,6 +151,18 @@</span><br><span>   virtual double getRxFreq(size_t chan = 0) = 0;</span><br><span>   virtual double getSampleRate()=0;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /* Default backward-compatible implementation based on TxGain APIs. New</span><br><span style="color: hsl(120, 100%, 40%);">+     implementations should be based on getNominalTxPower() once implemented for</span><br><span style="color: hsl(120, 100%, 40%);">+     the specific backend. */</span><br><span style="color: hsl(120, 100%, 40%);">+  virtual double setPowerAttenuation(int atten, size_t chan) {</span><br><span style="color: hsl(120, 100%, 40%);">+     double rfGain;</span><br><span style="color: hsl(120, 100%, 40%);">+        rfGain = setTxGain(maxTxGain() - atten, chan);</span><br><span style="color: hsl(120, 100%, 40%);">+        return maxTxGain() - rfGain;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+  virtual double getPowerAttenuation(size_t chan=0) {</span><br><span style="color: hsl(120, 100%, 40%);">+      return maxTxGain() - getTxGain(chan);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   protected:</span><br><span>   size_t tx_sps, rx_sps;</span><br><span>   InterfaceType iface;</span><br><span>@@ -171,6 +171,15 @@</span><br><span>   std::vector<std::string> tx_paths, rx_paths;</span><br><span>   std::vector<struct device_counters> m_ctr;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /** sets the transmit chan gain, returns the gain setting **/</span><br><span style="color: hsl(120, 100%, 40%);">+  virtual double setTxGain(double dB, size_t chan = 0) = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /** get transmit gain */</span><br><span style="color: hsl(120, 100%, 40%);">+  virtual double getTxGain(size_t chan = 0) = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /** return maximum Tx Gain **/</span><br><span style="color: hsl(120, 100%, 40%);">+  virtual double maxTxGain(void) = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   RadioDevice(size_t tx_sps, size_t rx_sps, InterfaceType type, size_t chan_num, double offset,</span><br><span>               const std::vector<std::string>& tx_paths,</span><br><span>               const std::vector<std::string>& rx_paths):</span><br><span>diff --git a/Transceiver52M/device/lms/LMSDevice.h b/Transceiver52M/device/lms/LMSDevice.h</span><br><span>index 78fd62a..c83fed2 100644</span><br><span>--- a/Transceiver52M/device/lms/LMSDevice.h</span><br><span>+++ b/Transceiver52M/device/lms/LMSDevice.h</span><br><span>@@ -77,6 +77,19 @@</span><br><span>   void update_stream_stats_rx(size_t chan, bool *overrun);</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 style="color: hsl(120, 100%, 40%);">+  /** sets the transmit chan gain, returns the gain setting **/</span><br><span style="color: hsl(120, 100%, 40%);">+ double setTxGain(double dB, size_t chan = 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /** get transmit gain */</span><br><span style="color: hsl(120, 100%, 40%);">+      double getTxGain(size_t chan = 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           return tx_gains[chan];</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%);">+   /** return maximum Tx Gain **/</span><br><span style="color: hsl(120, 100%, 40%);">+        double maxTxGain(void);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /** return minimum Rx Gain **/</span><br><span style="color: hsl(120, 100%, 40%);">+        double minTxGain(void);</span><br><span> </span><br><span> public:</span><br><span> </span><br><span>@@ -165,20 +178,6 @@</span><br><span>    /** return minimum Rx Gain **/</span><br><span>       double minRxGain(void);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     /** sets the transmit chan gain, returns the gain setting **/</span><br><span style="color: hsl(0, 100%, 40%);">-   double setTxGain(double dB, size_t chan = 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /** get transmit gain */</span><br><span style="color: hsl(0, 100%, 40%);">-        double getTxGain(size_t chan = 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-             return tx_gains[chan];</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /** return maximum Tx Gain **/</span><br><span style="color: hsl(0, 100%, 40%);">-  double maxTxGain(void);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /** return minimum Rx Gain **/</span><br><span style="color: hsl(0, 100%, 40%);">-  double minTxGain(void);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>      int getNominalTxPower(size_t chan = 0);</span><br><span> </span><br><span>  /** sets the RX path to use, returns true if successful and false otherwise */</span><br><span>diff --git a/Transceiver52M/device/uhd/UHDDevice.h b/Transceiver52M/device/uhd/UHDDevice.h</span><br><span>index 8a2d592..d87caf2 100644</span><br><span>--- a/Transceiver52M/device/uhd/UHDDevice.h</span><br><span>+++ b/Transceiver52M/device/uhd/UHDDevice.h</span><br><span>@@ -101,11 +101,6 @@</span><br><span>       double maxRxGain(void) { return rx_gain_max; }</span><br><span>       double minRxGain(void) { return rx_gain_min; }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      double setTxGain(double db, size_t chan);</span><br><span style="color: hsl(0, 100%, 40%);">-       double getTxGain(size_t chan = 0);</span><br><span style="color: hsl(0, 100%, 40%);">-      double maxTxGain(void) { return tx_gain_max; }</span><br><span style="color: hsl(0, 100%, 40%);">-  double minTxGain(void) { return tx_gain_min; }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>       int getNominalTxPower(size_t chan = 0);</span><br><span> </span><br><span>  double getTxFreq(size_t chan);</span><br><span>@@ -136,6 +131,11 @@</span><br><span>        };</span><br><span> </span><br><span> private:</span><br><span style="color: hsl(120, 100%, 40%);">+    double setTxGain(double db, size_t chan);</span><br><span style="color: hsl(120, 100%, 40%);">+     double getTxGain(size_t chan = 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    double maxTxGain(void) { return tx_gain_max; }</span><br><span style="color: hsl(120, 100%, 40%);">+        double minTxGain(void) { return tx_gain_min; }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     uhd::usrp::multi_usrp::sptr usrp_dev;</span><br><span>        uhd::tx_streamer::sptr tx_stream;</span><br><span>    uhd::rx_streamer::sptr rx_stream;</span><br><span>diff --git a/Transceiver52M/device/usrp1/USRPDevice.h b/Transceiver52M/device/usrp1/USRPDevice.h</span><br><span>index 0549192..1c1b3be 100644</span><br><span>--- a/Transceiver52M/device/usrp1/USRPDevice.h</span><br><span>+++ b/Transceiver52M/device/usrp1/USRPDevice.h</span><br><span>@@ -85,6 +85,18 @@</span><br><span>   int writeSamplesControl(std::vector<short *> &bufs, int len, bool *underrun,</span><br><span>                    TIMESTAMP timestamp = 0xffffffff, bool isControl = false);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /** sets the transmit chan gain, returns the gain setting **/</span><br><span style="color: hsl(120, 100%, 40%);">+  double setTxGain(double dB, size_t chan = 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /** get transmit gain */</span><br><span style="color: hsl(120, 100%, 40%);">+  double getTxGain(size_t chan = 0) { return txGain; }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /** return maximum Tx Gain **/</span><br><span style="color: hsl(120, 100%, 40%);">+  double maxTxGain(void);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /** return minimum Rx Gain **/</span><br><span style="color: hsl(120, 100%, 40%);">+  double minTxGain(void);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #ifdef SWLOOPBACK</span><br><span>   short loopbackBuffer[1000000];</span><br><span>   int loopbackBufferSize;</span><br><span>@@ -168,18 +180,6 @@</span><br><span>   /** return minimum Rx Gain **/</span><br><span>   double minRxGain(void);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /** sets the transmit chan gain, returns the gain setting **/</span><br><span style="color: hsl(0, 100%, 40%);">-  double setTxGain(double dB, size_t chan = 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /** get transmit gain */</span><br><span style="color: hsl(0, 100%, 40%);">-  double getTxGain(size_t chan = 0) { return txGain; }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /** return maximum Tx Gain **/</span><br><span style="color: hsl(0, 100%, 40%);">-  double maxTxGain(void);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /** return minimum Rx Gain **/</span><br><span style="color: hsl(0, 100%, 40%);">-  double minTxGain(void);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   int getNominalTxPower(size_t chan = 0);</span><br><span> </span><br><span>   /** sets the RX path to use, returns true if successful and false otherwise */</span><br><span>diff --git a/Transceiver52M/radioInterface.cpp b/Transceiver52M/radioInterface.cpp</span><br><span>index fb724d2..adc2ee7 100644</span><br><span>--- a/Transceiver52M/radioInterface.cpp</span><br><span>+++ b/Transceiver52M/radioInterface.cpp</span><br><span>@@ -103,7 +103,7 @@</span><br><span> </span><br><span> int RadioInterface::setPowerAttenuation(int atten, size_t chan)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  double rfGain, digAtten;</span><br><span style="color: hsl(120, 100%, 40%);">+  double rfAtten, digAtten;</span><br><span> </span><br><span>   if (chan >= mChans) {</span><br><span>     LOG(ALERT) << "Invalid channel requested";</span><br><span>@@ -113,8 +113,8 @@</span><br><span>   if (atten < 0.0)</span><br><span>     atten = 0.0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  rfGain = setTxGain(mDevice->maxTxGain() - (double) atten, chan);</span><br><span style="color: hsl(0, 100%, 40%);">-  digAtten = (double) atten - mDevice->maxTxGain() + rfGain;</span><br><span style="color: hsl(120, 100%, 40%);">+  rfAtten = mDevice->setPowerAttenuation((double) atten, chan);</span><br><span style="color: hsl(120, 100%, 40%);">+  digAtten = (double) atten - rfAtten;</span><br><span> </span><br><span>   if (digAtten < 1.0)</span><br><span>     powerScaling[chan] = 1.0;</span><br><span>@@ -318,11 +318,6 @@</span><br><span>   return mDevice->setRxGain(dB, chan);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-double RadioInterface::setTxGain(double dB, size_t chan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  return mDevice->setTxGain(dB, chan);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 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 eb7ed3b..8e5f4c1 100644</span><br><span>--- a/Transceiver52M/radioInterface.h</span><br><span>+++ b/Transceiver52M/radioInterface.h</span><br><span>@@ -116,7 +116,8 @@</span><br><span>   /** drive reception of GSM bursts. -1: Error. 0: Radio off. 1: Received something. */</span><br><span>   int driveReceiveRadio();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  int setPowerAttenuation(int atten, size_t chan = 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  /** set transmit power attenuation */</span><br><span style="color: hsl(120, 100%, 40%);">+  virtual int setPowerAttenuation(int atten, size_t chan = 0);</span><br><span>   int getNominalTxPower(size_t chan = 0);</span><br><span> </span><br><span>   /** returns the full-scale transmit amplitude **/</span><br><span>@@ -135,9 +136,6 @@</span><br><span>   /** drive synchronization of Tx/Rx of USRP */</span><br><span>   void alignRadio();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /** set transmit gain */</span><br><span style="color: hsl(0, 100%, 40%);">-  virtual double setTxGain(double dB, size_t chan = 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   friend void *AlignRadioServiceLoopAdapter(RadioInterface*);</span><br><span> };</span><br><span> </span><br><span>@@ -167,7 +165,7 @@</span><br><span>   bool pushBuffer();</span><br><span>   int pullBuffer();</span><br><span>   bool verify_arfcn_consistency(double freq, size_t chan, bool tx);</span><br><span style="color: hsl(0, 100%, 40%);">-  virtual double setTxGain(double dB, size_t chan);</span><br><span style="color: hsl(120, 100%, 40%);">+  virtual int setPowerAttenuation(int atten, size_t chan = 0);</span><br><span> </span><br><span>   signalVector *outerSendBuffer;</span><br><span>   signalVector *outerRecvBuffer;</span><br><span>diff --git a/Transceiver52M/radioInterfaceMulti.cpp b/Transceiver52M/radioInterfaceMulti.cpp</span><br><span>index a0c24b5..29f85ca 100644</span><br><span>--- a/Transceiver52M/radioInterfaceMulti.cpp</span><br><span>+++ b/Transceiver52M/radioInterfaceMulti.cpp</span><br><span>@@ -437,11 +437,8 @@</span><br><span>     return mDevice->getRxGain();</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-double RadioInterfaceMulti::setTxGain(double dB, size_t chan)</span><br><span style="color: hsl(120, 100%, 40%);">+int RadioInterfaceMulti::setPowerAttenuation(int atten, size_t chan)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      if (chan == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          return mDevice->setTxGain(dB);</span><br><span style="color: hsl(0, 100%, 40%);">-       else</span><br><span style="color: hsl(0, 100%, 40%);">-            return mDevice->getTxGain();</span><br><span style="color: hsl(120, 100%, 40%);">+               return RadioInterface::setPowerAttenuation(atten, 0);</span><br><span> </span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/18722">change 18722</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/+/18722"/><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: I4f8a1bcbed74aa9310306b97b0b1bfb02f7855e6 </div>
<div style="display:none"> Gerrit-Change-Number: 18722 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: roh <jsteiger@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: tnt <tnt@246tNt.com> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>