From 7c6f58af7a9685c50f33ea72c7bddc884b85de2f Mon Sep 17 00:00:00 2001 From: Thomas Tsou Date: Tue, 13 Mar 2012 18:06:10 -0400 Subject: multi-arfcn, trx: add and modify transceiver main for new interfaces Add a transceiver main() for multi-arfcn use and modify single channel transceiver for use with updated interfaces. Setup multiTRX with 3 channels for default case. Signed-off-by: Thomas Tsou --- Transceiver52M/multiTRX.cpp | 116 ++++++++++++++++++++++++++++++++++++++ Transceiver52M/runTransceiver.cpp | 15 +++-- 2 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 Transceiver52M/multiTRX.cpp diff --git a/Transceiver52M/multiTRX.cpp b/Transceiver52M/multiTRX.cpp new file mode 100644 index 0000000..a68f234 --- /dev/null +++ b/Transceiver52M/multiTRX.cpp @@ -0,0 +1,116 @@ +/* + * Copyright 2012 Thomas Tsou + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * See the COPYING file in the main directory for details. + */ + +#include +#include + +#include +#include +#include + +#include "Transceiver.h" +#include "radioDevice.h" + +#define DEVICERATE (400e3 * CHAN_M) + +ConfigurationTable gConfig("/etc/OpenBTS/OpenBTS.db"); + +volatile bool gbShutdown = false; + +static void sigHandler(int signum) +{ + LOG(NOTICE) << "Received shutdown signal"; + gbShutdown = true; +} + +static int setupSignals() +{ + struct sigaction action; + + action.sa_handler = sigHandler; + sigemptyset(&action.sa_mask); + action.sa_flags = 0; + + if (sigaction(SIGINT, &action, NULL) < 0) + return -1; + + if (sigaction(SIGTERM, &action, NULL) < 0) + return -1; + + return 0; +} + +int main(int argc, char *argv[]) +{ + RadioDevice *usrp; + RadioInterface* radio; + DriveLoop *drive; + Transceiver *trx0, *trx1, *trx2; + + gLogInit("transceiver", gConfig.getStr("Log.Level").c_str(), LOG_LOCAL7); + + if (setupSignals() < 0) { + LOG(ERR) << "Failed to setup signal handlers, exiting..."; + exit(-1); + } + + srandom(time(NULL)); + + usrp = RadioDevice::make(DEVICERATE); + if (!usrp->open()) { + LOG(ALERT) << "Failed to open device, exiting..."; + return EXIT_FAILURE; + } + + radio = new RadioInterface(usrp, 3, SAMPSPERSYM, 0, false); + drive = new DriveLoop(SAMPSPERSYM, GSM::Time(3,0), radio); + + LOG(NOTICE) << "Creating TRX0"; + trx0 = new Transceiver(5700, "127.0.0.1", SAMPSPERSYM, radio, drive, 0); + trx0->receiveFIFO(radio->receiveFIFO(0)); + trx0->transmitQueue(drive->priorityQueue(0)); + radio->activateChan(0); + trx0->start(); + + LOG(NOTICE) << "Creating TRX1"; + trx1 = new Transceiver(6700, "127.0.0.1", SAMPSPERSYM, radio, drive, 1); + trx1->receiveFIFO(radio->receiveFIFO(1)); + trx1->transmitQueue(drive->priorityQueue(1)); + radio->activateChan(1); + trx1->start(); + + LOG(NOTICE) << "Creating TRX2"; + trx2 = new Transceiver(7700, "127.0.0.1", SAMPSPERSYM, radio, drive, 4); + trx2->receiveFIFO(radio->receiveFIFO(4)); + trx2->transmitQueue(drive->priorityQueue(4)); + radio->activateChan(4); + trx2->start(); + + while (!gbShutdown) { + sleep(1); + } + + LOG(NOTICE) << "Shutting down transceiver..."; + + delete trx0; + delete trx1; + delete trx2; + delete drive; + delete radio; + delete usrp; +} diff --git a/Transceiver52M/runTransceiver.cpp b/Transceiver52M/runTransceiver.cpp index e61ba34..c750f96 100644 --- a/Transceiver52M/runTransceiver.cpp +++ b/Transceiver52M/runTransceiver.cpp @@ -116,8 +116,13 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - Transceiver *trx = new Transceiver(gConfig.getNum("TRX.Port"),gConfig.getStr("TRX.IP").c_str(),SAMPSPERSYM,GSM::Time(3,0),radio); - trx->receiveFIFO(radio->receiveFIFO()); + int port = gConfig.getNum("TRX.Port"); + const char *addr = gConfig.getStr("TRX.IP").c_str(); + DriveLoop *drive = new DriveLoop(SAMPSPERSYM,GSM::Time(3,0),radio); + Transceiver *trx = new Transceiver(port, addr, SAMPSPERSYM, radio, drive, 0); + trx->receiveFIFO(radio->receiveFIFO(0)); + trx->transmitQueue(drive->priorityQueue(0)); + radio->activateChan(0); /* signalVector *gsmPulse = generateGSMPulse(2,1); @@ -151,12 +156,12 @@ int main(int argc, char *argv[]) usrp->loadBurst(finalVecShort,finalVec.size()); */ trx->start(); - //int i = 0; + while(!gbShutdown) { sleep(1); }//i++; if (i==60) break;} cout << "Shutting down transceiver..." << endl; -// trx->stop(); delete trx; -// delete radio; + delete drive; + delete radio; } -- cgit v1.2.3