blob: 711d6785be56cc8114aee156f5ae68643f59fcf8 [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#ifndef __RADIO_DEVICE_H__
16#define __RADIO_DEVICE_H__
17
ttsouf60dafa2012-10-22 00:07:14 +000018#include <string>
Thomas Tsou204a9f12013-10-29 18:34:16 -040019#include <vector>
dburgessb3a0ca42011-10-12 07:44:40 +000020
21#ifdef HAVE_CONFIG_H
22#include "config.h"
23#endif
24
Alexander Chemerisf931cf22016-06-18 10:42:33 +030025#define GSMRATE (1625e3/6)
Tom Tsou76764272016-06-24 14:25:39 -070026#define MCBTS_SPACING 800000.0
Thomas Tsoucb69f082013-04-08 14:18:26 -040027
dburgessb3a0ca42011-10-12 07:44:40 +000028/** a 64-bit virtual timestamp for radio data */
29typedef unsigned long long TIMESTAMP;
30
31/** A class to handle a USRP rev 4, with a two RFX900 daughterboards */
32class RadioDevice {
33
34 public:
kurtis.heimerle380af32011-11-26 03:18:55 +000035 /* Available transport bus types */
Thomas Tsou02d88d12013-04-05 15:36:30 -040036 enum TxWindowType { TX_WINDOW_USRP1, TX_WINDOW_FIXED };
kurtis.heimerle380af32011-11-26 03:18:55 +000037
Thomas Tsoucb69f082013-04-08 14:18:26 -040038 /* Radio interface types */
Tom Tsou05c6feb2016-06-22 16:09:44 -070039 enum InterfaceType {
40 NORMAL,
41 RESAMP_64M,
42 RESAMP_100M,
Tom Tsou76764272016-06-24 14:25:39 -070043 MULTI_ARFCN,
Tom Tsou05c6feb2016-06-22 16:09:44 -070044 DIVERSITY,
45 };
Thomas Tsoucb69f082013-04-08 14:18:26 -040046
Tom Tsou2f3e60b2016-07-17 19:29:08 -070047 enum ReferenceType {
48 REF_INTERNAL,
49 REF_EXTERNAL,
50 REF_GPS,
51 };
52
Tom Tsou05c6feb2016-06-22 16:09:44 -070053 static RadioDevice *make(size_t tx_sps, size_t rx_sps, InterfaceType type,
54 size_t chans = 1, double offset = 0.0);
kurtis.heimerl965e7572011-11-26 03:16:54 +000055
kurtis.heimerldb2aae52011-11-26 03:17:13 +000056 /** Initialize the USRP */
Tom Tsou2f3e60b2016-07-17 19:29:08 -070057 virtual int open(const std::string &args, int ref, bool swap_channels)=0;
dburgessb3a0ca42011-10-12 07:44:40 +000058
Thomas Tsou8c336792013-11-15 16:26:05 -050059 virtual ~RadioDevice() { }
60
dburgessb3a0ca42011-10-12 07:44:40 +000061 /** Start the USRP */
62 virtual bool start()=0;
63
64 /** Stop the USRP */
65 virtual bool stop()=0;
66
Thomas Tsou02d88d12013-04-05 15:36:30 -040067 /** Get the Tx window type */
68 virtual enum TxWindowType getWindowType()=0;
kurtis.heimerle380af32011-11-26 03:18:55 +000069
kurtis.heimerldb2aae52011-11-26 03:17:13 +000070 /** Enable thread priority */
Thomas Tsou7553aa92013-11-08 12:50:03 -050071 virtual void setPriority(float prio = 0.5) = 0;
kurtis.heimerldb2aae52011-11-26 03:17:13 +000072
dburgessb3a0ca42011-10-12 07:44:40 +000073 /**
74 Read samples from the radio.
75 @param buf preallocated buf to contain read result
76 @param len number of samples desired
77 @param overrun Set if read buffer has been overrun, e.g. data not being read fast enough
78 @param timestamp The timestamp of the first samples to be read
79 @param underrun Set if radio does not have data to transmit, e.g. data not being sent fast enough
80 @param RSSI The received signal strength of the read result
81 @return The number of samples actually read
82 */
Thomas Tsou204a9f12013-10-29 18:34:16 -040083 virtual int readSamples(std::vector<short *> &bufs, int len, bool *overrun,
84 TIMESTAMP timestamp = 0xffffffff, bool *underrun = 0,
85 unsigned *RSSI = 0) = 0;
dburgessb3a0ca42011-10-12 07:44:40 +000086 /**
87 Write samples to the radio.
88 @param buf Contains the data to be written.
89 @param len number of samples to write.
90 @param underrun Set if radio does not have data to transmit, e.g. data not being sent fast enough
91 @param timestamp The timestamp of the first sample of the data buffer.
92 @param isControl Set if data is a control packet, e.g. a ping command
93 @return The number of samples actually written
94 */
Thomas Tsou204a9f12013-10-29 18:34:16 -040095 virtual int writeSamples(std::vector<short *> &bufs, int len, bool *underrun,
96 TIMESTAMP timestamp, bool isControl = false) = 0;
97
dburgessb3a0ca42011-10-12 07:44:40 +000098 /** Update the alignment between the read and write timestamps */
99 virtual bool updateAlignment(TIMESTAMP timestamp)=0;
Thomas Tsou204a9f12013-10-29 18:34:16 -0400100
dburgessb3a0ca42011-10-12 07:44:40 +0000101 /** Set the transmitter frequency */
Thomas Tsou204a9f12013-10-29 18:34:16 -0400102 virtual bool setTxFreq(double wFreq, size_t chan = 0) = 0;
dburgessb3a0ca42011-10-12 07:44:40 +0000103
104 /** Set the receiver frequency */
Thomas Tsou204a9f12013-10-29 18:34:16 -0400105 virtual bool setRxFreq(double wFreq, size_t chan = 0) = 0;
dburgessb3a0ca42011-10-12 07:44:40 +0000106
107 /** Returns the starting write Timestamp*/
108 virtual TIMESTAMP initialWriteTimestamp(void)=0;
109
110 /** Returns the starting read Timestamp*/
111 virtual TIMESTAMP initialReadTimestamp(void)=0;
112
113 /** returns the full-scale transmit amplitude **/
114 virtual double fullScaleInputValue()=0;
115
116 /** returns the full-scale receive amplitude **/
117 virtual double fullScaleOutputValue()=0;
118
119 /** sets the receive chan gain, returns the gain setting **/
Thomas Tsou204a9f12013-10-29 18:34:16 -0400120 virtual double setRxGain(double dB, size_t chan = 0) = 0;
dburgessb3a0ca42011-10-12 07:44:40 +0000121
122 /** gets the current receive gain **/
Thomas Tsou204a9f12013-10-29 18:34:16 -0400123 virtual double getRxGain(size_t chan = 0) = 0;
dburgessb3a0ca42011-10-12 07:44:40 +0000124
125 /** return maximum Rx Gain **/
126 virtual double maxRxGain(void) = 0;
127
128 /** return minimum Rx Gain **/
129 virtual double minRxGain(void) = 0;
130
131 /** sets the transmit chan gain, returns the gain setting **/
Thomas Tsou204a9f12013-10-29 18:34:16 -0400132 virtual double setTxGain(double dB, size_t chan = 0) = 0;
dburgessb3a0ca42011-10-12 07:44:40 +0000133
134 /** return maximum Tx Gain **/
135 virtual double maxTxGain(void) = 0;
136
137 /** return minimum Tx Gain **/
138 virtual double minTxGain(void) = 0;
139
140 /** Return internal status values */
Thomas Tsou204a9f12013-10-29 18:34:16 -0400141 virtual double getTxFreq(size_t chan = 0) = 0;
142 virtual double getRxFreq(size_t chan = 0) = 0;
dburgessb3a0ca42011-10-12 07:44:40 +0000143 virtual double getSampleRate()=0;
144 virtual double numberRead()=0;
145 virtual double numberWritten()=0;
146
147};
148
149#endif