DATV demod: API updates and small fixes

This commit is contained in:
f4exb 2021-10-30 12:35:02 +02:00
parent 4b1a861717
commit b0c49f3b50
17 changed files with 398 additions and 151 deletions

View File

@ -114,7 +114,7 @@ template<typename T> struct datvconstellation: runnable
unsigned long decimation;
long pixels_per_frame;
cstln_lut<eucl_ss, 256> **cstln; // Optional ptr to optional constellation
TVScreen *m_objDATVScreen;
TVScreen *m_tvScreen;
pipereader<std::complex<T> > in;
unsigned long phase;
std::vector<int> cstln_rows;
@ -126,14 +126,14 @@ template<typename T> struct datvconstellation: runnable
T _xymin,
T _xymax,
const char *_name = nullptr,
TVScreen *objDATVScreen = nullptr) :
TVScreen *tvScreen = nullptr) :
runnable(sch, _name ? _name : _in.name),
xymin(_xymin),
xymax(_xymax),
decimation(DEFAULT_GUI_DECIMATION),
pixels_per_frame(1024),
cstln(0),
m_objDATVScreen(objDATVScreen),
m_tvScreen(tvScreen),
in(_in),
phase(0)
{
@ -144,16 +144,16 @@ template<typename T> struct datvconstellation: runnable
//Symbols
while (in.readable() >= pixels_per_frame)
{
if ((!phase) && m_objDATVScreen)
if ((!phase) && m_tvScreen)
{
m_objDATVScreen->resetImage();
m_tvScreen->resetImage();
std::complex<T> *p = in.rd(), *pend = p + pixels_per_frame;
for (; p < pend; ++p)
{
m_objDATVScreen->selectRow(256 * (p->real() - xymin) / (xymax - xymin));
m_objDATVScreen->setDataColor(
m_tvScreen->selectRow(256 * (p->real() - xymin) / (xymax - xymin));
m_tvScreen->setDataColor(
256 - 256 * ((p->imag() - xymin) / (xymax - xymin)),
255, 0, 255);
}
@ -166,12 +166,12 @@ template<typename T> struct datvconstellation: runnable
for (;(row_it != cstln_rows.end()) && (col_it != cstln_cols.end()); ++row_it, ++col_it)
{
m_objDATVScreen->selectRow(*row_it);
m_objDATVScreen->setDataColor(*col_it, 250, 250, 5);
m_tvScreen->selectRow(*row_it);
m_tvScreen->setDataColor(*col_it, 250, 250, 5);
}
}
m_objDATVScreen->renderImage(0);
m_tvScreen->renderImage(0);
}
in.read(pixels_per_frame);

View File

@ -129,9 +129,106 @@ void DATVDemod::applySettings(const DATVDemodSettings& settings, bool force)
QString debugMsg = tr("DATVDemod::applySettings: force: %1").arg(force);
settings.debug(debugMsg);
QList<QString> reverseAPIKeys;
if (settings.m_rgbColor != m_settings.m_rgbColor) {
reverseAPIKeys.append("rgbColor");
}
if (settings.m_title != m_settings.m_title) {
reverseAPIKeys.append("title");
}
if (settings.m_rfBandwidth != m_settings.m_rfBandwidth) {
reverseAPIKeys.append("rfBandwidth");
}
if (settings.m_centerFrequency != m_settings.m_centerFrequency) {
reverseAPIKeys.append("centerFrequency");
}
if (settings.m_standard != m_settings.m_standard) {
reverseAPIKeys.append("standard");
}
if (settings.m_modulation != m_settings.m_modulation) {
reverseAPIKeys.append("modulation");
}
if (settings.m_fec != m_settings.m_fec) {
reverseAPIKeys.append("fec");
}
if (settings.m_softLDPC != m_settings.m_softLDPC) {
reverseAPIKeys.append("softLDPC");
}
if (settings.m_softLDPCToolPath != m_settings.m_softLDPCToolPath) {
reverseAPIKeys.append("softLDPCToolPath");
}
if (settings.m_softLDPCMaxTrials != m_settings.m_softLDPCMaxTrials) {
reverseAPIKeys.append("softLDPCMaxTrials");
}
if (settings.m_maxBitflips != m_settings.m_maxBitflips) {
reverseAPIKeys.append("maxBitflips");
}
if (settings.m_audioMute != m_settings.m_audioMute) {
reverseAPIKeys.append("audioMute");
}
if (settings.m_audioDeviceName != m_settings.m_audioDeviceName) {
reverseAPIKeys.append("audioDeviceName");
}
if (settings.m_symbolRate != m_settings.m_symbolRate) {
reverseAPIKeys.append("symbolRate");
}
if (settings.m_notchFilters != m_settings.m_notchFilters) {
reverseAPIKeys.append("notchFilters");
}
if (settings.m_allowDrift != m_settings.m_allowDrift) {
reverseAPIKeys.append("allowDrift");
}
if (settings.m_fastLock != m_settings.m_fastLock) {
reverseAPIKeys.append("fastLock");
}
if (settings.m_filter != m_settings.m_filter) {
reverseAPIKeys.append("filter");
}
if (settings.m_hardMetric != m_settings.m_hardMetric) {
reverseAPIKeys.append("hardMetric");
}
if (settings.m_rollOff != m_settings.m_rollOff) {
reverseAPIKeys.append("rollOff");
}
if (settings.m_viterbi != m_settings.m_viterbi) {
reverseAPIKeys.append("viterbi");
}
if (settings.m_excursion != m_settings.m_excursion) {
reverseAPIKeys.append("excursion");
}
if (settings.m_audioVolume != m_settings.m_audioVolume) {
reverseAPIKeys.append("audioVolume");
}
if (settings.m_videoMute != m_settings.m_videoMute) {
reverseAPIKeys.append("videoMute");
}
if (settings.m_udpTSAddress != m_settings.m_udpTSAddress) {
reverseAPIKeys.append("udpTSAddress");
}
if (settings.m_udpTSPort != m_settings.m_udpTSPort) {
reverseAPIKeys.append("udpTSPort");
}
if (settings.m_udpTS != m_settings.m_udpTS) {
reverseAPIKeys.append("udpTS");
}
if (settings.m_playerEnable != m_settings.m_playerEnable) {
reverseAPIKeys.append("playerEnable");
}
DATVDemodBaseband::MsgConfigureDATVDemodBaseband *msg = DATVDemodBaseband::MsgConfigureDATVDemodBaseband::create(settings, force);
m_basebandSink->getInputMessageQueue()->push(msg);
if (settings.m_useReverseAPI)
{
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
}
m_settings = settings;
}
@ -274,6 +371,9 @@ void DATVDemod::webapiUpdateChannelSettings(
if (channelSettingsKeys.contains("udpTS")) {
settings.m_udpTS = response.getDatvDemodSettings()->getUdpTs() == 1;
}
if (channelSettingsKeys.contains("playerEnable")) {
settings.m_playerEnable = response.getDatvDemodSettings()->getPlayerEnable() == 1;
}
if (channelSettingsKeys.contains("streamIndex")) {
settings.m_streamIndex = response.getDatvDemodSettings()->getStreamIndex();
}
@ -346,6 +446,8 @@ void DATVDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& res
}
response.getDatvDemodSettings()->setUdpTsPort(settings.m_udpTSPort);
response.getDatvDemodSettings()->setUdpTs(settings.m_udpTS ? 1 : 0);
response.getDatvDemodSettings()->setPlayerEnable(settings.m_playerEnable ? 1 : 0);
response.getDatvDemodSettings()->setStreamIndex(settings.m_streamIndex);
response.getDatvDemodSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0);
@ -372,6 +474,8 @@ void DATVDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respons
response.getDatvDemodReport()->setUdpRunning(udpRunning() ? 1 : 0);
response.getDatvDemodReport()->setVideoActive(videoActive() ? 1 : 0);
response.getDatvDemodReport()->setVideoDecodeOk(videoDecodeOK() ? 1 : 0);
response.getDatvDemodReport()->setMer(getMERAvg());
response.getDatvDemodReport()->setCnr(getCNRAvg());
}
void DATVDemod::sendChannelSettings(
@ -493,6 +597,9 @@ void DATVDemod::webapiFormatChannelSettings(
if (channelSettingsKeys.contains("udpTS") || force) {
swgDATVDemodSettings->setUdpTs(settings.m_udpTS ? 1 : 0);
}
if (channelSettingsKeys.contains("playerEnable") || force) {
swgDATVDemodSettings->setPlayerEnable(settings.m_playerEnable ? 1 : 0);
}
if (channelSettingsKeys.contains("streamIndex") || force) {
swgDATVDemodSettings->setStreamIndex(settings.m_streamIndex);
}

View File

@ -99,7 +99,7 @@ public:
m_basebandSink->setMessageQueueToGUI(queue);
}
void SetTVScreen(TVScreen *objScreen) { m_basebandSink->setTVScreen(objScreen); }
void SetTVScreen(TVScreen *tvScreen) { m_basebandSink->setTVScreen(tvScreen); }
void SetVideoRender(DATVideoRender *objScreen) { m_basebandSink->SetVideoRender(objScreen); }
DATVideostream *getVideoStream() { return m_basebandSink->getVideoStream(); }
DATVUDPStream *getUDPStream() { return m_basebandSink->getUDPStream(); }

View File

@ -167,7 +167,7 @@ void DATVDemodGUI::onMenuDialogCalled(const QPoint &p)
else if ((m_contextMenuType == ContextMenuStreamSettings) && (m_deviceUISet->m_deviceMIMOEngine))
{
DeviceStreamSelectionDialog dialog(this);
dialog.setNumberOfStreams(m_objDATVDemod->getNumberOfDeviceStreams());
dialog.setNumberOfStreams(m_datvDemod->getNumberOfDeviceStreams());
dialog.setStreamIndex(m_settings.m_streamIndex);
dialog.move(p);
dialog.exec();
@ -196,6 +196,7 @@ DATVDemodGUI::DATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, Ba
{
ui->setupUi(this);
ui->screenTV->setColor(true);
ui->screenTV->resizeTVScreen(256,256);
setAttribute(Qt::WA_DeleteOnClose, true);
connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &)));
@ -209,16 +210,16 @@ DATVDemodGUI::DATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, Ba
ui->cnrMeter->setRange(0, 30);
ui->cnrMeter->setAverageSmoothing(2);
m_objDATVDemod = (DATVDemod*) rxChannel;
m_objDATVDemod->setMessageQueueToGUI(getInputMessageQueue());
m_datvDemod = (DATVDemod*) rxChannel;
m_datvDemod->setMessageQueueToGUI(getInputMessageQueue());
m_objDATVDemod->SetTVScreen(ui->screenTV);
m_objDATVDemod->SetVideoRender(ui->screenTV_2);
m_datvDemod->SetTVScreen(ui->screenTV);
m_datvDemod->SetVideoRender(ui->screenTV_2);
if (m_settings.m_playerEnable) {
connect(m_objDATVDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
connect(m_datvDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
} else {
connect(m_objDATVDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
connect(m_datvDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
}
connect(ui->screenTV_2, &DATVideoRender::onMetaDataChanged, this, &DATVDemodGUI::on_StreamMetaDataChanged);
@ -377,13 +378,13 @@ void DATVDemodGUI::displaySettings()
if (m_settings.m_playerEnable)
{
disconnect(m_objDATVDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
connect(m_objDATVDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
disconnect(m_datvDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
connect(m_datvDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
}
else
{
disconnect(m_objDATVDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
connect(m_objDATVDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
disconnect(m_datvDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
connect(m_datvDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
}
blockApplySettings(false);
@ -454,7 +455,7 @@ void DATVDemodGUI::applySettings(bool force)
m_settings.debug(msg);
DATVDemod::MsgConfigureDATVDemod* message = DATVDemod::MsgConfigureDATVDemod::create(m_settings, force);
m_objDATVDemod->getInputMessageQueue()->push(message);
m_datvDemod->getInputMessageQueue()->push(message);
}
}
@ -502,16 +503,16 @@ void DATVDemodGUI::ldpcToolSelect()
void DATVDemodGUI::tick()
{
if (m_objDATVDemod)
if (m_datvDemod)
{
m_objMagSqAverage(m_objDATVDemod->getMagSq());
m_objMagSqAverage(m_datvDemod->getMagSq());
double magSqDB = CalcDb::dbPower(m_objMagSqAverage / (SDR_RX_SCALED*SDR_RX_SCALED));
ui->channePowerText->setText(tr("%1 dB").arg(magSqDB, 0, 'f', 1));
if ((m_modcodModulationIndex != m_objDATVDemod->getModcodModulation()) || (m_modcodCodeRateIndex != m_objDATVDemod->getModcodCodeRate()))
if ((m_modcodModulationIndex != m_datvDemod->getModcodModulation()) || (m_modcodCodeRateIndex != m_datvDemod->getModcodCodeRate()))
{
m_modcodModulationIndex = m_objDATVDemod->getModcodModulation();
m_modcodCodeRateIndex = m_objDATVDemod->getModcodCodeRate();
m_modcodModulationIndex = m_datvDemod->getModcodModulation();
m_modcodCodeRateIndex = m_datvDemod->getModcodCodeRate();
DATVDemodSettings::DATVModulation modulation = DATVDemodSettings::getModulationFromLeanDVBCode(m_modcodModulationIndex);
DATVDemodSettings::DATVCodeRate rate = DATVDemodSettings::getCodeRateFromLeanDVBCode(m_modcodCodeRateIndex);
QString modcodModulationStr = DATVDemodSettings::getStrFromModulation(modulation);
@ -519,9 +520,9 @@ void DATVDemodGUI::tick()
ui->statusText->setText(tr("MCOD %1 %2").arg(modcodModulationStr).arg(modcodCodeRateStr));
}
if (m_cstlnSetByModcod != m_objDATVDemod->isCstlnSetByModcod())
if (m_cstlnSetByModcod != m_datvDemod->isCstlnSetByModcod())
{
m_cstlnSetByModcod = m_objDATVDemod->isCstlnSetByModcod();
m_cstlnSetByModcod = m_datvDemod->isCstlnSetByModcod();
if (m_cstlnSetByModcod) {
ui->statusText->setStyleSheet("QLabel { background-color : green; }");
@ -537,9 +538,9 @@ void DATVDemodGUI::tick()
ui->lblRate->setText(QString("Speed: %1b/s").arg(formatBytes(m_intLastSpeed)));
}
if (m_objDATVDemod->audioActive())
if (m_datvDemod->audioActive())
{
if (m_objDATVDemod->audioDecodeOK()) {
if (m_datvDemod->audioDecodeOK()) {
ui->audioMute->setStyleSheet("QToolButton { background-color : green; }");
} else {
ui->audioMute->setStyleSheet("QToolButton { background-color : red; }");
@ -550,9 +551,9 @@ void DATVDemodGUI::tick()
ui->audioMute->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
}
if (m_objDATVDemod->videoActive())
if (m_datvDemod->videoActive())
{
if (m_objDATVDemod->videoDecodeOK()) {
if (m_datvDemod->videoDecodeOK()) {
ui->videoMute->setStyleSheet("QToolButton { background-color : green; }");
} else {
ui->videoMute->setStyleSheet("QToolButton { background-color : red; }");
@ -566,7 +567,7 @@ void DATVDemodGUI::tick()
m_intPreviousDecodedData = m_intLastDecodedData;
//Try to start video rendering
bool success = m_objDATVDemod->playVideo();
bool success = m_datvDemod->playVideo();
if (success) {
ui->playerIndicator->setStyleSheet("QLabel { background-color: rgb(85, 232, 85); border-radius: 8px; }"); // green
@ -574,7 +575,7 @@ void DATVDemodGUI::tick()
ui->playerIndicator->setStyleSheet("QLabel { background-color: gray; border-radius: 8px; }");
}
if (m_objDATVDemod->udpRunning()) {
if (m_datvDemod->udpRunning()) {
ui->udpIndicator->setStyleSheet("QLabel { background-color: rgb(85, 232, 85); border-radius: 8px; }"); // green
} else {
ui->udpIndicator->setStyleSheet("QLabel { background-color: gray; border-radius: 8px; }");
@ -583,10 +584,10 @@ void DATVDemodGUI::tick()
void DATVDemodGUI::tickMeter()
{
ui->merMeter->levelChanged(m_objDATVDemod->getMERRMS(), m_objDATVDemod->getMERPeak(), m_objDATVDemod->getMERNbAvg());
ui->cnrMeter->levelChanged(m_objDATVDemod->getCNRRMS(), m_objDATVDemod->getCNRPeak(), m_objDATVDemod->getCNRNbAvg());
ui->merText->setText(QString("%1").arg(m_objDATVDemod->getMERAvg(), 0, 'f', 1));
ui->cnrText->setText(QString("%1").arg(m_objDATVDemod->getCNRAvg(), 0, 'f', 1));
ui->merMeter->levelChanged(m_datvDemod->getMERRMS(), m_datvDemod->getMERPeak(), m_datvDemod->getMERNbAvg());
ui->cnrMeter->levelChanged(m_datvDemod->getCNRRMS(), m_datvDemod->getCNRPeak(), m_datvDemod->getCNRNbAvg());
ui->merText->setText(QString("%1").arg(m_datvDemod->getMERAvg(), 0, 'f', 1));
ui->cnrText->setText(QString("%1").arg(m_datvDemod->getCNRAvg(), 0, 'f', 1));
}
void DATVDemodGUI::on_cmbStandard_currentIndexChanged(int index)
@ -844,13 +845,13 @@ void DATVDemodGUI::on_playerEnable_clicked()
if (m_settings.m_playerEnable)
{
disconnect(m_objDATVDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
connect(m_objDATVDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
disconnect(m_datvDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
connect(m_datvDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
}
else
{
disconnect(m_objDATVDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
connect(m_objDATVDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
disconnect(m_datvDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
connect(m_datvDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
}
applySettings();

View File

@ -101,7 +101,7 @@ private:
DeviceUISet* m_deviceUISet;
ChannelMarker m_objChannelMarker;
DATVDemod* m_objDATVDemod;
DATVDemod* m_datvDemod;
MessageQueue m_inputMessageQueue;
DATVDemodSettings m_settings;

View File

@ -34,11 +34,11 @@ const unsigned int DATVDemodSink::m_rfFilterFftLength = 1024;
DATVDemodSink::DATVDemodSink() :
m_blnNeedConfigUpdate(false),
m_objRegisteredTVScreen(nullptr),
m_objRegisteredVideoRender(nullptr),
m_objVideoStream(new DATVideostream()),
m_tvScreen(nullptr),
m_videoRender(nullptr),
m_videoStream(new DATVideostream()),
m_udpStream(leansdr::tspacket::SIZE),
m_objRenderThread(nullptr),
m_videoThread(nullptr),
m_audioFifo(48000),
m_blnRenderingVideo(false),
m_cstlnSetByModcod(false),
@ -60,14 +60,14 @@ DATVDemodSink::~DATVDemodSink()
m_blnInitialized = false;
//Immediately exit from DATVideoStream if waiting for data before killing thread
m_objVideoStream->setThreadTimeout(0);
m_objVideoStream->deleteLater();
m_videoStream->setThreadTimeout(0);
m_videoStream->deleteLater();
stopVideo();
CleanUpDATVFramework();
if (m_objRenderThread) {
delete m_objRenderThread;
if (m_videoThread) {
delete m_videoThread;
}
delete m_objRFFilter;
@ -75,34 +75,33 @@ DATVDemodSink::~DATVDemodSink()
void DATVDemodSink::stopVideo()
{
if (m_objRenderThread)
if (m_videoThread)
{
if (m_objRenderThread->isRunning())
if (m_videoThread->isRunning())
{
m_objRenderThread->stopRendering();
m_objRenderThread->quit();
m_objRenderThread->wait();
m_videoThread->stopRendering();
m_videoThread->quit();
m_videoThread->wait();
}
}
}
bool DATVDemodSink::setTVScreen(TVScreen *objScreen)
void DATVDemodSink::setTVScreen(TVScreen *tvScreen)
{
m_objRegisteredTVScreen = objScreen;
return true;
m_tvScreen = tvScreen;
}
void DATVDemodSink::SetVideoRender(DATVideoRender *objScreen)
void DATVDemodSink::SetVideoRender(DATVideoRender *screen)
{
m_objRegisteredVideoRender = objScreen;
m_objRegisteredVideoRender->setAudioFIFO(&m_audioFifo);
m_objRenderThread = new DATVideoRenderThread(m_objRegisteredVideoRender, m_objVideoStream);
m_videoRender = screen;
m_videoRender->setAudioFIFO(&m_audioFifo);
m_videoThread = new DATVideoRenderThread(m_videoRender, m_videoStream);
}
bool DATVDemodSink::audioActive()
{
if (m_objRegisteredVideoRender) {
return m_objRegisteredVideoRender->getAudioStreamIndex() >= 0;
if (m_videoRender) {
return m_videoRender->getAudioStreamIndex() >= 0;
} else {
return false;
}
@ -110,8 +109,8 @@ bool DATVDemodSink::audioActive()
bool DATVDemodSink::videoActive()
{
if (m_objRegisteredVideoRender) {
return m_objRegisteredVideoRender->getVideoStreamIndex() >= 0;
if (m_videoRender) {
return m_videoRender->getVideoStreamIndex() >= 0;
} else {
return false;
}
@ -119,8 +118,8 @@ bool DATVDemodSink::videoActive()
bool DATVDemodSink::audioDecodeOK()
{
if (m_objRegisteredVideoRender) {
return m_objRegisteredVideoRender->getAudioDecodeOK();
if (m_videoRender) {
return m_videoRender->getAudioDecodeOK();
} else {
return false;
}
@ -128,8 +127,8 @@ bool DATVDemodSink::audioDecodeOK()
bool DATVDemodSink::videoDecodeOK()
{
if (m_objRegisteredVideoRender) {
return m_objRegisteredVideoRender->getVideoDecodeOK();
if (m_videoRender) {
return m_videoRender->getVideoDecodeOK();
} else {
return false;
}
@ -151,27 +150,27 @@ bool DATVDemodSink::playVideo()
{
QMutexLocker mlock(&m_mutex);
if (m_objVideoStream == nullptr) {
if (m_videoStream == nullptr) {
return false;
}
if (m_objRegisteredVideoRender == nullptr) {
if (m_videoRender == nullptr) {
return false;
}
if (m_objRenderThread == nullptr) {
if (m_videoThread == nullptr) {
return false;
}
if (m_objRenderThread->isRunning()) {
if (m_videoThread->isRunning()) {
return true;
}
if (m_objVideoStream->bytesAvailable() > 0)
if (m_videoStream->bytesAvailable() > 0)
{
m_objVideoStream->setMultiThreaded(true);
m_objVideoStream->setThreadTimeout(DATVideoRenderThread::videoThreadTimeoutMs);
m_objRenderThread->start();
m_videoStream->setMultiThreaded(true);
m_videoStream->setThreadTimeout(DATVideoRenderThread::videoThreadTimeoutMs);
m_videoThread->start();
}
return false;
@ -179,8 +178,8 @@ bool DATVDemodSink::playVideo()
void DATVDemodSink::CleanUpDATVFramework()
{
if (m_objVideoStream) {
m_objVideoStream->cleanUp();
if (m_videoStream) {
m_videoStream->cleanUp();
}
if (m_objScheduler != nullptr)
@ -556,7 +555,7 @@ void DATVDemodSink::InitDATVFramework()
m_objCfg.rrc_rej = (float) m_settings.m_excursion; //dB
m_objCfg.rrc_steps = 0; //auto
m_objVideoStream->resetTotalReceived();
m_videoStream->resetTotalReceived();
m_udpStream.resetTotalReceived();
switch(m_settings.m_modulation)
@ -769,12 +768,11 @@ void DATVDemodSink::InitDATVFramework()
//constellation
if (m_objRegisteredTVScreen)
if (m_tvScreen)
{
qDebug("DATVDemodSink::InitDATVFramework: Register DVBSTVSCREEN");
qDebug("DATVDemodSink::InitDATVFramework: Register DVB constellation TV screen");
m_objRegisteredTVScreen->resizeTVScreen(256,256);
r_scope_symbols = new leansdr::datvconstellation<leansdr::f32>(m_objScheduler, *p_sampled, -128,128, nullptr, m_objRegisteredTVScreen);
r_scope_symbols = new leansdr::datvconstellation<leansdr::f32>(m_objScheduler, *p_sampled, -128,128, nullptr, m_tvScreen);
r_scope_symbols->decimation = 1;
r_scope_symbols->cstln = &m_objDemodulator->cstln;
r_scope_symbols->calculate_cstln_points();
@ -850,7 +848,7 @@ void DATVDemodSink::InitDATVFramework()
// OUTPUT
if (m_settings.m_playerEnable) {
r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, m_objVideoStream, &m_udpStream);
r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, m_videoStream, &m_udpStream);
} else {
r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, nullptr, &m_udpStream);
}
@ -895,7 +893,7 @@ void DATVDemodSink::InitDATVS2Framework()
m_objCfg.rrc_rej = (float) m_settings.m_excursion; //dB
m_objCfg.rrc_steps = 0; //auto
m_objVideoStream->resetTotalReceived();
m_videoStream->resetTotalReceived();
m_udpStream.resetTotalReceived();
switch(m_settings.m_modulation)
@ -1075,11 +1073,10 @@ void DATVDemodSink::InitDATVS2Framework()
//constellation
if (m_objRegisteredTVScreen)
if (m_tvScreen)
{
qDebug("DATVDemodSink::InitDATVS2Framework: Register DVBS 2 TVSCREEN");
m_objRegisteredTVScreen->resizeTVScreen(256,256);
r_scope_symbols_dvbs2 = new leansdr::datvdvbs2constellation<leansdr::f32>(m_objScheduler, *p_cstln /* *p_sampled */ /* *p_cstln */, -128,128, nullptr, m_objRegisteredTVScreen);
r_scope_symbols_dvbs2 = new leansdr::datvdvbs2constellation<leansdr::f32>(m_objScheduler, *p_cstln /* *p_sampled */ /* *p_cstln */, -128,128, nullptr, m_tvScreen);
r_scope_symbols_dvbs2->decimation = 1;
r_scope_symbols_dvbs2->cstln = (leansdr::cstln_base**) &objDemodulatorDVBS2->cstln;
r_scope_symbols_dvbs2->calculate_cstln_points();
@ -1213,7 +1210,7 @@ void DATVDemodSink::InitDATVS2Framework()
// OUTPUT
if (m_settings.m_playerEnable) {
r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, m_objVideoStream, &m_udpStream);
r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, m_videoStream, &m_udpStream);
} else {
r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, nullptr, &m_udpStream);
}
@ -1410,22 +1407,22 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force)
if ((settings.m_audioVolume) != (m_settings.m_audioVolume) || force)
{
if (m_objRegisteredVideoRender) {
m_objRegisteredVideoRender->setAudioVolume(settings.m_audioVolume);
if (m_videoRender) {
m_videoRender->setAudioVolume(settings.m_audioVolume);
}
}
if ((settings.m_audioMute) != (m_settings.m_audioMute) || force)
{
if (m_objRegisteredVideoRender) {
m_objRegisteredVideoRender->setAudioMute(settings.m_audioMute);
if (m_videoRender) {
m_videoRender->setAudioMute(settings.m_audioMute);
}
}
if ((settings.m_videoMute) != (m_settings.m_videoMute) || force)
{
if (m_objRegisteredVideoRender) {
m_objRegisteredVideoRender->setVideoMute(settings.m_videoMute);
if (m_videoRender) {
m_videoRender->setVideoMute(settings.m_videoMute);
}
}

View File

@ -51,7 +51,6 @@
class TVScreen;
class DATVideoRender;
class QLabel;
class LevelMeterSignalDB;
class DATVDemodSink : public ChannelSampleSink {
public:
@ -60,9 +59,9 @@ public:
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
bool setTVScreen(TVScreen *objScreen);
void SetVideoRender(DATVideoRender *objScreen);
DATVideostream *getVideoStream() { return m_objVideoStream; }
void setTVScreen(TVScreen *tvScreen);
void SetVideoRender(DATVideoRender *screen);
DATVideostream *getVideoStream() { return m_videoStream; }
DATVUDPStream *getUDPStream() { return &m_udpStream; }
bool audioActive();
bool audioDecodeOK();
@ -318,11 +317,11 @@ private:
leansdr::datvmeter *r_cnrMeter;
//*************** DATV PARAMETERS ***************
TVScreen *m_objRegisteredTVScreen;
DATVideoRender *m_objRegisteredVideoRender;
DATVideostream *m_objVideoStream;
TVScreen *m_tvScreen;
DATVideoRender *m_videoRender;
DATVideostream *m_videoStream;
DATVUDPStream m_udpStream;
DATVideoRenderThread *m_objRenderThread;
DATVideoRenderThread *m_videoThread;
// Audio
AudioFifo m_audioFifo;

View File

@ -23,6 +23,8 @@
#include <QIODevice>
#include <QThread>
#include <QWidget>
#include <QTextStream>
#include <QDebug>
#include "datvideostream.h"
#include "gui/tvscreen.h"

View File

@ -3799,15 +3799,23 @@ margin-bottom: 20px;
},
"modcodModulation" : {
"type" : "integer",
"description" : "Modulation set by DVB-S2 MODCOD\n * 0: BPSK\n * 1: QPSK\n * 2: PSK8\n * 3: APSK16\n * 4: APSK32\n * 5: APSK64E\n * 6: QAM16\n * 7: QAM64\n * 8: QAM256\n"
"description" : "Modulation set by DVB-S2 MODCOD\n * -1: Unset\n * 0: BPSK\n * 1: QPSK\n * 2: PSK8\n * 3: APSK16\n * 4: APSK32\n * 5: APSK64E\n * 6: QAM16\n * 7: QAM64\n * 8: QAM256\n"
},
"modcodCodeRate" : {
"type" : "integer",
"description" : "Code rate (FEC) set by DVB-S2 MODCOD\n * 0: 1/2\n * 1: 2/3\n * 2: 4/6\n * 3: 3/4\n * 4: 5/6\n * 5: 7/8\n * 6: 4/5\n * 7: 8/9\n * 8: 9/10\n * 9: 1/4\n * 10: 1/3\n * 11: 2/5\n * 12: 3/5\n"
"description" : "Code rate (FEC) set by DVB-S2 MODCOD\n * -1: Unset\n * 0: 1/2\n * 1: 2/3\n * 2: 4/6\n * 3: 3/4\n * 4: 5/6\n * 5: 7/8\n * 6: 4/5\n * 7: 8/9\n * 8: 9/10\n * 9: 1/4\n * 10: 1/3\n * 11: 2/5\n * 12: 3/5\n"
},
"setByModcod" : {
"type" : "integer",
"description" : "Modulation and code rate set by DVB-S2 MODCOD (1 for yes, 0 for no)"
},
"mer" : {
"type" : "number",
"format" : "float"
},
"cnr" : {
"type" : "number",
"format" : "float"
}
},
"description" : "DATVDemod"
@ -3913,6 +3921,10 @@ margin-bottom: 20px;
"type" : "integer",
"description" : "boolean"
},
"playerEnable" : {
"type" : "integer",
"description" : "boolean"
},
"streamIndex" : {
"type" : "integer",
"description" : "MIMO channel. Not relevant when connected to SI (single Rx)."
@ -7905,14 +7917,15 @@ margin-bottom: 20px;
"fftCount" : {
"type" : "integer"
},
"frequencySpec" : {
"type" : "integer"
"sweepSpec" : {
"type" : "integer",
"description" : "(0 - Range, 1 - Step, 2 - List)"
},
"startFrequency" : {
"startValue" : {
"type" : "number",
"format" : "float"
},
"stopFrequency" : {
"stopValue" : {
"type" : "number",
"format" : "float"
},
@ -7923,9 +7936,13 @@ margin-bottom: 20px;
"type" : "number",
"format" : "float"
},
"frequencies" : {
"list" : {
"type" : "string"
},
"setting" : {
"type" : "string",
"description" : "The device setting to sweep (E.g. centerFrequency or gain)"
},
"visaDevice" : {
"type" : "string"
},
@ -51207,7 +51224,7 @@ except ApiException as e:
</div>
<div id="generator">
<div class="content">
Generated 2021-10-26T22:25:01.367+02:00
Generated 2021-10-29T08:40:21.343+02:00
</div>
</div>
</div>

View File

@ -104,6 +104,9 @@ DATVDemodSettings:
udpTS:
description: boolean
type: integer
playerEnable:
description: boolean
type: integer
streamIndex:
description: MIMO channel. Not relevant when connected to SI (single Rx).
type: integer
@ -145,34 +148,40 @@ DATVDemodReport:
type: integer
description: >
Modulation set by DVB-S2 MODCOD
* 0: BPSK
* 1: QPSK
* 2: PSK8
* 3: APSK16
* 4: APSK32
* 5: APSK64E
* 6: QAM16
* 7: QAM64
* 8: QAM256
* -1: Unset
* 0: BPSK
* 1: QPSK
* 2: PSK8
* 3: APSK16
* 4: APSK32
* 5: APSK64E
* 6: QAM16
* 7: QAM64
* 8: QAM256
modcodCodeRate:
type: integer
description: >
Code rate (FEC) set by DVB-S2 MODCOD
* 0: 1/2
* 1: 2/3
* 2: 4/6
* 3: 3/4
* 4: 5/6
* 5: 7/8
* 6: 4/5
* 7: 8/9
* 8: 9/10
* 9: 1/4
* -1: Unset
* 0: 1/2
* 1: 2/3
* 2: 4/6
* 3: 3/4
* 4: 5/6
* 5: 7/8
* 6: 4/5
* 7: 8/9
* 8: 9/10
* 9: 1/4
* 10: 1/3
* 11: 2/5
* 12: 3/5
setByModcod:
type: integer
description: Modulation and code rate set by DVB-S2 MODCOD (1 for yes, 0 for no)
mer:
type: number
format: float
cnr:
type: number
format: float

View File

@ -8,12 +8,13 @@ NoiseFigureSettings:
type: integer
fftCount:
type: integer
frequencySpec:
sweepSpec:
description: "(0 - Range, 1 - Step, 2 - List)"
type: integer
startFrequency:
startValue:
type: number
format: float
stopFrequency:
stopValue:
type: number
format: float
steps:
@ -21,7 +22,10 @@ NoiseFigureSettings:
step:
type: number
format: float
frequencies:
list:
type: string
setting:
description: "The device setting to sweep (E.g. centerFrequency or gain)"
type: string
visaDevice:
type: string

View File

@ -104,6 +104,9 @@ DATVDemodSettings:
udpTS:
description: boolean
type: integer
playerEnable:
description: boolean
type: integer
streamIndex:
description: MIMO channel. Not relevant when connected to SI (single Rx).
type: integer
@ -176,5 +179,9 @@ DATVDemodReport:
setByModcod:
type: integer
description: Modulation and code rate set by DVB-S2 MODCOD (1 for yes, 0 for no)
mer:
type: number
format: float
cnr:
type: number
format: float

View File

@ -3799,15 +3799,23 @@ margin-bottom: 20px;
},
"modcodModulation" : {
"type" : "integer",
"description" : "Modulation set by DVB-S2 MODCOD\n * 0: BPSK\n * 1: QPSK\n * 2: PSK8\n * 3: APSK16\n * 4: APSK32\n * 5: APSK64E\n * 6: QAM16\n * 7: QAM64\n * 8: QAM256\n"
"description" : "Modulation set by DVB-S2 MODCOD\n * -1: Unset\n * 0: BPSK\n * 1: QPSK\n * 2: PSK8\n * 3: APSK16\n * 4: APSK32\n * 5: APSK64E\n * 6: QAM16\n * 7: QAM64\n * 8: QAM256\n"
},
"modcodCodeRate" : {
"type" : "integer",
"description" : "Code rate (FEC) set by DVB-S2 MODCOD\n * 0: 1/2\n * 1: 2/3\n * 2: 4/6\n * 3: 3/4\n * 4: 5/6\n * 5: 7/8\n * 6: 4/5\n * 7: 8/9\n * 8: 9/10\n * 9: 1/4\n * 10: 1/3\n * 11: 2/5\n * 12: 3/5\n"
"description" : "Code rate (FEC) set by DVB-S2 MODCOD\n * -1: Unset\n * 0: 1/2\n * 1: 2/3\n * 2: 4/6\n * 3: 3/4\n * 4: 5/6\n * 5: 7/8\n * 6: 4/5\n * 7: 8/9\n * 8: 9/10\n * 9: 1/4\n * 10: 1/3\n * 11: 2/5\n * 12: 3/5\n"
},
"setByModcod" : {
"type" : "integer",
"description" : "Modulation and code rate set by DVB-S2 MODCOD (1 for yes, 0 for no)"
},
"mer" : {
"type" : "number",
"format" : "float"
},
"cnr" : {
"type" : "number",
"format" : "float"
}
},
"description" : "DATVDemod"
@ -3913,6 +3921,10 @@ margin-bottom: 20px;
"type" : "integer",
"description" : "boolean"
},
"playerEnable" : {
"type" : "integer",
"description" : "boolean"
},
"streamIndex" : {
"type" : "integer",
"description" : "MIMO channel. Not relevant when connected to SI (single Rx)."
@ -7905,14 +7917,15 @@ margin-bottom: 20px;
"fftCount" : {
"type" : "integer"
},
"frequencySpec" : {
"type" : "integer"
"sweepSpec" : {
"type" : "integer",
"description" : "(0 - Range, 1 - Step, 2 - List)"
},
"startFrequency" : {
"startValue" : {
"type" : "number",
"format" : "float"
},
"stopFrequency" : {
"stopValue" : {
"type" : "number",
"format" : "float"
},
@ -7923,9 +7936,13 @@ margin-bottom: 20px;
"type" : "number",
"format" : "float"
},
"frequencies" : {
"list" : {
"type" : "string"
},
"setting" : {
"type" : "string",
"description" : "The device setting to sweep (E.g. centerFrequency or gain)"
},
"visaDevice" : {
"type" : "string"
},
@ -51207,7 +51224,7 @@ except ApiException as e:
</div>
<div id="generator">
<div class="content">
Generated 2021-10-26T22:25:01.367+02:00
Generated 2021-10-29T08:40:21.343+02:00
</div>
</div>
</div>

View File

@ -46,6 +46,10 @@ SWGDATVDemodReport::SWGDATVDemodReport() {
m_modcod_code_rate_isSet = false;
set_by_modcod = 0;
m_set_by_modcod_isSet = false;
mer = 0.0f;
m_mer_isSet = false;
cnr = 0.0f;
m_cnr_isSet = false;
}
SWGDATVDemodReport::~SWGDATVDemodReport() {
@ -72,6 +76,10 @@ SWGDATVDemodReport::init() {
m_modcod_code_rate_isSet = false;
set_by_modcod = 0;
m_set_by_modcod_isSet = false;
mer = 0.0f;
m_mer_isSet = false;
cnr = 0.0f;
m_cnr_isSet = false;
}
void
@ -85,6 +93,8 @@ SWGDATVDemodReport::cleanup() {
}
SWGDATVDemodReport*
@ -116,6 +126,10 @@ SWGDATVDemodReport::fromJsonObject(QJsonObject &pJson) {
::SWGSDRangel::setValue(&set_by_modcod, pJson["setByModcod"], "qint32", "");
::SWGSDRangel::setValue(&mer, pJson["mer"], "float", "");
::SWGSDRangel::setValue(&cnr, pJson["cnr"], "float", "");
}
QString
@ -159,6 +173,12 @@ SWGDATVDemodReport::asJsonObject() {
if(m_set_by_modcod_isSet){
obj->insert("setByModcod", QJsonValue(set_by_modcod));
}
if(m_mer_isSet){
obj->insert("mer", QJsonValue(mer));
}
if(m_cnr_isSet){
obj->insert("cnr", QJsonValue(cnr));
}
return obj;
}
@ -253,6 +273,26 @@ SWGDATVDemodReport::setSetByModcod(qint32 set_by_modcod) {
this->m_set_by_modcod_isSet = true;
}
float
SWGDATVDemodReport::getMer() {
return mer;
}
void
SWGDATVDemodReport::setMer(float mer) {
this->mer = mer;
this->m_mer_isSet = true;
}
float
SWGDATVDemodReport::getCnr() {
return cnr;
}
void
SWGDATVDemodReport::setCnr(float cnr) {
this->cnr = cnr;
this->m_cnr_isSet = true;
}
bool
SWGDATVDemodReport::isSet(){
@ -285,6 +325,12 @@ SWGDATVDemodReport::isSet(){
if(m_set_by_modcod_isSet){
isObjectUpdated = true; break;
}
if(m_mer_isSet){
isObjectUpdated = true; break;
}
if(m_cnr_isSet){
isObjectUpdated = true; break;
}
}while(false);
return isObjectUpdated;
}

View File

@ -68,6 +68,12 @@ public:
qint32 getSetByModcod();
void setSetByModcod(qint32 set_by_modcod);
float getMer();
void setMer(float mer);
float getCnr();
void setCnr(float cnr);
virtual bool isSet() override;
@ -99,6 +105,12 @@ private:
qint32 set_by_modcod;
bool m_set_by_modcod_isSet;
float mer;
bool m_mer_isSet;
float cnr;
bool m_cnr_isSet;
};
}

View File

@ -82,6 +82,8 @@ SWGDATVDemodSettings::SWGDATVDemodSettings() {
m_udp_ts_port_isSet = false;
udp_ts = 0;
m_udp_ts_isSet = false;
player_enable = 0;
m_player_enable_isSet = false;
stream_index = 0;
m_stream_index_isSet = false;
use_reverse_api = 0;
@ -156,6 +158,8 @@ SWGDATVDemodSettings::init() {
m_udp_ts_port_isSet = false;
udp_ts = 0;
m_udp_ts_isSet = false;
player_enable = 0;
m_player_enable_isSet = false;
stream_index = 0;
m_stream_index_isSet = false;
use_reverse_api = 0;
@ -209,6 +213,7 @@ SWGDATVDemodSettings::cleanup() {
if(reverse_api_address != nullptr) {
delete reverse_api_address;
}
@ -282,6 +287,8 @@ SWGDATVDemodSettings::fromJsonObject(QJsonObject &pJson) {
::SWGSDRangel::setValue(&udp_ts, pJson["udpTS"], "qint32", "");
::SWGSDRangel::setValue(&player_enable, pJson["playerEnable"], "qint32", "");
::SWGSDRangel::setValue(&stream_index, pJson["streamIndex"], "qint32", "");
::SWGSDRangel::setValue(&use_reverse_api, pJson["useReverseAPI"], "qint32", "");
@ -391,6 +398,9 @@ SWGDATVDemodSettings::asJsonObject() {
if(m_udp_ts_isSet){
obj->insert("udpTS", QJsonValue(udp_ts));
}
if(m_player_enable_isSet){
obj->insert("playerEnable", QJsonValue(player_enable));
}
if(m_stream_index_isSet){
obj->insert("streamIndex", QJsonValue(stream_index));
}
@ -683,6 +693,16 @@ SWGDATVDemodSettings::setUdpTs(qint32 udp_ts) {
this->m_udp_ts_isSet = true;
}
qint32
SWGDATVDemodSettings::getPlayerEnable() {
return player_enable;
}
void
SWGDATVDemodSettings::setPlayerEnable(qint32 player_enable) {
this->player_enable = player_enable;
this->m_player_enable_isSet = true;
}
qint32
SWGDATVDemodSettings::getStreamIndex() {
return stream_index;
@ -829,6 +849,9 @@ SWGDATVDemodSettings::isSet(){
if(m_udp_ts_isSet){
isObjectUpdated = true; break;
}
if(m_player_enable_isSet){
isObjectUpdated = true; break;
}
if(m_stream_index_isSet){
isObjectUpdated = true; break;
}

View File

@ -123,6 +123,9 @@ public:
qint32 getUdpTs();
void setUdpTs(qint32 udp_ts);
qint32 getPlayerEnable();
void setPlayerEnable(qint32 player_enable);
qint32 getStreamIndex();
void setStreamIndex(qint32 stream_index);
@ -226,6 +229,9 @@ private:
qint32 udp_ts;
bool m_udp_ts_isSet;
qint32 player_enable;
bool m_player_enable_isSet;
qint32 stream_index;
bool m_stream_index_isSet;