mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-09-29 16:26:47 -04:00
DATV: external LDPC tool implementation final: dialog to select ldpctool and maximum retries
This commit is contained in:
parent
3e02af8d93
commit
7334b2fd20
@ -13,6 +13,7 @@ set(datv_SOURCES
|
|||||||
datvdemodreport.cpp
|
datvdemodreport.cpp
|
||||||
datvdemodsink.cpp
|
datvdemodsink.cpp
|
||||||
datvdemodbaseband.cpp
|
datvdemodbaseband.cpp
|
||||||
|
datvdvbs2ldpcdialog.cpp
|
||||||
leansdr/dvb.cpp
|
leansdr/dvb.cpp
|
||||||
leansdr/filtergen.cpp
|
leansdr/filtergen.cpp
|
||||||
leansdr/framework.cpp
|
leansdr/framework.cpp
|
||||||
@ -20,6 +21,7 @@ set(datv_SOURCES
|
|||||||
leansdr/sdr.cpp
|
leansdr/sdr.cpp
|
||||||
ldpctool/tables_handler.cpp
|
ldpctool/tables_handler.cpp
|
||||||
datvdemodgui.ui
|
datvdemodgui.ui
|
||||||
|
datvdvbs2ldpcdialog.ui
|
||||||
)
|
)
|
||||||
|
|
||||||
set(datv_HEADERS
|
set(datv_HEADERS
|
||||||
@ -36,6 +38,7 @@ set(datv_HEADERS
|
|||||||
datvdemodreport.h
|
datvdemodreport.h
|
||||||
datvdemodsink.h
|
datvdemodsink.h
|
||||||
datvdemodbaseband.h
|
datvdemodbaseband.h
|
||||||
|
datvdvbs2ldpcdialog.h
|
||||||
leansdr/dvb.h
|
leansdr/dvb.h
|
||||||
leansdr/dvbs2.h
|
leansdr/dvbs2.h
|
||||||
leansdr/filtergen.h
|
leansdr/filtergen.h
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
|
|
||||||
#include "datvdemodreport.h"
|
#include "datvdemodreport.h"
|
||||||
|
#include "datvdvbs2ldpcdialog.h"
|
||||||
#include "datvdemodgui.h"
|
#include "datvdemodgui.h"
|
||||||
|
|
||||||
const char* const DATVDemodGUI::m_strChannelID = "sdrangel.channel.demoddatv";
|
const char* const DATVDemodGUI::m_strChannelID = "sdrangel.channel.demoddatv";
|
||||||
@ -250,6 +251,9 @@ DATVDemodGUI::DATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, Ba
|
|||||||
CRightClickEnabler *audioMuteRightClickEnabler = new CRightClickEnabler(ui->audioMute);
|
CRightClickEnabler *audioMuteRightClickEnabler = new CRightClickEnabler(ui->audioMute);
|
||||||
connect(audioMuteRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(audioSelect()));
|
connect(audioMuteRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(audioSelect()));
|
||||||
|
|
||||||
|
CRightClickEnabler *ldpcToolRightClickEnabler = new CRightClickEnabler(ui->softLDPC);
|
||||||
|
connect(ldpcToolRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(ldpcToolSelect()));
|
||||||
|
|
||||||
resetToDefaults(); // does applySettings()
|
resetToDefaults(); // does applySettings()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -428,7 +432,7 @@ void DATVDemodGUI::enterEvent(QEvent*)
|
|||||||
|
|
||||||
void DATVDemodGUI::audioSelect()
|
void DATVDemodGUI::audioSelect()
|
||||||
{
|
{
|
||||||
qDebug("AMDemodGUI::audioSelect");
|
qDebug("DATVDemodGUI::audioSelect");
|
||||||
AudioSelectDialog audioSelect(DSPEngine::instance()->getAudioDeviceManager(), m_settings.m_audioDeviceName);
|
AudioSelectDialog audioSelect(DSPEngine::instance()->getAudioDeviceManager(), m_settings.m_audioDeviceName);
|
||||||
audioSelect.exec();
|
audioSelect.exec();
|
||||||
|
|
||||||
@ -439,6 +443,21 @@ void DATVDemodGUI::audioSelect()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DATVDemodGUI::ldpcToolSelect()
|
||||||
|
{
|
||||||
|
qDebug("DATVDemodGUI::ldpcToolSelect");
|
||||||
|
DatvDvbS2LdpcDialog ldpcDialog;
|
||||||
|
ldpcDialog.setFileName(m_settings.m_softLDPCToolPath);
|
||||||
|
ldpcDialog.setMaxTrials(m_settings.m_softLDPCMaxTrials);
|
||||||
|
|
||||||
|
if (ldpcDialog.exec() == QDialog::Accepted)
|
||||||
|
{
|
||||||
|
m_settings.m_softLDPCMaxTrials = ldpcDialog.getMaxTrials();
|
||||||
|
m_settings.m_softLDPCToolPath = ldpcDialog.getFileName();
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DATVDemodGUI::tick()
|
void DATVDemodGUI::tick()
|
||||||
{
|
{
|
||||||
if (m_objDATVDemod)
|
if (m_objDATVDemod)
|
||||||
|
@ -62,6 +62,7 @@ private slots:
|
|||||||
void onMenuDialogCalled(const QPoint& p);
|
void onMenuDialogCalled(const QPoint& p);
|
||||||
void handleInputMessages();
|
void handleInputMessages();
|
||||||
void audioSelect();
|
void audioSelect();
|
||||||
|
void ldpcToolSelect();
|
||||||
void tick();
|
void tick();
|
||||||
|
|
||||||
void on_cmbStandard_currentIndexChanged(int index);
|
void on_cmbStandard_currentIndexChanged(int index);
|
||||||
|
@ -43,6 +43,8 @@ void DATVDemodSettings::resetToDefaults()
|
|||||||
m_modulation = BPSK;
|
m_modulation = BPSK;
|
||||||
m_fec = FEC12;
|
m_fec = FEC12;
|
||||||
m_softLDPC = false;
|
m_softLDPC = false;
|
||||||
|
m_softLDPCToolPath = "/opt/install/sdrangel/bin/ldpctool";
|
||||||
|
m_softLDPCMaxTrials = 8;
|
||||||
m_maxBitflips = 0;
|
m_maxBitflips = 0;
|
||||||
m_symbolRate = 250000;
|
m_symbolRate = 250000;
|
||||||
m_notchFilters = 0;
|
m_notchFilters = 0;
|
||||||
@ -107,6 +109,8 @@ QByteArray DATVDemodSettings::serialize() const
|
|||||||
s.writeU32(31, m_reverseAPIChannelIndex);
|
s.writeU32(31, m_reverseAPIChannelIndex);
|
||||||
s.writeBool(32, m_softLDPC);
|
s.writeBool(32, m_softLDPC);
|
||||||
s.writeS32(33, m_maxBitflips);
|
s.writeS32(33, m_maxBitflips);
|
||||||
|
s.writeString(34, m_softLDPCToolPath);
|
||||||
|
s.writeS32(35, m_softLDPCMaxTrials);
|
||||||
|
|
||||||
return s.final();
|
return s.final();
|
||||||
}
|
}
|
||||||
@ -191,6 +195,9 @@ bool DATVDemodSettings::deserialize(const QByteArray& data)
|
|||||||
|
|
||||||
d.readBool(32, &m_softLDPC, false);
|
d.readBool(32, &m_softLDPC, false);
|
||||||
d.readS32(33, &m_maxBitflips, 0);
|
d.readS32(33, &m_maxBitflips, 0);
|
||||||
|
d.readString(34, &m_softLDPCToolPath, "/opt/install/sdrangel/bin/ldpctool");
|
||||||
|
d.readS32(35, &tmp, 8);
|
||||||
|
m_softLDPCMaxTrials = tmp < 1 ? 1 : tmp > 8 ? 8 : tmp;
|
||||||
|
|
||||||
validateSystemConfiguration();
|
validateSystemConfiguration();
|
||||||
|
|
||||||
@ -217,6 +224,8 @@ void DATVDemodSettings::debug(const QString& msg) const
|
|||||||
<< " m_viterbi: " << m_viterbi
|
<< " m_viterbi: " << m_viterbi
|
||||||
<< " m_fec: " << m_fec
|
<< " m_fec: " << m_fec
|
||||||
<< " m_softLDPC: " << m_softLDPC
|
<< " m_softLDPC: " << m_softLDPC
|
||||||
|
<< " m_softLDPCMaxTrials: " << m_softLDPCMaxTrials
|
||||||
|
<< " m_softLDPCToolPath: " << m_softLDPCToolPath
|
||||||
<< " m_maxBitflips: " << m_maxBitflips
|
<< " m_maxBitflips: " << m_maxBitflips
|
||||||
<< " m_modulation: " << m_modulation
|
<< " m_modulation: " << m_modulation
|
||||||
<< " m_standard: " << m_standard
|
<< " m_standard: " << m_standard
|
||||||
@ -239,6 +248,8 @@ bool DATVDemodSettings::isDifferent(const DATVDemodSettings& other)
|
|||||||
|| (m_viterbi != other.m_viterbi)
|
|| (m_viterbi != other.m_viterbi)
|
||||||
|| (m_fec != other.m_fec)
|
|| (m_fec != other.m_fec)
|
||||||
|| (m_softLDPC != other.m_softLDPC)
|
|| (m_softLDPC != other.m_softLDPC)
|
||||||
|
|| (m_softLDPCMaxTrials != other.m_softLDPCMaxTrials)
|
||||||
|
|| (m_softLDPCToolPath != other.m_softLDPCToolPath)
|
||||||
|| (m_maxBitflips != other.m_maxBitflips)
|
|| (m_maxBitflips != other.m_maxBitflips)
|
||||||
|| (m_modulation != other.m_modulation)
|
|| (m_modulation != other.m_modulation)
|
||||||
|| (m_standard != other.m_standard)
|
|| (m_standard != other.m_standard)
|
||||||
|
@ -81,6 +81,8 @@ struct DATVDemodSettings
|
|||||||
DATVModulation m_modulation;
|
DATVModulation m_modulation;
|
||||||
DATVCodeRate m_fec;
|
DATVCodeRate m_fec;
|
||||||
bool m_softLDPC;
|
bool m_softLDPC;
|
||||||
|
QString m_softLDPCToolPath;
|
||||||
|
int m_softLDPCMaxTrials;
|
||||||
int m_maxBitflips;
|
int m_maxBitflips;
|
||||||
bool m_audioMute;
|
bool m_audioMute;
|
||||||
QString m_audioDeviceName;
|
QString m_audioDeviceName;
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <QFileInfo>
|
||||||
|
|
||||||
#include "audio/audiooutputdevice.h"
|
#include "audio/audiooutputdevice.h"
|
||||||
#include "dsp/dspengine.h"
|
#include "dsp/dspengine.h"
|
||||||
@ -903,9 +904,9 @@ void DATVDemodSink::InitDATVS2Framework()
|
|||||||
<< " RollOff: " << m_settings.m_rollOff
|
<< " RollOff: " << m_settings.m_rollOff
|
||||||
<< " Viterbi: " << m_settings.m_viterbi
|
<< " Viterbi: " << m_settings.m_viterbi
|
||||||
<< " Excursion: " << m_settings.m_excursion
|
<< " Excursion: " << m_settings.m_excursion
|
||||||
<< " Sample rate: " << m_channelSampleRate ;
|
<< " Sample rate: " << m_channelSampleRate
|
||||||
|
<< " m_softLDPCMaxTrials: " << m_settings.m_softLDPCMaxTrials
|
||||||
|
<< " m_softLDPCToolPath: " << m_settings.m_softLDPCToolPath;
|
||||||
|
|
||||||
m_objCfg.standard = m_settings.m_standard;
|
m_objCfg.standard = m_settings.m_standard;
|
||||||
|
|
||||||
@ -1139,9 +1140,18 @@ void DATVDemodSink::InitDATVS2Framework()
|
|||||||
p_vbitcount= new leansdr::pipebuf<int>(m_objScheduler, "Bits processed", BUF_S2PACKETS);
|
p_vbitcount= new leansdr::pipebuf<int>(m_objScheduler, "Bits processed", BUF_S2PACKETS);
|
||||||
p_verrcount = new leansdr::pipebuf<int>(m_objScheduler, "Bits corrected", BUF_S2PACKETS);
|
p_verrcount = new leansdr::pipebuf<int>(m_objScheduler, "Bits corrected", BUF_S2PACKETS);
|
||||||
|
|
||||||
if (m_settings.m_softLDPC)
|
bool commandFileValid = false;
|
||||||
|
|
||||||
|
if (QFileInfo::exists(m_settings.m_softLDPCToolPath))
|
||||||
|
{
|
||||||
|
QFileInfo fileInfo = QFileInfo(m_settings.m_softLDPCToolPath);
|
||||||
|
commandFileValid = fileInfo.isExecutable();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_settings.m_softLDPC && commandFileValid)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
|
// Doesn't work...
|
||||||
// Soft LDPC decoder mode.
|
// Soft LDPC decoder mode.
|
||||||
// Deinterleave into soft bits.
|
// Deinterleave into soft bits.
|
||||||
p_fecframes = new leansdr::pipebuf<leansdr::fecframe<leansdr::llr_sb> >(m_objScheduler, "FEC frames", BUF_FRAMES);
|
p_fecframes = new leansdr::pipebuf<leansdr::fecframe<leansdr::llr_sb> >(m_objScheduler, "FEC frames", BUF_FRAMES);
|
||||||
@ -1162,6 +1172,8 @@ void DATVDemodSink::InitDATVS2Framework()
|
|||||||
// External LDPC decoder mode.
|
// External LDPC decoder mode.
|
||||||
// Deinterleave into soft bits.
|
// Deinterleave into soft bits.
|
||||||
// TBD Latency
|
// TBD Latency
|
||||||
|
QByteArray ba = m_settings.m_softLDPCToolPath.toLocal8Bit();
|
||||||
|
const char *c_str2 = ba.data();
|
||||||
p_fecframes = new leansdr::pipebuf<leansdr::fecframe<leansdr::llr_sb> >(m_objScheduler, "FEC frames", BUF_FRAMES);
|
p_fecframes = new leansdr::pipebuf<leansdr::fecframe<leansdr::llr_sb> >(m_objScheduler, "FEC frames", BUF_FRAMES);
|
||||||
p_s2_deinterleaver = new leansdr::s2_deinterleaver<leansdr::llr_ss, leansdr::llr_sb>(
|
p_s2_deinterleaver = new leansdr::s2_deinterleaver<leansdr::llr_ss, leansdr::llr_sb>(
|
||||||
m_objScheduler,
|
m_objScheduler,
|
||||||
@ -1173,7 +1185,7 @@ void DATVDemodSink::InitDATVS2Framework()
|
|||||||
m_objScheduler,
|
m_objScheduler,
|
||||||
*(leansdr::pipebuf< leansdr::fecframe<leansdr::llr_sb> > *) p_fecframes,
|
*(leansdr::pipebuf< leansdr::fecframe<leansdr::llr_sb> > *) p_fecframes,
|
||||||
*(leansdr::pipebuf<leansdr::bbframe> *) p_bbframes,
|
*(leansdr::pipebuf<leansdr::bbframe> *) p_bbframes,
|
||||||
"/opt/install/sdrangel/bin/ldpctool",
|
c_str2,
|
||||||
p_vbitcount,
|
p_vbitcount,
|
||||||
p_verrcount)
|
p_verrcount)
|
||||||
;
|
;
|
||||||
@ -1181,6 +1193,7 @@ void DATVDemodSink::InitDATVS2Framework()
|
|||||||
const int nhelpers = 2;
|
const int nhelpers = 2;
|
||||||
fecdec->nhelpers = nhelpers;
|
fecdec->nhelpers = nhelpers;
|
||||||
fecdec->must_buffer = false;
|
fecdec->must_buffer = false;
|
||||||
|
fecdec->max_trials = m_settings.m_softLDPCMaxTrials;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
78
plugins/channelrx/demoddatv/datvdvbs2ldpcdialog.cpp
Normal file
78
plugins/channelrx/demoddatv/datvdvbs2ldpcdialog.cpp
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Copyright (C) 2021 F4EXB //
|
||||||
|
// written by Edouard Griffiths //
|
||||||
|
// //
|
||||||
|
// 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 <QFileDialog>
|
||||||
|
|
||||||
|
#include "datvdvbs2ldpcdialog.h"
|
||||||
|
#include "ui_datvdvbs2ldpcdialog.h"
|
||||||
|
|
||||||
|
DatvDvbS2LdpcDialog::DatvDvbS2LdpcDialog(QWidget* parent) :
|
||||||
|
QDialog(parent),
|
||||||
|
ui(new Ui::DatvDvbS2LdpcDialog)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
DatvDvbS2LdpcDialog::~DatvDvbS2LdpcDialog()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DatvDvbS2LdpcDialog::accept()
|
||||||
|
{
|
||||||
|
QDialog::accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DatvDvbS2LdpcDialog::setFileName(const QString& fileName)
|
||||||
|
{
|
||||||
|
m_fileName = fileName;
|
||||||
|
ui->ldpcToolText->setText(m_fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DatvDvbS2LdpcDialog::setMaxTrials(int maxTrials)
|
||||||
|
{
|
||||||
|
m_maxTrials = maxTrials < 1 ? 1 : maxTrials > 8 ? 8 : maxTrials;
|
||||||
|
ui->maxTrials->setValue(m_maxTrials);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DatvDvbS2LdpcDialog::on_showFileDialog_clicked(bool checked)
|
||||||
|
{
|
||||||
|
(void) checked;
|
||||||
|
|
||||||
|
QFileDialog fileDialog(this, "Select LDPC tool");
|
||||||
|
fileDialog.setOption(QFileDialog::DontUseNativeDialog, true);
|
||||||
|
fileDialog.setFilter(QDir::Executable | QDir::Files);
|
||||||
|
fileDialog.selectFile(m_fileName);
|
||||||
|
|
||||||
|
if (fileDialog.exec() == QDialog::Accepted)
|
||||||
|
{
|
||||||
|
QStringList fileNames = fileDialog.selectedFiles();
|
||||||
|
|
||||||
|
if (fileNames.size() > 0)
|
||||||
|
{
|
||||||
|
m_fileName = fileNames[0];
|
||||||
|
ui->ldpcToolText->setText(m_fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DatvDvbS2LdpcDialog::on_maxTrials_valueChanged(int value)
|
||||||
|
{
|
||||||
|
m_maxTrials = value;
|
||||||
|
}
|
||||||
|
|
51
plugins/channelrx/demoddatv/datvdvbs2ldpcdialog.h
Normal file
51
plugins/channelrx/demoddatv/datvdvbs2ldpcdialog.h
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Copyright (C) 2021 F4EXB //
|
||||||
|
// written by Edouard Griffiths //
|
||||||
|
// //
|
||||||
|
// 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/>. //
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef SDRGUI_GUI_DATVDVBS2LDPCDIALOG_H_
|
||||||
|
#define SDRGUI_GUI_DATVDVBS2LDPCDIALOG_H_
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
#include "export.h"
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class DatvDvbS2LdpcDialog;
|
||||||
|
}
|
||||||
|
|
||||||
|
class SDRGUI_API DatvDvbS2LdpcDialog : public QDialog {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit DatvDvbS2LdpcDialog(QWidget* parent = nullptr);
|
||||||
|
~DatvDvbS2LdpcDialog();
|
||||||
|
|
||||||
|
void setFileName(const QString& fileName);
|
||||||
|
void setMaxTrials(int maxTrials);
|
||||||
|
QString& getFileName() { return m_fileName; }
|
||||||
|
int getMaxTrials() { return m_maxTrials; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::DatvDvbS2LdpcDialog* ui;
|
||||||
|
QString m_fileName;
|
||||||
|
int m_maxTrials;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void accept();
|
||||||
|
void on_showFileDialog_clicked(bool checked);
|
||||||
|
void on_maxTrials_valueChanged(int value);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* SDRGUI_GUI_DATVDVBS2LDPCDIALOG_H_ */
|
175
plugins/channelrx/demoddatv/datvdvbs2ldpcdialog.ui
Normal file
175
plugins/channelrx/demoddatv/datvdvbs2ldpcdialog.ui
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>DatvDvbS2LdpcDialog</class>
|
||||||
|
<widget class="QDialog" name="DatvDvbS2LdpcDialog">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>461</width>
|
||||||
|
<height>121</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<family>Liberation Sans</family>
|
||||||
|
<pointsize>9</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>DATV DVBS2 LDPC settings</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="levelLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="maxTrialsLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Max trials</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QSpinBox" name="maxTrials">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>8</number>
|
||||||
|
</property>
|
||||||
|
<property name="displayIntegerBase">
|
||||||
|
<number>10</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="logFileLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="ldpcToolLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>LDPC tool</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="showFileDialog">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>24</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Choose a log file</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../../sdrgui/resources/res.qrc">
|
||||||
|
<normaloff>:/preset-load.png</normaloff>:/preset-load.png</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="ldpcToolText">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>300</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Log file</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||||
|
</property>
|
||||||
|
<property name="centerButtons">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<tabstops>
|
||||||
|
<tabstop>buttonBox</tabstop>
|
||||||
|
</tabstops>
|
||||||
|
<resources>
|
||||||
|
<include location="../../../sdrgui/resources/res.qrc"/>
|
||||||
|
</resources>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>DatvDvbS2LdpcDialog</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>257</x>
|
||||||
|
<y>194</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>157</x>
|
||||||
|
<y>203</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>DatvDvbS2LdpcDialog</receiver>
|
||||||
|
<slot>reject()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>314</x>
|
||||||
|
<y>194</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>286</x>
|
||||||
|
<y>203</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
@ -2350,6 +2350,8 @@ struct s2_fecdec_helper : runnable
|
|||||||
int batch_size;
|
int batch_size;
|
||||||
int nhelpers;
|
int nhelpers;
|
||||||
bool must_buffer;
|
bool must_buffer;
|
||||||
|
int max_trials;
|
||||||
|
|
||||||
s2_fecdec_helper(scheduler *sch,
|
s2_fecdec_helper(scheduler *sch,
|
||||||
pipebuf<fecframe<SOFTBYTE>> &_in,
|
pipebuf<fecframe<SOFTBYTE>> &_in,
|
||||||
pipebuf<bbframe> &_out,
|
pipebuf<bbframe> &_out,
|
||||||
@ -2360,15 +2362,22 @@ struct s2_fecdec_helper : runnable
|
|||||||
batch_size(16),
|
batch_size(16),
|
||||||
nhelpers(1),
|
nhelpers(1),
|
||||||
must_buffer(false),
|
must_buffer(false),
|
||||||
|
max_trials(8),
|
||||||
in(_in), out(_out),
|
in(_in), out(_out),
|
||||||
command(_command),
|
|
||||||
bitcount(opt_writer(_bitcount, 1)),
|
bitcount(opt_writer(_bitcount, 1)),
|
||||||
errcount(opt_writer(_errcount, 1))
|
errcount(opt_writer(_errcount, 1))
|
||||||
{
|
{
|
||||||
|
command = strdup(_command);
|
||||||
for (int mc = 0; mc < 32; ++mc)
|
for (int mc = 0; mc < 32; ++mc)
|
||||||
for (int sf = 0; sf < 2; ++sf)
|
for (int sf = 0; sf < 2; ++sf)
|
||||||
pools[mc][sf].procs = nullptr;
|
pools[mc][sf].procs = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
~s2_fecdec_helper()
|
||||||
|
{
|
||||||
|
free(command);
|
||||||
|
}
|
||||||
|
|
||||||
void run()
|
void run()
|
||||||
{
|
{
|
||||||
// Send work until all helpers block.
|
// Send work until all helpers block.
|
||||||
@ -2520,12 +2529,21 @@ struct s2_fecdec_helper : runnable
|
|||||||
dup2(tx[0], 0);
|
dup2(tx[0], 0);
|
||||||
close(rx[0]);
|
close(rx[0]);
|
||||||
dup2(rx[1], 1);
|
dup2(rx[1], 1);
|
||||||
char mc_arg[16];
|
char max_trials_arg[16];
|
||||||
sprintf(mc_arg, "%d", pls->modcod);
|
sprintf(max_trials_arg, "%d", max_trials);
|
||||||
char batch_size_arg[16];
|
char batch_size_arg[16];
|
||||||
sprintf(batch_size_arg, "%d", batch_size);
|
sprintf(batch_size_arg, "%d", batch_size);
|
||||||
|
char mc_arg[16];
|
||||||
|
sprintf(mc_arg, "%d", pls->modcod);
|
||||||
const char *sf_arg = pls->sf ? "--shortframes" : nullptr;
|
const char *sf_arg = pls->sf ? "--shortframes" : nullptr;
|
||||||
const char *argv[] = {command, "--trials", "8", "--batch-size", batch_size_arg, "--modcod", mc_arg, sf_arg, nullptr};
|
const char *argv[] = {
|
||||||
|
command,
|
||||||
|
"--trials", max_trials_arg,
|
||||||
|
"--batch-size", batch_size_arg,
|
||||||
|
"--modcod", mc_arg,
|
||||||
|
sf_arg,
|
||||||
|
nullptr
|
||||||
|
};
|
||||||
execve(command, (char *const *)argv, nullptr);
|
execve(command, (char *const *)argv, nullptr);
|
||||||
fatal(command);
|
fatal(command);
|
||||||
}
|
}
|
||||||
@ -2592,7 +2610,7 @@ struct s2_fecdec_helper : runnable
|
|||||||
|
|
||||||
pipereader<fecframe<SOFTBYTE>> in;
|
pipereader<fecframe<SOFTBYTE>> in;
|
||||||
pipewriter<bbframe> out;
|
pipewriter<bbframe> out;
|
||||||
const char *command;
|
char *command;
|
||||||
SOFTBYTE ldpc_buf[64800 / 8];
|
SOFTBYTE ldpc_buf[64800 / 8];
|
||||||
uint8_t bch_buf[64800 / 8]; // Temp storage for hardening before BCH
|
uint8_t bch_buf[64800 / 8]; // Temp storage for hardening before BCH
|
||||||
s2_bch_engines s2bch;
|
s2_bch_engines s2bch;
|
||||||
|
@ -165,7 +165,14 @@ The controls specific to DVB-S are disabled and greyed out. These are: Fast Lock
|
|||||||
|
|
||||||
<h5>B.2b.6: DVB-S2 specific - Soft LDPC decoder</h5>
|
<h5>B.2b.6: DVB-S2 specific - Soft LDPC decoder</h5>
|
||||||
|
|
||||||
Not implemented yet
|
This is for experimenters only. It can be used to decode signals lower that ~10 db MER which is the limit of LDPC hard decoding as explained next (B.2b.7). Video degrades progressively down to about 7.5 dB MER and drops below this limit.
|
||||||
|
|
||||||
|
Runs the `ldpctool` program for soft LDPC decoding. Frames are sent on its standard input and decoded frames retrieved from its standard output. Two processes executing `ldpctool` are spawned but so far it seems that only one is effectively used.
|
||||||
|
|
||||||
|
Right clicking on this control opens a dialog where you can choose:
|
||||||
|
|
||||||
|
- The `ldpctool` executable. You have to use the `ldpctool` binary produced by the build of SDRangel.
|
||||||
|
- The maximum of retries in LDPC decoding from 1 to 8.
|
||||||
|
|
||||||
<h5>B.2b.7: DVB-S2 specific - LDPC maximum number of bit flips allowed</h5>
|
<h5>B.2b.7: DVB-S2 specific - LDPC maximum number of bit flips allowed</h5>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user