Skip to content

Commit d48f562

Browse files
authored
Merge pull request #2590 from f4exb/feature-2561
FT8 Demodulator: added option to send reports to PSK reporter. Fixes #2561
2 parents c334ffe + 54b521f commit d48f562

24 files changed

+911
-25
lines changed

doc/img/FT8Demod_plugin_C1.png

102 KB
Loading

doc/img/FT8Demod_plugin_C1.xcf

177 KB
Binary file not shown.

plugins/channelrx/demodft8/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ set(demodft8_SOURCES
99
ft8plugin.cpp
1010
ft8buffer.cpp
1111
ft8demodworker.cpp
12+
pskreporterworker.cpp
1213
)
1314

1415
set(demodft8_HEADERS
@@ -19,7 +20,8 @@ set(demodft8_HEADERS
1920
ft8demodwebapiadapter.h
2021
ft8plugin.h
2122
ft8buffer.h
22-
ft8demodworker.h;
23+
ft8demodworker.h
24+
pskreporterworker.h
2325
)
2426

2527
include_directories(

plugins/channelrx/demodft8/ft8demod.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,18 @@ void FT8Demod::applySettings(const FT8DemodSettings& settings, bool force)
329329
if ((m_settings.m_verifyOSD != settings.m_verifyOSD) || force) {
330330
reverseAPIKeys.append("verifyOSD");
331331
}
332+
if ((m_settings.m_enablePSKReporter != settings.m_enablePSKReporter) || force) {
333+
reverseAPIKeys.append("enablePSKReporter");
334+
}
335+
if ((m_settings.m_pskReporterCallsign != settings.m_pskReporterCallsign) || force) {
336+
reverseAPIKeys.append("pskReporterCallsign");
337+
}
338+
if ((m_settings.m_pskReporterLocator != settings.m_pskReporterLocator) || force) {
339+
reverseAPIKeys.append("pskReporterLocator");
340+
}
341+
if ((m_settings.m_pskReporterSoftware != settings.m_pskReporterSoftware) || force) {
342+
reverseAPIKeys.append("pskReporterSoftware");
343+
}
332344

333345
if (m_settings.m_streamIndex != settings.m_streamIndex)
334346
{
@@ -525,6 +537,18 @@ void FT8Demod::webapiUpdateChannelSettings(
525537
if (channelSettingsKeys.contains("verifyOSD")) {
526538
settings.m_verifyOSD = response.getFt8DemodSettings()->getVerifyOsd() != 0;
527539
}
540+
if (channelSettingsKeys.contains("enablePSKReporter")) {
541+
settings.m_enablePSKReporter = response.getFt8DemodSettings()->getEnablePskReporter() != 0;
542+
}
543+
if (channelSettingsKeys.contains("pskReporterCallsign")) {
544+
settings.m_pskReporterCallsign = *response.getFt8DemodSettings()->getPskReporterCallsign();
545+
}
546+
if (channelSettingsKeys.contains("pskReporterLocator")) {
547+
settings.m_pskReporterLocator = *response.getFt8DemodSettings()->getPskReporterLocator();
548+
}
549+
if (channelSettingsKeys.contains("pskReporterSoftware")) {
550+
settings.m_pskReporterSoftware = *response.getFt8DemodSettings()->getPskReporterSoftware();
551+
}
528552
if (channelSettingsKeys.contains("rgbColor")) {
529553
settings.m_rgbColor = response.getFt8DemodSettings()->getRgbColor();
530554
}
@@ -589,6 +613,10 @@ void FT8Demod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& resp
589613
response.getFt8DemodSettings()->setOsdDepth(settings.m_osdDepth);
590614
response.getFt8DemodSettings()->setOsdLdpcThreshold(settings.m_osdLDPCThreshold);
591615
response.getFt8DemodSettings()->setUseOsd(settings.m_verifyOSD ? 1 : 0);
616+
response.getFt8DemodSettings()->setEnablePskReporter(settings.m_enablePSKReporter ? 1 : 0);
617+
response.getFt8DemodSettings()->setPskReporterCallsign(new QString(settings.m_pskReporterCallsign));
618+
response.getFt8DemodSettings()->setPskReporterLocator(new QString(settings.m_pskReporterLocator));
619+
response.getFt8DemodSettings()->setPskReporterSoftware(new QString(settings.m_pskReporterSoftware));
592620
response.getFt8DemodSettings()->setRgbColor(settings.m_rgbColor);
593621

594622
if (response.getFt8DemodSettings()->getTitle()) {
@@ -784,6 +812,18 @@ void FT8Demod::webapiFormatChannelSettings(
784812
if (channelSettingsKeys.contains("verifyOSD") || force) {
785813
swgFT8DemodSettings->setVerifyOsd(settings.m_verifyOSD ? 1 : 0);
786814
}
815+
if (channelSettingsKeys.contains("enablePSKReporter") || force) {
816+
swgFT8DemodSettings->setEnablePskReporter(settings.m_enablePSKReporter ? 1 : 0);
817+
}
818+
if (channelSettingsKeys.contains("pskReporterCallsign") || force) {
819+
swgFT8DemodSettings->setPskReporterCallsign(new QString(settings.m_pskReporterCallsign));
820+
}
821+
if (channelSettingsKeys.contains("pskReporterLocator") || force) {
822+
swgFT8DemodSettings->setPskReporterLocator(new QString(settings.m_pskReporterLocator));
823+
}
824+
if (channelSettingsKeys.contains("pskReporterSoftware") || force) {
825+
swgFT8DemodSettings->setPskReporterSoftware(new QString(settings.m_pskReporterSoftware));
826+
}
787827
if (channelSettingsKeys.contains("rgbColor") || force) {
788828
swgFT8DemodSettings->setRgbColor(settings.m_rgbColor);
789829
}

plugins/channelrx/demodft8/ft8demodbaseband.cpp

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "maincore.h"
2525

2626
#include "ft8demodworker.h"
27+
#include "pskreporterworker.h"
2728
#include "ft8demodbaseband.h"
2829

2930
MESSAGE_CLASS_DEFINITION(FT8DemodBaseband::MsgConfigureFT8DemodBaseband, Message)
@@ -48,12 +49,7 @@ FT8DemodBaseband::FT8DemodBaseband() :
4849
m_ft8DemodWorker,
4950
&QObject::deleteLater
5051
);
51-
QObject::connect(
52-
m_workerThread,
53-
&QThread::finished,
54-
m_ft8DemodWorker,
55-
&QThread::deleteLater
56-
);
52+
5753
QObject::connect(
5854
this,
5955
&FT8DemodBaseband::bufferReady,
@@ -64,6 +60,20 @@ FT8DemodBaseband::FT8DemodBaseband() :
6460

6561
m_workerThread->start();
6662

63+
m_pskReporterThread = new QThread();
64+
m_pskReporterWorker = new PskReporterWorker();
65+
m_ft8DemodWorker->setPSKReportingMessageQueue(m_pskReporterWorker->getInputMessageQueue());
66+
m_pskReporterWorker->moveToThread(m_pskReporterThread);
67+
68+
QObject::connect(
69+
m_pskReporterThread,
70+
&QThread::finished,
71+
m_pskReporterWorker,
72+
&QObject::deleteLater
73+
);
74+
75+
m_pskReporterThread->start();
76+
6777
QObject::connect(
6878
&m_sampleFifo,
6979
&SampleSinkFifo::dataReady,
@@ -84,6 +94,8 @@ FT8DemodBaseband::~FT8DemodBaseband()
8494
m_workerThread->exit();
8595
m_workerThread->wait();
8696
delete[] m_ft8WorkerBuffer;
97+
m_pskReporterThread->exit();
98+
m_pskReporterThread->wait();
8799
}
88100

89101
void FT8DemodBaseband::reset()
@@ -96,7 +108,7 @@ void FT8DemodBaseband::reset()
96108
void FT8DemodBaseband::setMessageQueueToGUI(MessageQueue *messageQueue)
97109
{
98110
m_messageQueueToGUI = messageQueue;
99-
m_ft8DemodWorker->setReportingMessageQueue(m_messageQueueToGUI);
111+
m_ft8DemodWorker->setGUIReportingMessageQueue(m_messageQueueToGUI);
100112
}
101113

102114
void FT8DemodBaseband::setChannel(ChannelAPI *channel)
@@ -237,6 +249,22 @@ void FT8DemodBaseband::applySettings(const FT8DemodSettings& settings, bool forc
237249
m_ft8DemodWorker->setLogMessages(settings.m_logMessages);
238250
}
239251

252+
if ((settings.m_enablePSKReporter != m_settings.m_enablePSKReporter) || force) {
253+
m_ft8DemodWorker->setEnablePskReporter(settings.m_enablePSKReporter);
254+
}
255+
256+
if ((settings.m_pskReporterCallsign != m_settings.m_pskReporterCallsign) || force) {
257+
m_pskReporterWorker->setMyCallsign(settings.m_pskReporterCallsign);
258+
}
259+
260+
if ((settings.m_pskReporterLocator != m_settings.m_pskReporterLocator) || force) {
261+
m_pskReporterWorker->setMyLocator(settings.m_pskReporterLocator);
262+
}
263+
264+
if ((settings.m_pskReporterSoftware != m_settings.m_pskReporterSoftware) || force) {
265+
m_pskReporterWorker->setDecoderInfo(settings.m_pskReporterSoftware);
266+
}
267+
240268
if ((settings.m_nbDecoderThreads != m_settings.m_nbDecoderThreads) || force) {
241269
m_ft8DemodWorker->setNbDecoderThreads(settings.m_nbDecoderThreads);
242270
}

plugins/channelrx/demodft8/ft8demodbaseband.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class ChannelAPI;
3636
class SpectrumVis;
3737
class QThread;
3838
class FT8DemodWorker;
39+
class PskReporterWorker;
3940

4041
class FT8DemodBaseband : public QObject
4142
{
@@ -102,6 +103,8 @@ class FT8DemodBaseband : public QObject
102103
int m_tickCount;
103104
QThread *m_workerThread;
104105
FT8DemodWorker *m_ft8DemodWorker;
106+
QThread *m_pskReporterThread;
107+
PskReporterWorker *m_pskReporterWorker;
105108
int16_t *m_ft8WorkerBuffer;
106109
qint64 m_deviceCenterFrequency;
107110
QRecursiveMutex m_mutex;

plugins/channelrx/demodft8/ft8demodgui.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,30 @@ void FT8DemodGUI::on_settings_clicked()
528528
changed = true;
529529
}
530530

531+
if (settingsKeys.contains("enablePSKReporter"))
532+
{
533+
m_settings.m_enablePSKReporter = settings.m_enablePSKReporter;
534+
changed = true;
535+
}
536+
537+
if (settingsKeys.contains("pskReporterCallsign"))
538+
{
539+
m_settings.m_pskReporterCallsign = settings.m_pskReporterCallsign;
540+
changed = true;
541+
}
542+
543+
if (settingsKeys.contains("pskReporterLocator"))
544+
{
545+
m_settings.m_pskReporterLocator = settings.m_pskReporterLocator;
546+
changed = true;
547+
}
548+
549+
if (settingsKeys.contains("pskReporterSoftware"))
550+
{
551+
m_settings.m_pskReporterSoftware = settings.m_pskReporterSoftware;
552+
changed = true;
553+
}
554+
531555
if (settingsKeys.contains("bandPresets"))
532556
{
533557
m_settings.m_bandPresets = settings.m_bandPresets;

plugins/channelrx/demodft8/ft8demodsettings.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,12 @@
1919
///////////////////////////////////////////////////////////////////////////////////
2020

2121
#include <QColor>
22+
#include <QCoreApplication>
2223

2324
#include "util/simpleserializer.h"
2425
#include "settings/serializable.h"
26+
#include "maincore.h"
27+
#include "util/maidenhead.h"
2528
#include "ft8demodsettings.h"
2629

2730
const int FT8DemodSettings::m_ft8SampleRate = 12000;
@@ -66,6 +69,10 @@ void FT8DemodSettings::resetToDefaults()
6669
m_workspaceIndex = 0;
6770
m_hidden = false;
6871
m_filterIndex = 0;
72+
m_enablePSKReporter = false;
73+
m_pskReporterCallsign = getDefaultReporterCallsign();
74+
m_pskReporterLocator = getDefaultReporterLocator();
75+
m_pskReporterSoftware = "SDRangel FT8 Demod";
6976
resetBandPresets();
7077
}
7178

@@ -133,6 +140,10 @@ QByteArray FT8DemodSettings::serialize() const
133140
s.writeBlob(26, m_geometryBytes);
134141
s.writeBool(27, m_hidden);
135142
s.writeU32(29, m_filterIndex);
143+
s.writeBool(30, m_enablePSKReporter);
144+
s.writeString(31, m_pskReporterCallsign);
145+
s.writeString(32, m_pskReporterLocator);
146+
s.writeString(33, m_pskReporterSoftware);
136147

137148
for (unsigned int i = 0; i < 10; i++)
138149
{
@@ -214,6 +225,10 @@ bool FT8DemodSettings::deserialize(const QByteArray& data)
214225
d.readBool(27, &m_hidden, false);
215226
d.readU32(29, &utmp, 0);
216227
m_filterIndex = utmp < 10 ? utmp : 0;
228+
d.readBool(30, &m_enablePSKReporter, false);
229+
d.readString(31, &m_pskReporterCallsign, getDefaultReporterCallsign());
230+
d.readString(32, &m_pskReporterLocator, getDefaultReporterLocator());
231+
d.readString(33, &m_pskReporterSoftware, getDefaultReporterSoftware());
217232

218233
for (unsigned int i = 0; (i < 10); i++)
219234
{
@@ -252,3 +267,20 @@ QDataStream& operator>>(QDataStream& in, FT8DemodBandPreset& bandPreset)
252267
in >> bandPreset.m_channelOffset;
253268
return in;
254269
}
270+
271+
QString FT8DemodSettings::getDefaultReporterCallsign() const
272+
{
273+
return MainCore::instance()->getSettings().getStationName();
274+
}
275+
276+
QString FT8DemodSettings::getDefaultReporterLocator() const
277+
{
278+
float lat = MainCore::instance()->getSettings().getLatitude();
279+
float lon = MainCore::instance()->getSettings().getLongitude();
280+
return Maidenhead::toMaidenhead(lat, lon);
281+
}
282+
283+
QString FT8DemodSettings::getDefaultReporterSoftware() const
284+
{
285+
return QCoreApplication::applicationName() + " " + QCoreApplication::applicationVersion();
286+
}

plugins/channelrx/demodft8/ft8demodsettings.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ class FT8DemodSettings
9797
std::vector<FT8DemodFilterSettings> m_filterBank;
9898
unsigned int m_filterIndex;
9999
QList<FT8DemodBandPreset> m_bandPresets;
100+
bool m_enablePSKReporter;
101+
QString m_pskReporterCallsign;
102+
QString m_pskReporterLocator;
103+
QString m_pskReporterSoftware;
100104

101105
Serializable *m_channelMarker;
102106
Serializable *m_spectrumGUI;
@@ -110,6 +114,9 @@ class FT8DemodSettings
110114
QByteArray serialize() const;
111115
bool deserialize(const QByteArray& data);
112116
void resetBandPresets();
117+
QString getDefaultReporterCallsign() const;
118+
QString getDefaultReporterLocator() const;
119+
QString getDefaultReporterSoftware() const;
113120

114121
static const int m_ft8SampleRate;
115122
static const int m_minPowerThresholdDB;

plugins/channelrx/demodft8/ft8demodsettingsdialog.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ FT8DemodSettingsDialog::FT8DemodSettingsDialog(FT8DemodSettings& settings, QStri
3535
ui->osdLDPCThreshold->setValue(m_settings.m_osdLDPCThreshold);
3636
ui->osdLDPCThresholdText->setText(tr("%1").arg(m_settings.m_osdLDPCThreshold));
3737
ui->verifyOSD->setChecked(m_settings.m_verifyOSD);
38+
ui->enablePSKReporter->setChecked(m_settings.m_enablePSKReporter);
39+
ui->reportingStation->setText(m_settings.m_pskReporterCallsign);
40+
ui->reportingLocator->setText(m_settings.m_pskReporterLocator);
41+
ui->reportingSoftware->setText(m_settings.m_pskReporterSoftware);
3842
resizeBandsTable();
3943
populateBandsTable();
4044
connect(ui->bands, &QTableWidget::cellChanged, this, &FT8DemodSettingsDialog::textCellChanged);
@@ -162,6 +166,65 @@ void FT8DemodSettingsDialog::on_verifyOSD_stateChanged(int state)
162166
}
163167
}
164168

169+
void FT8DemodSettingsDialog::on_enablePSKReporter_toggled(bool checked)
170+
{
171+
m_settings.m_enablePSKReporter = checked;
172+
173+
if (!m_settingsKeys.contains("enablePSKReporter")) {
174+
m_settingsKeys.append("enablePSKReporter");
175+
}
176+
}
177+
178+
void FT8DemodSettingsDialog::on_pskReporterCallsign_editingFinished()
179+
{
180+
m_settings.m_pskReporterCallsign = ui->reportingStation->text();
181+
182+
if (!m_settingsKeys.contains("pskReporterCallsign")) {
183+
m_settingsKeys.append("pskReporterCallsign");
184+
}
185+
}
186+
187+
void FT8DemodSettingsDialog::on_pskReporterLocator_editingFinished()
188+
{
189+
m_settings.m_pskReporterLocator = ui->reportingLocator->text();
190+
191+
if (!m_settingsKeys.contains("pskReporterLocator")) {
192+
m_settingsKeys.append("pskReporterLocator");
193+
}
194+
}
195+
196+
void FT8DemodSettingsDialog::on_pskReporterSoftware_editingFinished()
197+
{
198+
m_settings.m_pskReporterSoftware = ui->reportingSoftware->text();
199+
200+
if (!m_settingsKeys.contains("pskReporterSoftware")) {
201+
m_settingsKeys.append("pskReporterSoftware");
202+
}
203+
}
204+
205+
void FT8DemodSettingsDialog::on_reportingDefaults_clicked()
206+
{
207+
ui->reportingStation->setText(m_settings.getDefaultReporterCallsign());
208+
ui->reportingLocator->setText(m_settings.getDefaultReporterLocator());
209+
ui->reportingSoftware->setText(m_settings.getDefaultReporterSoftware());
210+
211+
m_settings.m_pskReporterCallsign = ui->reportingStation->text();
212+
m_settings.m_pskReporterLocator = ui->reportingLocator->text();
213+
m_settings.m_pskReporterSoftware = ui->reportingSoftware->text();
214+
215+
if (!m_settingsKeys.contains("pskReporterCallsign")) {
216+
m_settingsKeys.append("pskReporterCallsign");
217+
}
218+
219+
if (!m_settingsKeys.contains("pskReporterLocator")) {
220+
m_settingsKeys.append("pskReporterLocator");
221+
}
222+
223+
if (!m_settingsKeys.contains("pskReporterSoftware")) {
224+
m_settingsKeys.append("pskReporterSoftware");
225+
}
226+
}
227+
165228
void FT8DemodSettingsDialog::on_addBand_clicked()
166229
{
167230
int currentRow = ui->bands->currentRow();

0 commit comments

Comments
 (0)