From 9c44e9a34d08c469026cc5e19fb1fd28470f65d7 Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 20 Mar 2017 22:37:11 +0100 Subject: [PATCH] ATV Demodulator: specify nominal number of lines and fps in the GUI to calculate line length --- debian/changelog | 5 +- plugins/channelrx/demodatv/atvdemod.cpp | 13 +++-- plugins/channelrx/demodatv/atvdemod.h | 6 +- plugins/channelrx/demodatv/atvdemodgui.cpp | 68 +++++++++++++++++++++- plugins/channelrx/demodatv/atvdemodgui.h | 6 ++ plugins/channelrx/demodatv/atvdemodgui.ui | 63 +++++++++++++++++--- 6 files changed, 140 insertions(+), 21 deletions(-) diff --git a/debian/changelog b/debian/changelog index 0fdbfde8e..7d0464360 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,14 +1,15 @@ sdrangel (3.3.2-1) unstable; urgency=medium * ATV plugins: 405 lines mode + * ATV demodulator: added a scope panel in a tab combo with the TV screen - -- Edouard Griffiths, F4EXB Thu, 16 Mar 2017 23:14:18 +0100 + -- Edouard Griffiths, F4EXB Wed, 22 Mar 2017 23:14:18 +0100 sdrangel (3.3.1-1) unstable; urgency=medium * ATV plugins: SSB and vestigiial sideband support - -- Edouard Griffiths, F4EXB Thu, 16 Mar 2017 23:14:18 +0100 + -- Edouard Griffiths, F4EXB Sun, 19 Mar 2017 23:14:18 +0100 sdrangel (3.3.0-1) unstable; urgency=medium diff --git a/plugins/channelrx/demodatv/atvdemod.cpp b/plugins/channelrx/demodatv/atvdemod.cpp index f96a025e3..d18f07404 100644 --- a/plugins/channelrx/demodatv/atvdemod.cpp +++ b/plugins/channelrx/demodatv/atvdemod.cpp @@ -618,7 +618,7 @@ bool ATVDemod::handleMessage(const Message& cmd) << " m_fltVoltLevelSynchroBlack:" << m_objConfig.m_fltVoltLevelSynchroBlack << " m_fltVoltLevelSynchroTop:" << m_objConfig.m_fltVoltLevelSynchroTop << " m_fltFramePerS:" << m_objConfig.m_fltFramePerS - << " m_fltLineDurationUs:" << m_objConfig.m_fltLineDurationUs + << " m_fltLineDurationUs:" << m_objConfig.m_fltLineDuration << " m_fltRatioOfRowsToDisplay:" << m_objConfig.m_fltRatioOfRowsToDisplay << " m_fltTopDurationUs:" << m_objConfig.m_fltTopDurationUs << " m_blnHSync:" << m_objConfig.m_blnHSync @@ -700,18 +700,19 @@ void ATVDemod::applySettings() } if((m_objConfig.m_fltFramePerS != m_objRunning.m_fltFramePerS) - || (m_objConfig.m_fltLineDurationUs != m_objRunning.m_fltLineDurationUs) + || (m_objConfig.m_fltLineDuration != m_objRunning.m_fltLineDuration) || (m_objConfig.m_intSampleRate != m_objRunning.m_intSampleRate) || (m_objConfig.m_fltTopDurationUs != m_objRunning.m_fltTopDurationUs) || (m_objConfig.m_fltRatioOfRowsToDisplay != m_objRunning.m_fltRatioOfRowsToDisplay)) { m_objSettingsMutex.lock(); - m_intNumberSamplePerLine = (int) ((m_objConfig.m_fltLineDurationUs * m_objConfig.m_intSampleRate) / m_fltSecondToUs); - m_intNumberOfLines = (int) ((m_fltSecondToUs / m_objConfig.m_fltFramePerS) /round(m_objConfig.m_fltLineDurationUs)); - m_objRegisteredATVScreen->resizeATVScreen(m_intNumberSamplePerLine, m_intNumberOfLines); + m_intNumberOfLines = (int) (1.0f / (m_objConfig.m_fltLineDuration * m_objConfig.m_fltFramePerS)); + m_intNumberSamplePerLine = (int) (m_objConfig.m_fltLineDuration * m_objConfig.m_intSampleRate); + m_intNumberOfRowsToDisplay = (int) (m_objConfig.m_fltRatioOfRowsToDisplay * m_objConfig.m_fltLineDuration * m_objConfig.m_intSampleRate); + m_intNumberSamplePerTop = (int) ((m_objConfig.m_fltTopDurationUs * m_objConfig.m_intSampleRate) / m_fltSecondToUs); - m_intNumberOfRowsToDisplay = (int) ((m_objConfig.m_fltRatioOfRowsToDisplay * m_objConfig.m_fltLineDurationUs * m_objConfig.m_intSampleRate) / m_fltSecondToUs); + m_objRegisteredATVScreen->resizeATVScreen(m_intNumberSamplePerLine, m_intNumberOfLines); m_intRowsLimit = m_intNumberOfLines-1; m_intImageIndex = 0; diff --git a/plugins/channelrx/demodatv/atvdemod.h b/plugins/channelrx/demodatv/atvdemod.h index 9a2a04016..aec6ca80a 100644 --- a/plugins/channelrx/demodatv/atvdemod.h +++ b/plugins/channelrx/demodatv/atvdemod.h @@ -55,7 +55,7 @@ public: struct ATVConfig { int m_intSampleRate; - float m_fltLineDurationUs; + float m_fltLineDuration; float m_fltTopDurationUs; float m_fltFramePerS; float m_fltRatioOfRowsToDisplay; @@ -67,7 +67,7 @@ public: ATVConfig() : m_intSampleRate(0), - m_fltLineDurationUs(0.0f), + m_fltLineDuration(0.0f), m_fltTopDurationUs(0.0f), m_fltFramePerS(0.0f), m_fltRatioOfRowsToDisplay(0.0f), @@ -212,7 +212,7 @@ private: m_objMsgConfig.m_fltVoltLevelSynchroBlack = fltVoltLevelSynchroBlack; m_objMsgConfig.m_fltVoltLevelSynchroTop = fltVoltLevelSynchroTop; m_objMsgConfig.m_fltFramePerS = fltFramePerS; - m_objMsgConfig.m_fltLineDurationUs = fltLineDurationUs; + m_objMsgConfig.m_fltLineDuration = fltLineDurationUs; m_objMsgConfig.m_fltTopDurationUs = fltTopDurationUs; m_objMsgConfig.m_fltRatioOfRowsToDisplay = flatRatioOfRowsToDisplay; m_objMsgConfig.m_blnHSync = blnHSync; diff --git a/plugins/channelrx/demodatv/atvdemodgui.cpp b/plugins/channelrx/demodatv/atvdemodgui.cpp index 91a3dc939..f06def64f 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.cpp +++ b/plugins/channelrx/demodatv/atvdemodgui.cpp @@ -94,6 +94,7 @@ void ATVDemodGUI::resetToDefaults() ui->bfo->setValue(0); blockApplySettings(false); + lineTimeUpdate(); applySettings(); } @@ -116,6 +117,7 @@ QByteArray ATVDemodGUI::serialize() const s.writeS32(13, ui->rfOppBW->value()); s.writeS32(14, ui->bfo->value()); s.writeBool(15, ui->invertVideo->isChecked()); + s.writeS32(16, ui->nbLines->currentIndex()); return s.final(); } @@ -175,10 +177,13 @@ bool ATVDemodGUI::deserialize(const QByteArray& arrData) ui->bfo->setValue(tmp); d.readBool(15, &booltmp, true); ui->invertVideo->setChecked(booltmp); + d.readS32(16, &tmp, 0); + ui->nbLines->setCurrentIndex(tmp); blockApplySettings(false); m_objChannelMarker.blockSignals(false); + lineTimeUpdate(); applySettings(); return true; } @@ -332,7 +337,7 @@ void ATVDemodGUI::applySettings() m_objChannelMarker.getCenterFrequency()); m_objATVDemod->configure(m_objATVDemod->getInputMessageQueue(), - ui->lineTime->value() / 10.0f, + getNominalLineTime(ui->nbLines->currentIndex(), ui->fps->currentIndex()) + ui->lineTime->value() * m_fltLineTimeMultiplier, ui->topTime->value() * 1.0f, (ui->fps->currentIndex() == 0) ? 25.0f : 30.0f, (ui->halfImage->checkState() == Qt::Checked) ? 0.5f : 1.0f, @@ -463,9 +468,8 @@ void ATVDemodGUI::on_blackLevel_valueChanged(int value) void ATVDemodGUI::on_lineTime_valueChanged(int value) { - ui->lineTimeText->setText(QString("%1 uS").arg(((float) value) / 10.0f)); + lineTimeUpdate(); applySettings(); - } void ATVDemodGUI::on_topTime_valueChanged(int value) @@ -494,8 +498,15 @@ void ATVDemodGUI::on_halfImage_clicked() applySettings(); } +void ATVDemodGUI::on_nbLines_currentIndexChanged(int index) +{ + lineTimeUpdate(); + applySettings(); +} + void ATVDemodGUI::on_fps_currentIndexChanged(int index) { + lineTimeUpdate(); applySettings(); } @@ -564,3 +575,54 @@ void ATVDemodGUI::on_bfo_valueChanged(int value) applyRFSettings(); } +void ATVDemodGUI::lineTimeUpdate() +{ + float nominalLineTime = getNominalLineTime(ui->nbLines->currentIndex(), ui->fps->currentIndex()); + int lineTimeScaleFactor = (int) std::log10(nominalLineTime); + m_fltLineTimeMultiplier = std::pow(10.0, lineTimeScaleFactor-3); + + float lineTime = nominalLineTime + m_fltLineTimeMultiplier * ui->lineTime->value(); + + if(lineTime < 0.000001) + ui->lineTimeText->setText(tr("%1 ns").arg(lineTime * 1000000000.0, 0, 'f', 1)); + else if(lineTime < 0.001) + ui->lineTimeText->setText(tr("%1 µs").arg(lineTime * 1000000.0, 0, 'f', 1)); + else if(lineTime < 1.0) + ui->lineTimeText->setText(tr("%1 ms").arg(lineTime * 1000.0, 0, 'f', 1)); + else + ui->lineTimeText->setText(tr("%1 s").arg(lineTime * 1.0, 0, 'f', 1)); +} + +float ATVDemodGUI::getFps(int fpsIndex) +{ + switch(fpsIndex) + { + case 1: + return 30.0f; + break; + case 0: + default: + return 25.0f; + break; + } +} + +float ATVDemodGUI::getNominalLineTime(int nbLinesIndex, int fpsIndex) +{ + float fps = getFps(fpsIndex); + + switch(nbLinesIndex) + { + case 1: + return 1.0f / (525 * fps); + break; + case 2: + return 1.0f / (405 * fps); + break; + case 0: + default: + return 1.0f / (625 * fps); + break; + } +} + diff --git a/plugins/channelrx/demodatv/atvdemodgui.h b/plugins/channelrx/demodatv/atvdemodgui.h index 8562fc14e..a2dd131f0 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.h +++ b/plugins/channelrx/demodatv/atvdemodgui.h @@ -73,6 +73,7 @@ private slots: void on_invertVideo_clicked(); void on_halfImage_clicked(); void on_modulation_currentIndexChanged(int index); + void on_nbLines_currentIndexChanged(int index); void on_fps_currentIndexChanged(int index); void on_reset_clicked(bool checked); void on_rfBW_valueChanged(int value); @@ -100,6 +101,8 @@ private: ScopeVisNG* m_objScopeVis; + float m_fltLineTimeMultiplier; + explicit ATVDemodGUI(PluginAPI* objPluginAPI, DeviceSourceAPI *objDeviceAPI, QWidget* objParent = NULL); virtual ~ATVDemodGUI(); @@ -108,6 +111,9 @@ private: void applyRFSettings(); void setChannelMarkerBandwidth(); void setRFFiltersSlidersRange(int sampleRate); + void lineTimeUpdate(); + static float getFps(int fpsIndex); + static float getNominalLineTime(int nbLinesIndex, int fpsIndex); void leaveEvent(QEvent*); void enterEvent(QEvent*); diff --git a/plugins/channelrx/demodatv/atvdemodgui.ui b/plugins/channelrx/demodatv/atvdemodgui.ui index a8efcb54e..8095cff12 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.ui +++ b/plugins/channelrx/demodatv/atvdemodgui.ui @@ -414,6 +414,28 @@ + + + + Nominal number of lines per frame + + + + 625 L + + + + + 525 L + + + + + 405 L + + + + @@ -528,6 +550,9 @@ + + Black level value + <html><head/><body><p align="right">mV</p></body></html> @@ -538,6 +563,9 @@ + + Horizontal synchronization level value + <html><head/><body><p align="right">mV</p></body></html> @@ -592,13 +620,13 @@ - Line length in time units + Line length adjustment - 1 + -100 - 1000 + 100 1 @@ -607,7 +635,10 @@ 1 - 1 + 0 + + + 0 Qt::Horizontal @@ -616,8 +647,17 @@ + + + 55 + 0 + + + + Effective line length value + - <html><head/><body><p align="right">uS</p></body></html> + us Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -634,7 +674,7 @@ - Horizontal top length in time units + Horizontal top length adjustment 1 @@ -658,8 +698,17 @@ + + + 55 + 0 + + + + Horizontal top length value + - <html><head/><body><p align="right">uS</p></body></html> + <html><head/><body><p align="right">&mu;S</p></body></html> Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter