mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-07-07 11:25:22 -04:00
Update threading model in Simple VOR localizer feature. Part of #1346
This commit is contained in:
parent
b1e91e9dd2
commit
31edca0a6b
@ -48,11 +48,12 @@ const char* const VORLocalizer::m_featureIdURI = "sdrangel.feature.vorlocalizer"
|
|||||||
const char* const VORLocalizer::m_featureId = "VORLocalizer";
|
const char* const VORLocalizer::m_featureId = "VORLocalizer";
|
||||||
|
|
||||||
VORLocalizer::VORLocalizer(WebAPIAdapterInterface *webAPIAdapterInterface) :
|
VORLocalizer::VORLocalizer(WebAPIAdapterInterface *webAPIAdapterInterface) :
|
||||||
Feature(m_featureIdURI, webAPIAdapterInterface)
|
Feature(m_featureIdURI, webAPIAdapterInterface),
|
||||||
|
m_thread(nullptr),
|
||||||
|
m_worker(nullptr),
|
||||||
|
m_running(false)
|
||||||
{
|
{
|
||||||
setObjectName(m_featureId);
|
setObjectName(m_featureId);
|
||||||
m_worker = new VorLocalizerWorker(webAPIAdapterInterface);
|
|
||||||
m_worker->moveToThread(&m_thread);
|
|
||||||
m_state = StIdle;
|
m_state = StIdle;
|
||||||
m_errorMessage = "VORLocalizer error";
|
m_errorMessage = "VORLocalizer error";
|
||||||
m_networkManager = new QNetworkAccessManager();
|
m_networkManager = new QNetworkAccessManager();
|
||||||
@ -85,35 +86,67 @@ VORLocalizer::~VORLocalizer()
|
|||||||
&VORLocalizer::networkManagerFinished
|
&VORLocalizer::networkManagerFinished
|
||||||
);
|
);
|
||||||
delete m_networkManager;
|
delete m_networkManager;
|
||||||
if (m_worker->isRunning()) {
|
|
||||||
stop();
|
stop();
|
||||||
}
|
|
||||||
|
|
||||||
delete m_worker;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VORLocalizer::start()
|
void VORLocalizer::start()
|
||||||
{
|
{
|
||||||
qDebug("VORLocalizer::start");
|
QMutexLocker m_lock(&m_mutex);
|
||||||
|
|
||||||
|
if (m_running) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug("VORLocalizer::start");
|
||||||
|
m_thread = new QThread();
|
||||||
|
m_worker = new VorLocalizerWorker(getWebAPIAdapterInterface());
|
||||||
|
m_worker->moveToThread(m_thread);
|
||||||
|
|
||||||
|
QObject::connect(
|
||||||
|
m_thread,
|
||||||
|
&QThread::started,
|
||||||
|
m_worker,
|
||||||
|
&VorLocalizerWorker::startWork
|
||||||
|
);
|
||||||
|
QObject::connect(
|
||||||
|
m_thread,
|
||||||
|
&QThread::finished,
|
||||||
|
m_worker,
|
||||||
|
&QObject::deleteLater
|
||||||
|
);
|
||||||
|
QObject::connect(
|
||||||
|
m_thread,
|
||||||
|
&QThread::finished,
|
||||||
|
m_thread,
|
||||||
|
&QThread::deleteLater
|
||||||
|
);
|
||||||
|
|
||||||
m_worker->reset();
|
|
||||||
m_worker->setMessageQueueToFeature(getInputMessageQueue());
|
m_worker->setMessageQueueToFeature(getInputMessageQueue());
|
||||||
m_worker->setAvailableChannels(&m_availableChannels);
|
m_worker->setAvailableChannels(&m_availableChannels);
|
||||||
bool ok = m_worker->startWork();
|
m_worker->startWork();
|
||||||
m_state = ok ? StRunning : StError;
|
m_state = StRunning;
|
||||||
m_thread.start();
|
m_thread->start();
|
||||||
|
|
||||||
VorLocalizerWorker::MsgConfigureVORLocalizerWorker *msg = VorLocalizerWorker::MsgConfigureVORLocalizerWorker::create(m_settings, true);
|
VorLocalizerWorker::MsgConfigureVORLocalizerWorker *msg = VorLocalizerWorker::MsgConfigureVORLocalizerWorker::create(m_settings, true);
|
||||||
m_worker->getInputMessageQueue()->push(msg);
|
m_worker->getInputMessageQueue()->push(msg);
|
||||||
|
|
||||||
|
m_running = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VORLocalizer::stop()
|
void VORLocalizer::stop()
|
||||||
{
|
{
|
||||||
|
QMutexLocker m_lock(&m_mutex);
|
||||||
|
|
||||||
|
if (!m_running) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
qDebug("VORLocalizer::stop");
|
qDebug("VORLocalizer::stop");
|
||||||
|
m_running = false;
|
||||||
m_worker->stopWork();
|
m_worker->stopWork();
|
||||||
m_state = StIdle;
|
m_state = StIdle;
|
||||||
m_thread.quit();
|
m_thread->quit();
|
||||||
m_thread.wait();
|
m_thread->wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VORLocalizer::handleMessage(const Message& cmd)
|
bool VORLocalizer::handleMessage(const Message& cmd)
|
||||||
@ -334,10 +367,13 @@ void VORLocalizer::applySettings(const VORLocalizerSettings& settings, bool forc
|
|||||||
reverseAPIKeys.append("centerShift");
|
reverseAPIKeys.append("centerShift");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_running)
|
||||||
|
{
|
||||||
VorLocalizerWorker::MsgConfigureVORLocalizerWorker *msg = VorLocalizerWorker::MsgConfigureVORLocalizerWorker::create(
|
VorLocalizerWorker::MsgConfigureVORLocalizerWorker *msg = VorLocalizerWorker::MsgConfigureVORLocalizerWorker::create(
|
||||||
settings, force
|
settings, force
|
||||||
);
|
);
|
||||||
m_worker->getInputMessageQueue()->push(msg);
|
m_worker->getInputMessageQueue()->push(msg);
|
||||||
|
}
|
||||||
|
|
||||||
if (settings.m_useReverseAPI)
|
if (settings.m_useReverseAPI)
|
||||||
{
|
{
|
||||||
@ -723,6 +759,9 @@ void VORLocalizer::notifyUpdateChannels()
|
|||||||
getMessageQueueToGUI()->push(msgToGUI);
|
getMessageQueueToGUI()->push(msgToGUI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_running)
|
||||||
|
{
|
||||||
VorLocalizerWorker::MsgRefreshChannels *msgToWorker = VorLocalizerWorker::MsgRefreshChannels::create();
|
VorLocalizerWorker::MsgRefreshChannels *msgToWorker = VorLocalizerWorker::MsgRefreshChannels::create();
|
||||||
m_worker->getInputMessageQueue()->push(msgToWorker);
|
m_worker->getInputMessageQueue()->push(msgToWorker);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
#ifndef INCLUDE_FEATURE_VORLOCALIZER_H_
|
#ifndef INCLUDE_FEATURE_VORLOCALIZER_H_
|
||||||
#define INCLUDE_FEATURE_VORLOCALIZER_H_
|
#define INCLUDE_FEATURE_VORLOCALIZER_H_
|
||||||
|
|
||||||
#include <QThread>
|
#include <QRecursiveMutex>
|
||||||
#include <QNetworkRequest>
|
#include <QNetworkRequest>
|
||||||
|
|
||||||
#include "feature/feature.h"
|
#include "feature/feature.h"
|
||||||
@ -31,6 +31,7 @@ class WebAPIAdapterInterface;
|
|||||||
class VorLocalizerWorker;
|
class VorLocalizerWorker;
|
||||||
class QNetworkAccessManager;
|
class QNetworkAccessManager;
|
||||||
class QNetworkReply;
|
class QNetworkReply;
|
||||||
|
class QThread;
|
||||||
|
|
||||||
namespace SWGSDRangel {
|
namespace SWGSDRangel {
|
||||||
class SWGDeviceState;
|
class SWGDeviceState;
|
||||||
@ -199,8 +200,10 @@ private:
|
|||||||
VORChannelReport& operator=(const VORChannelReport&) = default;
|
VORChannelReport& operator=(const VORChannelReport&) = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
QThread m_thread;
|
QThread *m_thread;
|
||||||
VorLocalizerWorker *m_worker;
|
VorLocalizerWorker *m_worker;
|
||||||
|
bool m_running;
|
||||||
|
QRecursiveMutex m_mutex;
|
||||||
VORLocalizerSettings m_settings;
|
VORLocalizerSettings m_settings;
|
||||||
QHash<ChannelAPI*, VORLocalizerSettings::AvailableChannel> m_availableChannels;
|
QHash<ChannelAPI*, VORLocalizerSettings::AvailableChannel> m_availableChannels;
|
||||||
QHash<int, VORChannelReport> m_vorChannelReports;
|
QHash<int, VORChannelReport> m_vorChannelReports;
|
||||||
|
@ -45,7 +45,6 @@ VorLocalizerWorker::VorLocalizerWorker(WebAPIAdapterInterface *webAPIAdapterInte
|
|||||||
m_webAPIAdapterInterface(webAPIAdapterInterface),
|
m_webAPIAdapterInterface(webAPIAdapterInterface),
|
||||||
m_msgQueueToFeature(nullptr),
|
m_msgQueueToFeature(nullptr),
|
||||||
m_availableChannels(nullptr),
|
m_availableChannels(nullptr),
|
||||||
m_running(false),
|
|
||||||
m_updateTimer(this),
|
m_updateTimer(this),
|
||||||
m_rrTimer(this)
|
m_rrTimer(this)
|
||||||
{
|
{
|
||||||
@ -64,15 +63,13 @@ void VorLocalizerWorker::reset()
|
|||||||
m_inputMessageQueue.clear();
|
m_inputMessageQueue.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VorLocalizerWorker::startWork()
|
void VorLocalizerWorker::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()));
|
||||||
connect(&m_rrTimer, SIGNAL(timeout()), this, SLOT(rrNextTurn()));
|
connect(&m_rrTimer, SIGNAL(timeout()), this, SLOT(rrNextTurn()));
|
||||||
connect(thread(), SIGNAL(started()), this, SLOT(started()));
|
connect(thread(), SIGNAL(started()), this, SLOT(started()));
|
||||||
connect(thread(), SIGNAL(finished()), this, SLOT(finished()));
|
connect(thread(), SIGNAL(finished()), this, SLOT(finished()));
|
||||||
m_running = true;
|
|
||||||
return m_running;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// startWork() is called from main thread. Timers/sockets need to be started on worker thread
|
// startWork() is called from main thread. Timers/sockets need to be started on worker thread
|
||||||
@ -93,7 +90,6 @@ void VorLocalizerWorker::finished()
|
|||||||
m_rrTimer.stop();
|
m_rrTimer.stop();
|
||||||
disconnect(&m_rrTimer, SIGNAL(timeout()), this, SLOT(rrNextTurn()));
|
disconnect(&m_rrTimer, SIGNAL(timeout()), this, SLOT(rrNextTurn()));
|
||||||
disconnect(thread(), SIGNAL(finished()), this, SLOT(finished()));
|
disconnect(thread(), SIGNAL(finished()), this, SLOT(finished()));
|
||||||
m_running = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VorLocalizerWorker::handleInputMessages()
|
void VorLocalizerWorker::handleInputMessages()
|
||||||
|
@ -74,9 +74,8 @@ public:
|
|||||||
VorLocalizerWorker(WebAPIAdapterInterface *webAPIAdapterInterface);
|
VorLocalizerWorker(WebAPIAdapterInterface *webAPIAdapterInterface);
|
||||||
~VorLocalizerWorker();
|
~VorLocalizerWorker();
|
||||||
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; }
|
||||||
void setAvailableChannels(QHash<ChannelAPI*, VORLocalizerSettings::AvailableChannel> *avaialbleChannels) {
|
void setAvailableChannels(QHash<ChannelAPI*, VORLocalizerSettings::AvailableChannel> *avaialbleChannels) {
|
||||||
@ -146,7 +145,6 @@ private:
|
|||||||
QList<VORLocalizerSettings::VORChannel> m_vorChannels;
|
QList<VORLocalizerSettings::VORChannel> m_vorChannels;
|
||||||
QHash<int, ChannelAllocation> m_channelAllocations;
|
QHash<int, ChannelAllocation> m_channelAllocations;
|
||||||
QHash<ChannelAPI*, VORLocalizerSettings::AvailableChannel> *m_availableChannels;
|
QHash<ChannelAPI*, VORLocalizerSettings::AvailableChannel> *m_availableChannels;
|
||||||
bool m_running;
|
|
||||||
QTimer m_updateTimer;
|
QTimer m_updateTimer;
|
||||||
QRecursiveMutex m_mutex;
|
QRecursiveMutex m_mutex;
|
||||||
QTimer m_rrTimer;
|
QTimer m_rrTimer;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user