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