kopia lustrzana https://github.com/pa3gsb/Radioberry-2.x
164 wiersze
4.7 KiB
C++
164 wiersze
4.7 KiB
C++
#include <SoapySDR/Device.hpp>
|
|
#include <SoapySDR/Logger.hpp>
|
|
#include <SoapySDR/Formats.hpp>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <sys/ioctl.h>
|
|
#include <memory>
|
|
#include <string.h>
|
|
#include <mutex>
|
|
#include <cstring>
|
|
#include "radioberry_ioctl.h"
|
|
#include "i2c.h"
|
|
|
|
#define TX_MAX 4800
|
|
#define TX_MAX_BUFFER (TX_MAX * 8)
|
|
|
|
typedef enum radioberrysdrStreamFormat {
|
|
RADIOBERRY_SDR_CF32,
|
|
RADIOBERRY_SDR_CS16
|
|
} radioberrysdrStreamFormat;
|
|
|
|
class sdr_stream
|
|
{
|
|
public:
|
|
sdr_stream(int dir)
|
|
{
|
|
direction = dir;
|
|
}
|
|
int get_direction() { return direction; }
|
|
void set_stream_format(radioberrysdrStreamFormat sf) { streamFormat = sf; };
|
|
radioberrysdrStreamFormat get_stream_format() { return streamFormat; };
|
|
|
|
private:
|
|
int direction;
|
|
radioberrysdrStreamFormat streamFormat;
|
|
};
|
|
|
|
|
|
|
|
class SoapyRadioberry : public SoapySDR::Device
|
|
{
|
|
|
|
public:
|
|
SoapyRadioberry(const SoapySDR::Kwargs &args);
|
|
~SoapyRadioberry();
|
|
|
|
/*******************************************************************
|
|
* Identification API
|
|
******************************************************************/
|
|
|
|
std::string getDriverKey(void) const;
|
|
|
|
std::string getHardwareKey(void) const;
|
|
|
|
SoapySDR::Kwargs getHardwareInfo(void) const;
|
|
|
|
/*******************************************************************
|
|
* Channels API
|
|
******************************************************************/
|
|
|
|
size_t getNumChannels(const int direction) const;
|
|
|
|
bool getFullDuplex(const int direction, const size_t channel) const;
|
|
|
|
/*******************************************************************
|
|
* Stream API
|
|
******************************************************************/
|
|
SoapySDR::RangeList getSampleRateRange(const int direction, const size_t channel) const;
|
|
|
|
std::vector<std::string> getStreamFormats(const int direction, const size_t channel) const;
|
|
|
|
std::string getNativeStreamFormat(const int direction, const size_t channel, double &fullScale) const;
|
|
|
|
SoapySDR::ArgInfoList getStreamArgsInfo(const int direction, const size_t channel) const;
|
|
|
|
void closeStream(SoapySDR::Stream *stream);
|
|
|
|
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());
|
|
|
|
int readStream(
|
|
SoapySDR::Stream *stream,
|
|
void *const *buffs,
|
|
const size_t numElems,
|
|
int &flags,
|
|
long long &timeNs,
|
|
const long timeoutUs = 100000);
|
|
|
|
int writeStream(
|
|
SoapySDR::Stream *stream,
|
|
const void *const *buffs,
|
|
const size_t numElems,
|
|
int &flags,
|
|
const long long timeNs = 0,
|
|
const long timeoutUs = 100000);
|
|
|
|
/*******************************************************************
|
|
* Sample Rate API
|
|
******************************************************************/
|
|
|
|
void setSampleRate(const int direction, const size_t channel, const double rate);
|
|
|
|
double getBandwidth(const int direction, const size_t channel) const;
|
|
|
|
std::vector<double> listBandwidths(const int direction, const size_t channel) const;
|
|
std::vector<double> listSampleRates(const int direction, const size_t channel) const;
|
|
|
|
/*******************************************************************
|
|
* Frequency API
|
|
******************************************************************/
|
|
|
|
void setFrequency(
|
|
const int direction,
|
|
const size_t channel,
|
|
const double frequency,
|
|
const SoapySDR::Kwargs &args = SoapySDR::Kwargs());
|
|
|
|
SoapySDR::RangeList getFrequencyRange(const int direction, const size_t channel) const;
|
|
|
|
/*******************************************************************
|
|
* Antenna API
|
|
******************************************************************/
|
|
|
|
std::vector<std::string> listAntennas(const int direction, const size_t channel) const;
|
|
|
|
/*******************************************************************
|
|
* Gain API
|
|
******************************************************************/
|
|
|
|
std::vector<std::string> listGains(const int direction, const size_t channel) const;
|
|
|
|
void setGain(const int direction, const size_t channel, const double value);
|
|
|
|
SoapySDR::Range getGainRange(const int direction, const size_t channel) const;
|
|
|
|
void controlRadioberry(uint32_t command, uint32_t command_data);
|
|
|
|
/*******************************************************************
|
|
* I2C API
|
|
******************************************************************/
|
|
|
|
std::string readI2C(const int addr, const size_t numBytes);
|
|
void writeI2C(const int addr, const std::string &data);
|
|
|
|
private:
|
|
|
|
int fd_rb;
|
|
double sample_rate;
|
|
int rx_frequency;
|
|
int no_channels;
|
|
struct rb_info_arg_t rb_control;
|
|
std::mutex send_command;
|
|
std::vector<sdr_stream *> streams;
|
|
std::unique_ptr<rpihw::driver::i2c> i2c_ptr;
|
|
bool i2c_available;
|
|
bool mox;
|
|
};
|