diff options
Diffstat (limited to 'Transceiver52M/Transceiver.h')
-rw-r--r-- | Transceiver52M/Transceiver.h | 88 |
1 files changed, 49 insertions, 39 deletions
diff --git a/Transceiver52M/Transceiver.h b/Transceiver52M/Transceiver.h index 1f8bed2..4356ef2 100644 --- a/Transceiver52M/Transceiver.h +++ b/Transceiver52M/Transceiver.h @@ -86,18 +86,18 @@ private: GSM::Time mTransmitLatency; ///< latency between basestation clock and transmit deadline clock GSM::Time mLatencyUpdateTime; ///< last time latency was updated - UDPSocket *mDataSocket; ///< socket for writing to/reading from GSM core - UDPSocket *mCtrlSocket; ///< socket for writing/reading control commands from GSM core - UDPSocket *mClockSocket; ///< socket for writing clock updates to GSM core + std::vector<UDPSocket *> mDataSockets; ///< socket for writing to/reading from GSM core + std::vector<UDPSocket *> mCtrlSockets; ///< socket for writing/reading control commands from GSM core + UDPSocket *mClockSocket; ///< socket for writing clock updates to GSM core - VectorQueue mTransmitPriorityQueue; ///< priority queue of transmit bursts received from GSM core - VectorFIFO* mTransmitFIFO; ///< radioInterface FIFO of transmit bursts - VectorFIFO* mReceiveFIFO; ///< radioInterface FIFO of receive bursts + std::vector<VectorQueue> mTxPriorityQueues; ///< priority queue of transmit bursts received from GSM core + std::vector<VectorFIFO *> mReceiveFIFO; ///< radioInterface FIFO of receive bursts - Thread *mRxServiceLoopThread; ///< thread to pull bursts into receive FIFO - Thread *mTxServiceLoopThread; ///< thread to push bursts into transmit FIFO - Thread *mControlServiceLoopThread; ///< thread to process control messages from GSM core - Thread *mTransmitPriorityQueueServiceLoopThread;///< thread to process transmit bursts from GSM core + std::vector<Thread *> mRxServiceLoopThreads; ///< thread to pull bursts into receive FIFO + Thread *mRxLowerLoopThread; ///< thread to pull bursts into receive FIFO + Thread *mTxLowerLoopThread; ///< thread to push bursts into transmit FIFO + std::vector<Thread *> mControlServiceLoopThreads; ///< thread to process control messages from GSM core + std::vector<Thread *> mTxPriorityQueueServiceLoopThreads; ///< thread to process transmit bursts from GSM core GSM::Time mTransmitDeadlineClock; ///< deadline for pushing bursts into transmit FIFO GSM::Time mLastClockUpdateTime; ///< last time clock update was sent up to core @@ -118,29 +118,28 @@ private: noiseVector mNoises; ///< Vector holding running noise measurements /** modulate and add a burst to the transmit queue */ - void addRadioVector(BitVector &burst, - int RSSI, - GSM::Time &wTime); + void addRadioVector(size_t chan, BitVector &burst, + int RSSI, GSM::Time &wTime); /** Push modulated burst into transmit FIFO corresponding to a particular timestamp */ void pushRadioVector(GSM::Time &nowTime); - /** Pull and demodulate a burst from the receive FIFO */ - SoftVector *pullRadioVector(GSM::Time &wTime, - int &RSSI, - int &timingOffset); - + /** Pull and demodulate a burst from the receive FIFO */ + SoftVector *pullRadioVector(GSM::Time &wTime, int &RSSI, + int &timingOffset, size_t chan = 0); + /** Set modulus for specific timeslot */ - void setModulus(int timeslot); + void setModulus(size_t timeslot, size_t chan); /** return the expected burst type for the specified timestamp */ - CorrType expectedCorrType(GSM::Time currTime); + CorrType expectedCorrType(GSM::Time currTime, size_t chan); /** send messages over the clock socket */ void writeClockInterface(void); int mSPSTx; ///< number of samples per Tx symbol int mSPSRx; ///< number of samples per Rx symbol + size_t mChans; bool mOn; ///< flag to indicate that transceiver is powered on double mTxFreq; ///< the transmit frequency @@ -149,7 +148,7 @@ private: unsigned mTSC; ///< the midamble sequence code unsigned mMaxExpectedDelay; ///< maximum expected time-of-arrival offset in GSM symbols - TransceiverState mState; + std::vector<TransceiverState> mStates; public: @@ -162,10 +161,10 @@ public: */ Transceiver(int wBasePort, const char *TRXAddress, - int wSPS, + size_t wSPS, size_t chans, GSM::Time wTransmitLatency, RadioInterface *wRadioInterface); - + /** Destructor */ ~Transceiver(); @@ -174,10 +173,14 @@ public: bool init(); /** attach the radioInterface receive FIFO */ - void receiveFIFO(VectorFIFO *wFIFO) { mReceiveFIFO = wFIFO;} + bool receiveFIFO(VectorFIFO *wFIFO, size_t chan) + { + if (chan >= mReceiveFIFO.size()) + return false; - /** attach the radioInterface transmit FIFO */ - void transmitFIFO(VectorFIFO *wFIFO) { mTransmitFIFO = wFIFO;} + mReceiveFIFO[chan] = wFIFO; + return true; + } /** Codes for channel combinations */ typedef enum { @@ -200,29 +203,34 @@ public: } ChannelCombination; protected: + /** drive lower receive I/O and burst generation */ + void driveReceiveRadio(); - /** drive reception and demodulation of GSM bursts */ - void driveReceiveFIFO(); + /** drive demodulation of GSM bursts */ + void driveReceiveFIFO(size_t chan); /** drive transmission of GSM bursts */ - void driveTransmitFIFO(); + void driveTxFIFO(); /** drive handling of control messages from GSM core */ - void driveControl(); + void driveControl(size_t chan); /** drive modulation and sorting of GSM bursts from GSM core @return true if a burst was transferred successfully */ - bool driveTransmitPriorityQueue(); + bool driveTxPriorityQueue(size_t chan); - friend void *RxServiceLoopAdapter(Transceiver *); + friend void *RxUpperLoopAdapter(TransceiverChannel *); - friend void *TxServiceLoopAdapter(Transceiver *); + friend void *TxUpperLoopAdapter(TransceiverChannel *); - friend void *ControlServiceLoopAdapter(Transceiver *); + friend void *RxLowerLoopAdapter(Transceiver *); + + friend void *TxLowerLoopAdapter(Transceiver *); + + friend void *ControlServiceLoopAdapter(TransceiverChannel *); - friend void *TransmitPriorityQueueServiceLoopAdapter(Transceiver *); void reset(); @@ -231,13 +239,15 @@ protected: }; +void *RxUpperLoopAdapter(TransceiverChannel *); + /** Main drive threads */ -void *RxServiceLoopAdapter(Transceiver *); -void *TxServiceLoopAdapter(Transceiver *); +void *RxLowerLoopAdapter(Transceiver *); +void *TxLowerLoopAdapter(Transceiver *); /** control message handler thread loop */ -void *ControlServiceLoopAdapter(Transceiver *); +void *ControlServiceLoopAdapter(TransceiverChannel *); /** transmit queueing thread loop */ -void *TransmitPriorityQueueServiceLoopAdapter(Transceiver *); +void *TxUpperLoopAdapter(TransceiverChannel *); |