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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Transceiver: Pass config struct instead of large list of params<br><br>Change-Id: Ifb43cb11f3e7a69b0a88f632f0a0c90ada7f939e<br>---<br>M CommonLibs/config_defs.h<br>M CommonLibs/trx_vty.h<br>M Transceiver52M/Transceiver.cpp<br>M Transceiver52M/Transceiver.h<br>M Transceiver52M/osmo-trx.cpp<br>5 files changed, 88 insertions(+), 117 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/CommonLibs/config_defs.h b/CommonLibs/config_defs.h</span><br><span>index 8626166..7d501cd 100644</span><br><span>--- a/CommonLibs/config_defs.h</span><br><span>+++ b/CommonLibs/config_defs.h</span><br><span>@@ -5,6 +5,8 @@</span><br><span>  * osmo-trx (CXX, dir Transceiver52)</span><br><span>  */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> enum FillerType {</span><br><span>   FILLER_DUMMY,</span><br><span>   FILLER_ZERO,</span><br><span>@@ -18,3 +20,38 @@</span><br><span>   REF_EXTERNAL,</span><br><span>   REF_GPS,</span><br><span> };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Maximum number of physical RF channels */</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRX_CHAN_MAX 8</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct trx_ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct trx_chan {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct trx_ctx *trx; /* backpointer */</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int idx; /* channel index */</span><br><span style="color: hsl(120, 100%, 40%);">+ char *rx_path;</span><br><span style="color: hsl(120, 100%, 40%);">+        char *tx_path;</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%);">+struct trx_cfg {</span><br><span style="color: hsl(120, 100%, 40%);">+        char *bind_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+      char *remote_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+    char *dev_args;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int base_port;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int tx_sps;</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned int rx_sps;</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned int rtsc;</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned int rach_delay;</span><br><span style="color: hsl(120, 100%, 40%);">+      enum ReferenceType clock_ref;</span><br><span style="color: hsl(120, 100%, 40%);">+ enum FillerType filler;</span><br><span style="color: hsl(120, 100%, 40%);">+       bool multi_arfcn;</span><br><span style="color: hsl(120, 100%, 40%);">+     double offset;</span><br><span style="color: hsl(120, 100%, 40%);">+        double rssi_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+   bool swap_channels;</span><br><span style="color: hsl(120, 100%, 40%);">+   bool ext_rach;</span><br><span style="color: hsl(120, 100%, 40%);">+        bool egprs;</span><br><span style="color: hsl(120, 100%, 40%);">+   unsigned int sched_rr;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int stack_size;</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int num_chans;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct trx_chan chans[TRX_CHAN_MAX];</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span>diff --git a/CommonLibs/trx_vty.h b/CommonLibs/trx_vty.h</span><br><span>index c0d54cf..a6e84e8 100644</span><br><span>--- a/CommonLibs/trx_vty.h</span><br><span>+++ b/CommonLibs/trx_vty.h</span><br><span>@@ -8,8 +8,6 @@</span><br><span> extern const struct value_string clock_ref_names[];</span><br><span> extern const struct value_string filler_names[];</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Maximum number of physical RF channels */</span><br><span style="color: hsl(0, 100%, 40%);">-#define TRX_CHAN_MAX 8</span><br><span> /* Maximum number of carriers in multi-ARFCN mode */</span><br><span> #define TRX_MCHAN_MAX 3</span><br><span> </span><br><span>@@ -35,38 +33,8 @@</span><br><span> #define DEFAULT_TRX_IP          "127.0.0.1"</span><br><span> #define DEFAULT_CHANS          1</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct trx_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct trx_chan {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct trx_ctx *trx; /* backpointer */</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned int idx; /* channel index */</span><br><span style="color: hsl(0, 100%, 40%);">-   char *rx_path;</span><br><span style="color: hsl(0, 100%, 40%);">-  char *tx_path;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> struct trx_ctx {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                char *bind_addr;</span><br><span style="color: hsl(0, 100%, 40%);">-                char *remote_addr;</span><br><span style="color: hsl(0, 100%, 40%);">-              char *dev_args;</span><br><span style="color: hsl(0, 100%, 40%);">-         unsigned int base_port;</span><br><span style="color: hsl(0, 100%, 40%);">-         unsigned int tx_sps;</span><br><span style="color: hsl(0, 100%, 40%);">-            unsigned int rx_sps;</span><br><span style="color: hsl(0, 100%, 40%);">-            unsigned int rtsc;</span><br><span style="color: hsl(0, 100%, 40%);">-              unsigned int rach_delay;</span><br><span style="color: hsl(0, 100%, 40%);">-                enum ReferenceType clock_ref;</span><br><span style="color: hsl(0, 100%, 40%);">-           enum FillerType filler;</span><br><span style="color: hsl(0, 100%, 40%);">-         bool multi_arfcn;</span><br><span style="color: hsl(0, 100%, 40%);">-               double offset;</span><br><span style="color: hsl(0, 100%, 40%);">-          double rssi_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-             bool swap_channels;</span><br><span style="color: hsl(0, 100%, 40%);">-             bool ext_rach;</span><br><span style="color: hsl(0, 100%, 40%);">-          bool egprs;</span><br><span style="color: hsl(0, 100%, 40%);">-             unsigned int sched_rr;</span><br><span style="color: hsl(0, 100%, 40%);">-          unsigned int stack_size;</span><br><span style="color: hsl(0, 100%, 40%);">-                unsigned int num_chans;</span><br><span style="color: hsl(0, 100%, 40%);">-         struct trx_chan chans[TRX_CHAN_MAX];</span><br><span style="color: hsl(0, 100%, 40%);">-    } cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct trx_cfg cfg;</span><br><span> };</span><br><span> </span><br><span> int trx_vty_init(struct trx_ctx* trx);</span><br><span>diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp</span><br><span>index 676ffde..c697234 100644</span><br><span>--- a/Transceiver52M/Transceiver.cpp</span><br><span>+++ b/Transceiver52M/Transceiver.cpp</span><br><span>@@ -132,20 +132,14 @@</span><br><span>   return false;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-Transceiver::Transceiver(int wBasePort,</span><br><span style="color: hsl(0, 100%, 40%);">-                         const char *TRXAddress,</span><br><span style="color: hsl(0, 100%, 40%);">-                         const char *GSMcoreAddress,</span><br><span style="color: hsl(0, 100%, 40%);">-                         size_t tx_sps, size_t rx_sps, size_t chans,</span><br><span style="color: hsl(120, 100%, 40%);">+Transceiver::Transceiver(const struct trx_cfg *cfg,</span><br><span>                          GSM::Time wTransmitLatency,</span><br><span style="color: hsl(0, 100%, 40%);">-                         RadioInterface *wRadioInterface,</span><br><span style="color: hsl(0, 100%, 40%);">-                         double wRssiOffset, int wStackSize)</span><br><span style="color: hsl(0, 100%, 40%);">-  : mBasePort(wBasePort), mLocalAddr(TRXAddress), mRemoteAddr(GSMcoreAddress),</span><br><span style="color: hsl(0, 100%, 40%);">-    mClockSocket(-1), mTransmitLatency(wTransmitLatency), mRadioInterface(wRadioInterface),</span><br><span style="color: hsl(0, 100%, 40%);">-    rssiOffset(wRssiOffset), stackSize(wStackSize),</span><br><span style="color: hsl(0, 100%, 40%);">-    mSPSTx(tx_sps), mSPSRx(rx_sps), mChans(chans), mExtRACH(false), mEdge(false),</span><br><span style="color: hsl(0, 100%, 40%);">-    mOn(false), mForceClockInterface(false),</span><br><span style="color: hsl(0, 100%, 40%);">-    mTxFreq(0.0), mRxFreq(0.0), mTSC(0), mMaxExpectedDelayAB(0), mMaxExpectedDelayNB(0),</span><br><span style="color: hsl(0, 100%, 40%);">-    mWriteBurstToDiskMask(0)</span><br><span style="color: hsl(120, 100%, 40%);">+                         RadioInterface *wRadioInterface)</span><br><span style="color: hsl(120, 100%, 40%);">+  : cfg(cfg), mClockSocket(-1),</span><br><span style="color: hsl(120, 100%, 40%);">+    mTransmitLatency(wTransmitLatency), mRadioInterface(wRadioInterface),</span><br><span style="color: hsl(120, 100%, 40%);">+    mChans(cfg->num_chans), mOn(false), mForceClockInterface(false),</span><br><span style="color: hsl(120, 100%, 40%);">+    mTxFreq(0.0), mRxFreq(0.0), mTSC(0), mMaxExpectedDelayAB(0),</span><br><span style="color: hsl(120, 100%, 40%);">+    mMaxExpectedDelayNB(0), mWriteBurstToDiskMask(0)</span><br><span> {</span><br><span>   txFullScale = mRadioInterface->fullScaleInputValue();</span><br><span>   rxFullScale = mRadioInterface->fullScaleOutputValue();</span><br><span>@@ -199,11 +193,9 @@</span><br><span>  * are still expected to report clock indications through control channel</span><br><span>  * activity.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-bool Transceiver::init(FillerType filler, size_t rtsc, unsigned rach_delay,</span><br><span style="color: hsl(0, 100%, 40%);">-                       bool edge, bool ext_rach)</span><br><span style="color: hsl(120, 100%, 40%);">+bool Transceiver::init()</span><br><span> {</span><br><span>   int d_srcport, d_dstport, c_srcport, c_dstport;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   if (!mChans) {</span><br><span>     LOG(FATAL) << "No channels assigned";</span><br><span>     return false;</span><br><span>@@ -214,9 +206,6 @@</span><br><span>     return false;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  mExtRACH = ext_rach;</span><br><span style="color: hsl(0, 100%, 40%);">-  mEdge = edge;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   mDataSockets.resize(mChans, -1);</span><br><span>   mCtrlSockets.resize(mChans);</span><br><span>   mTxPriorityQueueServiceLoopThreads.resize(mChans);</span><br><span>@@ -228,27 +217,28 @@</span><br><span>   mVersionTRXD.resize(mChans);</span><br><span> </span><br><span>   /* Filler table retransmissions - support only on channel 0 */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (filler == FILLER_DUMMY)</span><br><span style="color: hsl(120, 100%, 40%);">+  if (cfg->filler == FILLER_DUMMY)</span><br><span>     mStates[0].mRetrans = true;</span><br><span> </span><br><span>   /* Setup sockets */</span><br><span>   mClockSocket = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   mLocalAddr.c_str(), mBasePort,</span><br><span style="color: hsl(0, 100%, 40%);">-                                  mRemoteAddr.c_str(), mBasePort + 100,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 cfg->bind_addr, cfg->base_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 cfg->remote_addr, cfg->base_port + 100,</span><br><span>                                OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT);</span><br><span>   if (mClockSocket < 0)</span><br><span>     return false;</span><br><span> </span><br><span>   for (size_t i = 0; i < mChans; i++) {</span><br><span>     int rv;</span><br><span style="color: hsl(0, 100%, 40%);">-    c_srcport = mBasePort + 2 * i + 1;</span><br><span style="color: hsl(0, 100%, 40%);">-    c_dstport = mBasePort + 2 * i + 101;</span><br><span style="color: hsl(0, 100%, 40%);">-    d_srcport = mBasePort + 2 * i + 2;</span><br><span style="color: hsl(0, 100%, 40%);">-    d_dstport = mBasePort + 2 * i + 102;</span><br><span style="color: hsl(120, 100%, 40%);">+    FillerType filler = cfg->filler;</span><br><span style="color: hsl(120, 100%, 40%);">+    c_srcport = cfg->base_port + 2 * i + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    c_dstport = cfg->base_port + 2 * i + 101;</span><br><span style="color: hsl(120, 100%, 40%);">+    d_srcport = cfg->base_port + 2 * i + 2;</span><br><span style="color: hsl(120, 100%, 40%);">+    d_dstport = cfg->base_port + 2 * i + 102;</span><br><span> </span><br><span>     rv = osmo_sock_init2_ofd(&mCtrlSockets[i].conn_bfd, AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      mLocalAddr.c_str(), c_srcport,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      mRemoteAddr.c_str(), c_dstport,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      cfg->bind_addr, c_srcport,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      cfg->remote_addr, c_dstport,</span><br><span>                                      OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT);</span><br><span>     if (rv < 0)</span><br><span>       return false;</span><br><span>@@ -258,8 +248,8 @@</span><br><span> </span><br><span> </span><br><span>     mDataSockets[i] = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      mLocalAddr.c_str(), d_srcport,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      mRemoteAddr.c_str(), d_dstport,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      cfg->bind_addr, d_srcport,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      cfg->remote_addr, d_dstport,</span><br><span>                                OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT);</span><br><span>     if (mDataSockets[i] < 0)</span><br><span>       return false;</span><br><span>@@ -267,7 +257,7 @@</span><br><span>     if (i && filler == FILLER_DUMMY)</span><br><span>       filler = FILLER_ZERO;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    mStates[i].init(filler, mSPSTx, txFullScale, rtsc, rach_delay);</span><br><span style="color: hsl(120, 100%, 40%);">+    mStates[i].init(filler, cfg->tx_sps, txFullScale, cfg->rtsc, cfg->rach_delay);</span><br><span>   }</span><br><span> </span><br><span>   /* Randomize the central clock */</span><br><span>@@ -309,8 +299,8 @@</span><br><span>   }</span><br><span> </span><br><span>   /* Device is running - launch I/O threads */</span><br><span style="color: hsl(0, 100%, 40%);">-  mRxLowerLoopThread = new Thread(stackSize);</span><br><span style="color: hsl(0, 100%, 40%);">-  mTxLowerLoopThread = new Thread(stackSize);</span><br><span style="color: hsl(120, 100%, 40%);">+  mRxLowerLoopThread = new Thread(cfg->stack_size);</span><br><span style="color: hsl(120, 100%, 40%);">+  mTxLowerLoopThread = new Thread(cfg->stack_size);</span><br><span>   mTxLowerLoopThread->start((void * (*)(void*))</span><br><span>                             TxLowerLoopAdapter,(void*) this);</span><br><span>   mRxLowerLoopThread->start((void * (*)(void*))</span><br><span>@@ -321,14 +311,14 @@</span><br><span>     TrxChanThParams *params = (TrxChanThParams *)malloc(sizeof(struct TrxChanThParams));</span><br><span>     params->trx = this;</span><br><span>     params->num = i;</span><br><span style="color: hsl(0, 100%, 40%);">-    mRxServiceLoopThreads[i] = new Thread(stackSize);</span><br><span style="color: hsl(120, 100%, 40%);">+    mRxServiceLoopThreads[i] = new Thread(cfg->stack_size);</span><br><span>     mRxServiceLoopThreads[i]->start((void * (*)(void*))</span><br><span>                             RxUpperLoopAdapter, (void*) params);</span><br><span> </span><br><span>     params = (TrxChanThParams *)malloc(sizeof(struct TrxChanThParams));</span><br><span>     params->trx = this;</span><br><span>     params->num = i;</span><br><span style="color: hsl(0, 100%, 40%);">-    mTxPriorityQueueServiceLoopThreads[i] = new Thread(stackSize);</span><br><span style="color: hsl(120, 100%, 40%);">+    mTxPriorityQueueServiceLoopThreads[i] = new Thread(cfg->stack_size);</span><br><span>     mTxPriorityQueueServiceLoopThreads[i]->start((void * (*)(void*))</span><br><span>                             TxUpperLoopAdapter, (void*) params);</span><br><span>   }</span><br><span>@@ -401,9 +391,9 @@</span><br><span> </span><br><span>   /* Use the number of bits as the EDGE burst indicator */</span><br><span>   if (bits.size() == EDGE_BURST_NBITS)</span><br><span style="color: hsl(0, 100%, 40%);">-    burst = modulateEdgeBurst(bits, mSPSTx);</span><br><span style="color: hsl(120, 100%, 40%);">+    burst = modulateEdgeBurst(bits, cfg->tx_sps);</span><br><span>   else</span><br><span style="color: hsl(0, 100%, 40%);">-    burst = modulateBurst(bits, 8 + (wTime.TN() % 4 == 0), mSPSTx);</span><br><span style="color: hsl(120, 100%, 40%);">+    burst = modulateBurst(bits, 8 + (wTime.TN() % 4 == 0), cfg->tx_sps);</span><br><span> </span><br><span>   scaleVector(*burst, txFullScale * pow(10, -RSSI / 10));</span><br><span> </span><br><span>@@ -566,16 +556,16 @@</span><br><span>     break;</span><br><span>   case IV:</span><br><span>   case VI:</span><br><span style="color: hsl(0, 100%, 40%);">-    return mExtRACH ? EXT_RACH : RACH;</span><br><span style="color: hsl(120, 100%, 40%);">+    return cfg->ext_rach ? EXT_RACH : RACH;</span><br><span>     break;</span><br><span>   case V: {</span><br><span>     int mod51 = burstFN % 51;</span><br><span>     if ((mod51 <= 36) && (mod51 >= 14))</span><br><span style="color: hsl(0, 100%, 40%);">-      return mExtRACH ? EXT_RACH : RACH;</span><br><span style="color: hsl(120, 100%, 40%);">+      return cfg->ext_rach ? EXT_RACH : RACH;</span><br><span>     else if ((mod51 == 4) || (mod51 == 5))</span><br><span style="color: hsl(0, 100%, 40%);">-      return mExtRACH ? EXT_RACH : RACH;</span><br><span style="color: hsl(120, 100%, 40%);">+      return cfg->ext_rach ? EXT_RACH : RACH;</span><br><span>     else if ((mod51 == 45) || (mod51 == 46))</span><br><span style="color: hsl(0, 100%, 40%);">-      return mExtRACH ? EXT_RACH : RACH;</span><br><span style="color: hsl(120, 100%, 40%);">+      return cfg->ext_rach ? EXT_RACH : RACH;</span><br><span>     else if (mHandover[burstTN][sdcch4_subslot[burstFN % 102]])</span><br><span>       return RACH;</span><br><span>     else</span><br><span>@@ -593,11 +583,11 @@</span><br><span>   case XIII: {</span><br><span>     int mod52 = burstFN % 52;</span><br><span>     if ((mod52 == 12) || (mod52 == 38))</span><br><span style="color: hsl(0, 100%, 40%);">-      return mExtRACH ? EXT_RACH : RACH;</span><br><span style="color: hsl(120, 100%, 40%);">+      return cfg->ext_rach ? EXT_RACH : RACH;</span><br><span>     else if ((mod52 == 25) || (mod52 == 51))</span><br><span>       return IDLE;</span><br><span>     else /* Enable 8-PSK burst detection if EDGE is enabled */</span><br><span style="color: hsl(0, 100%, 40%);">-      return mEdge ? EDGE : TSC;</span><br><span style="color: hsl(120, 100%, 40%);">+      return cfg->egprs ? EDGE : TSC;</span><br><span>     break;</span><br><span>   }</span><br><span>   case LOOPBACK:</span><br><span>@@ -685,7 +675,7 @@</span><br><span> </span><br><span>   /* Select the diversity channel with highest energy */</span><br><span>   for (size_t i = 0; i < radio_burst->chans(); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-    float pow = energyDetect(*radio_burst->getVector(i), 20 * mSPSRx);</span><br><span style="color: hsl(120, 100%, 40%);">+    float pow = energyDetect(*radio_burst->getVector(i), 20 * cfg->rx_sps);</span><br><span>     if (pow > max) {</span><br><span>       max = pow;</span><br><span>       max_i = i;</span><br><span>@@ -710,8 +700,8 @@</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) + rssiOffset;</span><br><span style="color: hsl(0, 100%, 40%);">-  bi->noise = 20.0 * log10(rxFullScale / state->mNoiseLev) + rssiOffset;</span><br><span style="color: hsl(120, 100%, 40%);">+  bi->rssi = 20.0 * log10(rxFullScale / avg) + cfg->rssi_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+  bi->noise = 20.0 * log10(rxFullScale / state->mNoiseLev) + cfg->rssi_offset;</span><br><span> </span><br><span>   if (type == IDLE)</span><br><span>     goto ret_idle;</span><br><span>@@ -720,7 +710,7 @@</span><br><span>             mMaxExpectedDelayAB : mMaxExpectedDelayNB;</span><br><span> </span><br><span>   /* Detect normal or RACH bursts */</span><br><span style="color: hsl(0, 100%, 40%);">-  rc = detectAnyBurst(*burst, mTSC, BURST_THRESH, mSPSRx, type, max_toa, &ebp);</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = detectAnyBurst(*burst, mTSC, BURST_THRESH, cfg->rx_sps, type, max_toa, &ebp);</span><br><span>   if (rc <= 0) {</span><br><span>     if (rc == -SIGERR_CLIP) {</span><br><span>       LOGCHAN(chan, DTRXDUL, INFO) << "Clipping detected on received RACH or Normal Burst";</span><br><span>@@ -738,7 +728,7 @@</span><br><span>   bi->toa = ebp.toa;</span><br><span>   bi->tsc = ebp.tsc;</span><br><span>   bi->ci = ebp.ci;</span><br><span style="color: hsl(0, 100%, 40%);">-  rxBurst = demodAnyBurst(*burst, mSPSRx, ebp.amp, ebp.toa, type);</span><br><span style="color: hsl(120, 100%, 40%);">+  rxBurst = demodAnyBurst(*burst, cfg->rx_sps, ebp.amp, ebp.toa, type);</span><br><span> </span><br><span>   /* EDGE demodulator returns 444 (gSlotLen * 3) bits */</span><br><span>   if (rxBurst->size() == EDGE_BURST_NBITS) {</span><br><span>@@ -1055,8 +1045,8 @@</span><br><span>       burstLen = gSlotLen;</span><br><span>       break;</span><br><span>     case sizeof(*dl) + EDGE_BURST_NBITS: /* EDGE burst */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (mSPSTx != 4) {</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGCHAN(chan, DTRXDDL, ERROR) << "EDGE burst received but SPS is set to " << mSPSTx;</span><br><span style="color: hsl(120, 100%, 40%);">+      if (cfg->tx_sps != 4) {</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGCHAN(chan, DTRXDDL, ERROR) << "EDGE burst received but SPS is set to " << cfg->tx_sps;</span><br><span>         return false;</span><br><span>       }</span><br><span>       burstLen = EDGE_BURST_NBITS;</span><br><span>@@ -1165,9 +1155,9 @@</span><br><span> </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 - rssiOffset)</span><br><span style="color: hsl(120, 100%, 40%);">+    << " RSSI: "   << std::setw(5) << std::setprecision(1) << (bi->rssi - cfg->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 - rssiOffset)</span><br><span style="color: hsl(120, 100%, 40%);">+    << " noise: "  << std::setw(5) << std::setprecision(1) << (bi->noise - cfg->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 7a05ac5..42a780e 100644</span><br><span>--- a/Transceiver52M/Transceiver.h</span><br><span>+++ b/Transceiver52M/Transceiver.h</span><br><span>@@ -100,27 +100,19 @@</span><br><span> class Transceiver {</span><br><span> public:</span><br><span>   /** Transceiver constructor</span><br><span style="color: hsl(0, 100%, 40%);">-      @param wBasePort base port number of UDP sockets</span><br><span style="color: hsl(0, 100%, 40%);">-      @param TRXAddress IP address of the TRX, as a string</span><br><span style="color: hsl(0, 100%, 40%);">-      @param GSMcoreAddress IP address of the GSM core, as a string</span><br><span style="color: hsl(0, 100%, 40%);">-      @param wSPS number of samples per GSM symbol</span><br><span style="color: hsl(120, 100%, 40%);">+      @param cfg VTY populated config</span><br><span>       @param wTransmitLatency initial setting of transmit latency</span><br><span>       @param radioInterface associated radioInterface object</span><br><span>   */</span><br><span style="color: hsl(0, 100%, 40%);">-  Transceiver(int wBasePort,</span><br><span style="color: hsl(0, 100%, 40%);">-              const char *TRXAddress,</span><br><span style="color: hsl(0, 100%, 40%);">-              const char *GSMcoreAddress,</span><br><span style="color: hsl(0, 100%, 40%);">-              size_t tx_sps, size_t rx_sps, size_t chans,</span><br><span style="color: hsl(120, 100%, 40%);">+  Transceiver(const struct trx_cfg *cfg,</span><br><span>               GSM::Time wTransmitLatency,</span><br><span style="color: hsl(0, 100%, 40%);">-              RadioInterface *wRadioInterface,</span><br><span style="color: hsl(0, 100%, 40%);">-              double wRssiOffset, int stackSize);</span><br><span style="color: hsl(120, 100%, 40%);">+              RadioInterface *wRadioInterface);</span><br><span> </span><br><span>   /** Destructor */</span><br><span>   ~Transceiver();</span><br><span> </span><br><span>   /** Start the control loop */</span><br><span style="color: hsl(0, 100%, 40%);">-  bool init(FillerType filler, size_t rtsc, unsigned rach_delay,</span><br><span style="color: hsl(0, 100%, 40%);">-            bool edge, bool ext_rach);</span><br><span style="color: hsl(120, 100%, 40%);">+  bool init(void);</span><br><span> </span><br><span>   /** attach the radioInterface receive FIFO */</span><br><span>   bool receiveFIFO(VectorFIFO *wFIFO, size_t chan)</span><br><span>@@ -133,7 +125,7 @@</span><br><span>   }</span><br><span> </span><br><span>   /** accessor for number of channels */</span><br><span style="color: hsl(0, 100%, 40%);">-  size_t numChans() const { return mChans; };</span><br><span style="color: hsl(120, 100%, 40%);">+  size_t numChans() const { return cfg->num_chans; };</span><br><span> </span><br><span>   /** Codes for channel combinations */</span><br><span>   typedef enum {</span><br><span>@@ -156,7 +148,6 @@</span><br><span>   } ChannelCombination;</span><br><span> </span><br><span> private:</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> struct ctrl_msg {</span><br><span>   char data[101];</span><br><span>   ctrl_msg() {};</span><br><span>@@ -177,10 +168,7 @@</span><br><span>   }</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  int mBasePort;</span><br><span style="color: hsl(0, 100%, 40%);">-  std::string mLocalAddr;</span><br><span style="color: hsl(0, 100%, 40%);">-  std::string mRemoteAddr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+  const struct trx_cfg *cfg;  ///< VTY populated config</span><br><span>   std::vector<int> mDataSockets;  ///< socket for writing to/reading from GSM core</span><br><span>   std::vector<ctrl_sock_state> mCtrlSockets;  ///< socket for writing/reading control commands from GSM core</span><br><span>   int mClockSocket;               ///< socket for writing clock updates to GSM core</span><br><span>@@ -202,9 +190,6 @@</span><br><span>   double txFullScale;                     ///< full scale input to radio</span><br><span>   double rxFullScale;                     ///< full scale output to radio</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  double rssiOffset;                      ///< RSSI to dBm conversion offset</span><br><span style="color: hsl(0, 100%, 40%);">-  int stackSize;                      ///< stack size for threads, 0 = OS default</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   /** modulate and add a burst to the transmit queue */</span><br><span>   void addRadioVector(size_t chan, BitVector &bits,</span><br><span>                       int RSSI, GSM::Time &wTime);</span><br><span>@@ -233,12 +218,7 @@</span><br><span>   /** drive handling of control messages from GSM core */</span><br><span>   int ctrl_sock_handle_rx(int chan);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  int mSPSTx;                          ///< number of samples per Tx symbol</span><br><span style="color: hsl(0, 100%, 40%);">-  int mSPSRx;                          ///< number of samples per Rx symbol</span><br><span>   size_t mChans;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  bool mExtRACH;</span><br><span style="color: hsl(0, 100%, 40%);">-  bool mEdge;</span><br><span>   bool mOn;                             ///< flag to indicate that transceiver is powered on</span><br><span>   bool mForceClockInterface;           ///< flag to indicate whether IND CLOCK shall be sent unconditionally after transceiver is started</span><br><span>   bool mHandover[8][8];                ///< expect handover to the timeslot/subslot</span><br><span>diff --git a/Transceiver52M/osmo-trx.cpp b/Transceiver52M/osmo-trx.cpp</span><br><span>index c32f1ff..ec949c8 100644</span><br><span>--- a/Transceiver52M/osmo-trx.cpp</span><br><span>+++ b/Transceiver52M/osmo-trx.cpp</span><br><span>@@ -144,12 +144,8 @@</span><br><span> {</span><br><span>    VectorFIFO *fifo;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   transceiver = new Transceiver(trx->cfg.base_port, trx->cfg.bind_addr,</span><br><span style="color: hsl(0, 100%, 40%);">-                           trx->cfg.remote_addr, trx->cfg.tx_sps,</span><br><span style="color: hsl(0, 100%, 40%);">-                            trx->cfg.rx_sps, trx->cfg.num_chans, GSM::Time(3,0),</span><br><span style="color: hsl(0, 100%, 40%);">-                              radio, trx->cfg.rssi_offset, trx->cfg.stack_size);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!transceiver->init(trx->cfg.filler, trx->cfg.rtsc,</span><br><span style="color: hsl(0, 100%, 40%);">-                trx->cfg.rach_delay, trx->cfg.egprs, trx->cfg.ext_rach)) {</span><br><span style="color: hsl(120, 100%, 40%);">+    transceiver = new Transceiver(&trx->cfg, GSM::Time(3,0), radio);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!transceiver->init()) {</span><br><span>               LOG(ALERT) << "Failed to initialize transceiver";</span><br><span>            return -1;</span><br><span>   }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/20638">change 20638</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/+/20638"/><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: Ifb43cb11f3e7a69b0a88f632f0a0c90ada7f939e </div>
<div style="display:none"> Gerrit-Change-Number: 20638 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </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: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>