PicoScenes API Docs
 
Loading...
Searching...
No Matches
VirtualSDRFrontEnd.hxx
Go to the documentation of this file.
1//
2// Created by Zhiping Jiang on 5/4/21.
3//
4
5#ifndef PICOSCENES_PLATFORM_VIRTUALSDRFRONTEND_HXX
6#define PICOSCENES_PLATFORM_VIRTUALSDRFRONTEND_HXX
7
8#include <thread>
10
12public:
13 static std::shared_ptr<VirtualSDRFrontEnd> getInstance(const std::string& referredInterfaceName);
14
15 int32_t transmitSignals(const std::vector<const void*>& signals, int64_t bufferLength, double postfixDuration) override {
16 return 0;
17 }
18
19 ExtraInfo buildExtraInfo() override {
20 ExtraInfo extraInfo;
21 return extraInfo;
22 }
23
24 void printStatus() override {
25 LoggingService_Frontend_info_printf("[VirtualSDR(%s)]: cf=%.4fMHz, sf=%.4fMHz, mode=%s, txcm = %u, rxcm = %u, txpower = %0.f\n", getReferredInterfaceName(),
26 getRxCarrierFrequencies()[0] / 1e6, getSamplingRate() / 1e6, channelModel2String(channelFlags2ChannelMode(getChannelFlags())), getTxChainMask(), getRxChainMask(), getTxpower());
27 }
28
29 std::tuple<double, double, double> getChannelAndBandwidth() override {
30 return std::tuple<double, double, double>();
31 }
32
33 int setChannelAndBandwidth(double center, double bw, double control) override { return 0; }
34
35 int setChannelAndBandwidth(std::optional<double> control, std::optional<double> bw, std::optional<double> center) override {
36 return 0;
37 }
38
39 bool isHardwareSupportedPreset(const std::string& presetName) override {
40 // Support all presets
41 return true;
42 }
43
44 void applyPreset(const std::string& presetName, bool skipChangeRate) override {
45 // Convert preset name to uppercase for case-insensitive comparison
46 std::string upperPresetName = boost::to_upper_copy(presetName);
47
48 // First check if preset exists and is supported by hardware
49 if (!isHardwareSupportedPreset(upperPresetName)) {
50 throw std::invalid_argument(fmt::format("Preset '{}' is not supported by the current USRP device type.", presetName));
51 }
52
53 // Get the preset from the preset map
54 const auto& preset = FrontEndModePreset::getPresetMap().at(upperPresetName);
55 userSpecifiedTxParameters.applyPreset(upperPresetName);
56
57 if (preset->txCBW.has_value()) {
58 if (!skipChangeRate)
59 setTxSamplingRate(preset->txCBW.value() * 1e6);
61 }
62
63 if (preset->rxCBW.has_value()) {
64 if (!skipChangeRate)
65 setRxSamplingRate(preset->rxCBW.value() * 1e6);
67 setRxChannelBandwidthMode(static_cast<ChannelBandwidthEnum>(preset->rxCBW.value()));
68 }
69 }
70
71 void setTxCarrierFrequencies(std::vector<double> carrierFreqsV) override {
72 carrierFrequency = carrierFreqsV[0];
73 }
74
75 void setRxCarrierFrequencies(std::vector<double> carrierFreqsV) override {
76 carrierFrequency = carrierFreqsV[0];
77 }
78
79 std::vector<double> getTxCarrierFrequencies() override {
80 return {carrierFrequency};
81 }
82
83 std::vector<double> getRxCarrierFrequencies() override {
84 return {carrierFrequency};
85 }
86
87 double getTxSamplingRate() override {
88 return txSamplingRate;
89 }
90
91 double getRxSamplingRate() override {
92 return rxSamplingRate;
93 }
94
95 void setTxSamplingRate(double txRate) override {
96 txSamplingRate = txRate;
97 }
98
99 void setRxSamplingRate(double rxRate) override {
100 rxSamplingRate = rxRate;
101 }
102
103 double getControlChannelFrequency() override {
104 return controlFrequency;
105 }
106
107 void setControlChannelFrequency(const double controlFrequencyV) override {
108 controlFrequency = controlFrequencyV;
109 }
110
111 double getTxpower() override {
112 return txpower;
113 }
114
115 void setTxpower(const double txpowerV) override {
116 txpower = txpowerV;
117 }
118
119 double getRxGain() override {
120 return rxGain;
121 }
122
123 void setRxGain(const double rxGainV) override {
124 rxGain = rxGainV;
125 }
126
127 void setRxGain(const double rxGainV, uint8_t channel) override {
128 rxGain = rxGainV;
129 };
130
131 bool supportAGC() override {
132 return false;
133 }
134
135 void setAGC(bool enableAGC) override {
136 }
137
138 uint16_t getChannelFlags() override {
139 return channelFlags;
140 }
141
142 std::string getClockSource() override {
143 return clockSource;
144 }
145
146 void setClockSource(const std::string& clockSourceV) override {
147 clockSource = clockSourceV;
148 }
149
150 std::string getTimeSource() override {
151 return timeSource;
152 }
153
154 void setTimeSource(const std::string& timeSourceV) override {
155 timeSource = timeSourceV;
156 }
157
158 double getMasterClockRate() override {
159 return masterClockRate;
160 }
161
162 void setMasterClockRate(const double masterClockRateV) override {
163 masterClockRate = masterClockRateV;
164 }
165
166 double getSDRFrontEndTime() override {
167 return std::chrono::system_clock::now().time_since_epoch().count();
168 }
169
170 std::vector<std::string> getTxAntennas() override {
171 return txAntennas;
172 }
173
174 void setTxAntennas(const std::vector<std::string>& txAnts) override {
175 txAntennas = txAnts;
176 }
177
178 std::vector<std::string> getRxAntennas() override {
179 return rxAntennas;
180 }
181
182 void setRxAntennas(const std::vector<std::string>& rxAnts) override {
183 rxAntennas = rxAnts;
184 }
185
186 double getFilterBandwidth() override {
187 return filterBandwidth;
188 }
189
190 void setFilterBandwidth(const double bw) override {
191 filterBandwidth = bw;
192 }
193
194protected:
195 double carrierFrequency = 2412e6;
196 double txSamplingRate = 20e6;
197 double rxSamplingRate = 20e6;
198 double controlFrequency = 2412e6;
199 double txpower = 10;
200 double rxGain = 30;
201 uint16_t channelFlags{};
202 std::string clockSource;
203 std::string timeSource;
204 std::optional<double> rxCarrierFrequencyOffset = std::nullopt;
205 ChannelBandwidthEnum rxCBW = ChannelBandwidthEnum::CBW_20;
206 double masterClockRate = 100e6;
207 std::vector<std::string> txAntennas{"TX/RX"};
208 std::vector<std::string> rxAntennas{"RX2"};
209 double filterBandwidth = 40e6;
210
212};
213
214
215#endif //PICOSCENES_PLATFORM_VIRTUALSDRFRONTEND_HXX
#define LoggingService_Frontend_info_printf(...)
std::string referredInterfaceName
the user specified frontend name
PicoScenesFrameTxParameters userSpecifiedTxParameters
user-specified Tx parameters
const std::string & getReferredInterfaceName() const
Get the user-specified frontend name.
The shared abstract frontend for SDR devices only.
void setRxChannelBandwidthMode(ChannelBandwidthEnum rxCbw) override
Set the CBW value for Wi-Fi baseband decoder, invoked by "--rx-cbw" option.
void setTxResampleRatio(double txResampleRatioV) override
Set Tx signal resample ratio.
double getSamplingRate() override
Get the baseband sampling rate.
void setRxResampleRatio(double rxResampleRatioV) override
Set the Rx signal rasample ratio.
uint8_t getRxChainMask() override
Get Rx chain mask.
uint8_t getTxChainMask() override
Get the Tx chain mask.
void setTxSamplingRate(double txRate) override
uint16_t getChannelFlags() override
Get the old ChannelFlags descriptor.
std::tuple< double, double, double > getChannelAndBandwidth() override
Get the <contorlfreq-bandwidth-centerfreq> channel parameter.
void setRxGain(const double rxGainV) override
Set the total Rx gain. However, currently only QCA9300 and SDR frontend support this method.
static std::shared_ptr< VirtualSDRFrontEnd > getInstance(const std::string &referredInterfaceName)
ChannelBandwidthEnum rxCBW
double getTxpower() override
get the transmission power (Tx power)
void setTimeSource(const std::string &timeSourceV) override
Set the timing source. For USRP, it can be "external", "mimo", "internal".
double getRxSamplingRate() override
void setFilterBandwidth(const double bw) override
Set the hardware frontend filter bandwidth.
void setMasterClockRate(const double masterClockRateV) override
Set the USRP master clock rate (in Hz)
void setRxAntennas(const std::vector< std::string > &rxAnts) override
Specify antenna for each Rx chain.
void setRxGain(const double rxGainV, uint8_t channel) override
Set the Rx gain for the specified channel. However, currently only QCA9300 and SDR frontend support t...
std::string getClockSource() override
Get the clock source.
void setClockSource(const std::string &clockSourceV) override
Set the clock source. For USRP, it can be "external", "mimo", "internal".
bool isHardwareSupportedPreset(const std::string &presetName) override
Check if a preset configuration is supported by the hardware.
std::optional< double > rxCarrierFrequencyOffset
void setAGC(bool enableAGC) override
void setControlChannelFrequency(const double controlFrequencyV) override
Get the control channel frequency of <contorlfreq-bandwidth-centerfreq> channel parameter.
ExtraInfo buildExtraInfo() override
Build an ExtraInfo object describing the current frontend status.
std::vector< std::string > txAntennas
double getFilterBandwidth() override
get the hardware-frontend filter bandwidth
std::vector< double > getTxCarrierFrequencies() override
void setRxCarrierFrequencies(std::vector< double > carrierFreqsV) override
VirtualSDRFrontEnd(const std::string &referredInterfaceName)
int32_t transmitSignals(const std::vector< const void * > &signals, int64_t bufferLength, double postfixDuration) override
double getTxSamplingRate() override
double getMasterClockRate() override
Get the USRP master clock rate (in Hz)
void setTxCarrierFrequencies(std::vector< double > carrierFreqsV) override
void setTxAntennas(const std::vector< std::string > &txAnts) override
Specify antenna for each Tx chain.
std::vector< double > getRxCarrierFrequencies() override
double getControlChannelFrequency() override
Get the control channel frequency of <contorlfreq-bandwidth-centerfreq> channel parameter.
std::vector< std::string > getTxAntennas() override
std::vector< std::string > getRxAntennas() override
void setTxpower(const double txpowerV) override
Set the Tx power (in dB)
void setRxSamplingRate(double rxRate) override
int setChannelAndBandwidth(double center, double bw, double control) override
Set the <contorlfreq-bandwidth-centerfreq> channel parameter.
double getSDRFrontEndTime() override
Obtain the SDR hardware time.
int setChannelAndBandwidth(std::optional< double > control, std::optional< double > bw, std::optional< double > center) override
Set the <contorlfreq-bandwidth-centerfreq> channel parameter, but with optional.
void applyPreset(const std::string &presetName, bool skipChangeRate) override
Apply a preset configuration to the frontend hardware.
double getRxGain() override
Get the total Rx gain. However, currently only QCA9300 and SDR frontend support this method.
std::vector< std::string > rxAntennas
std::string getTimeSource() override
Get the timing source.
void printStatus() override
Print a status string to command line.