mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-03 13:11:20 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			336 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			336 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
///////////////////////////////////////////////////////////////////////////////////
 | 
						|
// Copyright (C) 2023 Edouard Griffiths, F4EXB <f4exb06@gmail.com>               //
 | 
						|
//                                                                               //
 | 
						|
// This program is free software; you can redistribute it and/or modify          //
 | 
						|
// it under the terms of the GNU General Public License as published by          //
 | 
						|
// the Free Software Foundation as version 3 of the License, or                  //
 | 
						|
// (at your option) any later version.                                           //
 | 
						|
//                                                                               //
 | 
						|
// This program is distributed in the hope that it will be useful,               //
 | 
						|
// but WITHOUT ANY WARRANTY; without even the implied warranty of                //
 | 
						|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                  //
 | 
						|
// GNU General Public License V3 for more details.                               //
 | 
						|
//                                                                               //
 | 
						|
// You should have received a copy of the GNU General Public License             //
 | 
						|
// along with this program. If not, see <http://www.gnu.org/licenses/>.          //
 | 
						|
///////////////////////////////////////////////////////////////////////////////////
 | 
						|
#include <QScrollBar>
 | 
						|
#include <QLineEdit>
 | 
						|
 | 
						|
#include "ft8demodsettings.h"
 | 
						|
#include "ft8demodsettingsdialog.h"
 | 
						|
 | 
						|
FT8DemodSettingsDialog::FT8DemodSettingsDialog(FT8DemodSettings& settings, QStringList& settingsKeys, QWidget* parent ) :
 | 
						|
    QDialog(parent),
 | 
						|
    ui(new Ui::FT8DemodSettingsDialog),
 | 
						|
    m_settings(settings),
 | 
						|
    m_settingsKeys(settingsKeys)
 | 
						|
{
 | 
						|
    ui->setupUi(this);
 | 
						|
    ui->decoderNbThreads->setValue(m_settings.m_nbDecoderThreads);
 | 
						|
    ui->decoderTimeBudget->setValue(m_settings.m_decoderTimeBudget);
 | 
						|
    ui->osdEnable->setChecked(m_settings.m_useOSD);
 | 
						|
    ui->osdDepth->setValue(m_settings.m_osdDepth);
 | 
						|
    ui->osdDepthText->setText(tr("%1").arg(m_settings.m_osdDepth));
 | 
						|
    ui->osdLDPCThreshold->setValue(m_settings.m_osdLDPCThreshold);
 | 
						|
    ui->osdLDPCThresholdText->setText(tr("%1").arg(m_settings.m_osdLDPCThreshold));
 | 
						|
    ui->verifyOSD->setChecked(m_settings.m_verifyOSD);
 | 
						|
    resizeBandsTable();
 | 
						|
    populateBandsTable();
 | 
						|
    connect(ui->bands, &QTableWidget::cellChanged, this, &FT8DemodSettingsDialog::textCellChanged);
 | 
						|
}
 | 
						|
 | 
						|
FT8DemodSettingsDialog::~FT8DemodSettingsDialog()
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::resizeBandsTable()
 | 
						|
{
 | 
						|
    // Fill table with a row of dummy data that will size the columns nicely
 | 
						|
    // Trailing spaces are for sort arrow
 | 
						|
    int row = ui->bands->rowCount();
 | 
						|
    ui->bands->setRowCount(row + 1);
 | 
						|
    ui->bands->setItem(row, BAND_NAME, new QTableWidgetItem("123456789012345"));
 | 
						|
    ui->bands->setItem(row, BAND_BASE_FREQUENCY, new QTableWidgetItem("10000000"));
 | 
						|
    ui->bands->setItem(row, BAND_OFFSET_FREQUENCY, new QTableWidgetItem("-1000"));
 | 
						|
    ui->bands->resizeColumnsToContents();
 | 
						|
    ui->bands->removeRow(row);
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::populateBandsTable()
 | 
						|
{
 | 
						|
    // Add to messages table
 | 
						|
    int row = ui->bands->rowCount();
 | 
						|
 | 
						|
    for (const auto& band : m_settings.m_bandPresets)
 | 
						|
    {
 | 
						|
        ui->bands->setRowCount(row + 1);
 | 
						|
 | 
						|
        QTableWidgetItem *nameItem = new QTableWidgetItem();
 | 
						|
        QTableWidgetItem *baseFrequencyItem = new QTableWidgetItem();
 | 
						|
        QTableWidgetItem *offsetFrequencyItem = new QTableWidgetItem();
 | 
						|
 | 
						|
        ui->bands->setItem(row, BAND_NAME, nameItem);
 | 
						|
        ui->bands->setItem(row, BAND_BASE_FREQUENCY, baseFrequencyItem);
 | 
						|
        ui->bands->setItem(row, BAND_OFFSET_FREQUENCY, offsetFrequencyItem);
 | 
						|
 | 
						|
        nameItem->setText(band.m_name);
 | 
						|
        QLineEdit *editBaseFrequency = new QLineEdit(ui->bands);
 | 
						|
        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);
 | 
						|
        connect(editOffsetFrequency, &QLineEdit::editingFinished, this, &FT8DemodSettingsDialog::offsetFrequencyCellChanged);
 | 
						|
 | 
						|
        row++;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::accept()
 | 
						|
{
 | 
						|
    QDialog::accept();
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::reject()
 | 
						|
{
 | 
						|
    m_settingsKeys.clear();
 | 
						|
    QDialog::reject();
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::on_decoderNbThreads_valueChanged(int value)
 | 
						|
{
 | 
						|
    m_settings.m_nbDecoderThreads = value;
 | 
						|
 | 
						|
    if (!m_settingsKeys.contains("nbDecoderThreads")) {
 | 
						|
        m_settingsKeys.append("nbDecoderThreads");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::on_decoderTimeBudget_valueChanged(double value)
 | 
						|
{
 | 
						|
    m_settings.m_decoderTimeBudget = value;
 | 
						|
 | 
						|
    if (!m_settingsKeys.contains("decoderTimeBudget")) {
 | 
						|
        m_settingsKeys.append("decoderTimeBudget");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::on_osdEnable_toggled(bool checked)
 | 
						|
{
 | 
						|
    m_settings.m_useOSD = checked;
 | 
						|
 | 
						|
    if (!m_settingsKeys.contains("useOSD")) {
 | 
						|
        m_settingsKeys.append("useOSD");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::on_osdDepth_valueChanged(int value)
 | 
						|
{
 | 
						|
    m_settings.m_osdDepth = value;
 | 
						|
    ui->osdDepthText->setText(tr("%1").arg(m_settings.m_osdDepth));
 | 
						|
 | 
						|
    if (!m_settingsKeys.contains("osdDepth")) {
 | 
						|
        m_settingsKeys.append("osdDepth");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::on_osdLDPCThreshold_valueChanged(int value)
 | 
						|
{
 | 
						|
    m_settings.m_osdLDPCThreshold = value;
 | 
						|
    ui->osdLDPCThresholdText->setText(tr("%1").arg(m_settings.m_osdLDPCThreshold));
 | 
						|
 | 
						|
    if (!m_settingsKeys.contains("osdLDPCThreshold")) {
 | 
						|
        m_settingsKeys.append("osdLDPCThreshold");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::on_verifyOSD_stateChanged(int state)
 | 
						|
{
 | 
						|
    m_settings.m_verifyOSD = state == Qt::Checked;
 | 
						|
 | 
						|
    if (!m_settingsKeys.contains("verifyOSD")) {
 | 
						|
        m_settingsKeys.append("verifyOSD");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::on_addBand_clicked()
 | 
						|
{
 | 
						|
    int currentRow = ui->bands->currentRow();
 | 
						|
    const QTableWidgetItem *currentNameItem = ui->bands->item(currentRow, BAND_NAME);
 | 
						|
    FT8DemodBandPreset newPreset({"", 0, 0});
 | 
						|
 | 
						|
    if (currentNameItem) {
 | 
						|
        newPreset.m_name = currentNameItem->text();
 | 
						|
    }
 | 
						|
 | 
						|
    QLineEdit *currentEditBaseFrequency = qobject_cast<QLineEdit*>(ui->bands->cellWidget(currentRow, BAND_BASE_FREQUENCY));
 | 
						|
 | 
						|
    if (currentEditBaseFrequency) {
 | 
						|
        newPreset.m_baseFrequency = currentEditBaseFrequency->text().toInt();
 | 
						|
    }
 | 
						|
 | 
						|
    QLineEdit *currentEditOffsetFrequency = qobject_cast<QLineEdit*>(ui->bands->cellWidget(currentRow, BAND_OFFSET_FREQUENCY));
 | 
						|
 | 
						|
    if (currentEditOffsetFrequency) {
 | 
						|
        newPreset.m_channelOffset = currentEditOffsetFrequency->text().toInt();
 | 
						|
    }
 | 
						|
 | 
						|
    m_settings.m_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");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::on_deleteBand_clicked()
 | 
						|
{
 | 
						|
    int currentRow = ui->bands->currentRow();
 | 
						|
 | 
						|
    if (currentRow < 0) {
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    m_settings.m_bandPresets.removeAt(currentRow);
 | 
						|
    ui->bands->removeRow(currentRow);
 | 
						|
 | 
						|
    if (!m_settingsKeys.contains("bandPresets")) {
 | 
						|
        m_settingsKeys.append("bandPresets");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::on_moveBandUp_clicked()
 | 
						|
{
 | 
						|
    int currentRow = ui->bands->currentRow();
 | 
						|
 | 
						|
    if (currentRow < 1) {
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    ui->bands->blockSignals(true);
 | 
						|
    QList<QTableWidgetItem*> sourceItems = takeRow(currentRow);
 | 
						|
    QList<QTableWidgetItem*> destItems = takeRow(currentRow-1);
 | 
						|
    setRow(currentRow, destItems);
 | 
						|
    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;
 | 
						|
 | 
						|
    if (!m_settingsKeys.contains("bandPresets")) {
 | 
						|
        m_settingsKeys.append("bandPresets");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::on_moveBandDown_clicked()
 | 
						|
{
 | 
						|
    int currentRow = ui->bands->currentRow();
 | 
						|
 | 
						|
    if (currentRow > ui->bands->rowCount()-2) {
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    ui->bands->blockSignals(true);
 | 
						|
    QList<QTableWidgetItem*> sourceItems = takeRow(currentRow);
 | 
						|
    QList<QTableWidgetItem*> destItems = takeRow(currentRow+1);
 | 
						|
    setRow(currentRow, destItems);
 | 
						|
    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;
 | 
						|
 | 
						|
    if (!m_settingsKeys.contains("bandPresets")) {
 | 
						|
        m_settingsKeys.append("bandPresets");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::on_restoreBandPresets_clicked()
 | 
						|
{
 | 
						|
    m_settings.resetBandPresets();
 | 
						|
    ui->bands->blockSignals(true);
 | 
						|
    ui->bands->setRowCount(0);
 | 
						|
    populateBandsTable();
 | 
						|
    ui->bands->blockSignals(false);
 | 
						|
 | 
						|
    if (!m_settingsKeys.contains("bandPresets")) {
 | 
						|
        m_settingsKeys.append("bandPresets");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
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 (!m_settingsKeys.contains("bandPresets")) {
 | 
						|
        m_settingsKeys.append("bandPresets");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::baseFrequencyCellChanged()
 | 
						|
{
 | 
						|
    QLineEdit *editBaseFrequency = qobject_cast<QLineEdit*>(sender());
 | 
						|
 | 
						|
    if (editBaseFrequency)
 | 
						|
    {
 | 
						|
        int row = editBaseFrequency->property("row").toInt();
 | 
						|
        m_settings.m_bandPresets[row].m_baseFrequency = editBaseFrequency->text().toInt();
 | 
						|
    }
 | 
						|
 | 
						|
    if (!m_settingsKeys.contains("bandPresets")) {
 | 
						|
        m_settingsKeys.append("bandPresets");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::offsetFrequencyCellChanged()
 | 
						|
{
 | 
						|
    QLineEdit *editOffsetFrequency = qobject_cast<QLineEdit*>(sender());
 | 
						|
 | 
						|
    if (editOffsetFrequency)
 | 
						|
    {
 | 
						|
        int row = editOffsetFrequency->property("row").toInt();
 | 
						|
        m_settings.m_bandPresets[row].m_channelOffset = editOffsetFrequency->text().toInt();
 | 
						|
    }
 | 
						|
 | 
						|
    if (!m_settingsKeys.contains("bandPresets")) {
 | 
						|
        m_settingsKeys.append("bandPresets");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
QList<QTableWidgetItem*> FT8DemodSettingsDialog::takeRow(int row)
 | 
						|
{
 | 
						|
	QList<QTableWidgetItem*> rowItems;
 | 
						|
 | 
						|
	for (int col = 0; col < ui->bands->columnCount(); ++col) {
 | 
						|
		rowItems << ui->bands->takeItem(row, col);
 | 
						|
	}
 | 
						|
 | 
						|
    return rowItems;
 | 
						|
}
 | 
						|
 | 
						|
void FT8DemodSettingsDialog::setRow(int row, const QList<QTableWidgetItem*>& rowItems)
 | 
						|
{
 | 
						|
	for (int col = 0; col < ui->bands->columnCount(); ++col) {
 | 
						|
		ui->bands->setItem(row, col, rowItems.at(col));
 | 
						|
	}
 | 
						|
}
 |