1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-12-23 01:55:48 -05:00

ChirpChat demod: run the decoder on its own thread

This commit is contained in:
f4exb 2024-04-04 02:06:46 +02:00
parent c21223771a
commit a02d1839ef
2 changed files with 46 additions and 12 deletions

View File

@ -44,6 +44,7 @@
#include "maincore.h" #include "maincore.h"
#include "chirpchatdemodmsg.h" #include "chirpchatdemodmsg.h"
#include "chirpchatdemoddecoder.h"
#include "chirpchatdemod.h" #include "chirpchatdemod.h"
MESSAGE_CLASS_DEFINITION(ChirpChatDemod::MsgConfigureChirpChatDemod, Message) MESSAGE_CLASS_DEFINITION(ChirpChatDemod::MsgConfigureChirpChatDemod, Message)
@ -55,7 +56,9 @@ ChirpChatDemod::ChirpChatDemod(DeviceAPI* deviceAPI) :
ChannelAPI(m_channelIdURI, ChannelAPI::StreamSingleSink), ChannelAPI(m_channelIdURI, ChannelAPI::StreamSingleSink),
m_deviceAPI(deviceAPI), m_deviceAPI(deviceAPI),
m_thread(nullptr), m_thread(nullptr),
m_decoderThread(nullptr),
m_basebandSink(nullptr), m_basebandSink(nullptr),
m_decoder(nullptr),
m_running(false), m_running(false),
m_spectrumVis(SDR_RX_SCALEF), m_spectrumVis(SDR_RX_SCALEF),
m_basebandSampleRate(0), m_basebandSampleRate(0),
@ -88,7 +91,6 @@ ChirpChatDemod::ChirpChatDemod(DeviceAPI* deviceAPI) :
&ChirpChatDemod::handleIndexInDeviceSetChanged &ChirpChatDemod::handleIndexInDeviceSetChanged
); );
m_decoder.setOutputMessageQueue(getInputMessageQueue());
start(); start();
} }
@ -121,7 +123,7 @@ void ChirpChatDemod::feed(const SampleVector::const_iterator& begin, const Sampl
(void) pO; (void) pO;
if (m_running) { if (m_running) {
m_basebandSink->feed(begin, end); m_basebandSink->feed(begin, end);
} }
} }
@ -132,10 +134,25 @@ void ChirpChatDemod::start()
} }
qDebug() << "ChirpChatDemod::start"; qDebug() << "ChirpChatDemod::start";
m_decoderThread = new QThread(this);
m_decoder = new ChirpChatDemodDecoder();
m_decoder->setOutputMessageQueue(getInputMessageQueue());
m_decoder->setNbSymbolBits(m_settings.m_spreadFactor, m_settings.m_deBits);
m_decoder->setCodingScheme(m_settings.m_codingScheme);
m_decoder->setLoRaHasHeader(m_settings.m_hasHeader);
m_decoder->setLoRaHasCRC(m_settings.m_hasCRC);
m_decoder->setLoRaParityBits(m_settings.m_nbParityBits);
m_decoder->setLoRaPacketLength(m_settings.m_packetLength);
m_decoder->moveToThread(m_decoderThread);
QObject::connect(m_decoderThread, &QThread::finished, m_decoder, &QObject::deleteLater);
QObject::connect(m_decoderThread, &QThread::finished, m_decoderThread, &QThread::deleteLater);
m_decoderThread->start();
m_thread = new QThread(this); m_thread = new QThread(this);
m_basebandSink = new ChirpChatDemodBaseband(); m_basebandSink = new ChirpChatDemodBaseband();
m_basebandSink->setSpectrumSink(&m_spectrumVis); m_basebandSink->setSpectrumSink(&m_spectrumVis);
m_basebandSink->setDecoderMessageQueue(m_decoder.getInputMessageQueue()); // Decoder held on the main thread m_basebandSink->setDecoderMessageQueue(m_decoder->getInputMessageQueue());
m_basebandSink->moveToThread(m_thread); m_basebandSink->moveToThread(m_thread);
QObject::connect(m_thread, &QThread::finished, m_basebandSink, &QObject::deleteLater); QObject::connect(m_thread, &QThread::finished, m_basebandSink, &QObject::deleteLater);
@ -166,6 +183,9 @@ void ChirpChatDemod::stop()
m_running = false; m_running = false;
m_thread->exit(); m_thread->exit();
m_thread->wait(); m_thread->wait();
m_decoderThread->exit();
m_decoderThread->wait();
m_decoderThread = nullptr;
} }
bool ChirpChatDemod::handleMessage(const Message& cmd) bool ChirpChatDemod::handleMessage(const Message& cmd)
@ -404,38 +424,51 @@ void ChirpChatDemod::applySettings(const ChirpChatDemodSettings& settings, bool
} }
if ((settings.m_spreadFactor != m_settings.m_spreadFactor) if ((settings.m_spreadFactor != m_settings.m_spreadFactor)
|| (settings.m_deBits != m_settings.m_deBits) || force) { || (settings.m_deBits != m_settings.m_deBits) || force)
m_decoder.setNbSymbolBits(settings.m_spreadFactor, settings.m_deBits); {
if (m_decoder) {
m_decoder->setNbSymbolBits(settings.m_spreadFactor, settings.m_deBits);
}
} }
if ((settings.m_codingScheme != m_settings.m_codingScheme) || force) if ((settings.m_codingScheme != m_settings.m_codingScheme) || force)
{ {
reverseAPIKeys.append("codingScheme"); reverseAPIKeys.append("codingScheme");
m_decoder.setCodingScheme(settings.m_codingScheme); if (m_decoder) {
m_decoder->setCodingScheme(settings.m_codingScheme);
}
} }
if ((settings.m_hasHeader != m_settings.m_hasHeader) || force) if ((settings.m_hasHeader != m_settings.m_hasHeader) || force)
{ {
reverseAPIKeys.append("hasHeader"); reverseAPIKeys.append("hasHeader");
m_decoder.setLoRaHasHeader(settings.m_hasHeader); if (m_decoder) {
m_decoder->setLoRaHasHeader(settings.m_hasHeader);
}
} }
if ((settings.m_hasCRC != m_settings.m_hasCRC) || force) if ((settings.m_hasCRC != m_settings.m_hasCRC) || force)
{ {
reverseAPIKeys.append("hasCRC"); reverseAPIKeys.append("hasCRC");
m_decoder.setLoRaHasCRC(settings.m_hasCRC); if (m_decoder) {
m_decoder->setLoRaHasCRC(settings.m_hasCRC);
}
} }
if ((settings.m_nbParityBits != m_settings.m_nbParityBits) || force) if ((settings.m_nbParityBits != m_settings.m_nbParityBits) || force)
{ {
reverseAPIKeys.append("nbParityBits"); reverseAPIKeys.append("nbParityBits");
m_decoder.setLoRaParityBits(settings.m_nbParityBits); if (m_decoder) {
m_decoder->setLoRaParityBits(settings.m_nbParityBits);
}
} }
if ((settings.m_packetLength != m_settings.m_packetLength) || force) if ((settings.m_packetLength != m_settings.m_packetLength) || force)
{ {
reverseAPIKeys.append("packetLength"); reverseAPIKeys.append("packetLength");
m_decoder.setLoRaPacketLength(settings.m_packetLength); if (m_decoder) {
m_decoder->setLoRaPacketLength(settings.m_packetLength);
}
} }
if ((settings.m_decodeActive != m_settings.m_decodeActive) || force) { if ((settings.m_decodeActive != m_settings.m_decodeActive) || force) {

View File

@ -35,13 +35,13 @@
#include "util/udpsinkutil.h" #include "util/udpsinkutil.h"
#include "chirpchatdemodbaseband.h" #include "chirpchatdemodbaseband.h"
#include "chirpchatdemoddecoder.h"
class QNetworkAccessManager; class QNetworkAccessManager;
class QNetworkReply; class QNetworkReply;
class DeviceAPI; class DeviceAPI;
class QThread; class QThread;
class ObjectPipe; class ObjectPipe;
class ChirpChatDemodDecoder;
class ChirpChatDemod : public BasebandSampleSink, public ChannelAPI { class ChirpChatDemod : public BasebandSampleSink, public ChannelAPI {
public: public:
@ -141,9 +141,10 @@ public:
private: private:
DeviceAPI *m_deviceAPI; DeviceAPI *m_deviceAPI;
QThread *m_thread; QThread *m_thread;
QThread *m_decoderThread;
ChirpChatDemodBaseband *m_basebandSink; ChirpChatDemodBaseband *m_basebandSink;
ChirpChatDemodDecoder *m_decoder;
bool m_running; bool m_running;
ChirpChatDemodDecoder m_decoder;
ChirpChatDemodSettings m_settings; ChirpChatDemodSettings m_settings;
SpectrumVis m_spectrumVis; SpectrumVis m_spectrumVis;
int m_basebandSampleRate; //!< stored from device message used when starting baseband sink int m_basebandSampleRate; //!< stored from device message used when starting baseband sink