aboutsummaryrefslogtreecommitdiffstats
path: root/Transceiver52M/multiTRX.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Transceiver52M/multiTRX.cpp')
-rw-r--r--Transceiver52M/multiTRX.cpp125
1 files changed, 34 insertions, 91 deletions
diff --git a/Transceiver52M/multiTRX.cpp b/Transceiver52M/multiTRX.cpp
index 04e2c95..e988eec 100644
--- a/Transceiver52M/multiTRX.cpp
+++ b/Transceiver52M/multiTRX.cpp
@@ -26,13 +26,11 @@
#include "Transceiver.h"
#include "radioDevice.h"
-#define DEVICERATE (400e3 * CHAN_M)
-
ConfigurationTable gConfig("/etc/OpenBTS/OpenBTS.db");
volatile bool gbShutdown = false;
-int Transceiver::mTSC = 0;
+int Transceiver::mTSC = -1;
static void sigHandler(int signum)
{
@@ -50,72 +48,26 @@ static int setupSignals()
if (sigaction(SIGINT, &action, NULL) < 0)
return -1;
-
if (sigaction(SIGTERM, &action, NULL) < 0)
return -1;
return 0;
}
-/*
- * Generate the channel-transceiver ordering. Attempt to match the RAD1
- * ordering where the active channels are centered in the overall device
- * bandwidth. C0 is always has the lowest ARFCN with increasing subsequent
- * channels. When an even number of channels is selected, the carriers will
- * be offset from the RF center by -200 kHz, or half ARFCN spacing.
- */
-static void genChanMap(int numARFCN, int chanM, int *chans)
-{
- int i, n;
-
- chans[0] = numARFCN / 2;
-
- for (i = 1, n = 1; i < numARFCN; i++) {
- if (!chans[i - 1])
- chans[i] = chanM - 1;
- else
- chans[i] = chans[i - 1] - 1;
- }
-}
-
-static void createTrx(Transceiver **trx, int *map, int num,
- RadioInterface *radio, DriveLoop *drive)
-{
- int i;
- bool primary = true;
-
- for (i = 0; i < num; i++) {
- LOG(NOTICE) << "Creating TRX" << i
- << " attached on channel " << map[i];
-
- radio->activateChan(map[i]);
- trx[i] = new Transceiver(5700 + 2 * i, "127.0.0.1",
- SAMPSPERSYM, radio, drive,
- map[i], primary);
- trx[i]->start();
- primary = false;
- }
-}
-
int main(int argc, char *argv[])
{
- int i, chanM, numARFCN = 1;
- int chanMap[CHAN_MAX];
- RadioDevice *usrp;
- RadioInterface* radio;
- DriveLoop *drive;
- Transceiver *trx[CHAN_MAX];
-
- gLogInit("transceiver", gConfig.getStr("Log.Level").c_str(), LOG_LOCAL7);
+ int numARFCN = 1;
if (argc > 1) {
numARFCN = atoi(argv[1]);
- if (numARFCN > (CHAN_MAX - 1)) {
- LOG(ALERT) << numARFCN << " channels not supported with current build";
+ if (numARFCN > CHAN_MAX) {
+ LOG(ALERT) << numARFCN << " channels not supported "
+ << " with with current build";
exit(-1);
}
}
+ gLogInit("transceiver", gConfig.getStr("Log.Level").c_str(), LOG_LOCAL7);
srandom(time(NULL));
if (setupSignals() < 0) {
@@ -123,58 +75,49 @@ int main(int argc, char *argv[])
exit(-1);
}
- /*
- * Select the number of channels according to the number of ARFCNs's
- * and generate ARFCN-to-channelizer path mappings. The channelizer
- * aliases and extracts 'M' equally spaced channels to baseband. The
- * number of ARFCN's must be less than the number of channels in the
- * channelizer.
- */
- switch (numARFCN) {
- case 1:
- chanM = 1;
- break;
- case 2:
- case 3:
- chanM = 5;
- break;
- default:
- chanM = 10;
+ RadioDevice *device = RadioDevice::make(SAMPSPERSYM);
+ int radioType = device->open("");
+ if (radioType < 0) {
+ LOG(ALERT) << "Failed to open device, exiting...";
+ return EXIT_FAILURE;
}
- genChanMap(numARFCN, chanM, chanMap);
- usrp = RadioDevice::make(DEVICERATE);
- if (!usrp->open()) {
- LOG(ALERT) << "Failed to open device, exiting...";
+ RadioInterface *radio;
+ switch (radioType) {
+ case RadioDevice::NORMAL:
+ radio = new RadioInterface(device, numARFCN);
+ break;
+ case RadioDevice::RESAMP:
+ default:
+ LOG(ALERT) << "Unsupported configuration";
return EXIT_FAILURE;
}
- radio = new RadioInterface(usrp, chanM, 3, SAMPSPERSYM, 0, false);
- drive = new DriveLoop(5700, "127.0.0.1", chanM, chanMap[0],
- SAMPSPERSYM, GSM::Time(3,0), radio);
+ DriveLoop *drive = new DriveLoop(5700, "127.0.0.1", radio, numARFCN, 0);
- /* Create, attach, and activate all transceivers */
- createTrx(trx, chanMap, numARFCN, radio, drive);
+ Transceiver *trx[CHAN_MAX];
+ bool primary = true;
+ for (int i = 0; i < numARFCN; i++) {
+ trx[i] = new Transceiver(5700 + 2 * i, "127.0.0.1",
+ drive, radio, SAMPSPERSYM,
+ i, primary);
+ trx[i]->start();
+ primary = false;
+ }
- while (!gbShutdown) {
+ while (!gbShutdown)
sleep(1);
- }
LOG(NOTICE) << "Shutting down transceivers...";
- for (i = 0; i < numARFCN; i++) {
+ for (int i = 0; i < numARFCN; i++)
trx[i]->shutdown();
- }
- /*
- * Allow time for threads to end before we start freeing objects
- */
+ /* Allow time for threads to end before we start freeing objects */
sleep(2);
- for (i = 0; i < numARFCN; i++) {
+ for (int i = 0; i < numARFCN; i++)
delete trx[i];
- }
-
delete drive;
delete radio;
- delete usrp;
+ delete device;
}