1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-09-27 07:16:48 -04:00

Deep redesign: fixed RTLSDR input plugin

This commit is contained in:
f4exb 2015-08-26 02:03:20 +02:00
parent a68104ab65
commit 5a0668f9ec
12 changed files with 102 additions and 46 deletions

View File

@ -42,6 +42,7 @@ public:
MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; }
MessageQueue *getOutputMessageQueue() { return &m_outputMessageQueue; }
MessageQueue *getOutputMessageQueueToGUI() { return &m_outputMessageQueueToGUI; }
SampleFifo* getSampleFifo() { return &m_sampleFifo; }
protected slots:
@ -49,8 +50,9 @@ protected slots:
protected:
SampleFifo m_sampleFifo;
MessageQueue m_inputMessageQueue;
MessageQueue m_outputMessageQueue;
MessageQueue m_inputMessageQueue; //!< Input queue to the source
MessageQueue m_outputMessageQueue; //!< Generic output queue
MessageQueue m_outputMessageQueueToGUI; //!< Output queue specialized for the source GUI
};
#endif // INCLUDE_SAMPLESOURCE_H

View File

@ -20,7 +20,7 @@
#include <QObject>
#include "plugin/plugininterface.h"
class BlderfPlugin : public QObject, PluginInterface {
class BlderfPlugin : public QObject, public PluginInterface {
Q_OBJECT
Q_INTERFACES(PluginInterface)
Q_PLUGIN_METADATA(IID "org.osmocom.sdr.samplesource.bladerf")

View File

@ -4,7 +4,7 @@
#include <QObject>
#include "plugin/plugininterface.h"
class FCDPlugin : public QObject, PluginInterface {
class FCDPlugin : public QObject, public PluginInterface {
Q_OBJECT
Q_INTERFACES(PluginInterface)
Q_PLUGIN_METADATA(IID "org.osmocom.sdr.samplesource.fcd")

View File

@ -109,6 +109,11 @@ void FileSourceInput::openFileStream()
getOutputMessageQueue()->push(report);
}
bool FileSourceInput::init(const Message& message)
{
return false;
}
bool FileSourceInput::start(int device)
{
QMutexLocker mutexLocker(&m_mutex);

View File

@ -20,7 +20,7 @@
#include <QObject>
#include "plugin/plugininterface.h"
class FileSourcePlugin : public QObject, PluginInterface {
class FileSourcePlugin : public QObject, public PluginInterface {
Q_OBJECT
Q_INTERFACES(PluginInterface)
Q_PLUGIN_METADATA(IID "org.osmocom.sdr.samplesource.filesource")

View File

@ -1,3 +1,4 @@
#include <QDebug>
#include "rtlsdrgui.h"
#include "ui_rtlsdrgui.h"
#include "plugin/pluginapi.h"
@ -18,6 +19,7 @@ RTLSDRGui::RTLSDRGui(PluginAPI* pluginAPI, QWidget* parent) :
displaySettings();
m_sampleSource = new RTLSDRInput();
connect(m_sampleSource->getOutputMessageQueueToGUI(), SIGNAL(messageEnqueued()), this, SLOT(HandleSourceMessages()));
DSPEngine::instance()->setSource(m_sampleSource);
}
@ -77,6 +79,7 @@ bool RTLSDRGui::handleMessage(const Message& message)
{
if (RTLSDRInput::MsgReportRTLSDR::match(message))
{
qDebug() << "RTLSDRGui::handleMessage: MsgReportRTLSDR";
m_gains = ((RTLSDRInput::MsgReportRTLSDR&) message).getGains();
displaySettings();
return true;
@ -87,6 +90,21 @@ bool RTLSDRGui::handleMessage(const Message& message)
}
}
void RTLSDRGui::HandleSourceMessages()
{
Message* message;
while ((message = m_sampleSource->getOutputMessageQueueToGUI()->pop()) != 0)
{
qDebug("RTLSDRGui::HandleSourceMessages: message: %s", message->getIdentifier());
if (handleMessage(*message))
{
delete message;
}
}
}
void RTLSDRGui::displaySettings()
{
ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000);
@ -219,8 +237,8 @@ void RTLSDRGui::on_checkBox_stateChanged(int state)
sendSettings();
}
unsigned int RTLSDRSampleRates::m_rates[] = {288, 1024, 1536, 1152, 2048, 2500 };
unsigned int RTLSDRSampleRates::m_nb_rates = 6;
unsigned int RTLSDRSampleRates::m_rates[] = {288, 1152, 1536, 2304};
unsigned int RTLSDRSampleRates::m_nb_rates = 4;
unsigned int RTLSDRSampleRates::getRate(unsigned int rate_index)
{

View File

@ -49,6 +49,7 @@ private slots:
void on_samplerate_valueChanged(int value);
void on_checkBox_stateChanged(int state);
void updateHardware();
void HandleSourceMessages();
};
class RTLSDRSampleRates {

View File

@ -15,6 +15,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include <QDebug>
#include <string.h>
#include <errno.h>
#include "rtlsdrinput.h"
@ -94,6 +95,11 @@ RTLSDRInput::~RTLSDRInput()
stop();
}
bool RTLSDRInput::init(const Message& message)
{
return false;
}
bool RTLSDRInput::start(int device)
{
QMutexLocker mutexLocker(&m_mutex);
@ -111,13 +117,13 @@ bool RTLSDRInput::start(int device)
if (!m_sampleFifo.setSize(96000 * 4))
{
qCritical("Could not allocate SampleFifo");
qCritical("RTLSDRInput::start: Could not allocate SampleFifo");
return false;
}
if ((res = rtlsdr_open(&m_dev, device)) < 0)
{
qCritical("could not open RTLSDR #%d: %s", device, strerror(errno));
qCritical("RTLSDRInput::start: could not open RTLSDR #%d: %s", device, strerror(errno));
return false;
}
@ -127,31 +133,31 @@ bool RTLSDRInput::start(int device)
if ((res = rtlsdr_get_usb_strings(m_dev, vendor, product, serial)) < 0)
{
qCritical("error accessing USB device");
qCritical("RTLSDRInput::start: error accessing USB device");
stop();
return false;
}
qWarning("RTLSDRInput open: %s %s, SN: %s", vendor, product, serial);
qWarning("RTLSDRInput::start: open: %s %s, SN: %s", vendor, product, serial);
m_deviceDescription = QString("%1 (SN %2)").arg(product).arg(serial);
if ((res = rtlsdr_set_sample_rate(m_dev, 1024000)) < 0)
if ((res = rtlsdr_set_sample_rate(m_dev, 1152000)) < 0)
{
qCritical("could not set sample rate: 1024k S/s");
qCritical("RTLSDRInput::start: could not set sample rate: 1024k S/s");
stop();
return false;
}
if ((res = rtlsdr_set_tuner_gain_mode(m_dev, 1)) < 0)
{
qCritical("error setting tuner gain mode");
qCritical("RTLSDRInput::start: error setting tuner gain mode");
stop();
return false;
}
if ((res = rtlsdr_set_agc_mode(m_dev, 0)) < 0)
{
qCritical("error setting agc mode");
qCritical("RTLSDRInput::start: error setting agc mode");
stop();
return false;
}
@ -160,7 +166,7 @@ bool RTLSDRInput::start(int device)
if (numberOfGains < 0)
{
qCritical("error getting number of gain values supported");
qCritical("RTLSDRInput::start: error getting number of gain values supported");
stop();
return false;
}
@ -169,21 +175,27 @@ bool RTLSDRInput::start(int device)
if (rtlsdr_get_tuner_gains(m_dev, &m_gains[0]) < 0)
{
qCritical("error getting gain values");
qCritical("RTLSDRInput::start: error getting gain values");
stop();
return false;
}
else
{
qDebug() << "RTLSDRInput::start: " << m_gains.size() << "gains";
MsgReportRTLSDR *message = MsgReportRTLSDR::create(m_gains);
getOutputMessageQueueToGUI()->push(message);
}
if ((res = rtlsdr_reset_buffer(m_dev)) < 0)
{
qCritical("could not reset USB EP buffers: %s", strerror(errno));
qCritical("RTLSDRInput::start: could not reset USB EP buffers: %s", strerror(errno));
stop();
return false;
}
if ((m_rtlSDRThread = new RTLSDRThread(m_dev, &m_sampleFifo)) == NULL)
{
qFatal("out of memory");
qFatal("RTLSDRInput::start: out of memory");
stop();
return false;
}
@ -194,11 +206,6 @@ bool RTLSDRInput::start(int device)
applySettings(m_settings, true);
qDebug("RTLSDRInput::start");
MsgReportRTLSDR *message = MsgReportRTLSDR::create(m_gains);
getOutputMessageQueue()->push(message);
return true;
}

View File

@ -4,7 +4,7 @@
#include <QObject>
#include "plugin/plugininterface.h"
class RTLSDRPlugin : public QObject, PluginInterface {
class RTLSDRPlugin : public QObject, public PluginInterface {
Q_OBJECT
Q_INTERFACES(PluginInterface)
Q_PLUGIN_METADATA(IID "org.osmocom.sdr.samplesource.rtl-sdr")

View File

@ -614,7 +614,7 @@ void DSPEngine::handleInputMessages()
while ((message = m_inputMessageQueue.pop()) != 0)
{
qDebug(" - message: %s", message->getIdentifier());
qDebug("DSPEngine::handleInputMessages: message: %s", message->getIdentifier());
if (DSPConfigureCorrection::match(*message))
{
@ -635,9 +635,9 @@ void DSPEngine::handleInputMessages()
m_qRange = 1 << 16;
m_imbalance = 65536;
}
}
delete message;
delete message;
}
}
}
@ -645,12 +645,14 @@ void DSPEngine::handleSourceMessages()
{
Message *message;
qDebug() << "DSPEngine::handleSourceMessages";
while ((message = m_sampleSource->getOutputMessageQueue()->pop()) != 0)
{
qDebug() << "DSPEngine::handleSourceMessages: " << message->getIdentifier();
if (DSPSignalNotification::match(*message))
{
qDebug() << "DSPEngine::handleSourceMessages: process DSPSignalNotification";
DSPSignalNotification *notif = (DSPSignalNotification *) message;
// update DSP values
@ -678,9 +680,9 @@ void DSPEngine::handleSourceMessages()
DSPSignalNotification* rep = new DSPSignalNotification(*notif); // make a copy for the output queue
m_outputMessageQueue.push(rep);
}
delete message;
delete message;
}
}
}

View File

@ -93,6 +93,8 @@ MainWindow::MainWindow(QWidget* parent) :
m_masterTimer.start(50);
qDebug() << "MainWindow::MainWindow: m_pluginManager->loadPlugins ...";
m_pluginManager->loadPlugins();
bool sampleSourceSignalsBlocked = ui->sampleSource->blockSignals(true);
@ -347,9 +349,9 @@ void MainWindow::handleDSPMessages()
updateSampleRate();
qDebug() << "MainWindow::handleDSPMessages: forward to file sink";
m_fileSink->handleMessage(*notif);
}
delete message;
delete message;
}
}
}

View File

@ -28,13 +28,16 @@ PluginManager::~PluginManager()
void PluginManager::loadPlugins()
{
qDebug() << "PluginManager::loadPlugins: " << qPrintable(QApplication::instance()->applicationDirPath());
QDir pluginsDir = QDir(QApplication::instance()->applicationDirPath());
loadPlugins(pluginsDir);
qSort(m_plugins);
for(Plugins::const_iterator it = m_plugins.begin(); it != m_plugins.end(); ++it) {
for (Plugins::const_iterator it = m_plugins.begin(); it != m_plugins.end(); ++it)
{
it->plugin->initPlugin(&m_pluginAPI);
}
@ -321,22 +324,38 @@ void PluginManager::loadPlugins(const QDir& dir)
foreach (QString fileName, pluginsDir.entryList(QDir::Files))
{
QPluginLoader* loader = new QPluginLoader(pluginsDir.absoluteFilePath(fileName));
PluginInterface* plugin = qobject_cast<PluginInterface*>(loader->instance());
if (fileName.endsWith(".so"))
{
qDebug() << "PluginManager::loadPlugins: fileName: " << qPrintable(fileName);
if (loader->isLoaded()) {
qWarning("loaded plugin %s", qPrintable(fileName));
}
QPluginLoader* loader = new QPluginLoader(pluginsDir.absoluteFilePath(fileName));
PluginInterface* plugin = qobject_cast<PluginInterface*>(loader->instance());
if (plugin != NULL) {
m_plugins.append(Plugin(fileName, loader, plugin));
} else {
loader->unload();
delete loader;
if (loader->isLoaded())
{
qWarning("PluginManager::loadPlugins: loaded plugin %s", qPrintable(fileName));
}
else
{
qWarning() << "PluginManager::loadPlugins: " << qPrintable(loader->errorString());
}
if (plugin != 0)
{
m_plugins.append(Plugin(fileName, loader, plugin));
}
else
{
loader->unload();
delete loader;
}
}
}
foreach (QString dirName, pluginsDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
// recursive calls on subdirectories
foreach (QString dirName, pluginsDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
{
loadPlugins(pluginsDir.absoluteFilePath(dirName));
}
}