mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-05-29 21:42:26 -04:00
Update threading model in Demod Analyzer feature. Part of #1346
This commit is contained in:
parent
dc04245a6d
commit
4bae584a9d
@ -48,15 +48,15 @@ const char* const DemodAnalyzer::m_featureId = "DemodAnalyzer";
|
|||||||
|
|
||||||
DemodAnalyzer::DemodAnalyzer(WebAPIAdapterInterface *webAPIAdapterInterface) :
|
DemodAnalyzer::DemodAnalyzer(WebAPIAdapterInterface *webAPIAdapterInterface) :
|
||||||
Feature(m_featureIdURI, webAPIAdapterInterface),
|
Feature(m_featureIdURI, webAPIAdapterInterface),
|
||||||
|
m_thread(nullptr),
|
||||||
|
m_running(false),
|
||||||
|
m_worker(nullptr),
|
||||||
m_spectrumVis(SDR_RX_SCALEF),
|
m_spectrumVis(SDR_RX_SCALEF),
|
||||||
m_selectedChannel(nullptr),
|
m_selectedChannel(nullptr),
|
||||||
m_dataPipe(nullptr)
|
m_dataPipe(nullptr)
|
||||||
{
|
{
|
||||||
qDebug("DemodAnalyzer::DemodAnalyzer: webAPIAdapterInterface: %p", webAPIAdapterInterface);
|
qDebug("DemodAnalyzer::DemodAnalyzer: webAPIAdapterInterface: %p", webAPIAdapterInterface);
|
||||||
setObjectName(m_featureId);
|
setObjectName(m_featureId);
|
||||||
m_worker = new DemodAnalyzerWorker();
|
|
||||||
m_worker->moveToThread(&m_thread);
|
|
||||||
m_worker->setScopeVis(&m_scopeVis);
|
|
||||||
m_state = StIdle;
|
m_state = StIdle;
|
||||||
m_errorMessage = "DemodAnalyzer error";
|
m_errorMessage = "DemodAnalyzer error";
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
@ -77,22 +77,46 @@ DemodAnalyzer::~DemodAnalyzer()
|
|||||||
&DemodAnalyzer::networkManagerFinished
|
&DemodAnalyzer::networkManagerFinished
|
||||||
);
|
);
|
||||||
delete m_networkManager;
|
delete m_networkManager;
|
||||||
if (m_worker->isRunning()) {
|
stop();
|
||||||
stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
delete m_worker;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DemodAnalyzer::start()
|
void DemodAnalyzer::start()
|
||||||
{
|
{
|
||||||
qDebug("DemodAnalyzer::start");
|
QMutexLocker m_lock(&m_mutex);
|
||||||
|
|
||||||
|
if (m_running) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug("DemodAnalyzer::start");
|
||||||
|
m_thread = new QThread();
|
||||||
|
m_worker = new DemodAnalyzerWorker();
|
||||||
|
m_worker->moveToThread(m_thread);
|
||||||
|
|
||||||
|
QObject::connect(
|
||||||
|
m_thread,
|
||||||
|
&QThread::started,
|
||||||
|
m_worker,
|
||||||
|
&DemodAnalyzerWorker::startWork
|
||||||
|
);
|
||||||
|
QObject::connect(
|
||||||
|
m_thread,
|
||||||
|
&QThread::finished,
|
||||||
|
m_worker,
|
||||||
|
&QObject::deleteLater
|
||||||
|
);
|
||||||
|
QObject::connect(
|
||||||
|
m_thread,
|
||||||
|
&QThread::finished,
|
||||||
|
m_thread,
|
||||||
|
&QThread::deleteLater
|
||||||
|
);
|
||||||
|
|
||||||
|
m_worker->setScopeVis(&m_scopeVis);
|
||||||
m_worker->setMessageQueueToFeature(getInputMessageQueue());
|
m_worker->setMessageQueueToFeature(getInputMessageQueue());
|
||||||
m_worker->reset();
|
m_worker->startWork();
|
||||||
bool ok = m_worker->startWork();
|
m_state = StRunning;
|
||||||
m_state = ok ? StRunning : StError;
|
m_thread->start();
|
||||||
m_thread.start();
|
|
||||||
|
|
||||||
DemodAnalyzerWorker::MsgConfigureDemodAnalyzerWorker *msg
|
DemodAnalyzerWorker::MsgConfigureDemodAnalyzerWorker *msg
|
||||||
= DemodAnalyzerWorker::MsgConfigureDemodAnalyzerWorker::create(m_settings, true);
|
= DemodAnalyzerWorker::MsgConfigureDemodAnalyzerWorker::create(m_settings, true);
|
||||||
@ -108,11 +132,20 @@ void DemodAnalyzer::start()
|
|||||||
m_worker->getInputMessageQueue()->push(msg);
|
m_worker->getInputMessageQueue()->push(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_running = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DemodAnalyzer::stop()
|
void DemodAnalyzer::stop()
|
||||||
{
|
{
|
||||||
|
QMutexLocker m_lock(&m_mutex);
|
||||||
|
|
||||||
|
if (!m_running) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
qDebug("DemodAnalyzer::stop");
|
qDebug("DemodAnalyzer::stop");
|
||||||
|
m_running = false;
|
||||||
|
|
||||||
if (m_dataPipe)
|
if (m_dataPipe)
|
||||||
{
|
{
|
||||||
@ -127,13 +160,13 @@ void DemodAnalyzer::stop()
|
|||||||
|
|
||||||
m_worker->stopWork();
|
m_worker->stopWork();
|
||||||
m_state = StIdle;
|
m_state = StIdle;
|
||||||
m_thread.quit();
|
m_thread->quit();
|
||||||
m_thread.wait();
|
m_thread->wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
double DemodAnalyzer::getMagSqAvg() const
|
double DemodAnalyzer::getMagSqAvg() const
|
||||||
{
|
{
|
||||||
return m_worker->getMagSqAvg();
|
return m_running ? m_worker->getMagSqAvg() : 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DemodAnalyzer::handleMessage(const Message& cmd)
|
bool DemodAnalyzer::handleMessage(const Message& cmd)
|
||||||
@ -261,10 +294,14 @@ void DemodAnalyzer::applySettings(const DemodAnalyzerSettings& settings, bool fo
|
|||||||
reverseAPIKeys.append("rgbColor");
|
reverseAPIKeys.append("rgbColor");
|
||||||
}
|
}
|
||||||
|
|
||||||
DemodAnalyzerWorker::MsgConfigureDemodAnalyzerWorker *msg = DemodAnalyzerWorker::MsgConfigureDemodAnalyzerWorker::create(
|
if (m_running)
|
||||||
settings, force
|
{
|
||||||
);
|
DemodAnalyzerWorker::MsgConfigureDemodAnalyzerWorker *msg = DemodAnalyzerWorker::MsgConfigureDemodAnalyzerWorker::create(
|
||||||
m_worker->getInputMessageQueue()->push(msg);
|
settings, force
|
||||||
|
);
|
||||||
|
m_worker->getInputMessageQueue()->push(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (settings.m_useReverseAPI)
|
if (settings.m_useReverseAPI)
|
||||||
{
|
{
|
||||||
@ -343,7 +380,7 @@ void DemodAnalyzer::setChannel(ChannelAPI *selectedChannel)
|
|||||||
ObjectPipe *pipe = mainCore->getDataPipes().unregisterProducerToConsumer(m_selectedChannel, this, "demod");
|
ObjectPipe *pipe = mainCore->getDataPipes().unregisterProducerToConsumer(m_selectedChannel, this, "demod");
|
||||||
DataFifo *fifo = qobject_cast<DataFifo*>(pipe->m_element);
|
DataFifo *fifo = qobject_cast<DataFifo*>(pipe->m_element);
|
||||||
|
|
||||||
if ((fifo) && m_worker->isRunning())
|
if ((fifo) && m_running)
|
||||||
{
|
{
|
||||||
DemodAnalyzerWorker::MsgConnectFifo *msg = DemodAnalyzerWorker::MsgConnectFifo::create(fifo, false);
|
DemodAnalyzerWorker::MsgConnectFifo *msg = DemodAnalyzerWorker::MsgConnectFifo::create(fifo, false);
|
||||||
m_worker->getInputMessageQueue()->push(msg);
|
m_worker->getInputMessageQueue()->push(msg);
|
||||||
@ -369,7 +406,7 @@ void DemodAnalyzer::setChannel(ChannelAPI *selectedChannel)
|
|||||||
{
|
{
|
||||||
fifo->setSize(96000);
|
fifo->setSize(96000);
|
||||||
|
|
||||||
if (m_worker->isRunning())
|
if (m_running)
|
||||||
{
|
{
|
||||||
DemodAnalyzerWorker::MsgConnectFifo *msg = DemodAnalyzerWorker::MsgConnectFifo::create(fifo, true);
|
DemodAnalyzerWorker::MsgConnectFifo *msg = DemodAnalyzerWorker::MsgConnectFifo::create(fifo, true);
|
||||||
m_worker->getInputMessageQueue()->push(msg);
|
m_worker->getInputMessageQueue()->push(msg);
|
||||||
@ -633,7 +670,7 @@ void DemodAnalyzer::handleDataPipeToBeDeleted(int reason, QObject *object)
|
|||||||
{
|
{
|
||||||
DataFifo *fifo = qobject_cast<DataFifo*>(m_dataPipe->m_element);
|
DataFifo *fifo = qobject_cast<DataFifo*>(m_dataPipe->m_element);
|
||||||
|
|
||||||
if (fifo && m_worker->isRunning())
|
if ((fifo) && m_running)
|
||||||
{
|
{
|
||||||
DemodAnalyzerWorker::MsgConnectFifo *msg = DemodAnalyzerWorker::MsgConnectFifo::create(fifo, false);
|
DemodAnalyzerWorker::MsgConnectFifo *msg = DemodAnalyzerWorker::MsgConnectFifo::create(fifo, false);
|
||||||
m_worker->getInputMessageQueue()->push(msg);
|
m_worker->getInputMessageQueue()->push(msg);
|
||||||
|
@ -18,9 +18,9 @@
|
|||||||
#ifndef INCLUDE_FEATURE_DEMODANALYZER_H_
|
#ifndef INCLUDE_FEATURE_DEMODANALYZER_H_
|
||||||
#define INCLUDE_FEATURE_DEMODANALYZER_H_
|
#define INCLUDE_FEATURE_DEMODANALYZER_H_
|
||||||
|
|
||||||
#include <QThread>
|
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include <QNetworkRequest>
|
#include <QNetworkRequest>
|
||||||
|
#include <QRecursiveMutex>
|
||||||
|
|
||||||
#include "feature/feature.h"
|
#include "feature/feature.h"
|
||||||
#include "util/message.h"
|
#include "util/message.h"
|
||||||
@ -33,6 +33,7 @@ class WebAPIAdapterInterface;
|
|||||||
class DemodAnalyzerWorker;
|
class DemodAnalyzerWorker;
|
||||||
class QNetworkAccessManager;
|
class QNetworkAccessManager;
|
||||||
class QNetworkReply;
|
class QNetworkReply;
|
||||||
|
class QThread;
|
||||||
class ObjectPipe;
|
class ObjectPipe;
|
||||||
|
|
||||||
namespace SWGSDRangel {
|
namespace SWGSDRangel {
|
||||||
@ -195,7 +196,9 @@ public:
|
|||||||
static const char* const m_featureId;
|
static const char* const m_featureId;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QThread m_thread;
|
QThread *m_thread;
|
||||||
|
QRecursiveMutex m_mutex;
|
||||||
|
bool m_running;
|
||||||
DemodAnalyzerWorker *m_worker;
|
DemodAnalyzerWorker *m_worker;
|
||||||
DemodAnalyzerSettings m_settings;
|
DemodAnalyzerSettings m_settings;
|
||||||
SpectrumVis m_spectrumVis;
|
SpectrumVis m_spectrumVis;
|
||||||
|
@ -28,8 +28,7 @@ MESSAGE_CLASS_DEFINITION(DemodAnalyzerWorker::MsgConnectFifo, Message)
|
|||||||
DemodAnalyzerWorker::DemodAnalyzerWorker() :
|
DemodAnalyzerWorker::DemodAnalyzerWorker() :
|
||||||
m_dataFifo(nullptr),
|
m_dataFifo(nullptr),
|
||||||
m_msgQueueToFeature(nullptr),
|
m_msgQueueToFeature(nullptr),
|
||||||
m_sampleBufferSize(0),
|
m_sampleBufferSize(0)
|
||||||
m_running(false)
|
|
||||||
{
|
{
|
||||||
qDebug("DemodAnalyzerWorker::DemodAnalyzerWorker");
|
qDebug("DemodAnalyzerWorker::DemodAnalyzerWorker");
|
||||||
}
|
}
|
||||||
@ -45,19 +44,16 @@ void DemodAnalyzerWorker::reset()
|
|||||||
m_inputMessageQueue.clear();
|
m_inputMessageQueue.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DemodAnalyzerWorker::startWork()
|
void DemodAnalyzerWorker::startWork()
|
||||||
{
|
{
|
||||||
QMutexLocker mutexLocker(&m_mutex);
|
QMutexLocker mutexLocker(&m_mutex);
|
||||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||||
m_running = true;
|
|
||||||
return m_running;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DemodAnalyzerWorker::stopWork()
|
void DemodAnalyzerWorker::stopWork()
|
||||||
{
|
{
|
||||||
QMutexLocker mutexLocker(&m_mutex);
|
QMutexLocker mutexLocker(&m_mutex);
|
||||||
disconnect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
disconnect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||||
m_running = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DemodAnalyzerWorker::feedPart(
|
void DemodAnalyzerWorker::feedPart(
|
||||||
|
@ -86,9 +86,8 @@ public:
|
|||||||
DemodAnalyzerWorker();
|
DemodAnalyzerWorker();
|
||||||
~DemodAnalyzerWorker();
|
~DemodAnalyzerWorker();
|
||||||
void reset();
|
void reset();
|
||||||
bool startWork();
|
void startWork();
|
||||||
void stopWork();
|
void stopWork();
|
||||||
bool isRunning() const { return m_running; }
|
|
||||||
MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; }
|
MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; }
|
||||||
void setMessageQueueToFeature(MessageQueue *messageQueue) { m_msgQueueToFeature = messageQueue; }
|
void setMessageQueueToFeature(MessageQueue *messageQueue) { m_msgQueueToFeature = messageQueue; }
|
||||||
|
|
||||||
@ -122,7 +121,6 @@ private:
|
|||||||
int m_sampleBufferSize;
|
int m_sampleBufferSize;
|
||||||
MovingAverageUtil<double, double, 480> m_channelPowerAvg;
|
MovingAverageUtil<double, double, 480> m_channelPowerAvg;
|
||||||
ScopeVis* m_scopeVis;
|
ScopeVis* m_scopeVis;
|
||||||
bool m_running;
|
|
||||||
QRecursiveMutex m_mutex;
|
QRecursiveMutex m_mutex;
|
||||||
|
|
||||||
bool handleMessage(const Message& cmd);
|
bool handleMessage(const Message& cmd);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user