1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-03-18 14:09:37 -04:00

FT8 demod: separate band presets for FT8 and FT4

This commit is contained in:
f4exb 2026-03-14 21:33:13 +01:00
parent d0ad1ae413
commit a1d3a3403d
6 changed files with 197 additions and 85 deletions

View File

@ -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);
}

View File

@ -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<FT8DemodBandPreset>& FT8DemodSettings::getBandPresets(DecoderMode mode)
{
m_bandPresets = getBandPresetsForMode(decoderMode);
if (mode == DecoderModeFT4) {
return m_ft4BandPresets;
} else {
return m_ft8BandPresets;
}
}
QList<FT8DemodBandPreset> FT8DemodSettings::getBandPresetsForMode(int decoderMode)
void FT8DemodSettings::resetBandPresets(DecoderMode decoderMode)
{
getBandPresets(decoderMode) = getDefaultBandPresetsForMode(decoderMode);
}
QList<FT8DemodBandPreset> FT8DemodSettings::getDefaultBandPresetsForMode(DecoderMode decoderMode)
{
QList<FT8DemodBandPreset> 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;
}

View File

@ -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<FT8DemodFilterSettings> m_filterBank;
unsigned int m_filterIndex;
QList<FT8DemodBandPreset> m_bandPresets;
QList<FT8DemodBandPreset> m_ft8BandPresets;
QList<FT8DemodBandPreset> 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<FT8DemodBandPreset>& 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<FT8DemodBandPreset> getBandPresetsForMode(int decoderMode);
static QString getDecoderModeString(DecoderMode decoderMode);
static int getDecoderFrameDurationMs(DecoderMode decoderMode);
static int getDecoderFrameSamples(DecoderMode decoderMode);
static QList<FT8DemodBandPreset> getDefaultBandPresetsForMode(DecoderMode decoderMode);
static bool areBandPresetsEqual(const QList<FT8DemodBandPreset>& left, const QList<FT8DemodBandPreset>& right);
static const int m_ft8SampleRate;

View File

@ -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<FT8DemodBandPreset>& 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<FT8DemodBandPreset> 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<FT8DemodSettings::DecoderMode>(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<FT8DemodBandPreset>& 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<FT8DemodBandPreset>& 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<FT8DemodBandPreset>& 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<FT8DemodBandPreset>& 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<FT8DemodBandPreset>& 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<FT8DemodBandPreset>& 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<FT8DemodBandPreset>& 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");
}
}

View File

@ -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;

View File

@ -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;