diff --git a/plugins/channelrx/demodft8/ft8demodgui.cpp b/plugins/channelrx/demodft8/ft8demodgui.cpp index 945a085b5..863068eb9 100644 --- a/plugins/channelrx/demodft8/ft8demodgui.cpp +++ b/plugins/channelrx/demodft8/ft8demodgui.cpp @@ -451,8 +451,8 @@ void FT8DemodGUI::on_filterMessages_toggled(bool checked) void FT8DemodGUI::on_applyBandPreset_clicked() { int bandPresetIndex = ui->bandPreset->currentIndex(); - int channelShift = m_settings.m_bandPresets[bandPresetIndex].m_channelOffset; // kHz - int baseFrequency = m_settings.m_bandPresets[bandPresetIndex].m_baseFrequency; // kHz + int channelShift = m_settings.getBandPresets(m_settings.m_decoderMode)[bandPresetIndex].m_channelOffset; // kHz + int baseFrequency = m_settings.getBandPresets(m_settings.m_decoderMode)[bandPresetIndex].m_baseFrequency; // kHz quint64 deviceFrequency = (baseFrequency - channelShift)*1000; // Hz m_ft8Demod->setDeviceCenterFrequency(deviceFrequency, m_settings.m_streamIndex); @@ -558,9 +558,16 @@ void FT8DemodGUI::on_settings_clicked() changed = true; } - if (settingsKeys.contains("bandPresets")) + if (settingsKeys.contains("ft8BandPresets")) { - m_settings.m_bandPresets = settings.m_bandPresets; + m_settings.m_ft8BandPresets = settings.m_ft8BandPresets; + populateBandPresets(); + changed = true; + } + + if (settingsKeys.contains("ft4BandPresets")) + { + m_settings.m_ft4BandPresets = settings.m_ft4BandPresets; populateBandPresets(); changed = true; } @@ -975,7 +982,7 @@ void FT8DemodGUI::populateBandPresets() ui->bandPreset->blockSignals(true); ui->bandPreset->clear(); - for (const auto& bandPreset : m_settings.m_bandPresets) { + for (const auto& bandPreset : m_settings.getBandPresets(m_settings.m_decoderMode)) { ui->bandPreset->addItem(bandPreset.m_name); } diff --git a/plugins/channelrx/demodft8/ft8demodsettings.cpp b/plugins/channelrx/demodft8/ft8demodsettings.cpp index 9049f3271..7689fbe11 100644 --- a/plugins/channelrx/demodft8/ft8demodsettings.cpp +++ b/plugins/channelrx/demodft8/ft8demodsettings.cpp @@ -74,7 +74,8 @@ void FT8DemodSettings::resetToDefaults() m_pskReporterCallsign = getDefaultReporterCallsign(); m_pskReporterLocator = getDefaultReporterLocator(); m_pskReporterSoftware = "SDRangel FT8 Demod"; - resetBandPresets(); + resetBandPresets(DecoderModeFT8); + resetBandPresets(DecoderModeFT4); } void FT8DemodSettings::resetBandPresets() @@ -82,12 +83,21 @@ void FT8DemodSettings::resetBandPresets() resetBandPresets(m_decoderMode); } -void FT8DemodSettings::resetBandPresets(int decoderMode) +QList& FT8DemodSettings::getBandPresets(DecoderMode mode) { - m_bandPresets = getBandPresetsForMode(decoderMode); + if (mode == DecoderModeFT4) { + return m_ft4BandPresets; + } else { + return m_ft8BandPresets; + } } -QList FT8DemodSettings::getBandPresetsForMode(int decoderMode) +void FT8DemodSettings::resetBandPresets(DecoderMode decoderMode) +{ + getBandPresets(decoderMode) = getDefaultBandPresetsForMode(decoderMode); +} + +QList FT8DemodSettings::getDefaultBandPresetsForMode(DecoderMode decoderMode) { QList bandPresets; @@ -158,11 +168,15 @@ QByteArray FT8DemodSettings::serialize() const SimpleSerializer s(1); QByteArray bytetmp; - QDataStream *stream = new QDataStream(&bytetmp, QIODevice::WriteOnly); - *stream << m_bandPresets; - delete stream; + QDataStream *stream8 = new QDataStream(&bytetmp, QIODevice::WriteOnly); + *stream8 << m_ft8BandPresets; + delete stream8; s.writeBlob(2, bytetmp); + QDataStream *stream4 = new QDataStream(&bytetmp, QIODevice::WriteOnly); + *stream4 << m_ft4BandPresets; + delete stream4; + s.writeBlob(34, bytetmp); s.writeS32(1, m_inputFrequencyOffset); s.writeS32(3, m_volume * 10.0); @@ -233,7 +247,19 @@ bool FT8DemodSettings::deserialize(const QByteArray& data) d.readBlob(2, &bytetmp); QDataStream readStream(&bytetmp, QIODevice::ReadOnly); - readStream >> m_bandPresets; + readStream >> m_ft8BandPresets; + + d.readBlob(34, &bytetmp); + QDataStream readStream4(&bytetmp, QIODevice::ReadOnly); + readStream4 >> m_ft4BandPresets; + + if (m_ft8BandPresets.isEmpty()) { + resetBandPresets(DecoderModeFT8); + } + + if (m_ft4BandPresets.isEmpty()) { + resetBandPresets(DecoderModeFT4); + } d.readS32(1, &m_inputFrequencyOffset, 0); d.readS32(3, &tmp, 30); @@ -248,8 +274,8 @@ 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(10, &m_decoderMode, DecoderModeFT8); - m_decoderMode = (m_decoderMode >= DecoderModeFT8) && (m_decoderMode <= DecoderModeFT4) ? m_decoderMode : DecoderModeFT8; + d.readS32(10, &tmp, (int) DecoderModeFT8); + m_decoderMode = (tmp >= DecoderModeFT8) && (tmp <= DecoderModeFT4) ? (DecoderMode) tmp : DecoderModeFT8; d.readS32(8, &m_nbDecoderThreads, 3); d.readFloat(9, &m_decoderTimeBudget, 0.5); d.readBool(11, &m_agc, false); @@ -386,8 +412,11 @@ void FT8DemodSettings::applySettings(const QStringList& settingsKeys, const FT8D if (settingsKeys.contains("filterIndex")) { m_filterIndex = settings.m_filterIndex; } - if (settingsKeys.contains("bandPresets")) { - m_bandPresets = settings.m_bandPresets; + if (settingsKeys.contains("ft8BandPresets")) { + m_ft8BandPresets = settings.m_ft8BandPresets; + } + if (settingsKeys.contains("ft4BandPresets")) { + m_ft4BandPresets = settings.m_ft4BandPresets; } if (settingsKeys.contains("enablePSKReporter")) { m_enablePSKReporter = settings.m_enablePSKReporter; @@ -525,17 +554,17 @@ QString FT8DemodSettings::getDefaultReporterSoftware() const return QCoreApplication::applicationName() + " " + QCoreApplication::applicationVersion(); } -QString FT8DemodSettings::getDecoderModeString(int decoderMode) +QString FT8DemodSettings::getDecoderModeString(DecoderMode decoderMode) { return decoderMode == DecoderModeFT4 ? "FT4" : "FT8"; } -int FT8DemodSettings::getDecoderFrameDurationMs(int decoderMode) +int FT8DemodSettings::getDecoderFrameDurationMs(DecoderMode decoderMode) { return decoderMode == DecoderModeFT4 ? 7500 : 15000; } -int FT8DemodSettings::getDecoderFrameSamples(int decoderMode) +int FT8DemodSettings::getDecoderFrameSamples(DecoderMode decoderMode) { return (m_ft8SampleRate * getDecoderFrameDurationMs(decoderMode)) / 1000; } diff --git a/plugins/channelrx/demodft8/ft8demodsettings.h b/plugins/channelrx/demodft8/ft8demodsettings.h index 49253e914..a405648a6 100644 --- a/plugins/channelrx/demodft8/ft8demodsettings.h +++ b/plugins/channelrx/demodft8/ft8demodsettings.h @@ -81,7 +81,7 @@ public: bool m_agc; bool m_recordWav; bool m_logMessages; - int m_decoderMode; + DecoderMode m_decoderMode; int m_nbDecoderThreads; float m_decoderTimeBudget; bool m_useOSD; @@ -102,7 +102,8 @@ public: // FFTWindow::Function m_fftWindow; std::vector m_filterBank; unsigned int m_filterIndex; - QList m_bandPresets; + QList m_ft8BandPresets; + QList m_ft4BandPresets; bool m_enablePSKReporter; QString m_pskReporterCallsign; QString m_pskReporterLocator; @@ -120,16 +121,17 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); void resetBandPresets(); - void resetBandPresets(int decoderMode); + QList& getBandPresets(DecoderMode mode); + void resetBandPresets(DecoderMode decoderMode); QString getDefaultReporterCallsign() const; QString getDefaultReporterLocator() const; QString getDefaultReporterSoftware() const; void applySettings(const QStringList& settingsKeys, const FT8DemodSettings& settings); QString getDebugString(const QStringList& settingsKeys, bool force=false) const; - static QString getDecoderModeString(int decoderMode); - static int getDecoderFrameDurationMs(int decoderMode); - static int getDecoderFrameSamples(int decoderMode); - static QList getBandPresetsForMode(int decoderMode); + static QString getDecoderModeString(DecoderMode decoderMode); + static int getDecoderFrameDurationMs(DecoderMode decoderMode); + static int getDecoderFrameSamples(DecoderMode decoderMode); + static QList getDefaultBandPresetsForMode(DecoderMode decoderMode); static bool areBandPresetsEqual(const QList& left, const QList& right); static const int m_ft8SampleRate; diff --git a/plugins/channelrx/demodft8/ft8demodsettingsdialog.cpp b/plugins/channelrx/demodft8/ft8demodsettingsdialog.cpp index 3e42b9ada..7ddb20da3 100644 --- a/plugins/channelrx/demodft8/ft8demodsettingsdialog.cpp +++ b/plugins/channelrx/demodft8/ft8demodsettingsdialog.cpp @@ -66,9 +66,9 @@ void FT8DemodSettingsDialog::populateBandsTable() { // Add to messages table int row = ui->bands->rowCount(); - m_settings.m_bandPresets = FT8DemodSettings::getBandPresetsForMode(m_settings.m_decoderMode); + const QList& bandPresets = m_settings.getBandPresets(m_settings.m_decoderMode); - for (const auto& band : m_settings.m_bandPresets) + for (const auto& band : bandPresets) { ui->bands->setRowCount(row + 1); @@ -85,13 +85,11 @@ void FT8DemodSettingsDialog::populateBandsTable() editBaseFrequency->setValidator(new QIntValidator()); editBaseFrequency->setText(tr("%1").arg(band.m_baseFrequency)); editBaseFrequency->setAlignment(Qt::AlignRight); - editBaseFrequency->setProperty("row", row); ui->bands->setCellWidget(row, BAND_BASE_FREQUENCY, editBaseFrequency); QLineEdit *editOffsetFrequency = new QLineEdit(ui->bands); editOffsetFrequency->setValidator(new QIntValidator()); editOffsetFrequency->setText(tr("%1").arg(band.m_channelOffset)); editOffsetFrequency->setAlignment(Qt::AlignRight); - editOffsetFrequency->setProperty("row", row); ui->bands->setCellWidget(row, BAND_OFFSET_FREQUENCY, editOffsetFrequency); connect(editBaseFrequency, &QLineEdit::editingFinished, this, &FT8DemodSettingsDialog::baseFrequencyCellChanged); @@ -114,25 +112,10 @@ void FT8DemodSettingsDialog::reject() void FT8DemodSettingsDialog::on_decoderMode_currentIndexChanged(int index) { - const int previousDecoderMode = m_settings.m_decoderMode; - const QList previousDefaults = FT8DemodSettings::getBandPresetsForMode(previousDecoderMode); - const bool hadDefaultBandPresets = FT8DemodSettings::areBandPresetsEqual(m_settings.m_bandPresets, previousDefaults); - - m_settings.m_decoderMode = (index >= FT8DemodSettings::DecoderModeFT8) && (index <= FT8DemodSettings::DecoderModeFT4) ? - index : FT8DemodSettings::DecoderModeFT8; - - if (hadDefaultBandPresets) - { - m_settings.resetBandPresets(m_settings.m_decoderMode); - ui->bands->blockSignals(true); - ui->bands->setRowCount(0); - populateBandsTable(); - ui->bands->blockSignals(false); - - if (!m_settingsKeys.contains("bandPresets")) { - m_settingsKeys.append("bandPresets"); - } - } + m_settings.m_decoderMode = static_cast(index); + ui->bands->setRowCount(0); + populateBandsTable(); + ui->bands->blockSignals(false); if (!m_settingsKeys.contains("decoderMode")) { m_settingsKeys.append("decoderMode"); @@ -276,15 +259,20 @@ void FT8DemodSettingsDialog::on_addBand_clicked() newPreset.m_channelOffset = currentEditOffsetFrequency->text().toInt(); } - m_settings.m_bandPresets.push_back(newPreset); + QList& bandPresets = m_settings.getBandPresets(m_settings.m_decoderMode); + bandPresets.push_back(newPreset); ui->bands->blockSignals(true); ui->bands->setRowCount(0); populateBandsTable(); ui->bands->scrollToBottom(); ui->bands->blockSignals(false); - if (!m_settingsKeys.contains("bandPresets")) { - m_settingsKeys.append("bandPresets"); + if (!m_settingsKeys.contains("ft8BandPresets")) { + m_settingsKeys.append("ft8BandPresets"); + } + + if (!m_settingsKeys.contains("ft4BandPresets")) { + m_settingsKeys.append("ft4BandPresets"); } } @@ -296,11 +284,16 @@ void FT8DemodSettingsDialog::on_deleteBand_clicked() return; } - m_settings.m_bandPresets.removeAt(currentRow); + QList& bandPresets = m_settings.getBandPresets(m_settings.m_decoderMode); + bandPresets.removeAt(currentRow); ui->bands->removeRow(currentRow); - if (!m_settingsKeys.contains("bandPresets")) { - m_settingsKeys.append("bandPresets"); + if (!m_settingsKeys.contains("ft8BandPresets")) { + m_settingsKeys.append("ft8BandPresets"); + } + + if (!m_settingsKeys.contains("ft4BandPresets")) { + m_settingsKeys.append("ft4BandPresets"); } } @@ -319,13 +312,18 @@ void FT8DemodSettingsDialog::on_moveBandUp_clicked() setRow(currentRow-1, sourceItems); ui->bands->blockSignals(false); - const auto sourceBandPreset = m_settings.m_bandPresets[currentRow]; - const auto destBandPreset = m_settings.m_bandPresets[currentRow-1]; - m_settings.m_bandPresets[currentRow] = destBandPreset; - m_settings.m_bandPresets[currentRow-1] = sourceBandPreset; + QList& bandPresets = m_settings.getBandPresets(m_settings.m_decoderMode); + const auto sourceBandPreset = bandPresets[currentRow]; + const auto destBandPreset = bandPresets[currentRow-1]; + bandPresets[currentRow] = destBandPreset; + bandPresets[currentRow-1] = sourceBandPreset; - if (!m_settingsKeys.contains("bandPresets")) { - m_settingsKeys.append("bandPresets"); + if (!m_settingsKeys.contains("ft8BandPresets")) { + m_settingsKeys.append("ft8BandPresets"); + } + + if (!m_settingsKeys.contains("ft4BandPresets")) { + m_settingsKeys.append("ft4BandPresets"); } } @@ -344,13 +342,18 @@ void FT8DemodSettingsDialog::on_moveBandDown_clicked() setRow(currentRow+1, sourceItems); ui->bands->blockSignals(false); - const auto sourceBandPreset = m_settings.m_bandPresets[currentRow]; - const auto destBandPreset = m_settings.m_bandPresets[currentRow+1]; - m_settings.m_bandPresets[currentRow] = destBandPreset; - m_settings.m_bandPresets[currentRow+1] = sourceBandPreset; + QList& bandPresets = m_settings.getBandPresets(m_settings.m_decoderMode); + const auto sourceBandPreset = bandPresets[currentRow]; + const auto destBandPreset = bandPresets[currentRow+1]; + bandPresets[currentRow] = destBandPreset; + bandPresets[currentRow+1] = sourceBandPreset; - if (!m_settingsKeys.contains("bandPresets")) { - m_settingsKeys.append("bandPresets"); + if (!m_settingsKeys.contains("ft8BandPresets")) { + m_settingsKeys.append("ft8BandPresets"); + } + + if (!m_settingsKeys.contains("ft4BandPresets")) { + m_settingsKeys.append("ft4BandPresets"); } } @@ -362,19 +365,40 @@ void FT8DemodSettingsDialog::on_restoreBandPresets_clicked() populateBandsTable(); ui->bands->blockSignals(false); - if (!m_settingsKeys.contains("bandPresets")) { - m_settingsKeys.append("bandPresets"); + if (!m_settingsKeys.contains("ft8BandPresets")) { + m_settingsKeys.append("ft8BandPresets"); + } + + if (!m_settingsKeys.contains("ft4BandPresets")) { + m_settingsKeys.append("ft4BandPresets"); } } void FT8DemodSettingsDialog::textCellChanged(int row, int col) { - if (col == BAND_NAME) { - m_settings.m_bandPresets[row].m_name = ui->bands->item(row, col)->text(); + if (col == BAND_NAME) + { + QList& bandPresets = m_settings.getBandPresets(m_settings.m_decoderMode); + + if ((row < 0) || (row >= bandPresets.size())) { + return; + } + + QTableWidgetItem *nameItem = ui->bands->item(row, col); + + if (!nameItem) { + return; + } + + bandPresets[row].m_name = nameItem->text(); } - if (!m_settingsKeys.contains("bandPresets")) { - m_settingsKeys.append("bandPresets"); + if (!m_settingsKeys.contains("ft8BandPresets")) { + m_settingsKeys.append("ft8BandPresets"); + } + + if (!m_settingsKeys.contains("ft4BandPresets")) { + m_settingsKeys.append("ft4BandPresets"); } } @@ -384,12 +408,36 @@ void FT8DemodSettingsDialog::baseFrequencyCellChanged() if (editBaseFrequency) { - int row = editBaseFrequency->property("row").toInt(); - m_settings.m_bandPresets[row].m_baseFrequency = editBaseFrequency->text().toInt(); + int row = -1; + + for (int i = 0; i < ui->bands->rowCount(); ++i) + { + if (ui->bands->cellWidget(i, BAND_BASE_FREQUENCY) == editBaseFrequency) + { + row = i; + break; + } + } + + if (row < 0) { + return; + } + + QList& bandPresets = m_settings.getBandPresets(m_settings.m_decoderMode); + + if (row >= bandPresets.size()) { + return; + } + + bandPresets[row].m_baseFrequency = editBaseFrequency->text().toInt(); } - if (!m_settingsKeys.contains("bandPresets")) { - m_settingsKeys.append("bandPresets"); + if (!m_settingsKeys.contains("ft8BandPresets")) { + m_settingsKeys.append("ft8BandPresets"); + } + + if (!m_settingsKeys.contains("ft4BandPresets")) { + m_settingsKeys.append("ft4BandPresets"); } } @@ -399,12 +447,36 @@ void FT8DemodSettingsDialog::offsetFrequencyCellChanged() if (editOffsetFrequency) { - int row = editOffsetFrequency->property("row").toInt(); - m_settings.m_bandPresets[row].m_channelOffset = editOffsetFrequency->text().toInt(); + int row = -1; + + for (int i = 0; i < ui->bands->rowCount(); ++i) + { + if (ui->bands->cellWidget(i, BAND_OFFSET_FREQUENCY) == editOffsetFrequency) + { + row = i; + break; + } + } + + if (row < 0) { + return; + } + + QList& bandPresets = m_settings.getBandPresets(m_settings.m_decoderMode); + + if (row >= bandPresets.size()) { + return; + } + + bandPresets[row].m_channelOffset = editOffsetFrequency->text().toInt(); } - if (!m_settingsKeys.contains("bandPresets")) { - m_settingsKeys.append("bandPresets"); + if (!m_settingsKeys.contains("ft8BandPresets")) { + m_settingsKeys.append("ft8BandPresets"); + } + + if (!m_settingsKeys.contains("ft4BandPresets")) { + m_settingsKeys.append("ft4BandPresets"); } } diff --git a/plugins/channelrx/demodft8/ft8demodworker.cpp b/plugins/channelrx/demodft8/ft8demodworker.cpp index 0388c203c..08ecd6ccc 100644 --- a/plugins/channelrx/demodft8/ft8demodworker.cpp +++ b/plugins/channelrx/demodft8/ft8demodworker.cpp @@ -177,7 +177,7 @@ FT8DemodWorker::FT8DemodWorker() : FT8DemodWorker::~FT8DemodWorker() {} -void FT8DemodWorker::setDecoderMode(int decoderMode) +void FT8DemodWorker::setDecoderMode(FT8DemodSettings::DecoderMode decoderMode) { m_decoderMode = decoderMode; m_unsupportedModeWarningPending = true; diff --git a/plugins/channelrx/demodft8/ft8demodworker.h b/plugins/channelrx/demodft8/ft8demodworker.h index 446139323..597d656e4 100644 --- a/plugins/channelrx/demodft8/ft8demodworker.h +++ b/plugins/channelrx/demodft8/ft8demodworker.h @@ -27,6 +27,8 @@ #include "ft4.h" #include "packing.h" +#include "ft8demodsettings.h" + class QDateTime; class MessageQueue; class MsgReportFT8Messages; @@ -45,7 +47,7 @@ public: void setEnablePskReporter(bool enablePskReporter) { m_enablePskReporter = enablePskReporter; } void setNbDecoderThreads(int nbDecoderThreads) { m_nbDecoderThreads = nbDecoderThreads; } void setDecoderTimeBudget(float decoderTimeBudget) { m_decoderTimeBudget = decoderTimeBudget; } - void setDecoderMode(int decoderMode); + void setDecoderMode(FT8DemodSettings::DecoderMode decoderMode); void setUseOSD(bool useOSD) { m_useOSD = useOSD; } void setOSDDepth(int osdDepth) { m_osdDepth = osdDepth; } void setOSDLDPCThreshold(int osdLDPCThreshold) { m_osdLDPCThreshold = osdLDPCThreshold; } @@ -102,7 +104,7 @@ private: bool m_enablePskReporter; int m_nbDecoderThreads; float m_decoderTimeBudget; - int m_decoderMode; + FT8DemodSettings::DecoderMode m_decoderMode; bool m_useOSD; int m_osdDepth; int m_osdLDPCThreshold;