From 2b5078e0006a915e3f43d1b5531d7a63ceb79753 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 21 Jan 2023 12:22:05 +0100 Subject: [PATCH] FT8 demod: make FT8::FFTEngine a singleton. Name worker threads for debugging --- ft8/fft.cpp | 11 ++++++ ft8/fft.h | 11 +++++- ft8/ft8.cpp | 3 +- ft8/ft8.h | 3 +- plugins/channelrx/demodft8/ft8demodgui.cpp | 5 ++- plugins/channelrx/demodft8/ft8demodgui.ui | 37 ++++++++++++++++++- .../channelrx/demodft8/ft8demodsettings.cpp | 4 +- plugins/channelrx/demodft8/ft8demodworker.cpp | 31 +++++++++++----- plugins/channelrx/demodft8/ft8demodworker.h | 9 ++++- sdrbench/test_ft8.cpp | 6 +++ 10 files changed, 101 insertions(+), 19 deletions(-) diff --git a/ft8/fft.cpp b/ft8/fft.cpp index b96993f92..623a2b4fc 100644 --- a/ft8/fft.cpp +++ b/ft8/fft.cpp @@ -28,6 +28,17 @@ namespace FT8 { +FFTEngine* FFTEngine::m_instance= nullptr;; + +FFTEngine *FFTEngine::GetInstance() +{ + if (!m_instance) { + m_instance = new FFTEngine(); + } + + return m_instance; +} + FFTEngine::Plan *FFTEngine::get_plan(int n, const char *why) { // cache fftw plans in the parent process, diff --git a/ft8/fft.h b/ft8/fft.h index ffb38e3f4..d93fdbccd 100644 --- a/ft8/fft.h +++ b/ft8/fft.h @@ -67,8 +67,9 @@ public: int uses_; }; // Plan - FFTEngine() : m_nplans(0) - {} + FFTEngine(FFTEngine& other) = delete; + void operator=(const FFTEngine &) = delete; + static FFTEngine *GetInstance(); Plan *get_plan(int n, const char *why); @@ -82,6 +83,12 @@ public: std::vector> analytic(const std::vector &x, const char *why); std::vector hilbert_shift(const std::vector &x, float hz0, float hz1, int rate); +protected: + FFTEngine() : + m_nplans(0) + {} + static FFTEngine *m_instance; + private: void fft_stats(); QMutex m_plansmu; diff --git a/ft8/ft8.cpp b/ft8/ft8.cpp index 9683c9469..2fab2399c 100644 --- a/ft8/ft8.cpp +++ b/ft8/ft8.cpp @@ -3533,13 +3533,14 @@ void FT8Decoder::entry( final_deadline, cb, prevdecs, - &fftEngine + FFTEngine::GetInstance() ); ft8->getParams() = getParams(); // transfer parameters int npasses = nprevdecs > 0 ? params.npasses_two : params.npasses_one; ft8->set_npasses(npasses); QThread *th = new QThread(); + th->setObjectName(tr("ft8:%1:%2").arg(cb->get_name()).arg(i)); threads.push_back(th); // std::thread *th = new std::thread([ft8, npasses] () { ft8->go(npasses); }); // thv.push_back(std::pair(ft8, th)); diff --git a/ft8/ft8.h b/ft8/ft8.h index 5ab3f5ad0..79cfeddfe 100644 --- a/ft8/ft8.h +++ b/ft8/ft8.h @@ -25,6 +25,7 @@ #include #include +#include #include "fft.h" #include "export.h" @@ -45,6 +46,7 @@ public: int pass, int correct_bits ) = 0; //!< virtual nathod called each time there is a result + virtual QString get_name() = 0; }; // @@ -684,7 +686,6 @@ public: void forceQuit(); //!< force quit all threads FT8Params& getParams() { return params; } private: - FFTEngine fftEngine; FT8Params params; std::vector threads; }; // FT8Decoder diff --git a/plugins/channelrx/demodft8/ft8demodgui.cpp b/plugins/channelrx/demodft8/ft8demodgui.cpp index 782947034..f870c9537 100644 --- a/plugins/channelrx/demodft8/ft8demodgui.cpp +++ b/plugins/channelrx/demodft8/ft8demodgui.cpp @@ -214,6 +214,7 @@ void FT8DemodGUI::on_filterIndex_valueChanged(int value) void FT8DemodGUI::on_clearMessages_clicked() { ui->messages->setRowCount(0); + ui->nbDecodesInTable->setText("0"); } void FT8DemodGUI::on_recordWav_toggled(bool checked) @@ -621,7 +622,7 @@ void FT8DemodGUI::resizeMessageTable() ui->messages->setItem(row, MESSAGE_COL_DEC, new QTableWidgetItem("174")); ui->messages->setItem(row, MESSAGE_COL_DT, new QTableWidgetItem("-0.0")); ui->messages->setItem(row, MESSAGE_COL_DF, new QTableWidgetItem("0000")); - ui->messages->setItem(row, MESSAGE_COL_CALL1, new QTableWidgetItem("123456789ABCD")); + ui->messages->setItem(row, MESSAGE_COL_CALL1, new QTableWidgetItem("CQ PA900RAALTE")); ui->messages->setItem(row, MESSAGE_COL_CALL2, new QTableWidgetItem("PA900RAALTE")); ui->messages->setItem(row, MESSAGE_COL_LOC, new QTableWidgetItem("JN000")); ui->messages->setItem(row, MESSAGE_COL_INFO, new QTableWidgetItem("OSD-0-73")); @@ -680,6 +681,8 @@ void FT8DemodGUI::messagesReceived(const QList& messages) row++; } + ui->nbDecodesInTable->setText(tr("%1").arg(row)); + if (scrollToBottom) { ui->messages->scrollToBottom(); } diff --git a/plugins/channelrx/demodft8/ft8demodgui.ui b/plugins/channelrx/demodft8/ft8demodgui.ui index ba75ff30c..fbae3b061 100644 --- a/plugins/channelrx/demodft8/ft8demodgui.ui +++ b/plugins/channelrx/demodft8/ft8demodgui.ui @@ -886,11 +886,43 @@ + + + 15 + 0 + + Number of messages decoded in the last sequence - 00 + 0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + / + + + + + + + + 45 + 0 + + + + 0 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter @@ -977,6 +1009,9 @@ QAbstractItemView::NoEditTriggers + + false + 15 diff --git a/plugins/channelrx/demodft8/ft8demodsettings.cpp b/plugins/channelrx/demodft8/ft8demodsettings.cpp index c5f8dc359..6e3640c1f 100644 --- a/plugins/channelrx/demodft8/ft8demodsettings.cpp +++ b/plugins/channelrx/demodft8/ft8demodsettings.cpp @@ -45,7 +45,7 @@ void FT8DemodSettings::resetToDefaults() m_agc = false; m_recordWav = false; m_logMessages = false; - m_nbDecoderThreads = 6; + m_nbDecoderThreads = 3; m_decoderTimeBudget = 0.5; m_volume = 1.0; m_inputFrequencyOffset = 0; @@ -136,7 +136,7 @@ bool FT8DemodSettings::deserialize(const QByteArray& data) d.readU32(5, &m_rgbColor); d.readBool(6, &m_recordWav, false); d.readBool(7, &m_logMessages, false); - d.readS32(8, &m_nbDecoderThreads, 6); + d.readS32(8, &m_nbDecoderThreads, 3); d.readFloat(9, &m_decoderTimeBudget, 0.5); d.readBool(11, &m_agc, false); d.readString(16, &m_title, "SSB Demodulator"); diff --git a/plugins/channelrx/demodft8/ft8demodworker.cpp b/plugins/channelrx/demodft8/ft8demodworker.cpp index c4088341b..53822aa83 100644 --- a/plugins/channelrx/demodft8/ft8demodworker.cpp +++ b/plugins/channelrx/demodft8/ft8demodworker.cpp @@ -27,10 +27,16 @@ #include "ft8demodsettings.h" #include "ft8demodworker.h" -FT8DemodWorker::FT8Callback::FT8Callback(const QDateTime& periodTS, qint64 baseFrequency, FT8::Packing& packing) : +FT8DemodWorker::FT8Callback::FT8Callback( + const QDateTime& periodTS, + qint64 baseFrequency, + FT8::Packing& packing, + const QString& name +) : m_packing(packing), m_periodTS(periodTS), - m_baseFrequency(baseFrequency) + m_baseFrequency(baseFrequency), + m_name(name) { m_msgReportFT8Messages = MsgReportFT8Messages::create(); m_msgReportFT8Messages->setBaseFrequency(baseFrequency); @@ -92,6 +98,11 @@ int FT8DemodWorker::FT8Callback::hcb( return 2; // 2 => new decode, do subtract. } +QString FT8DemodWorker::FT8Callback::get_name() +{ + return m_name; +} + FT8DemodWorker::FT8DemodWorker() : m_recordSamples(false), m_nbDecoderThreads(6), @@ -108,7 +119,7 @@ FT8DemodWorker::FT8DemodWorker() : dir.mkpath(relPath); m_samplesPath = dir.absolutePath() + "/" + relPath; qDebug("FT8DemodWorker::FT8DemodWorker: samples path: %s", qPrintable(m_samplesPath)); - relPath = "sdrangel/ft8"; + relPath = "sdrangel/ft8/logs"; m_logsPath = dir.absolutePath() + "/" + relPath; qDebug("FT8DemodWorker::FT8DemodWorker: logs path: %s", qPrintable(m_logsPath)); } @@ -134,8 +145,14 @@ void FT8DemodWorker::processBuffer(int16_t *buffer, QDateTime periodTS) return; } + QString channelReference = "d0c0"; // default + + if (m_channel) { + channelReference = tr("d%1c%2").arg(m_channel->getDeviceSetIndex()).arg(m_channel->getIndexInDeviceSet()); + } + int hints[2] = { 2, 0 }; // CQ - FT8Callback ft8Callback(periodTS, m_baseFrequency, m_packing); + FT8Callback ft8Callback(periodTS, m_baseFrequency, m_packing, channelReference); m_ft8Decoder.getParams().nthreads = m_nbDecoderThreads; std::vector samples(15*FT8DemodSettings::m_ft8SampleRate); @@ -180,12 +197,6 @@ void FT8DemodWorker::processBuffer(int16_t *buffer, QDateTime periodTS) { if (!logFile.is_open()) { - QString channelReference = "d0c0"; // default - - if (m_channel) { - channelReference = tr("d%1c%2").arg(m_channel->getDeviceSetIndex()).arg(m_channel->getIndexInDeviceSet()); - } - QString logFileName(tr("%1_%2.txt").arg(periodTS.toString("yyyyMMdd")).arg(channelReference)); QFileInfo lfi(QDir(m_logsPath), logFileName); QString logFilePath = lfi.absoluteFilePath(); diff --git a/plugins/channelrx/demodft8/ft8demodworker.h b/plugins/channelrx/demodft8/ft8demodworker.h index bace69dd5..4bcc34ff9 100644 --- a/plugins/channelrx/demodft8/ft8demodworker.h +++ b/plugins/channelrx/demodft8/ft8demodworker.h @@ -51,7 +51,12 @@ private: class FT8Callback : public FT8::CallbackInterface { public: - FT8Callback(const QDateTime& periodTS, qint64 baseFrequency, FT8::Packing& packing); + FT8Callback + (const QDateTime& periodTS, + qint64 baseFrequency, + FT8::Packing& packing, + const QString& name + ); virtual int hcb( int *a91, float hz0, @@ -61,6 +66,7 @@ private: int pass, int correct_bits ); + virtual QString get_name(); const std::map& getMsgMap() { return cycle_already; } MsgReportFT8Messages *getReportMessage() { return m_msgReportFT8Messages; } @@ -71,6 +77,7 @@ private: MsgReportFT8Messages *m_msgReportFT8Messages; const QDateTime& m_periodTS; qint64 m_baseFrequency; + QString m_name; }; QString m_samplesPath; diff --git a/sdrbench/test_ft8.cpp b/sdrbench/test_ft8.cpp index 6b2dea0f2..1a1d0e2bf 100644 --- a/sdrbench/test_ft8.cpp +++ b/sdrbench/test_ft8.cpp @@ -47,6 +47,7 @@ public: int pass, int correct_bits ); + virtual QString get_name(); const std::map& getMsgMap() { return cycle_already; } @@ -102,6 +103,11 @@ int TestFT8Callback::hcb( return 2; // 2 => new decode, do subtract. } +QString TestFT8Callback::get_name() +{ + return "test"; +} + void MainBench::testFT8(const QString& wavFile, const QString& argsStr) { int nthreads = 8; // number of threads (default)