diff options
author | Alexander Chemeris <Alexander.Chemeris@gmail.com> | 2013-07-14 22:45:40 +0400 |
---|---|---|
committer | Alexander Chemeris <Alexander.Chemeris@gmail.com> | 2013-07-16 07:36:17 +0400 |
commit | f1c5b4f76567334a8da7cd2bf36ba854db5e341a (patch) | |
tree | 6a3889c252652ebf1c84be0e008010667ea4adf6 | |
parent | 19ae715e7126e6c333874d415f56959eac0e6654 (diff) |
Transceiver52M: Introduce usage counting for DriveLoop and RadioInterface.
The reason is to allow them to be started from any TRX. I.e. they are started
when the first TRX starts and stopped when the last TRX stops.
-rw-r--r-- | Transceiver52M/DriveLoop.cpp | 27 | ||||
-rw-r--r-- | Transceiver52M/DriveLoop.h | 9 | ||||
-rw-r--r-- | Transceiver52M/radioInterface.cpp | 20 | ||||
-rw-r--r-- | Transceiver52M/radioInterface.h | 4 |
4 files changed, 54 insertions, 6 deletions
diff --git a/Transceiver52M/DriveLoop.cpp b/Transceiver52M/DriveLoop.cpp index 51ce750..7521a18 100644 --- a/Transceiver52M/DriveLoop.cpp +++ b/Transceiver52M/DriveLoop.cpp @@ -33,6 +33,7 @@ DriveLoop::DriveLoop(int wBasePort, const char *TRXAddress, int wChanM, int wC0, int wSamplesPerSymbol, GSM::Time wTransmitLatency) : Thread("DriveLoop") +, mUseCount(0) , mClockSocket(wBasePort, TRXAddress, wBasePort + 100) , mC0(wC0) { @@ -85,6 +86,32 @@ DriveLoop::~DriveLoop() sigProcLibDestroy(); } +bool DriveLoop::start() +{ + // Use count must not be negative + assert(mUseCount>=0); + + mUseCount++; + if (mUseCount>1) + return false; + + startThread(); + return true; +} + +bool DriveLoop::stop() +{ + // Use count must not be negative or zero + assert(mUseCount>0); + + mUseCount--; + if (mUseCount>0) + return false; + + stopThread(); + return true; +} + void DriveLoop::pushRadioVector(GSM::Time &nowTime) { int i; diff --git a/Transceiver52M/DriveLoop.h b/Transceiver52M/DriveLoop.h index f396abd..eeabe03 100644 --- a/Transceiver52M/DriveLoop.h +++ b/Transceiver52M/DriveLoop.h @@ -45,10 +45,12 @@ //#define TRANSMIT_LOGGING 1 /** The Transceiver class, responsible for physical layer of basestation */ -class DriveLoop : public Thread { +class DriveLoop : private Thread { private: + int mUseCount; ///< Use counter + GSM::Time mTransmitLatency; ///< latency between basestation clock and transmit deadline clock GSM::Time mLatencyUpdateTime; ///< last time latency was updated GSM::Time mLastClockUpdateTime; ///< last time clock update was sent up to core @@ -110,6 +112,11 @@ public: /** Destructor */ ~DriveLoop(); + /** Increase usage counter and start the thread if not started yet */ + bool start(); + /** Decrease usage counter and stop the thread if no users left */ + bool stop(); + VectorQueue *priorityQueue(int m) { return &mTransmitPriorityQueue[m]; } /** Codes for burst types of received bursts*/ diff --git a/Transceiver52M/radioInterface.cpp b/Transceiver52M/radioInterface.cpp index 6694066..6ae6ef7 100644 --- a/Transceiver52M/radioInterface.cpp +++ b/Transceiver52M/radioInterface.cpp @@ -55,6 +55,7 @@ RadioInterface::RadioInterface(RadioDevice *wRadio, int wReceiveOffset, GSM::Time wStartTime) : mChanM(wChanM), underrun(false), sendCursor(0), rcvCursor(0), mOn(false), + mUseCount(0), mRadio(wRadio), receiveOffset(wReceiveOffset), samplesPerSymbol(wSPS), powerScaling(1.0), loadTest(false) { @@ -147,9 +148,13 @@ bool RadioInterface::tuneRx(double freq, int chan) bool RadioInterface::start() { - int i; + // Use count must not be negative + assert(mUseCount>=0); + // Being on while mUseCount is 0 is a wrong condition + assert(!(mOn && mUseCount==0)); - if (mOn) + mUseCount++; + if (mOn || mUseCount>1) return false; mOn = true; @@ -160,7 +165,7 @@ bool RadioInterface::start() #endif writeTimestamp = mRadio->initialWriteTimestamp(); readTimestamp = mRadio->initialReadTimestamp(); - for (i = 0; i < mChanM; i++) { + for (int i = 0; i < mChanM; i++) { sendBuffer[i] = new float[8*2*INCHUNK]; rcvBuffer[i] = new float[8*2*OUTCHUNK]; } @@ -178,11 +183,18 @@ bool RadioInterface::start() bool RadioInterface::stop() { - if (!mOn) + // Use count must not be negative or zero + assert(mUseCount>0); + // Must be on while stopping + assert(mOn); + + mUseCount--; + if (mUseCount>0) return false; mOn = false; mRadio->stop(); + return true; } #ifdef USRP1 diff --git a/Transceiver52M/radioInterface.h b/Transceiver52M/radioInterface.h index 83413cf..c2c4255 100644 --- a/Transceiver52M/radioInterface.h +++ b/Transceiver52M/radioInterface.h @@ -59,6 +59,7 @@ protected: int receiveOffset; ///< offset b/w transmit and receive GSM timestamps, in timeslots bool mOn; ///< indicates radio is on + int mUseCount; ///< Use counter double powerScaling; @@ -90,8 +91,9 @@ private: public: - /** start the interface */ + /** Increase usage counter and start the interface if not started yet */ bool start(); + /** Decrease usage counter and stop the interface if no users left */ bool stop(); bool started() { return mOn; }; |