diff options
author | Thomas Tsou <tom@tsou.cc> | 2014-10-07 19:37:37 -0700 |
---|---|---|
committer | Thomas Tsou <tom@tsou.cc> | 2014-10-07 19:40:54 -0700 |
commit | 09befd7a06877094653456942605b63c6dccb1d4 (patch) | |
tree | b235e3b6fce7c25ec3b04902a55ccca11238de98 /Transceiver52M | |
parent | 1303376ad1af451a0487a9015372e2fd068194e2 (diff) |
ms: Add command line option and allow negative Tx/Rx offset
The +/- 3 frame offset for Tx/Rx is setup in the RadioInterface
constructor, so we need to know whether we are operating in MS or BTS
mode at the very beginning.
For MS mode, handle negative frame offsets, which would previously cause
an assertion error.
Signed-off-by: Thomas Tsou <tom@tsou.cc>
Diffstat (limited to 'Transceiver52M')
-rw-r--r-- | Transceiver52M/osmo-trx.cpp | 26 | ||||
-rw-r--r-- | Transceiver52M/radioInterface.cpp | 6 |
2 files changed, 28 insertions, 4 deletions
diff --git a/Transceiver52M/osmo-trx.cpp b/Transceiver52M/osmo-trx.cpp index 9215fa5..b3b0c2d 100644 --- a/Transceiver52M/osmo-trx.cpp +++ b/Transceiver52M/osmo-trx.cpp @@ -68,6 +68,7 @@ struct trx_config { bool extref; bool filler; bool diversity; + bool ms; double offset; }; @@ -118,7 +119,7 @@ bool testConfig() */ bool trx_setup_config(struct trx_config *config) { - std::string refstr, fillstr, divstr; + std::string refstr, fillstr, divstr, msstr; if (!testConfig()) return false; @@ -167,6 +168,7 @@ bool trx_setup_config(struct trx_config *config) refstr = config->extref ? "Enabled" : "Disabled"; fillstr = config->filler ? "Enabled" : "Disabled"; divstr = config->diversity ? "Enabled" : "Disabled"; + msstr = config->ms ? "Enabled" : "Disabled"; std::ostringstream ost(""); ost << "Config Settings" << std::endl; @@ -179,6 +181,7 @@ bool trx_setup_config(struct trx_config *config) ost << " External Reference...... " << refstr << std::endl; ost << " C0 Filler Table......... " << fillstr << std::endl; ost << " Diversity............... " << divstr << std::endl; + ost << " MS Mode................. " << msstr << std::endl; ost << " Tuning offset........... " << config->offset << std::endl; std::cout << ost << std::endl; @@ -196,10 +199,22 @@ RadioInterface *makeRadioInterface(struct trx_config *config, RadioDevice *usrp, int type) { RadioInterface *radio = NULL; + size_t div = 1; + int offset = 3; + + if (config->ms) { + if (type != RadioDevice::NORMAL) { + LOG(ALERT) << "Unsupported configuration"; + return NULL; + } + + offset *= -1; + } switch (type) { case RadioDevice::NORMAL: - radio = new RadioInterface(usrp, config->sps, config->chans); + radio = new RadioInterface(usrp, config->sps, + config->chans, div, offset); break; case RadioDevice::RESAMP_64M: case RadioDevice::RESAMP_100M: @@ -286,6 +301,7 @@ static void print_help() " -s Samples-per-symbol (1 or 4)\n" " -c Number of ARFCN channels (default=1)\n" " -f Enable C0 filler table\n" + " -m Enable MS mode\n" " -o Set baseband frequency offset (default=auto)\n", "EMERG, ALERT, CRT, ERR, WARNING, NOTICE, INFO, DEBUG"); } @@ -300,9 +316,10 @@ static void handle_options(int argc, char **argv, struct trx_config *config) config->extref = false; config->filler = false; config->diversity = false; + config->ms = false; config->offset = 0.0; - while ((option = getopt(argc, argv, "ha:l:i:p:c:dxfo:s:")) != -1) { + while ((option = getopt(argc, argv, "ha:l:i:p:c:dxfo:ms:")) != -1) { switch (option) { case 'h': print_help(); @@ -335,6 +352,9 @@ static void handle_options(int argc, char **argv, struct trx_config *config) case 'o': config->offset = atof(optarg); break; + case 'm': + config->ms = true; + break; case 's': config->sps = atoi(optarg); if ((config->sps != 1) && (config->sps != 4)) { diff --git a/Transceiver52M/radioInterface.cpp b/Transceiver52M/radioInterface.cpp index 3d91cd1..e55f66b 100644 --- a/Transceiver52M/radioInterface.cpp +++ b/Transceiver52M/radioInterface.cpp @@ -238,7 +238,11 @@ bool RadioInterface::driveReceiveRadio() pullBuffer(); GSM::Time rcvClock = mClock.get(); - rcvClock.decTN(receiveOffset); + if (receiveOffset < 0) + rcvClock.incTN(-receiveOffset); + else + rcvClock.decTN(receiveOffset); + unsigned tN = rcvClock.TN(); int recvSz = recvCursor; int readSz = 0; |