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