aboutsummaryrefslogtreecommitdiffstats
path: root/Transceiver52M/Transceiver.h
diff options
context:
space:
mode:
authordburgess <dburgess@19bc5d8c-e614-43d4-8b26-e1612bc8e597>2011-10-12 07:44:40 +0000
committerdburgess <dburgess@19bc5d8c-e614-43d4-8b26-e1612bc8e597>2011-10-12 07:44:40 +0000
commitb3a0ca42db0bd08c58b9370a1398528016e6953f (patch)
tree1e81558498b765f0faac4c8588c18fbc4bfc8dfb /Transceiver52M/Transceiver.h
parentec3d77d0eaa12c102893490766557dd4d4efd029 (diff)
Adding in the missing Transceiver52M directory
git-svn-id: http://wush.net/svn/range/software/public/openbts/trunk@2307 19bc5d8c-e614-43d4-8b26-e1612bc8e597
Diffstat (limited to 'Transceiver52M/Transceiver.h')
-rw-r--r--Transceiver52M/Transceiver.h207
1 files changed, 207 insertions, 0 deletions
diff --git a/Transceiver52M/Transceiver.h b/Transceiver52M/Transceiver.h
new file mode 100644
index 0000000..e724c03
--- /dev/null
+++ b/Transceiver52M/Transceiver.h
@@ -0,0 +1,207 @@
+/*
+* Copyright 2008 Free Software Foundation, Inc.
+*
+* This software is distributed under the terms of the GNU Public License.
+* See the COPYING file in the main directory for details.
+*
+* This use of this software may be subject to additional restrictions.
+* See the LEGAL file in the main directory for details.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+
+/*
+ Compilation switches
+ TRANSMIT_LOGGING write every burst on the given slot to a log
+*/
+
+#include "radioInterface.h"
+#include "Interthread.h"
+#include "GSMCommon.h"
+#include "Sockets.h"
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+/** Define this to be the slot number to be logged. */
+//#define TRANSMIT_LOGGING 1
+
+/** The Transceiver class, responsible for physical layer of basestation */
+class Transceiver {
+
+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 mControlSocket; ///< 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
+
+ Thread *mFIFOServiceLoopThread; ///< thread to push/pull bursts into transmit/receive FIFO
+ Thread *mControlServiceLoopThread; ///< thread to process control messages from GSM core
+ Thread *mTransmitPriorityQueueServiceLoopThread;///< 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
+
+ RadioInterface *mRadioInterface; ///< associated radioInterface object
+ double txFullScale; ///< full scale input to radio
+ double rxFullScale; ///< full scale output to radio
+
+ /** Codes for burst types of received bursts*/
+ typedef enum {
+ OFF, ///< timeslot is off
+ TSC, ///< timeslot should contain a normal burst
+ RACH, ///< timeslot should contain an access burst
+ IDLE ///< timeslot is an idle (or dummy) burst
+ } CorrType;
+
+
+ /** Codes for channel combinations */
+ typedef enum {
+ FILL, ///< Channel is transmitted, but unused
+ I, ///< TCH/FS
+ II, ///< TCH/HS, idle every other slot
+ III, ///< TCH/HS
+ IV, ///< FCCH+SCH+CCCH+BCCH, uplink RACH
+ V, ///< FCCH+SCH+CCCH+BCCH+SDCCH/4+SACCH/4, uplink RACH+SDCCH/4
+ VI, ///< CCCH+BCCH, uplink RACH
+ VII, ///< SDCCH/8 + SACCH/8
+ NONE, ///< Channel is inactive, default
+ LOOPBACK ///< similar go VII, used in loopback testing
+ } ChannelCombination;
+
+
+ /** unmodulate a modulated burst */
+#ifdef TRANSMIT_LOGGING
+ void unModulateVector(signalVector wVector);
+#endif
+
+ /** modulate and add a burst to the transmit queue */
+ void addRadioVector(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);
+
+ /** Set modulus for specific timeslot */
+ void setModulus(int timeslot);
+
+ /** return the expected burst type for the specified timestamp */
+ CorrType expectedCorrType(GSM::Time currTime);
+
+ /** send messages over the clock socket */
+ void writeClockInterface(void);
+
+ signalVector *gsmPulse; ///< the GSM shaping pulse for modulation
+
+ int mSamplesPerSymbol; ///< number of samples per GSM symbol
+
+ bool mOn; ///< flag to indicate that transceiver is powered on
+ ChannelCombination mChanType[8]; ///< channel types for all timeslots
+ double mTxFreq; ///< the transmit frequency
+ double mRxFreq; ///< the receive frequency
+ int mPower; ///< the transmit power in dB
+ unsigned mTSC; ///< the midamble sequence code
+ double mEnergyThreshold; ///< threshold to determine if received data is potentially a GSM burst
+ GSM::Time prevFalseDetectionTime; ///< last timestamp of a false energy detection
+ int fillerModulus[8]; ///< modulus values of all timeslots, in frames
+ signalVector *fillerTable[102][8]; ///< table of modulated filler waveforms for all timeslots
+ unsigned mMaxExpectedDelay; ///< maximum expected time-of-arrival offset in GSM symbols
+
+ GSM::Time channelEstimateTime[8]; ///< last timestamp of each timeslot's channel estimate
+ signalVector *channelResponse[8]; ///< most recent channel estimate of all timeslots
+ float SNRestimate[8]; ///< most recent SNR estimate of all timeslots
+ signalVector *DFEForward[8]; ///< most recent DFE feedforward filter of all timeslots
+ signalVector *DFEFeedback[8]; ///< most recent DFE feedback filter of all timeslots
+ float chanRespOffset[8]; ///< most recent timing offset, e.g. TOA, of all timeslots
+ complex chanRespAmplitude[8]; ///< most recent channel amplitude of all timeslots
+
+public:
+
+ /** Transceiver constructor
+ @param wBasePort base port number of UDP sockets
+ @param TRXAddress IP address of the TRX manager, as a string
+ @param wSamplesPerSymbol number of samples per GSM symbol
+ @param wTransmitLatency initial setting of transmit latency
+ @param radioInterface associated radioInterface object
+ */
+ Transceiver(int wBasePort,
+ const char *TRXAddress,
+ int wSamplesPerSymbol,
+ GSM::Time wTransmitLatency,
+ RadioInterface *wRadioInterface);
+
+ /** Destructor */
+ ~Transceiver();
+
+ /** start the Transceiver */
+ void start();
+
+ /** attach the radioInterface receive FIFO */
+ void receiveFIFO(VectorFIFO *wFIFO) { mReceiveFIFO = wFIFO;}
+
+ /** attach the radioInterface transmit FIFO */
+ void transmitFIFO(VectorFIFO *wFIFO) { mTransmitFIFO = wFIFO;}
+
+
+protected:
+
+ /** drive reception and demodulation of GSM bursts */
+ void driveReceiveFIFO();
+
+ /** drive transmission of GSM bursts */
+ void driveTransmitFIFO();
+
+ /** drive handling of control messages from GSM core */
+ void driveControl();
+
+ /**
+ drive modulation and sorting of GSM bursts from GSM core
+ @return true if a burst was transferred successfully
+ */
+ bool driveTransmitPriorityQueue();
+
+ friend void *FIFOServiceLoopAdapter(Transceiver *);
+
+ friend void *ControlServiceLoopAdapter(Transceiver *);
+
+ friend void *TransmitPriorityQueueServiceLoopAdapter(Transceiver *);
+
+ void reset();
+};
+
+/** FIFO thread loop */
+void *FIFOServiceLoopAdapter(Transceiver *);
+
+/** control message handler thread loop */
+void *ControlServiceLoopAdapter(Transceiver *);
+
+/** transmit queueing thread loop */
+void *TransmitPriorityQueueServiceLoopAdapter(Transceiver *);
+