summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/output/Lime.cpp295
-rw-r--r--src/output/Lime.h90
2 files changed, 183 insertions, 202 deletions
diff --git a/src/output/Lime.cpp b/src/output/Lime.cpp
index 335adc2..219b97a 100644
--- a/src/output/Lime.cpp
+++ b/src/output/Lime.cpp
@@ -41,152 +41,142 @@ DESCRIPTION:
using namespace std;
-namespace Output {
+namespace Output
+{
static constexpr size_t FRAMES_MAX_SIZE = 2;
-Lime::Lime(SDRDeviceConfig& config) :
- SDRDevice(),
- m_conf(config)
+Lime::Lime(SDRDeviceConfig &config) : SDRDevice(),
+ m_conf(config)
{
- m_interpolate=m_conf.upsample;
-
- etiLog.level(info) <<
- "Lime:Creating the device with: " <<
- m_conf.device;
+ m_interpolate = m_conf.upsample;
+
+ etiLog.level(info) << "Lime:Creating the device with: " << m_conf.device;
int device_count = LMS_GetDeviceList(NULL);
- if (device_count < 0)
- {
- etiLog.level(error) << "Error making LimeSDR device: " << LMS_GetLastErrorMessage();
+ if (device_count < 0)
+ {
+ etiLog.level(error) << "Error making LimeSDR device: " << LMS_GetLastErrorMessage();
throw std::runtime_error("Cannot find LimeSDR output device");
-
- }
+ }
lms_info_str_t device_list[device_count];
- if (LMS_GetDeviceList(device_list) < 0)
- {
- etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
+ if (LMS_GetDeviceList(device_list) < 0)
+ {
+ etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
throw std::runtime_error("Cannot find LimeSDR output device");
-
- }
- unsigned int device_i=0; // If several cards, need to get device by configuration
+ }
+ unsigned int device_i = 0; // If several cards, need to get device by configuration
if (LMS_Open(&m_device, device_list[device_i], NULL) < 0)
- {
- etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
+ {
+ etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
throw std::runtime_error("Cannot open LimeSDR output device");
- }
+ }
if (LMS_Reset(m_device) < 0)
- {
- etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
+ {
+ etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
throw std::runtime_error("Cannot reset LimeSDR output device");
- }
+ }
- if (LMS_Init(m_device) < 0)
- {
- etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
+ if (LMS_Init(m_device) < 0)
+ {
+ etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
throw std::runtime_error("Cannot init LimeSDR output device");
- }
-
+ }
+
if (LMS_EnableChannel(m_device, LMS_CH_TX, m_channel, true) < 0)
- {
- etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
+ {
+ etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
throw std::runtime_error("Cannot channel LimeSDR output device");
- }
+ }
- if (LMS_SetSampleRate(m_device, m_conf.masterClockRate*m_interpolate, 0) < 0)
- {
- etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
+ if (LMS_SetSampleRate(m_device, m_conf.masterClockRate * m_interpolate, 0) < 0)
+ {
+ etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
throw std::runtime_error("Cannot channel LimeSDR output device");
- }
- float_type host_sample_rate=0.0;
+ }
+ float_type host_sample_rate = 0.0;
if (LMS_GetSampleRate(m_device, LMS_CH_TX, m_channel, &host_sample_rate, NULL) < 0)
- {
- etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
+ {
+ etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
throw std::runtime_error("Cannot getsamplerate LimeSDR output device");
- }
- etiLog.level(info) << "LimeSDR master clock rate set to " <<
- std::fixed << std::setprecision(4) <<
- host_sample_rate/1000.0 << " kHz";
-
- if (LMS_SetLOFrequency(m_device, LMS_CH_TX,m_channel, m_conf.frequency) < 0)
- {
- etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
+ }
+ etiLog.level(info) << "LimeSDR master clock rate set to " << std::fixed << std::setprecision(4) << host_sample_rate / 1000.0 << " kHz";
+
+ if (LMS_SetLOFrequency(m_device, LMS_CH_TX, m_channel, m_conf.frequency) < 0)
+ {
+ etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
throw std::runtime_error("Cannot Frequency LimeSDR output device");
- }
+ }
- float_type cur_frequency=0.0;
+ float_type cur_frequency = 0.0;
- if (LMS_GetLOFrequency(m_device, LMS_CH_TX,m_channel, &cur_frequency)<0)
+ if (LMS_GetLOFrequency(m_device, LMS_CH_TX, m_channel, &cur_frequency) < 0)
{
etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
- throw std::runtime_error("Cannot GetFrequency LimeSDR output device");
+ throw std::runtime_error("Cannot GetFrequency LimeSDR output device");
}
- etiLog.level(info) << "LimeSDR:Actual frequency: " <<
- std::fixed << std::setprecision(3) <<
- cur_frequency / 1000.0 << " kHz.";
-
- if (LMS_SetNormalizedGain(m_device, LMS_CH_TX, m_channel, m_conf.txgain/100.0) < 0) //value 0..100 -> Normalize
- {
- etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
- throw std::runtime_error("Cannot Gain LimeSDR output device");
- }
-
-
+ etiLog.level(info) << "LimeSDR:Actual frequency: " << std::fixed << std::setprecision(3) << cur_frequency / 1000.0 << " kHz.";
+
+ if (LMS_SetNormalizedGain(m_device, LMS_CH_TX, m_channel, m_conf.txgain / 100.0) < 0) //value 0..100 -> Normalize
+ {
+ etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
+ throw std::runtime_error("Cannot Gain LimeSDR output device");
+ }
+
if (LMS_SetAntenna(m_device, LMS_CH_TX, m_channel, LMS_PATH_TX2) < 0)
- {
- etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
+ {
+ etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
throw std::runtime_error("Cannot Antenna LimeSDR output device");
- }
-
+ }
- double bandwidth_calibrating=2.5e6; // Minimal bandwidth
- if (LMS_Calibrate(m_device, LMS_CH_TX, m_channel, bandwidth_calibrating, 0) < 0)
- {
- etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
+ double bandwidth_calibrating = 2.5e6; // Minimal bandwidth
+ if (LMS_Calibrate(m_device, LMS_CH_TX, m_channel, bandwidth_calibrating, 0) < 0)
+ {
+ etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
throw std::runtime_error("Cannot Gain LimeSDR output device");
- }
- switch(m_interpolate)
+ }
+ switch (m_interpolate)
{
- case 1:
- {
- static double coeff[]= {-0.0014080960536375642, 0.0010270054917782545, 0.0002103941806126386, -0.0023147952742874622, 0.004256128799170256, -0.0038850826676934958, -0.0006057845894247293, 0.008352266624569893, -0.014639420434832573, 0.01275692880153656, 0.0012119393795728683, -0.02339744009077549, 0.04088031128048897, -0.03649924695491791, -0.001745241112075746, 0.07178881019353867, -0.15494878590106964, 0.22244733572006226, 0.7530255913734436, 0.22244733572006226, -0.15494878590106964, 0.07178881019353867, -0.001745241112075746, -0.03649924695491791, 0.04088031128048897, -0.02339744009077549, 0.0012119393795728683, 0.01275692880153656, -0.014639420434832573, 0.008352266624569893, -0.0006057845894247293, -0.0038850826676934958, 0.004256128799170256, -0.0023147952742874622, 0.0002103941806126386, 0.0010270054917782545, -0.0014080960536375642};
- LMS_SetGFIRCoeff(m_device, LMS_CH_TX, m_channel, LMS_GFIR3, coeff, 37) ;
- LMS_SetGFIR(m_device, LMS_CH_TX,m_channel, LMS_GFIR3, true);
- }
- break;
- case 2:
- {
- static double coeff[]= {0.0007009872933849692, 0.0006160094635561109, -0.0003868100175168365, -0.0010892765130847692, -0.0003017585549969226, 0.0013388358056545258, 0.0014964848523959517, -0.000810395460575819, -0.0028437587898224592, -0.001026041223667562, 0.0033166243229061365, 0.004008698742836714, -0.0016114861937239766, -0.006794447544962168, -0.0029077117796987295, 0.0070640090852975845, 0.009203733876347542, -0.002605677582323551, -0.014204192906618118, -0.007088471669703722, 0.013578214682638645, 0.019509244710206985, -0.0035577849484980106, -0.028872046619653702, -0.016949573531746864, 0.02703845500946045, 0.045044951140880585, -0.00423968443647027, -0.07416801154613495, -0.05744718387722969, 0.09617383778095245, 0.30029231309890747, 0.39504382014274597, 0.30029231309890747, 0.09617383778095245, -0.05744718387722969, -0.07416801154613495, -0.00423968443647027, 0.045044951140880585, 0.02703845500946045, -0.016949573531746864, -0.028872046619653702, -0.0035577849484980106, 0.019509244710206985, 0.013578214682638645, -0.007088471669703722, -0.014204192906618118, -0.002605677582323551, 0.009203733876347542, 0.0070640090852975845, -0.0029077117796987295, -0.006794447544962168, -0.0016114861937239766, 0.004008698742836714, 0.0033166243229061365, -0.001026041223667562, -0.0028437587898224592, -0.000810395460575819, 0.0014964848523959517, 0.0013388358056545258, -0.0003017585549969226, -0.0010892765130847692, -0.0003868100175168365, 0.0006160094635561109, 0.0007009872933849692};
- LMS_SetGFIRCoeff(m_device, LMS_CH_TX, m_channel, LMS_GFIR3, coeff, 65) ;
- LMS_SetGFIR(m_device, LMS_CH_TX,m_channel, LMS_GFIR3, true);
- }
- break;
+ case 1:
+ {
+ static double coeff[] = {-0.0014080960536375642, 0.0010270054917782545, 0.0002103941806126386, -0.0023147952742874622, 0.004256128799170256, -0.0038850826676934958, -0.0006057845894247293, 0.008352266624569893, -0.014639420434832573, 0.01275692880153656, 0.0012119393795728683, -0.02339744009077549, 0.04088031128048897, -0.03649924695491791, -0.001745241112075746, 0.07178881019353867, -0.15494878590106964, 0.22244733572006226, 0.7530255913734436, 0.22244733572006226, -0.15494878590106964, 0.07178881019353867, -0.001745241112075746, -0.03649924695491791, 0.04088031128048897, -0.02339744009077549, 0.0012119393795728683, 0.01275692880153656, -0.014639420434832573, 0.008352266624569893, -0.0006057845894247293, -0.0038850826676934958, 0.004256128799170256, -0.0023147952742874622, 0.0002103941806126386, 0.0010270054917782545, -0.0014080960536375642};
+ LMS_SetGFIRCoeff(m_device, LMS_CH_TX, m_channel, LMS_GFIR3, coeff, 37);
+ LMS_SetGFIR(m_device, LMS_CH_TX, m_channel, LMS_GFIR3, true);
+ }
+ break;
+ case 2:
+ {
+ static double coeff[] = {0.0007009872933849692, 0.0006160094635561109, -0.0003868100175168365, -0.0010892765130847692, -0.0003017585549969226, 0.0013388358056545258, 0.0014964848523959517, -0.000810395460575819, -0.0028437587898224592, -0.001026041223667562, 0.0033166243229061365, 0.004008698742836714, -0.0016114861937239766, -0.006794447544962168, -0.0029077117796987295, 0.0070640090852975845, 0.009203733876347542, -0.002605677582323551, -0.014204192906618118, -0.007088471669703722, 0.013578214682638645, 0.019509244710206985, -0.0035577849484980106, -0.028872046619653702, -0.016949573531746864, 0.02703845500946045, 0.045044951140880585, -0.00423968443647027, -0.07416801154613495, -0.05744718387722969, 0.09617383778095245, 0.30029231309890747, 0.39504382014274597, 0.30029231309890747, 0.09617383778095245, -0.05744718387722969, -0.07416801154613495, -0.00423968443647027, 0.045044951140880585, 0.02703845500946045, -0.016949573531746864, -0.028872046619653702, -0.0035577849484980106, 0.019509244710206985, 0.013578214682638645, -0.007088471669703722, -0.014204192906618118, -0.002605677582323551, 0.009203733876347542, 0.0070640090852975845, -0.0029077117796987295, -0.006794447544962168, -0.0016114861937239766, 0.004008698742836714, 0.0033166243229061365, -0.001026041223667562, -0.0028437587898224592, -0.000810395460575819, 0.0014964848523959517, 0.0013388358056545258, -0.0003017585549969226, -0.0010892765130847692, -0.0003868100175168365, 0.0006160094635561109, 0.0007009872933849692};
+ LMS_SetGFIRCoeff(m_device, LMS_CH_TX, m_channel, LMS_GFIR3, coeff, 65);
+ LMS_SetGFIR(m_device, LMS_CH_TX, m_channel, LMS_GFIR3, true);
+ }
+ break;
}
- #define FRAME_LENGTH 196608
- // FRAME DURATION is 96ms
- unsigned int buffer_size = FRAME_LENGTH*m_interpolate*10; // We take 10 Frame buffer size Fifo
- interpolatebuf=new complexf[FRAME_LENGTH*m_interpolate];
+#define FRAME_LENGTH 196608
+ // FRAME DURATION is 96ms
+ unsigned int buffer_size = FRAME_LENGTH * m_interpolate * 10; // We take 10 Frame buffer size Fifo
+ interpolatebuf = new complexf[FRAME_LENGTH * m_interpolate];
// Fifo seems to be round to multiple of SampleRate
m_tx_stream.channel = m_channel;
- m_tx_stream.fifoSize = buffer_size;
- m_tx_stream.throughputVsLatency = 1.0;
- m_tx_stream.isTx = LMS_CH_TX;
- m_tx_stream.dataFmt = lms_stream_t::LMS_FMT_F32;
- if ( LMS_SetupStream(m_device, &m_tx_stream) < 0 )
+ m_tx_stream.fifoSize = buffer_size;
+ m_tx_stream.throughputVsLatency = 1.0;
+ m_tx_stream.isTx = LMS_CH_TX;
+ m_tx_stream.dataFmt = lms_stream_t::LMS_FMT_F32;
+ if (LMS_SetupStream(m_device, &m_tx_stream) < 0)
{
etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage();
throw std::runtime_error("Cannot Channel Activate LimeSDR output device");
- }
+ }
LMS_StartStream(&m_tx_stream);
LMS_SetGFIR(m_device, LMS_CH_TX, m_channel, LMS_GFIR3, true);
}
Lime::~Lime()
{
-
+
if (m_device != nullptr)
{
-
+
//if (m_tx_stream != nullptr)
{
LMS_StopStream(&m_tx_stream);
@@ -198,15 +188,15 @@ Lime::~Lime()
}
*/
LMS_EnableChannel(m_device, LMS_CH_TX, m_channel, false);
- LMS_Close(m_device);
+ LMS_Close(m_device);
}
- if(interpolatebuf!=nullptr)
- delete(interpolatebuf);
+ if (interpolatebuf != nullptr)
+ delete (interpolatebuf);
}
void Lime::tune(double lo_offset, double frequency)
{
- /* if (not m_device) throw runtime_error("Soapy device not set up");
+ /* if (not m_device) throw runtime_error("Soapy device not set up");
SoapySDR::Kwargs offset_arg;
offset_arg["OFFSET"] = to_string(lo_offset);
@@ -216,26 +206,29 @@ void Lime::tune(double lo_offset, double frequency)
double Lime::get_tx_freq(void) const
{
- if (not m_device) throw runtime_error("Lime device not set up");
+ if (not m_device)
+ throw runtime_error("Lime device not set up");
// TODO lo offset
- return 0;//m_device->getFrequency(SOAPY_SDR_TX, 0);
+ return 0; //m_device->getFrequency(SOAPY_SDR_TX, 0);
}
void Lime::set_txgain(double txgain)
{
m_conf.txgain = txgain;
- if (not m_device) throw runtime_error("Lime device not set up");
+ if (not m_device)
+ throw runtime_error("Lime device not set up");
//m_device->setGain(SOAPY_SDR_TX, 0, m_conf.txgain);
}
double Lime::get_txgain(void) const
{
- if (not m_device) throw runtime_error("Lime device not set up");
- return 0;//m_device->getGain(SOAPY_SDR_TX, 0);
+ if (not m_device)
+ throw runtime_error("Lime device not set up");
+ return 0; //m_device->getGain(SOAPY_SDR_TX, 0);
}
-SDRDevice::RunStatistics Lime::get_run_statistics(void) const
+SDRDevice::RunStatistics Lime::get_run_statistics(void) const
{
RunStatistics rs;
rs.num_underruns = underflows;
@@ -245,7 +238,6 @@ SDRDevice::RunStatistics Lime::get_run_statistics(void) const
return rs;
}
-
double Lime::get_real_secs(void) const
{
/*if (m_device) {
@@ -267,14 +259,14 @@ void Lime::set_rxgain(double rxgain)
double Lime::get_rxgain(void) const
{
- return 0.0;//m_device->getGain(SOAPY_SDR_RX, 0);
+ return 0.0; //m_device->getGain(SOAPY_SDR_RX, 0);
}
size_t Lime::receive_frame(
- complexf *buf,
- size_t num_samples,
- struct frame_timestamp& ts,
- double timeout_secs)
+ complexf *buf,
+ size_t num_samples,
+ struct frame_timestamp &ts,
+ double timeout_secs)
{
/*int flags = 0;
long long timeNs = ts.get_ns();
@@ -309,17 +301,16 @@ size_t Lime::receive_frame(
return n_read;
*/
- return 0;
+ return 0;
}
-
bool Lime::is_clk_source_ok() const
{
// TODO
return true;
}
-const char* Lime::device_name(void) const
+const char *Lime::device_name(void) const
{
return "Lime";
}
@@ -331,10 +322,11 @@ double Lime::get_temperature(void) const
return std::numeric_limits<double>::quiet_NaN();
}
-void Lime::transmit_frame(const struct FrameData& frame)
+void Lime::transmit_frame(const struct FrameData &frame)
{
-
- if (not m_device) throw runtime_error("Lime device not set up");
+
+ if (not m_device)
+ throw runtime_error("Lime device not set up");
/*if (not m_tx_stream_active)
{
@@ -357,41 +349,35 @@ void Lime::transmit_frame(const struct FrameData& frame)
}*/
// The frame buffer contains bytes representing FC32 samples
- const complexf *buf = reinterpret_cast<const complexf*>(frame.buf.data());
+ const complexf *buf = reinterpret_cast<const complexf *>(frame.buf.data());
const size_t numSamples = frame.buf.size() / sizeof(complexf);
if ((frame.buf.size() % sizeof(complexf)) != 0)
{
throw std::runtime_error("Lime: invalid buffer size");
}
-
lms_stream_status_t LimeStatus;
- LMS_GetStreamStatus(&m_tx_stream,&LimeStatus);
- overflows=LimeStatus.overrun;
- underflows=LimeStatus.underrun;
- late_packets=LimeStatus.droppedPackets;
+ LMS_GetStreamStatus(&m_tx_stream, &LimeStatus);
+ overflows = LimeStatus.overrun;
+ underflows = LimeStatus.underrun;
+ late_packets = LimeStatus.droppedPackets;
-
- etiLog.level(info) << LimeStatus.fifoFilledCount<< "/" << LimeStatus.fifoSize << ":" << numSamples << "Rate" << LimeStatus.linkRate /(2*2.0);
+ etiLog.level(info) << LimeStatus.fifoFilledCount << "/" << LimeStatus.fifoSize << ":" << numSamples << "Rate" << LimeStatus.linkRate / (2 * 2.0);
etiLog.level(info) << "overrun" << LimeStatus.overrun << "underun" << LimeStatus.underrun << "drop" << LimeStatus.droppedPackets;
-
- /* if(LimeStatus.fifoFilledCount>LimeStatus.fifoSize-2*FRAME_LENGTH*m_interpolate) // Drop if Fifo is just 2 frames before fullness
+
+ /* if(LimeStatus.fifoFilledCount>LimeStatus.fifoSize-2*FRAME_LENGTH*m_interpolate) // Drop if Fifo is just 2 frames before fullness
{
etiLog.level(info) << "Fifo overflow : drop";
return;
- }*/
-
+ }*/
- if(LimeStatus.fifoFilledCount<FRAME_LENGTH*2*m_interpolate) // Wait if Fifo is just 2 frames before fullness
+ if (LimeStatus.fifoFilledCount < FRAME_LENGTH * 2 * m_interpolate) // Wait if Fifo is just 2 frames before fullness
{
etiLog.level(info) << "Fifo underflow : duplicate for filling garbage";
- for(size_t i=0;i<m_interpolate*10;i++)
- LMS_SendStream( &m_tx_stream, buf, numSamples, NULL, 1000 );
-
-
-
+ for (size_t i = 0; i < m_interpolate * 10; i++)
+ LMS_SendStream(&m_tx_stream, buf, numSamples, NULL, 1000);
}
-/*
+ /*
if(LimeStatus.fifoFilledCount>=5*FRAME_LENGTH*m_interpolate) // Start if FIFO is half full
{
@@ -404,21 +390,20 @@ void Lime::transmit_frame(const struct FrameData& frame)
}
*/
-
- size_t num_sent=0;
- if(m_interpolate==1)
- num_sent= LMS_SendStream( &m_tx_stream, buf, numSamples, NULL, 1000 );
+ size_t num_sent = 0;
+ if (m_interpolate == 1)
+ num_sent = LMS_SendStream(&m_tx_stream, buf, numSamples, NULL, 1000);
- if(m_interpolate>1) // We upsample (1 0 0 0), low pass filter is done by FIR
+ if (m_interpolate > 1) // We upsample (1 0 0 0), low pass filter is done by FIR
{
- for(size_t i=0;i<numSamples;i++)
+ for (size_t i = 0; i < numSamples; i++)
{
- interpolatebuf[i*m_interpolate]=buf[i];
- for(size_t j=1;j<m_interpolate;j++)
- interpolatebuf[i*m_interpolate+j]=complexf(0,0);
+ interpolatebuf[i * m_interpolate] = buf[i];
+ for (size_t j = 1; j < m_interpolate; j++)
+ interpolatebuf[i * m_interpolate + j] = complexf(0, 0);
}
- num_sent= LMS_SendStream( &m_tx_stream, interpolatebuf, numSamples*m_interpolate, NULL, 1000 );
+ num_sent = LMS_SendStream(&m_tx_stream, interpolatebuf, numSamples * m_interpolate, NULL, 1000);
}
if (num_sent <= 0)
@@ -428,16 +413,12 @@ void Lime::transmit_frame(const struct FrameData& frame)
}
else
{
- //etiLog.level(info) << "OK" << num_sent;
+ //etiLog.level(info) << "OK" << num_sent;
}
-
-
+
num_frames_modulated++;
-
}
} // namespace Output
#endif // HAVE_LIMESDR
-
-
diff --git a/src/output/Lime.h b/src/output/Lime.h
index 2b5c80c..ab0a388 100644
--- a/src/output/Lime.h
+++ b/src/output/Lime.h
@@ -30,7 +30,7 @@ DESCRIPTION:
#pragma once
#ifdef HAVE_CONFIG_H
-# include <config.h>
+#include <config.h>
#endif
//#define HAVE_LIMESDR
#ifdef HAVE_LIMESDR
@@ -44,58 +44,58 @@ DESCRIPTION:
#include "RemoteControl.h"
#include <lime/LimeSuite.h>
-namespace Output {
+namespace Output
+{
class Lime : public Output::SDRDevice
{
- public:
- Lime(SDRDeviceConfig& config);
- Lime(const Lime& other) = delete;
- Lime& operator=(const Lime& other) = delete;
- ~Lime();
-
- virtual void tune(double lo_offset, double frequency) override;
- virtual double get_tx_freq(void) const override;
- virtual void set_txgain(double txgain) override;
- virtual double get_txgain(void) const override;
- virtual void transmit_frame(const struct FrameData& frame) override;
- virtual RunStatistics get_run_statistics(void) const override;
- virtual double get_real_secs(void) const override;
-
- virtual void set_rxgain(double rxgain) override;
- virtual double get_rxgain(void) const override;
- virtual size_t receive_frame(
- complexf *buf,
- size_t num_samples,
- struct frame_timestamp& ts,
- double timeout_secs) override;
-
- // Return true if GPS and reference clock inputs are ok
- virtual bool is_clk_source_ok(void) const override;
- virtual const char* device_name(void) const override;
-
- virtual double get_temperature(void) const override;
-
- private:
- SDRDeviceConfig& m_conf;
- lms_device_t *m_device=nullptr;
- size_t m_channel=0; // Should be set by config
- /*
+ public:
+ Lime(SDRDeviceConfig &config);
+ Lime(const Lime &other) = delete;
+ Lime &operator=(const Lime &other) = delete;
+ ~Lime();
+
+ virtual void tune(double lo_offset, double frequency) override;
+ virtual double get_tx_freq(void) const override;
+ virtual void set_txgain(double txgain) override;
+ virtual double get_txgain(void) const override;
+ virtual void transmit_frame(const struct FrameData &frame) override;
+ virtual RunStatistics get_run_statistics(void) const override;
+ virtual double get_real_secs(void) const override;
+
+ virtual void set_rxgain(double rxgain) override;
+ virtual double get_rxgain(void) const override;
+ virtual size_t receive_frame(
+ complexf *buf,
+ size_t num_samples,
+ struct frame_timestamp &ts,
+ double timeout_secs) override;
+
+ // Return true if GPS and reference clock inputs are ok
+ virtual bool is_clk_source_ok(void) const override;
+ virtual const char *device_name(void) const override;
+
+ virtual double get_temperature(void) const override;
+
+ private:
+ SDRDeviceConfig &m_conf;
+ lms_device_t *m_device = nullptr;
+ size_t m_channel = 0; // Should be set by config
+ /*
SoapySDR::Device *m_device = nullptr;
SoapySDR::Stream *m_tx_stream = nullptr;
*/
- lms_stream_t m_tx_stream;
- bool m_tx_stream_active = false;
- size_t m_interpolate=1;
- complexf *interpolatebuf=nullptr;
-
- size_t underflows = 0;
- size_t overflows = 0;
- size_t late_packets = 0;
- size_t num_frames_modulated = 0;
+ lms_stream_t m_tx_stream;
+ bool m_tx_stream_active = false;
+ size_t m_interpolate = 1;
+ complexf *interpolatebuf = nullptr;
+
+ size_t underflows = 0;
+ size_t overflows = 0;
+ size_t late_packets = 0;
+ size_t num_frames_modulated = 0;
};
} // namespace Output
#endif //HAVE_SOAPYSDR
-