mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-03 21:20:31 -05: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