21 #include <QMutexLocker> 23 #include <QNetworkReply> 26 #include "lime/LimeSuite.h" 50 m_deviceAPI(deviceAPI),
52 m_limeSDROutputThread(0),
55 m_channelAcquired(false)
57 m_deviceAPI->setNbSinkStreams(1);
59 m_streamId.handle = 0;
65 m_networkManager =
new QNetworkAccessManager();
66 connect(m_networkManager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(networkManagerFinished(QNetworkReply*)));
98 qDebug(
"LimeSDROutput::openDevice: look in Ix buddies");
107 if (deviceParams == 0)
109 qCritical(
"LimeSDROutput::openDevice: cannot get device parameters from Tx buddy");
114 qDebug(
"LimeSDROutput::openDevice: getting device parameters from Tx buddy");
119 qCritical(
"LimeSDROutput::openDevice: no more Tx channels available in device");
124 qDebug(
"LimeSDROutput::openDevice: at least one more Tx channel is available in device");
134 if (buddyShared->
m_channel == requestedChannel)
136 qCritical(
"LimeSDROutput::openDevice: cannot open busy channel %u", requestedChannel);
147 qDebug(
"LimeSDROutput::openDevice: look in Rx buddies");
156 qCritical(
"LimeSDROutput::openDevice: cannot get device parameters from Rx buddy");
161 qDebug(
"LimeSDROutput::openDevice: getting device parameters from Rx buddy");
171 qDebug(
"LimeSDROutput::openDevice: open device here");
188 std::vector<DeviceAPI*>::const_iterator itSource = sourceBuddies.begin();
190 qDebug(
"LimeSDROutput::suspendRxBuddies (%lu)", sourceBuddies.size());
192 for (; itSource != sourceBuddies.end(); ++itSource)
211 std::vector<DeviceAPI*>::const_iterator itSink = sinkBuddies.begin();
213 qDebug(
"LimeSDROutput::suspendTxBuddies (%lu)", sinkBuddies.size());
215 for (; itSink != sinkBuddies.end(); ++itSink)
234 std::vector<DeviceAPI*>::const_iterator itSource = sourceBuddies.begin();
236 qDebug(
"LimeSDROutput::resumeRxBuddies (%lu)", sourceBuddies.size());
238 for (; itSource != sourceBuddies.end(); ++itSource)
251 std::vector<DeviceAPI*>::const_iterator itSink = sinkBuddies.begin();
253 qDebug(
"LimeSDROutput::resumeTxBuddies (%lu)", sinkBuddies.size());
255 for (; itSink != sinkBuddies.end(); ++itSink)
308 m_streamId.dataFmt = lms_stream_t::LMS_FMT_I12;
312 qCritical(
"LimeSDROutput::acquireChannel: cannot setup the stream on Tx channel %d",
m_deviceShared.
m_channel);
339 qWarning(
"LimeSDROutput::releaseChannel: cannot destroy the stream on Tx channel %d",
m_deviceShared.
m_channel);
386 qDebug(
"LimeSDROutput::start: thread created");
402 qDebug(
"LimeSDROutput::stop");
485 qDebug(
"LimeSDROutput::getLORange: min: %f max: %f", range.min, range.max);
493 qDebug(
"LimeSDROutput::getSRRange: min: %f max: %f", range.min, range.max);
501 qDebug(
"LimeSDROutput::getLPRange: min: %f max: %f", range.min, range.max);
523 qDebug() <<
"LimeSDROutput::handleMessage: MsgConfigureLimeSDR";
527 qDebug(
"LimeSDROutput::handleMessage config error");
535 qDebug() <<
"LimeSDROutput::handleMessage: MsgStartStop: " << (cmd.
getStartStop() ?
"start" :
"stop");
570 qDebug(
"LimeSDROutput::handleMessage: MsgReportBuddyChange: LMS_GetSampleRate() failed");
578 qDebug() <<
"LimeSDROutput::handleMessage: MsgReportBuddyChange:" 579 <<
" host_Hz: " << host_Hz
580 <<
" rf_Hz: " << rf_Hz
582 <<
" log2Hard: " << hard
642 lms_stream_status_t status;
651 status.fifoFilledCount,
655 status.droppedPackets,
687 qDebug(
"LimeSDROutput::handleMessage: MsgGetDeviceInfo: cannot get temperature");
694 qDebug(
"LimeSDROutput::handleMessage: MsgGetDeviceInfo: cannot get GPIO pins values");
707 std::vector<DeviceAPI*>::const_iterator itSource = sourceBuddies.begin();
709 for (; itSource != sourceBuddies.end(); ++itSource)
711 if ((*itSource)->getSamplingDeviceGUIMessageQueue())
714 (*itSource)->getSamplingDeviceGUIMessageQueue()->push(report);
720 std::vector<DeviceAPI*>::const_iterator itSink = sinkBuddies.begin();
722 for (; itSink != sinkBuddies.end(); ++itSink)
724 if ((*itSink)->getSamplingDeviceGUIMessageQueue())
727 (*itSink)->getSamplingDeviceGUIMessageQueue()->push(report);
741 bool forwardChangeOwnDSP =
false;
742 bool forwardChangeTxDSP =
false;
743 bool forwardChangeAllDSP =
false;
744 bool forwardClockSource =
false;
745 bool forwardGPIOChange =
false;
746 bool ownThreadWasRunning =
false;
747 bool doCalibration =
false;
748 bool doLPCalibration =
false;
749 double clockGenFreq = 0.0;
750 QList<QString> reverseAPIKeys;
755 deviceCenterFrequency = deviceCenterFrequency < 0 ? 0 : deviceCenterFrequency;
759 qCritical(
"LimeSDROutput::applySettings: could not get clock gen frequency");
763 qDebug() <<
"LimeSDROutput::applySettings: clock gen frequency: " << clockGenFreq;
770 reverseAPIKeys.append(
"gain");
779 qDebug(
"LimeSDROutput::applySettings: LMS_SetGaindB() failed");
783 doCalibration =
true;
784 qDebug() <<
"LimeSDROutput::applySettings: Gain set to " << settings.
m_gain;
792 reverseAPIKeys.append(
"devSampleRate");
793 reverseAPIKeys.append(
"log2HardInterp");
794 forwardChangeAllDSP =
true;
803 qCritical(
"LimeSDROutput::applySettings: could not set sample rate to %d with oversampling of %d",
812 forceNCOFrequency =
true;
813 qDebug(
"LimeSDROutput::applySettings: set sample rate set to %d with oversampling of %d",
823 reverseAPIKeys.append(
"devSampleRate");
824 reverseAPIKeys.append(
"log2SoftInterp");
829 qDebug(
"LimeSDROutput::applySettings: resize FIFO: %d", fifoSize);
835 reverseAPIKeys.append(
"lpfBW");
839 doLPCalibration =
true;
846 reverseAPIKeys.append(
"lpfFIRBW");
847 reverseAPIKeys.append(
"lpfFIREnable");
857 qCritical(
"LimeSDROutput::applySettings: could %s and set LPF FIR to %f Hz",
864 qDebug(
"LimeSDROutput::applySettings: %sd and set LPF FIR to %f Hz",
874 reverseAPIKeys.append(
"ncoFrequency");
875 reverseAPIKeys.append(
"ncoEnable");
876 forwardChangeOwnDSP =
true;
888 qDebug(
"LimeSDROutput::applySettings: %sd and set NCO to %d Hz",
894 qCritical(
"LimeSDROutput::applySettings: could not %s and set NCO to %d Hz",
903 reverseAPIKeys.append(
"log2SoftInterp");
904 forwardChangeOwnDSP =
true;
910 qDebug() <<
"LimeSDROutput::applySettings: set soft decimation to " << (1<<settings.
m_log2SoftInterp);
916 reverseAPIKeys.append(
"antennaPath");
924 doCalibration =
true;
925 qDebug(
"LimeSDROutput::applySettings: set antenna path to %d",
930 qCritical(
"LimeSDROutput::applySettings: could not set antenna path to %d",
941 reverseAPIKeys.append(
"centerFrequency");
942 reverseAPIKeys.append(
"transverterMode");
943 reverseAPIKeys.append(
"transverterDeltaFrequency");
944 forwardChangeTxDSP =
true;
950 qCritical(
"LimeSDROutput::applySettings: could not set frequency to %lld", deviceCenterFrequency);
954 doCalibration =
true;
956 qDebug(
"LimeSDROutput::applySettings: frequency set to %lld", deviceCenterFrequency);
964 reverseAPIKeys.append(
"extClock");
965 reverseAPIKeys.append(
"extClockFreq");
971 forwardClockSource =
true;
972 doCalibration =
true;
973 qDebug(
"LimeSDROutput::applySettings: clock set to %s (Ext: %d Hz)",
974 settings.
m_extClock ?
"external" :
"internal",
979 qCritical(
"LimeSDROutput::applySettings: could not set clock to %s (Ext: %d Hz)",
980 settings.
m_extClock ?
"external" :
"internal",
990 reverseAPIKeys.append(
"gpioDir");
994 qCritical(
"LimeSDROutput::applySettings: could not set GPIO directions to %u", settings.
m_gpioDir);
998 forwardGPIOChange =
true;
999 qDebug(
"LimeSDROutput::applySettings: GPIO directions set to %u", settings.
m_gpioDir);
1005 reverseAPIKeys.append(
"gpioPins");
1009 qCritical(
"LimeSDROutput::applySettings: could not set GPIO pins to %u", settings.
m_gpioPins);
1013 forwardGPIOChange =
true;
1014 qDebug(
"LimeSDROutput::applySettings: GPIO pins set to %u", settings.
m_gpioPins);
1029 double clockGenFreqAfter;
1033 qCritical(
"LimeSDROutput::applySettings: could not get clock gen frequency");
1037 qDebug() <<
"LimeSDROutput::applySettings: clock gen frequency after: " << clockGenFreqAfter;
1038 doCalibration = doCalibration || (clockGenFreqAfter != clockGenFreq);
1046 ownThreadWasRunning =
true;
1068 if (doLPCalibration)
1075 qCritical(
"LimeSDROutput::applySettings: could not set LPF to %f Hz",
m_settings.
m_lpfBW);
1086 if (ownThreadWasRunning) {
1093 if (forwardChangeAllDSP)
1095 qDebug(
"LimeSDROutput::applySettings: forward change to all buddies");
1107 std::vector<DeviceAPI*>::const_iterator itSink = sinkBuddies.begin();
1109 for (; itSink != sinkBuddies.end(); ++itSink)
1113 (*itSink)->getSamplingDeviceInputMessageQueue()->push(report);
1118 std::vector<DeviceAPI*>::const_iterator itSource = sourceBuddies.begin();
1120 for (; itSource != sourceBuddies.end(); ++itSource)
1124 (*itSource)->getSamplingDeviceInputMessageQueue()->push(report);
1127 else if (forwardChangeTxDSP)
1129 qDebug(
"LimeSDROutput::applySettings: forward change to Tx buddies");
1140 std::vector<DeviceAPI*>::const_iterator itSink = sinkBuddies.begin();
1142 for (; itSink != sinkBuddies.end(); ++itSink)
1146 (*itSink)->getSamplingDeviceInputMessageQueue()->push(report);
1149 else if (forwardChangeOwnDSP)
1151 qDebug(
"LimeSDROutput::applySettings: forward change to self only");
1159 if (forwardClockSource)
1163 std::vector<DeviceAPI*>::const_iterator itSource = sourceBuddies.begin();
1165 for (; itSource != sourceBuddies.end(); ++itSource)
1169 (*itSource)->getSamplingDeviceInputMessageQueue()->push(report);
1174 std::vector<DeviceAPI*>::const_iterator itSink = sinkBuddies.begin();
1176 for (; itSink != sinkBuddies.end(); ++itSink)
1180 (*itSink)->getSamplingDeviceInputMessageQueue()->push(report);
1184 if (forwardGPIOChange)
1187 std::vector<DeviceAPI*>::const_iterator itSource = sourceBuddies.begin();
1189 for (; itSource != sourceBuddies.end(); ++itSource)
1193 (*itSource)->getSamplingDeviceInputMessageQueue()->push(report);
1198 std::vector<DeviceAPI*>::const_iterator itSink = sinkBuddies.begin();
1200 for (; itSink != sinkBuddies.end(); ++itSink)
1204 (*itSink)->getSamplingDeviceInputMessageQueue()->push(report);
1213 <<
" deviceCenterFrequency: " << deviceCenterFrequency
1230 <<
" force: " << force
1231 <<
" forceNCOFrequency: " << forceNCOFrequency
1232 <<
" doCalibration: " << doCalibration
1233 <<
" doLPCalibration: " << doLPCalibration;
1240 QString& errorMessage)
1242 (void) errorMessage;
1251 const QStringList& deviceSettingsKeys,
1253 QString& errorMessage)
1255 (void) errorMessage;
1258 if (deviceSettingsKeys.contains(
"antennaPath")) {
1261 if (deviceSettingsKeys.contains(
"centerFrequency")) {
1264 if (deviceSettingsKeys.contains(
"devSampleRate")) {
1267 if (deviceSettingsKeys.contains(
"extClock")) {
1270 if (deviceSettingsKeys.contains(
"extClockFreq")) {
1273 if (deviceSettingsKeys.contains(
"gain")) {
1276 if (deviceSettingsKeys.contains(
"log2HardInterp")) {
1279 if (deviceSettingsKeys.contains(
"log2SoftInterp")) {
1282 if (deviceSettingsKeys.contains(
"lpfBW")) {
1285 if (deviceSettingsKeys.contains(
"lpfFIREnable")) {
1288 if (deviceSettingsKeys.contains(
"lpfFIRBW")) {
1291 if (deviceSettingsKeys.contains(
"ncoEnable")) {
1294 if (deviceSettingsKeys.contains(
"ncoFrequency")) {
1297 if (deviceSettingsKeys.contains(
"transverterDeltaFrequency")) {
1300 if (deviceSettingsKeys.contains(
"transverterMode")) {
1303 if (deviceSettingsKeys.contains(
"gpioDir")) {
1306 if (deviceSettingsKeys.contains(
"gpioPins")) {
1309 if (deviceSettingsKeys.contains(
"useReverseAPI")) {
1312 if (deviceSettingsKeys.contains(
"reverseAPIAddress")) {
1315 if (deviceSettingsKeys.contains(
"reverseAPIPort")) {
1318 if (deviceSettingsKeys.contains(
"reverseAPIDeviceIndex")) {
1337 QString& errorMessage)
1339 (void) errorMessage;
1378 QString& errorMessage)
1380 (void) errorMessage;
1388 QString& errorMessage)
1390 (void) errorMessage;
1406 bool success =
false;
1410 lms_stream_status_t status;
1411 status.active =
false;
1412 status.fifoFilledCount = 0;
1413 status.fifoSize = 1;
1414 status.underrun = 0;
1416 status.droppedPackets = 0;
1417 status.linkRate = 0.0;
1418 status.timestamp = 0;
1455 if (deviceSettingsKeys.contains(
"antennaPath") || force) {
1458 if (deviceSettingsKeys.contains(
"centerFrequency") || force) {
1461 if (deviceSettingsKeys.contains(
"devSampleRate") || force) {
1464 if (deviceSettingsKeys.contains(
"extClock") || force) {
1467 if (deviceSettingsKeys.contains(
"extClockFreq") || force) {
1470 if (deviceSettingsKeys.contains(
"gain") || force) {
1473 if (deviceSettingsKeys.contains(
"log2HardInterp") || force) {
1476 if (deviceSettingsKeys.contains(
"log2SoftInterp") || force) {
1479 if (deviceSettingsKeys.contains(
"lpfBW") || force) {
1482 if (deviceSettingsKeys.contains(
"lpfFIREnable") || force) {
1485 if (deviceSettingsKeys.contains(
"lpfFIRBW") || force) {
1488 if (deviceSettingsKeys.contains(
"ncoEnable") || force) {
1491 if (deviceSettingsKeys.contains(
"ncoFrequency") || force) {
1494 if (deviceSettingsKeys.contains(
"transverterDeltaFrequency") || force) {
1497 if (deviceSettingsKeys.contains(
"transverterMode") || force) {
1500 if (deviceSettingsKeys.contains(
"gpioDir") || force) {
1503 if (deviceSettingsKeys.contains(
"gpioPins") || force) {
1507 QString deviceSettingsURL = QString(
"http://%1:%2/sdrangel/deviceset/%3/device/settings")
1512 m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader,
"application/json");
1514 QBuffer *buffer=
new QBuffer();
1515 buffer->open((QBuffer::ReadWrite));
1516 buffer->write(swgDeviceSettings->
asJson().toUtf8());
1522 delete swgDeviceSettings;
1532 QString deviceSettingsURL = QString(
"http://%1:%2/sdrangel/deviceset/%3/device/run")
1537 m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader,
"application/json");
1539 QBuffer *buffer=
new QBuffer();
1540 buffer->open((QBuffer::ReadWrite));
1541 buffer->write(swgDeviceSettings->
asJson().toUtf8());
1550 delete swgDeviceSettings;
1555 QNetworkReply::NetworkError replyError = reply->error();
1559 qWarning() <<
"LimeSDROutput::networkManagerFinished:" 1560 <<
" error(" << (int) replyError
1561 <<
"): " << replyError
1562 <<
": " << reply->errorString();
1566 QString answer = reply->readAll();
1568 qDebug(
"LimeSDROutput::networkManagerFinished: reply:\n%s", answer.toStdString().c_str());
qint32 getDevSampleRate()
LimeSDROutputThread * m_limeSDROutputThread
uint64_t getCenterFrequency() const
virtual quint64 getCenterFrequency() const
Center frequency exposed by the sink.
#define LIMESDROUTPUT_BLOCKSIZE
bool startDeviceEngine()
Start the device engine corresponding to the stream type.
qint32 getTransverterMode()
int m_ncoFrequency
Actual NCO frequency (the resulting frequency with mixing is displayed)
void setLimeSdrOutputReport(SWGLimeSdrOutputReport *lime_sdr_output_report)
int m_channel
logical device channel number (-1 if none)
virtual QByteArray serialize() const
void push(Message *message, bool emitSignal=true)
Push message onto queue.
uint32_t getHWLog2Interp() const
void stopDeviceEngine()
Stop the device engine corresponding to the stream type.
DeviceLimeSDRShared m_deviceShared
void setLpfBw(qint32 lpf_bw)
void networkManagerFinished(QNetworkReply *reply)
void setStreamActive(qint32 stream_active)
void setReverseApiDeviceIndex(qint32 reverse_api_device_index)
virtual void setCenterFrequency(qint64 centerFrequency)
static MsgReportBuddyChange * create(int devSampleRate, int log2HardDecimInterp, uint64_t centerFrequency, bool rxElseTx)
const std::vector< DeviceAPI * > & getSinkBuddies() const
virtual void stopWork()=0
virtual void startWork()=0
void setReverseApiAddress(QString *reverse_api_address)
virtual QString asJson() override
MessageQueue * getDeviceEngineInputMessageQueue()
Device engine message queue.
static bool setTxAntennaPath(lms_device_t *device, std::size_t chan, int path)
SWGLimeSdrOutputSettings * getLimeSdrOutputSettings()
lms_device_t * getDevice()
void setLpfFirEnable(qint32 lpf_fir_enable)
uint32_t m_extClockFreq
Frequency (Hz) of external clock source.
lms_range_t m_srRangeTx
DAC sample rate range.
void setDroppedPacketsCount(qint32 dropped_packets_count)
uint32_t getDeviceItemIndex() const
uint32_t m_nbTxChannels
number of Tx channels (normally 2, we'll see if we really use it...)
virtual int webapiSettingsPutPatch(bool force, const QStringList &deviceSettingsKeys, SWGSDRangel::SWGDeviceSettings &response, QString &errorMessage)
qint32 getReverseApiDeviceIndex()
virtual int webapiRunGet(SWGSDRangel::SWGDeviceState &response, QString &errorMessage)
bool getStartStop() const
bool initDeviceEngine()
Init the device engine corresponding to the stream type.
uint16_t m_reverseAPIDeviceIndex
void setTemperature(float temperature)
void setLog2SoftInterp(qint32 log2_soft_interp)
void webapiReverseSendStartStop(bool start)
void setLog2Interpolation(unsigned int log2_ioterp)
QNetworkRequest m_networkRequest
void setOriginatorIndex(qint32 originator_index)
int m_log2OvSRTx
log2 of Tx oversampling (0..5)
uint16_t m_reverseAPIPort
void setExtClockFreq(qint32 ext_clock_freq)
void setUnderrunCount(qint32 underrun_count)
void setGpioPins(qint32 gpio_pins)
virtual int webapiRun(bool run, SWGSDRangel::SWGDeviceState &response, QString &errorMessage)
MessageQueue m_inputMessageQueue
Input queue to the sink.
void setLpfFirbw(qint32 lpf_firbw)
int getLog2HardDecimInterp() const
void webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport &response)
void setNcoEnable(qint32 nco_enable)
qint64 getTransverterDeltaFrequency()
void getSRRange(float &minF, float &maxF) const
bool applySettings(const LimeSDROutputSettings &settings, bool force=false, bool forceNCOFrequency=false)
std::size_t getChannelIndex()
int getDeviceSetIndex() const
void getLPRange(float &minF, float &maxF) const
virtual int getSampleRate() const
Sample rate exposed by the sink.
virtual void init()
initializations to be done when all collaborating objects are created and possibly connected ...
void * getBuddySharedPtr() const
void setGpioDir(qint32 gpio_dir)
#define MESSAGE_CLASS_DEFINITION(Name, BaseClass)
bool m_threadWasRunning
flag to know if thread needs to be resumed after suspend
void getLORange(float &minF, float &maxF) const
bool deserialize(const QByteArray &data)
static MsgStartStop * create(bool startStop)
void setExtClock(qint32 ext_clock)
QString * getReverseApiAddress()
void webapiReverseSendSettings(QList< QString > &deviceSettingsKeys, const LimeSDROutputSettings &settings, bool force)
virtual int webapiReportGet(SWGSDRangel::SWGDeviceReport &response, QString &errorMessage)
void setBuddySharedPtr(void *ptr)
bool m_ncoEnable
Enable TSP NCO and mixing.
qint32 getReverseApiPort()
virtual bool deserialize(const QByteArray &data)
static bool match(const Message *message)
void setTransverterDeltaFrequency(qint64 transverter_delta_frequency)
qint32 getLog2SoftInterp()
void setGain(qint32 gain)
QByteArray serialize() const
static bool setNCOFrequency(lms_device_t *device, bool dir_tx, std::size_t chan, bool enable, float frequency)
void setFifoSize(qint32 fifo_size)
void setLinkRate(float link_rate)
uint8_t m_gpioPins
GPIO pins to write; LSB first.
void setLimeSdrOutputSettings(SWGLimeSdrOutputSettings *lime_sdr_output_settings)
uint8_t getGPIODir() const
void setGpioDir(qint32 gpio_dir)
float m_sampleRate
ADC/DAC sample rate.
static const float m_sampleFifoLengthInSeconds
void setHwTimestamp(qint32 hw_timestamp)
qint64 m_transverterDeltaFrequency
static const int m_sampleFifoMinSize
lms_range_t m_lpfRangeTx
Low pass filter range information (Tx side)
void getDeviceEngineStateStr(QString &state)
void resize(uint32_t size)
void setLog2HardInterp(qint32 log2_hard_interp)
const QString & getSamplingDeviceSerial() const
void setUseReverseApi(qint32 use_reverse_api)
SWGLimeSdrOutputReport * getLimeSdrOutputReport()
LimeType m_type
Hardware type.
QString m_reverseAPIAddress
static MsgReportStreamInfo * create(bool success, bool active, uint32_t fifoFilledCount, uint32_t fifoSize, uint32_t underrun, uint32_t overrun, uint32_t droppedPackets, float linkRate, uint64_t timestamp)
virtual bool handleMessage(const Message &message)
uint8_t m_gpioDir
GPIO pin direction LSB first; 0 input, 1 output.
void setSuccess(qint32 success)
uint64_t m_centerFrequency
bool m_extClock
True if external clock source.
uint64_t m_centerFrequency
QNetworkAccessManager * m_networkManager
SampleSourceFifo m_sampleSourceFifo
void setReverseApiPort(qint32 reverse_api_port)
uint8_t getGPIOPins() const
bool m_lpfFIREnable
Enable LMS digital lowpass FIR filters.
const std::vector< DeviceAPI * > & getSourceBuddies() const
static bool setClockSource(lms_device_t *device, bool extClock, uint32_t extClockFrequency)
uint32_t m_gain
Optimally distributed gain (dB)
float m_lpfBW
LMS amalog lowpass filter bandwidth (Hz)
void setGpioPins(qint32 gpio_pins)
virtual bool isRunning()=0
DeviceLimeSDRParams * m_deviceParams
unique hardware device parameters
uint32_t m_log2SoftInterp
void setDevSampleRate(qint32 dev_sample_rate)
qint32 getLog2HardInterp()
qint64 getCenterFrequency()
float m_lpfFIRBW
LMS digital lowpass FIR filters bandwidth (Hz)
uint32_t getExtClockFeq() const
bool open(lms_info_str_t deviceStr)
lms_range_t m_loRangeTx
LO range for Tx.
DeviceLimeSDRParams::LimeType getLimeType() const
void setCenterFrequency(qint64 center_frequency)
uint32_t m_log2HardInterp
MessageQueue * getMessageQueueToGUI()
void setFifoFill(qint32 fifo_fill)
int getDevSampleRate() const
LimeSDROutputSettings m_settings
void setNcoFrequency(qint32 nco_frequency)
ThreadInterface * m_thread
holds the thread address if started else 0
void setDirection(qint32 direction)
void setTransverterMode(qint32 transverter_mode)
qint32 getUseReverseApi()
virtual const QString & getDeviceDescription() const
static MsgReportGPIOChange * create(uint8_t gpioDir, uint8_t gpioPins)
MessageQueue * m_guiMessageQueue
Input message queue to the GUI.
QString m_deviceDescription
void setAntennaPath(qint32 antenna_path)
T max(const T &x, const T &y)
virtual int webapiSettingsGet(SWGSDRangel::SWGDeviceSettings &response, QString &errorMessage)
void setDeviceHwType(QString *device_hw_type)
void webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings &response, const LimeSDROutputSettings &settings)
void setOverrunCount(qint32 overrun_count)
MessageQueue * getSamplingDeviceGUIMessageQueue()
Sampling device (ex: single Tx) GUI input message queue.
static MsgReportClockSourceChange * create(bool extClock, uint32_t m_extClockFreq)
static MsgReportDeviceInfo * create(float temperature, uint8_t gpioPins)