diff --git a/Readme.md b/Readme.md index a6ddeed90..b3d437675 100644 --- a/Readme.md +++ b/Readme.md @@ -99,6 +99,22 @@ If you use your own location for librtlsdr install directory you need to specify `-DLIBRTLSDR_LIBRARIES=/opt/install/librtlsdr/lib/librtlsdr.so -DLIBRTLSDR_INCLUDE_DIR=/opt/install/librtlsdr/include` +

Plugins for special devices

+ +

File input

+ +The file input plugin allows the playback of a recorded IQ file. Such a file is obtained using the recording feature. Press F7 to start recording and F8 to stop. The file has a fixed name `test.sdriq` created in the current directory. + +Note that this plugin does not require any of the hardware support libraries nor the libusb library. It is alwasys available in the list of devices as `FileSource[0]` even if no physical device is connected. + +

SDRdaemon input

+ +Warning: this is experimental is buggy (algorithm to retrieve samples is flawed). + +This is the client side of the SDRdaemon server. See the [SDRdaemon](https://github.com/f4exb/sdrdaemon) project in this Github repository. You must specify the address and UDP port to which the server connects and samples will flow into the SDRangel application (default is `127.0.0.1`port `9090`). It uses the meta data to retrieve the sample flow characteristics such as sample rate and receiveng center frequency. + +Note that this plugin does not require any of the hardware support libraries nor the libusb library. It is alwasys available in the list of devices as `SDRdaemon[0]` even if no physical device is connected. +

Software build

Ubuntu

diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp index 6584de777..1e1198d61 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp +++ b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp @@ -223,7 +223,7 @@ void SDRdaemonBuffer::writeToRawBufferUncompressed(const char *array, uint32_t l { std::memcpy((void *) &m_rawBuffer[m_rawCount], (const void *) array, m_rawSize - m_rawCount); m_rawCount = length - (m_rawSize - m_rawCount); - std::memcpy((void *) m_rawBuffer, (const void *) array, m_rawCount); + std::memcpy((void *) m_rawBuffer, (const void *) &array[m_rawSize - m_rawCount], m_rawCount); } } diff --git a/plugins/samplesource/sdrdaemon/sdrdaemongui.cpp b/plugins/samplesource/sdrdaemon/sdrdaemongui.cpp index a9bebf701..93dbfbfc7 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemongui.cpp +++ b/plugins/samplesource/sdrdaemon/sdrdaemongui.cpp @@ -40,6 +40,8 @@ SDRdaemonGui::SDRdaemonGui(PluginAPI* pluginAPI, QWidget* parent) : m_centerFrequency(0), m_samplesCount(0), m_tickCount(0), + m_address("127.0.0.1"), + m_port(9090), m_dcBlock(false), m_iqCorrection(false) { @@ -80,6 +82,10 @@ QString SDRdaemonGui::getName() const void SDRdaemonGui::resetToDefaults() { + m_address = "127.0.0.1"; + m_port = 9090; + m_dcBlock = false; + m_iqCorrection = false; displaySettings(); } @@ -87,12 +93,18 @@ QByteArray SDRdaemonGui::serialize() const { bool ok; SimpleSerializer s(1); + s.writeString(1, ui->address->text()); uint32_t uintval = ui->port->text().toInt(&ok); + if((!ok) || (uintval < 1024) || (uintval > 65535)) { uintval = 9090; } + s.writeU32(2, uintval); + s.writeBool(3, m_dcBlock); + s.writeBool(4, m_iqCorrection); + return s.final(); } @@ -110,24 +122,27 @@ bool SDRdaemonGui::deserialize(const QByteArray& data) if(d.getVersion() == 1) { uint32_t uintval; - d.readString(1, &address, "127.0.0.1"); + d.readString(1, &m_address, "127.0.0.1"); d.readU32(2, &uintval, 9090); + if ((uintval > 1024) && (uintval < 65536)) { - port = uintval; + m_port = uintval; } else { - port = 9090; + m_port = 9090; } + + d.readBool(3, &m_dcBlock, false); + d.readBool(4, &m_iqCorrection, false); + return true; } else { resetToDefaults(); return false; } - ui->address->setText(address); - ui->port->setText(QString::number(port)); + displaySettings(); } - qint64 SDRdaemonGui::getCenterFrequency() const { return m_centerFrequency; @@ -186,17 +201,12 @@ void SDRdaemonGui::handleSourceMessages() void SDRdaemonGui::displaySettings() { + ui->address->setText(m_address); + ui->port->setText(QString::number(m_port)); ui->dcOffset->setChecked(m_dcBlock); ui->iqImbalance->setChecked(m_iqCorrection); } -/* -void SDRdaemonGui::on_play_toggled(bool checked) -{ - SDRdaemonInput::MsgConfigureSDRdaemonWork* message = SDRdaemonInput::MsgConfigureSDRdaemonWork::create(checked); - m_sampleSource->getInputMessageQueue()->push(message); -}*/ - void SDRdaemonGui::on_applyButton_clicked(bool checked) { configureUDPLink(); @@ -207,8 +217,7 @@ void SDRdaemonGui::on_dcOffset_toggled(bool checked) if (m_dcBlock != checked) { m_dcBlock = checked; - SDRdaemonInput::MsgConfigureSDRdaemonAutoCorr* message = SDRdaemonInput::MsgConfigureSDRdaemonAutoCorr::create(m_dcBlock, m_iqCorrection); - m_sampleSource->getInputMessageQueue()->push(message); + configureAutoCorrections(); } } @@ -217,8 +226,7 @@ void SDRdaemonGui::on_iqImbalance_toggled(bool checked) if (m_iqCorrection != checked) { m_iqCorrection = checked; - SDRdaemonInput::MsgConfigureSDRdaemonAutoCorr* message = SDRdaemonInput::MsgConfigureSDRdaemonAutoCorr::create(m_dcBlock, m_iqCorrection); - m_sampleSource->getInputMessageQueue()->push(message); + configureAutoCorrections(); } } @@ -240,6 +248,12 @@ void SDRdaemonGui::configureUDPLink() m_sampleSource->getInputMessageQueue()->push(message); } +void SDRdaemonGui::configureAutoCorrections() +{ + SDRdaemonInput::MsgConfigureSDRdaemonAutoCorr* message = SDRdaemonInput::MsgConfigureSDRdaemonAutoCorr::create(m_dcBlock, m_iqCorrection); + m_sampleSource->getInputMessageQueue()->push(message); +} + void SDRdaemonGui::updateWithAcquisition() { } @@ -267,3 +281,4 @@ void SDRdaemonGui::tick() m_sampleSource->getInputMessageQueue()->push(message); } } + diff --git a/plugins/samplesource/sdrdaemon/sdrdaemongui.h b/plugins/samplesource/sdrdaemon/sdrdaemongui.h index baa640374..3760f7c12 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemongui.h +++ b/plugins/samplesource/sdrdaemon/sdrdaemongui.h @@ -60,12 +60,15 @@ private: int m_samplesCount; std::size_t m_tickCount; + QString m_address; + quint16 m_port; bool m_dcBlock; bool m_iqCorrection; void displaySettings(); void displayTime(); void configureUDPLink(); + void configureAutoCorrections(); void updateWithAcquisition(); void updateWithStreamData(); void updateWithStreamTime();