SDDC_Driver
Loading...
Searching...
No Matches
SoapySDDC.hpp
1/*
2 * This file is part of SDDC_Driver.
3 *
4 * =====================
5 * MIT License
6 * =====================
7 *
8 * Copyright (C) 2024 - Howard Su
9 * Copyright (C) 2024 - Ruslan Migirov
10 * Copyright (C) 2025 - SteamedFish
11 * Copyright (C) 2025 - RenardSpark
12 *
13 * Permission is hereby granted, free of charge, to any person obtaining a copy
14 * of this software and associated documentation files (the "Software"), to deal
15 * in the Software without restriction, including without limitation the rights
16 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17 * copies of the Software, and to permit persons to whom the Software is
18 * furnished to do so, subject to the following conditions:
19
20 * The above copyright notice and this permission notice shall be included in all
21 * copies or substantial portions of the Software.
22
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 * SOFTWARE.
30 *
31 * SPDX-License-Identifier: MIT
32 */
33
34#pragma once
35#include "../Core/config.h"
36#include <SoapySDR/Device.hpp>
37#include <SoapySDR/Types.h>
38#include <atomic>
39#include <cstddef>
40#include <sys/types.h>
41#include "FX3Class.h"
42#include "RadioHandler.h"
43
44class SoapySDDC : public SoapySDR::Device
45{
46public:
47 explicit SoapySDDC(uint8_t dev_index);
48 ~SoapySDDC(void);
49
50 // ----- Metadata ----- //
51 std::string getDriverKey(void) const override;
52 std::string getHardwareKey(void) const override;
53 SoapySDR::Kwargs getHardwareInfo(void) const override;
54
55 size_t getNumChannels(const int) const override;
56 SoapySDR::Kwargs getChannelInfo(const int direction, const size_t channel) const override;
57 bool getFullDuplex(const int direction, const size_t channel) const override;
58 // ----- //
59
60 // ----- Stream ----- //
61 // --- Metadata --- //
62 std::vector<std::string> getStreamFormats(const int direction, const size_t channel) const override;
63 std::string getNativeStreamFormat(const int direction, const size_t channel, double &fullScale) const override;
64 SoapySDR::ArgInfoList getStreamArgsInfo(const int direction, const size_t channel) const override;
65
66 // ---
67 SoapySDR::Stream *setupStream(const int direction, const std::string &format, const std::vector<size_t> &channels = std::vector<size_t>(), const SoapySDR::Kwargs &args = SoapySDR::Kwargs()) override;
68
69 void closeStream(SoapySDR::Stream *stream) override;
70
71 size_t getStreamMTU(SoapySDR::Stream *stream) const override;
72
73 int activateStream(SoapySDR::Stream *stream, const int flags = 0, const long long timeNs = 0, const size_t numElems = 0) override;
74
75 int deactivateStream(SoapySDR::Stream *stream, const int flags = 0, const long long timeNs = 0) override;
76
77 int readStream(SoapySDR::Stream *stream, void *const *buffs, const size_t numElems, int &flags, long long &timeNs, const long timeoutUs = 100000) override;
78
79 // size_t getNumDirectAccessBuffers(SoapySDR::Stream *stream);
80
81 // int getDirectAccessBufferAddrs(SoapySDR::Stream *stream, const size_t handle, void **buffs);
82
83 int acquireReadBuffer(SoapySDR::Stream *stream, size_t &handle, const void **buffs, int &flags, long long &timeNs, const long timeoutUs = 100000) override;
84
85 void releaseReadBuffer(SoapySDR::Stream *stream, const size_t handle) override;
86 // ----- //
87
88 // ----- Antennas ----- //
89 std::vector<std::string> listAntennas(const int direction, const size_t channel) const override;
90 void setAntenna(const int direction, const size_t channel, const std::string &name) override;
91 std::string getAntenna(const int direction, const size_t channel) const override;
92 // ----- //
93
94 // ----- Additional features ----- //
95 bool hasDCOffset(const int direction, const size_t channel) const override;
96 bool hasDCOffsetMode(const int direction, const size_t channel) const override;
97
98 bool hasIQBalance(const int, const size_t) const override;
99 bool hasIQBalanceMode(const int, const size_t) const override;
100
101 bool hasFrequencyCorrection(const int direction, const size_t channel) const override;
102 // ----- //
103
104 // ----- Gains --- //
105 std::vector<std::string> listGains(const int direction, const size_t channel) const override;
106 bool hasGainMode(const int direction, const size_t channel) const override;
107 void setGain(const int direction, const size_t channel, const std::string &name, const double value) override;
108 double getGain(const int direction, const size_t channel, const std::string &name) const override;
109 SoapySDR::Range getGainRange(const int direction, const size_t channel, const std::string &name) const override;
110 // ----- //
111
112 // ----- Frequency ----- //
113 // --- Metadata --- //
114 std::vector<std::string> listFrequencies(const int direction, const size_t channel) const override;
115 SoapySDR::RangeList getFrequencyRange(const int direction, const size_t channel) const override;
116 SoapySDR::RangeList getFrequencyRange(const int direction, const size_t channel, const std::string &name) const override;
117 SoapySDR::ArgInfoList getFrequencyArgsInfo(const int direction, const size_t channel) const override;
118 // --- //
119
120 void setFrequency(const int direction, const size_t channel, const double frequency, const SoapySDR::Kwargs &args = SoapySDR::Kwargs()) override;
121 void setFrequency(const int direction, const size_t channel, const std::string &name, const double frequency, const SoapySDR::Kwargs &args = SoapySDR::Kwargs()) override;
122 double getFrequency(const int direction, const size_t channel) const override;
123 double getFrequency(const int direction, const size_t channel, const std::string &name) const override;
124 // ----- //
125
126 // ----- Sample rate ----- //
127 SoapySDR::RangeList getSampleRateRange(const int direction, const size_t channel) const override;
128 void setSampleRate(const int direction, const size_t channel, const double rate) override;
129 double getSampleRate(const int direction, const size_t channel) const override;
130 // ----- //
131
132 // ----- Settings ----- //
133 SoapySDR::ArgInfoList getSettingInfo() const override;
134 void writeSetting(const std::string &key, const std::string &value) override;
135
136 // ----- Sensors ----- //
137 std::vector<std::string> listSensors() const override;
138 SoapySDR::ArgInfo getSensorInfo(const std::string &key) const override;
139 std::string readSensor(const std::string &key) const override;
140 // ----- //
141
142
143
144
145 // void setMasterClockRate(const double rate);
146
147 // double getMasterClockRate(void) const;
148
149 // std::vector<std::string> listTimeSources(void) const;
150
151 // std::string getTimeSource(void) const;
152
153 // bool hasHardwareTime(const std::string &what = "") const;
154
155 // long long getHardwareTime(const std::string &what = "") const;
156
157 // void setHardwareTime(const long long timeNs, const std::string &what = "");
158
159private:
160 int deviceId;
161 int bytesPerSample;
162
163 uint64_t centerFrequency = 0;
164 size_t numBuffers, bufferLength, asyncBuffs;
165 std::atomic<long long> ticks;
166
167 fx3class *Fx3;
168 RadioHandler *radio_handler;
169
170public:
171 void Callback(const sddc_complex_t *data, uint32_t len);
172
173 std::mutex _buf_mutex;
174 std::condition_variable _buf_cond;
175
176 std::vector<std::vector<uint8_t>> samples_buffer;
177 size_t samples_block_write;
178 size_t samples_block_read;
179 std::atomic<size_t> _buf_count;
180 char *_currentBuff;
181 std::atomic<bool> _overflowEvent;
182 size_t bufferedElems;
183 size_t _currentHandle;
184 bool resetBuffer;
185
186 int samplerateidx;
187
188 double masterClockRate;
189};
190
191
192
193
194
195
196 /*
197
198
199virtual int writeStream (Stream *stream, const void *const *buffs, const size_t numElems, int &flags, const long long timeNs=0, const long timeoutUs=100000)
200
201virtual int readStreamStatus (Stream *stream, size_t &chanMask, int &flags, long long &timeNs, const long timeoutUs=100000)
202
203virtual size_t getNumDirectAccessBuffers (Stream *stream)
204
205virtual int getDirectAccessBufferAddrs (Stream *stream, const size_t handle, void **buffs)
206
207virtual int acquireReadBuffer (Stream *stream, size_t &handle, const void **buffs, int &flags, long long &timeNs, const long timeoutUs=100000)
208
209virtual void releaseReadBuffer (Stream *stream, const size_t handle)
210
211virtual int acquireWriteBuffer (Stream *stream, size_t &handle, void **buffs, const long timeoutUs=100000)
212
213virtual void releaseWriteBuffer (Stream *stream, const size_t handle, const size_t numElems, int &flags, const long long timeNs=0)
214
215
216
217
218
219
220
221virtual void setBandwidth (const int direction, const size_t channel, const double bw)
222
223virtual double getBandwidth (const int direction, const size_t channel) const
224
225virtual std::vector< double > listBandwidths (const int direction, const size_t channel) const
226
227virtual RangeList getBandwidthRange (const int direction, const size_t channel) const
228
229virtual void setMasterClockRate (const double rate)
230
231virtual double getMasterClockRate (void) const
232
233virtual RangeList getMasterClockRates (void) const
234
235virtual void setReferenceClockRate (const double rate)
236
237virtual double getReferenceClockRate (void) const
238
239virtual RangeList getReferenceClockRates (void) const
240
241virtual std::vector< std::string > listClockSources (void) const
242
243virtual void setClockSource (const std::string &source)
244
245virtual std::string getClockSource (void) const
246
247virtual std::vector< std::string > listTimeSources (void) const
248
249virtual void setTimeSource (const std::string &source)
250
251virtual std::string getTimeSource (void) const
252
253virtual bool hasHardwareTime (const std::string &what="") const
254
255virtual long long getHardwareTime (const std::string &what="") const
256
257virtual void setHardwareTime (const long long timeNs, const std::string &what="")
258
259virtual void setCommandTime (const long long timeNs, const std::string &what="")
260
261virtual std::vector< std::string > listSensors (void) const
262
263virtual ArgInfo getSensorInfo (const std::string &key) const
264
265virtual std::string readSensor (const std::string &key) const
266
267template<typename Type >
268Type readSensor (const std::string &key) const
269
270virtual std::vector< std::string > listSensors (const int direction, const size_t channel) const
271
272virtual ArgInfo getSensorInfo (const int direction, const size_t channel, const std::string &key) const
273
274virtual std::string readSensor (const int direction, const size_t channel, const std::string &key) const
275
276template<typename Type >
277Type readSensor (const int direction, const size_t channel, const std::string &key) const
278
279virtual std::vector< std::string > listRegisterInterfaces (void) const
280
281virtual void writeRegister (const std::string &name, const unsigned addr, const unsigned value)
282
283virtual unsigned readRegister (const std::string &name, const unsigned addr) const
284
285virtual void writeRegister (const unsigned addr, const unsigned value)
286
287virtual unsigned readRegister (const unsigned addr) const
288
289virtual void writeRegisters (const std::string &name, const unsigned addr, const std::vector< unsigned > &value)
290
291virtual std::vector< unsigned > readRegisters (const std::string &name, const unsigned addr, const size_t length) const
292
293virtual ArgInfoList getSettingInfo (void) const
294
295virtual void writeSetting (const std::string &key, const std::string &value)
296
297template<typename Type >
298void writeSetting (const std::string &key, const Type &value)
299
300virtual std::string readSetting (const std::string &key) const
301
302template<typename Type >
303Type readSetting (const std::string &key)
304
305virtual ArgInfoList getSettingInfo (const int direction, const size_t channel) const
306
307virtual void writeSetting (const int direction, const size_t channel, const std::string &key, const std::string &value)
308
309template<typename Type >
310void writeSetting (const int direction, const size_t channel, const std::string &key, const Type &value)
311
312virtual std::string readSetting (const int direction, const size_t channel, const std::string &key) const
313
314template<typename Type >
315Type readSetting (const int direction, const size_t channel, const std::string &key)
316
317virtual std::vector< std::string > listGPIOBanks (void) const
318
319virtual void writeGPIO (const std::string &bank, const unsigned value)
320
321virtual void writeGPIO (const std::string &bank, const unsigned value, const unsigned mask)
322
323virtual unsigned readGPIO (const std::string &bank) const
324
325virtual void writeGPIODir (const std::string &bank, const unsigned dir)
326
327virtual void writeGPIODir (const std::string &bank, const unsigned dir, const unsigned mask)
328
329virtual unsigned readGPIODir (const std::string &bank) const
330
331virtual void writeI2C (const int addr, const std::string &data)
332
333virtual std::string readI2C (const int addr, const size_t numBytes)
334
335virtual unsigned transactSPI (const int addr, const unsigned data, const size_t numBits)
336
337virtual std::vector< std::string > listUARTs (void) const
338
339virtual void writeUART (const std::string &which, const std::string &data)
340
341virtual std::string readUART (const std::string &which, const long timeoutUs=100000) const
342
343virtual void * getNativeDeviceHandle (void) const
344*/
Definition RadioHandler.h:54
Definition SoapySDDC.hpp:45
Definition FX3Class.h:54