blob: 84de1e5968effa2d448042119f32cab20616d949 [file] [log] [blame]
dburgessb3a0ca42011-10-12 07:44:40 +00001/*
2* Copyright 2008 Free Software Foundation, Inc.
3*
4* This software is distributed under multiple licenses; see the COPYING file in the main directory for licensing information for this specific distribuion.
5*
6* This use of this software may be subject to additional restrictions.
7* See the LEGAL file in the main directory for details.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13*/
14
15
16
17#include "sigProcLib.h"
18#include "GSMCommon.h"
19#include "LinkedLists.h"
20#include "radioDevice.h"
kurtis.heimerl8aea56e2011-11-26 03:18:30 +000021#include "radioVector.h"
22#include "radioClock.h"
dburgessb3a0ca42011-10-12 07:44:40 +000023
Alexander Chemerisd734e2d2013-06-16 14:30:58 +040024static const unsigned gSlotLen = 148; ///< number of symbols per slot, not counting guard periods
25
dburgessb3a0ca42011-10-12 07:44:40 +000026/** class to interface the transceiver with the USRP */
27class RadioInterface {
28
Thomas Tsoucb69f082013-04-08 14:18:26 -040029protected:
dburgessb3a0ca42011-10-12 07:44:40 +000030
31 Thread mAlignRadioServiceLoopThread; ///< thread that synchronizes transmit and receive sections
32
33 VectorFIFO mReceiveFIFO; ///< FIFO that holds receive bursts
34
35 RadioDevice *mRadio; ///< the USRP object
Thomas Tsouc1f7c422013-10-11 13:49:55 -040036
37 int mSPSTx;
38 int mSPSRx;
Thomas Tsou03e6ecf2013-08-20 20:54:54 -040039 signalVector *sendBuffer;
40 signalVector *recvBuffer;
dburgessb3a0ca42011-10-12 07:44:40 +000041 unsigned sendCursor;
Thomas Tsou03e6ecf2013-08-20 20:54:54 -040042 unsigned recvCursor;
dburgessb3a0ca42011-10-12 07:44:40 +000043
Thomas Tsou03e6ecf2013-08-20 20:54:54 -040044 short *convertRecvBuffer;
45 short *convertSendBuffer;
46
dburgessb3a0ca42011-10-12 07:44:40 +000047 bool underrun; ///< indicates writes to USRP are too slow
48 bool overrun; ///< indicates reads from USRP are too slow
49 TIMESTAMP writeTimestamp; ///< sample timestamp of next packet written to USRP
50 TIMESTAMP readTimestamp; ///< sample timestamp of next packet read from USRP
51
52 RadioClock mClock; ///< the basestation clock!
53
dburgessb3a0ca42011-10-12 07:44:40 +000054 int receiveOffset; ///< offset b/w transmit and receive GSM timestamps, in timeslots
dburgessb3a0ca42011-10-12 07:44:40 +000055
56 bool mOn; ///< indicates radio is on
57
58 double powerScaling;
59
60 bool loadTest;
61 int mNumARFCNs;
62 signalVector *finalVec, *finalVec9;
63
Thomas Tsoucb69f082013-04-08 14:18:26 -040064private:
65
dburgessb3a0ca42011-10-12 07:44:40 +000066 /** format samples to USRP */
kurtis.heimerl9b557832011-11-26 03:18:34 +000067 int radioifyVector(signalVector &wVector,
68 float *floatVector,
kurtis.heimerl9b557832011-11-26 03:18:34 +000069 bool zero);
dburgessb3a0ca42011-10-12 07:44:40 +000070
71 /** format samples from USRP */
kurtis.heimerl9b557832011-11-26 03:18:34 +000072 int unRadioifyVector(float *floatVector, signalVector &wVector);
dburgessb3a0ca42011-10-12 07:44:40 +000073
74 /** push GSM bursts into the transmit buffer */
Thomas Tsoucb69f082013-04-08 14:18:26 -040075 virtual void pushBuffer(void);
dburgessb3a0ca42011-10-12 07:44:40 +000076
77 /** pull GSM bursts from the receive buffer */
Thomas Tsoucb69f082013-04-08 14:18:26 -040078 virtual void pullBuffer(void);
dburgessb3a0ca42011-10-12 07:44:40 +000079
80public:
81
82 /** start the interface */
83 void start();
84
Thomas Tsou03e6ecf2013-08-20 20:54:54 -040085 /** intialization */
Thomas Tsoufe269fe2013-10-14 23:56:51 -040086 virtual bool init(int type);
Thomas Tsou03e6ecf2013-08-20 20:54:54 -040087 virtual void close();
88
dburgessb3a0ca42011-10-12 07:44:40 +000089 /** constructor */
90 RadioInterface(RadioDevice* wRadio = NULL,
91 int receiveOffset = 3,
Thomas Tsoufe269fe2013-10-14 23:56:51 -040092 int wSPS = 4,
dburgessb3a0ca42011-10-12 07:44:40 +000093 GSM::Time wStartTime = GSM::Time(0));
94
95 /** destructor */
Thomas Tsou03e6ecf2013-08-20 20:54:54 -040096 virtual ~RadioInterface();
dburgessb3a0ca42011-10-12 07:44:40 +000097
dburgessb3a0ca42011-10-12 07:44:40 +000098 /** check for underrun, resets underrun value */
kurtis.heimerle724d6d2011-11-26 03:18:46 +000099 bool isUnderrun();
dburgessb3a0ca42011-10-12 07:44:40 +0000100
101 /** attach an existing USRP to this interface */
kurtis.heimerle724d6d2011-11-26 03:18:46 +0000102 void attach(RadioDevice *wRadio, int wRadioOversampling);
dburgessb3a0ca42011-10-12 07:44:40 +0000103
104 /** return the receive FIFO */
105 VectorFIFO* receiveFIFO() { return &mReceiveFIFO;}
106
107 /** return the basestation clock */
108 RadioClock* getClock(void) { return &mClock;};
109
dburgessb3a0ca42011-10-12 07:44:40 +0000110 /** set transmit frequency */
111 bool tuneTx(double freq);
112
113 /** set receive frequency */
114 bool tuneRx(double freq);
115
kurtis.heimerle724d6d2011-11-26 03:18:46 +0000116 /** set receive gain */
117 double setRxGain(double dB);
118
119 /** get receive gain */
120 double getRxGain(void);
121
dburgessb3a0ca42011-10-12 07:44:40 +0000122 /** drive transmission of GSM bursts */
123 void driveTransmitRadio(signalVector &radioBurst, bool zeroBurst);
124
125 /** drive reception of GSM bursts */
126 void driveReceiveRadio();
127
128 void setPowerAttenuation(double atten);
129
130 /** returns the full-scale transmit amplitude **/
131 double fullScaleInputValue();
132
133 /** returns the full-scale receive amplitude **/
134 double fullScaleOutputValue();
135
kurtis.heimerl6b495a52011-11-26 03:17:21 +0000136 /** set thread priority on current thread */
137 void setPriority() { mRadio->setPriority(); }
dburgessb3a0ca42011-10-12 07:44:40 +0000138
Thomas Tsou02d88d12013-04-05 15:36:30 -0400139 /** get transport window type of attached device */
140 enum RadioDevice::TxWindowType getWindowType() { return mRadio->getWindowType(); }
kurtis.heimerle380af32011-11-26 03:18:55 +0000141
Thomas Tsouf2293b82013-04-08 13:35:36 -0400142#if USRP1
dburgessb3a0ca42011-10-12 07:44:40 +0000143protected:
144
145 /** drive synchronization of Tx/Rx of USRP */
146 void alignRadio();
147
dburgessb3a0ca42011-10-12 07:44:40 +0000148 friend void *AlignRadioServiceLoopAdapter(RadioInterface*);
Thomas Tsouf2293b82013-04-08 13:35:36 -0400149#endif
dburgessb3a0ca42011-10-12 07:44:40 +0000150};
151
Thomas Tsouf2293b82013-04-08 13:35:36 -0400152#if USRP1
dburgessb3a0ca42011-10-12 07:44:40 +0000153/** synchronization thread loop */
154void *AlignRadioServiceLoopAdapter(RadioInterface*);
Thomas Tsouf2293b82013-04-08 13:35:36 -0400155#endif
Thomas Tsoucb69f082013-04-08 14:18:26 -0400156
157class RadioInterfaceResamp : public RadioInterface {
158
159private:
Thomas Tsou03e6ecf2013-08-20 20:54:54 -0400160 signalVector *innerSendBuffer;
161 signalVector *outerSendBuffer;
162 signalVector *innerRecvBuffer;
163 signalVector *outerRecvBuffer;
Thomas Tsoucb69f082013-04-08 14:18:26 -0400164
165 void pushBuffer();
166 void pullBuffer();
167
168public:
169
170 RadioInterfaceResamp(RadioDevice* wRadio = NULL,
171 int receiveOffset = 3,
Thomas Tsoufe269fe2013-10-14 23:56:51 -0400172 int wSPS = 4,
Thomas Tsoucb69f082013-04-08 14:18:26 -0400173 GSM::Time wStartTime = GSM::Time(0));
Thomas Tsou03e6ecf2013-08-20 20:54:54 -0400174
175 ~RadioInterfaceResamp();
176
Thomas Tsoufe269fe2013-10-14 23:56:51 -0400177 bool init(int type);
Thomas Tsou03e6ecf2013-08-20 20:54:54 -0400178 void close();
Thomas Tsoucb69f082013-04-08 14:18:26 -0400179};