aboutsummaryrefslogtreecommitdiffstats
path: root/Transceiver52M/Transceiver.cpp
diff options
context:
space:
mode:
authorTom Tsou <tom.tsou@ettus.com>2015-05-19 18:26:31 -0700
committerTom Tsou <tom.tsou@ettus.com>2015-05-19 18:26:31 -0700
commit64ad712daac0a9125e8827ed5d3eac0afcf369ce (patch)
tree85ccf47b217a927571fc9c65e12caf20da20d73f /Transceiver52M/Transceiver.cpp
parent5c7c1783697bea21f77d64338157bb26c5e5c255 (diff)
test: Add command line random normal burst option
Diffstat (limited to 'Transceiver52M/Transceiver.cpp')
-rw-r--r--Transceiver52M/Transceiver.cpp88
1 files changed, 70 insertions, 18 deletions
diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp
index 31eea60..75d61f3 100644
--- a/Transceiver52M/Transceiver.cpp
+++ b/Transceiver52M/Transceiver.cpp
@@ -69,18 +69,74 @@ TransceiverState::~TransceiverState()
}
}
-void TransceiverState::init(size_t slot, signalVector *burst, bool fill)
+static BitVector *genRandNormalBurst(size_t tsc)
{
- signalVector *filler;
+ if (tsc > 7)
+ return NULL;
- for (int i = 0; i < 102; i++) {
- if (fill)
- filler = new signalVector(*burst);
- else
- filler = new signalVector(burst->size());
+ BitVector *bits = new BitVector(148);
+
+ size_t i = 0;
+
+ /* Tail bits */
+ for (; i < 4; i++)
+ (*bits)[i] = 0;
+
+ /* Random bits */
+ for (; i < 61; i++)
+ (*bits)[i] = rand() % 2;
+
+ /* Training sequence */
+ for (; i < 87; i++)
+ (*bits)[i] = GSM::gTrainingSequence[tsc][i];
+
+ /* Random bits */
+ for (; i < 144; i++)
+ (*bits)[i] = rand() % 2;
+
+ /* Tail bits */
+ for (; i < 148; i++)
+ (*bits)[i] = 0;
+
+ return bits;
+}
+
+bool TransceiverState::init(int filler, size_t sps, float scale, size_t rtsc)
+{
+ BitVector *bits;
+ signalVector *burst;
+
+ if ((sps != 1) && (sps != 4))
+ return false;
+
+ for (size_t n = 0; n < 8; n++) {
+ size_t guard = 8 + !(n % 4);
+ size_t len = sps == 4 ? 625 : 148 + guard;
+
+ for (size_t i = 0; i < 102; i++) {
+ switch (filler) {
+ case Transceiver::FILLER_DUMMY:
+ burst = modulateBurst(gDummyBurst, guard, sps);
+ break;
+ case Transceiver::FILLER_RAND:
+ bits = genRandNormalBurst(rtsc);
+ burst = modulateBurst(*bits, guard, sps);
+ delete bits;
+ break;
+ case Transceiver::FILLER_ZERO:
+ default:
+ burst = new signalVector(len);
+ }
+
+ scaleVector(*burst, scale);
+ fillerTable[i][n] = burst;
+ }
- fillerTable[i][slot] = filler;
+ if (filler == Transceiver::FILLER_RAND)
+ chanType[n] = Transceiver::TSC;
}
+
+ return false;
}
Transceiver::Transceiver(int wBasePort,
@@ -124,10 +180,9 @@ Transceiver::~Transceiver()
* are still expected to report clock indications through control channel
* activity.
*/
-bool Transceiver::init(bool filler)
+bool Transceiver::init(int filler, size_t rtsc)
{
int d_srcport, d_dstport, c_srcport, c_dstport;
- signalVector *burst;
if (!mChans) {
LOG(ALERT) << "No channels assigned";
@@ -141,7 +196,6 @@ bool Transceiver::init(bool filler)
mDataSockets.resize(mChans);
mCtrlSockets.resize(mChans);
-
mControlServiceLoopThreads.resize(mChans);
mTxPriorityQueueServiceLoopThreads.resize(mChans);
mRxServiceLoopThreads.resize(mChans);
@@ -151,7 +205,7 @@ bool Transceiver::init(bool filler)
mStates.resize(mChans);
/* Filler table retransmissions - support only on channel 0 */
- if (filler)
+ if (filler == FILLER_DUMMY)
mStates[0].mRetrans = true;
/* Setup sockets */
@@ -179,12 +233,10 @@ bool Transceiver::init(bool filler)
mControlServiceLoopThreads[i]->start((void * (*)(void*))
ControlServiceLoopAdapter, (void*) chan);
- for (size_t n = 0; n < 8; n++) {
- burst = modulateBurst(gDummyBurst, 8 + (n % 4 == 0), mSPSTx);
- scaleVector(*burst, txFullScale);
- mStates[i].init(n, burst, filler && !i);
- delete burst;
- }
+ if (i && filler == FILLER_DUMMY)
+ filler = FILLER_ZERO;
+
+ mStates[i].init(filler, mSPSTx, txFullScale, rtsc);
}
return true;