diff --git a/plugins/channelrx/demodatv/atvdemod.cpp b/plugins/channelrx/demodatv/atvdemod.cpp index 0efda33c6..f29875220 100644 --- a/plugins/channelrx/demodatv/atvdemod.cpp +++ b/plugins/channelrx/demodatv/atvdemod.cpp @@ -29,7 +29,6 @@ MESSAGE_CLASS_DEFINITION(ATVDemod::MsgConfigureATVDemod, Message) MESSAGE_CLASS_DEFINITION(ATVDemod::MsgConfigureRFATVDemod, Message) MESSAGE_CLASS_DEFINITION(ATVDemod::MsgReportEffectiveSampleRate, Message) -const float ATVDemod::m_fltSecondToUs = 1000000.0f; const int ATVDemod::m_ssbFftLen = 1024; ATVDemod::ATVDemod(BasebandSampleSink* objScopeSink) : @@ -647,7 +646,7 @@ bool ATVDemod::handleMessage(const Message& cmd) << " m_fltFramePerS:" << m_objConfig.m_fltFramePerS << " m_fltLineDurationUs:" << m_objConfig.m_fltLineDuration << " m_fltRatioOfRowsToDisplay:" << m_objConfig.m_fltRatioOfRowsToDisplay - << " m_fltTopDurationUs:" << m_objConfig.m_fltTopDurationUs + << " m_fltTopDurationUs:" << m_objConfig.m_fltTopDuration << " m_blnHSync:" << m_objConfig.m_blnHSync << " m_blnVSync:" << m_objConfig.m_blnVSync; @@ -730,7 +729,7 @@ void ATVDemod::applySettings() if((m_objConfig.m_fltFramePerS != m_objRunning.m_fltFramePerS) || (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_fltTopDuration != m_objRunning.m_fltTopDuration) || (m_objConfig.m_fltRatioOfRowsToDisplay != m_objRunning.m_fltRatioOfRowsToDisplay)) { m_objSettingsMutex.lock(); @@ -746,7 +745,7 @@ void ATVDemod::applySettings() << " m_intNumberSamplePerLine: " << m_intNumberSamplePerLine << " m_intNumberOfRowsToDisplay: " << m_intNumberOfRowsToDisplay; - m_intNumberSamplePerTop = (int) ((m_objConfig.m_fltTopDurationUs * m_objConfig.m_intSampleRate) / m_fltSecondToUs); + m_intNumberSamplePerTop = (int) (m_objConfig.m_fltTopDuration * m_objConfig.m_intSampleRate); m_objRegisteredATVScreen->resizeATVScreen(m_intNumberSamplePerLine, m_intNumberOfLines); m_intRowsLimit = m_intNumberOfLines-1; diff --git a/plugins/channelrx/demodatv/atvdemod.h b/plugins/channelrx/demodatv/atvdemod.h index 96979d9ff..1d676f614 100644 --- a/plugins/channelrx/demodatv/atvdemod.h +++ b/plugins/channelrx/demodatv/atvdemod.h @@ -58,7 +58,7 @@ public: { int m_intSampleRate; float m_fltLineDuration; - float m_fltTopDurationUs; + float m_fltTopDuration; float m_fltFramePerS; float m_fltRatioOfRowsToDisplay; float m_fltVoltLevelSynchroTop; @@ -71,7 +71,7 @@ public: ATVConfig() : m_intSampleRate(0), m_fltLineDuration(0.0f), - m_fltTopDurationUs(0.0f), + m_fltTopDuration(0.0f), m_fltFramePerS(0.0f), m_fltRatioOfRowsToDisplay(0.0f), m_fltVoltLevelSynchroTop(0.0f), @@ -227,7 +227,7 @@ private: m_objMsgConfig.m_fltVoltLevelSynchroTop = fltVoltLevelSynchroTop; m_objMsgConfig.m_fltFramePerS = fltFramePerS; m_objMsgConfig.m_fltLineDuration = fltLineDurationUs; - m_objMsgConfig.m_fltTopDurationUs = fltTopDurationUs; + m_objMsgConfig.m_fltTopDuration = fltTopDurationUs; m_objMsgConfig.m_fltRatioOfRowsToDisplay = flatRatioOfRowsToDisplay; m_objMsgConfig.m_blnHSync = blnHSync; m_objMsgConfig.m_blnVSync = blnVSync; @@ -357,8 +357,6 @@ private: QMutex m_objSettingsMutex; - static const float m_fltSecondToUs; - void applySettings(); void demod(Complex& c); static float getRFBandwidthDivisor(ATVModulation modulation); diff --git a/plugins/channelrx/demodatv/atvdemodgui.cpp b/plugins/channelrx/demodatv/atvdemodgui.cpp index b8e725136..1db6ee719 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.cpp +++ b/plugins/channelrx/demodatv/atvdemodgui.cpp @@ -96,6 +96,7 @@ void ATVDemodGUI::resetToDefaults() blockApplySettings(false); lineTimeUpdate(); + topTimeUpdate(); applySettings(); } @@ -188,6 +189,7 @@ bool ATVDemodGUI::deserialize(const QByteArray& arrData) m_objChannelMarker.blockSignals(false); lineTimeUpdate(); + topTimeUpdate(); applySettings(); return true; } @@ -208,6 +210,7 @@ bool ATVDemodGUI::handleMessage(const Message& objMessage) ui->nbPointsPerLineText->setText(tr("%1p").arg(nbPointsPerLine)); setRFFiltersSlidersRange(sampleRate); lineTimeUpdate(); + topTimeUpdate(); return true; } @@ -363,7 +366,7 @@ void ATVDemodGUI::applySettings() m_objATVDemod->configure(m_objATVDemod->getInputMessageQueue(), getNominalLineTime(ui->nbLines->currentIndex(), ui->fps->currentIndex()) + ui->lineTime->value() * m_fltLineTimeMultiplier, - ui->topTime->value() * 1.0f, + getNominalLineTime(ui->nbLines->currentIndex(), ui->fps->currentIndex()) * (4.7f / 64.0f) + ui->topTime->value() * m_fltTopTimeMultiplier, getFps(ui->fps->currentIndex()), (ui->halfImage->checkState() == Qt::Checked) ? 0.5f : 1.0f, ui->synchLevel->value() / 1000.0f, @@ -511,7 +514,7 @@ void ATVDemodGUI::on_lineTime_valueChanged(int value) void ATVDemodGUI::on_topTime_valueChanged(int value) { - ui->topTimeText->setText(QString("%1 µS").arg(value)); + topTimeUpdate(); applySettings(); } @@ -538,12 +541,14 @@ void ATVDemodGUI::on_halfImage_clicked() void ATVDemodGUI::on_nbLines_currentIndexChanged(int index) { lineTimeUpdate(); + topTimeUpdate(); applySettings(); } void ATVDemodGUI::on_fps_currentIndexChanged(int index) { lineTimeUpdate(); + topTimeUpdate(); applySettings(); } @@ -637,13 +642,36 @@ void ATVDemodGUI::lineTimeUpdate() 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)); + ui->lineTimeText->setText(tr("%1 ns").arg(lineTime * 1000000000.0, 0, 'f', 2)); else if(lineTime < 0.001) - ui->lineTimeText->setText(tr("%1 µs").arg(lineTime * 1000000.0, 0, 'f', 1)); + ui->lineTimeText->setText(tr("%1 µs").arg(lineTime * 1000000.0, 0, 'f', 2)); else if(lineTime < 1.0) - ui->lineTimeText->setText(tr("%1 ms").arg(lineTime * 1000.0, 0, 'f', 1)); + ui->lineTimeText->setText(tr("%1 ms").arg(lineTime * 1000.0, 0, 'f', 2)); else - ui->lineTimeText->setText(tr("%1 s").arg(lineTime * 1.0, 0, 'f', 1)); + ui->lineTimeText->setText(tr("%1 s").arg(lineTime * 1.0, 0, 'f', 2)); +} + +void ATVDemodGUI::topTimeUpdate() +{ + float nominalTopTime = getNominalLineTime(ui->nbLines->currentIndex(), ui->fps->currentIndex()) * (4.7f / 64.0f); + int topTimeScaleFactor = (int) std::log10(nominalTopTime); + + if (m_objATVDemod->getEffectiveSampleRate() == 0) { + m_fltTopTimeMultiplier = std::pow(10.0, topTimeScaleFactor-3); + } else { + m_fltTopTimeMultiplier = 1.0f / m_objATVDemod->getEffectiveSampleRate(); + } + + float topTime = nominalTopTime + m_fltTopTimeMultiplier * ui->topTime->value(); + + if(topTime < 0.000001) + ui->topTimeText->setText(tr("%1 ns").arg(topTime * 1000000000.0, 0, 'f', 2)); + else if(topTime < 0.001) + ui->topTimeText->setText(tr("%1 µs").arg(topTime * 1000000.0, 0, 'f', 2)); + else if(topTime < 1.0) + ui->topTimeText->setText(tr("%1 ms").arg(topTime * 1000.0, 0, 'f', 2)); + else + ui->topTimeText->setText(tr("%1 s").arg(topTime * 1.0, 0, 'f', 2)); } float ATVDemodGUI::getFps(int fpsIndex) @@ -684,4 +712,3 @@ float ATVDemodGUI::getNominalLineTime(int nbLinesIndex, int fpsIndex) break; } } - diff --git a/plugins/channelrx/demodatv/atvdemodgui.h b/plugins/channelrx/demodatv/atvdemodgui.h index c174d6b2f..d99334d01 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.h +++ b/plugins/channelrx/demodatv/atvdemodgui.h @@ -104,6 +104,7 @@ private: ScopeVisNG* m_objScopeVis; float m_fltLineTimeMultiplier; + float m_fltTopTimeMultiplier; int m_rfSliderDivisor; explicit ATVDemodGUI(PluginAPI* objPluginAPI, DeviceSourceAPI *objDeviceAPI, QWidget* objParent = NULL); @@ -115,6 +116,7 @@ private: void setChannelMarkerBandwidth(); void setRFFiltersSlidersRange(int sampleRate); void lineTimeUpdate(); + void topTimeUpdate(); static float getFps(int fpsIndex); static float getNominalLineTime(int nbLinesIndex, int fpsIndex); diff --git a/plugins/channelrx/demodatv/atvdemodgui.ui b/plugins/channelrx/demodatv/atvdemodgui.ui index 9c74d8f89..dde81b4b2 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.ui +++ b/plugins/channelrx/demodatv/atvdemodgui.ui @@ -737,25 +737,6 @@ - - - - - 55 - 0 - - - - Effective line length value - - - us - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - @@ -769,7 +750,7 @@ Horizontal top length adjustment - 1 + -30 30 @@ -781,7 +762,7 @@ 1 - 1 + 0 Qt::Horizontal @@ -792,7 +773,7 @@ - 55 + 62 0 @@ -820,6 +801,25 @@ + + + + + 62 + 0 + + + + Effective line length value + + + <html><head/><body><p align="right">&mu;S</p></body></html> + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + diff --git a/plugins/channeltx/modatv/atvmod.cpp b/plugins/channeltx/modatv/atvmod.cpp index 85daa52a9..6bd49f7ae 100644 --- a/plugins/channeltx/modatv/atvmod.cpp +++ b/plugins/channeltx/modatv/atvmod.cpp @@ -688,10 +688,7 @@ void ATVMod::apply(bool force) || (m_config.m_rfBandwidth != m_running.m_rfBandwidth) || (m_config.m_atvModulation != m_running.m_atvModulation) || force) { - int rateUnits, nbPointsPerRateUnit; - getBaseValues(m_config.m_outputSampleRate, m_config.m_nbLines * m_config.m_fps, rateUnits, nbPointsPerRateUnit); - m_tvSampleRate = (m_config.m_outputSampleRate / rateUnits) * rateUnits; // make sure working sample rate is a multiple of rate units - m_pointsPerLine = (m_tvSampleRate / rateUnits) * nbPointsPerRateUnit; + getBaseValues(m_config.m_outputSampleRate, m_config.m_nbLines * m_config.m_fps, m_tvSampleRate, m_pointsPerLine); // qDebug() << "ATVMod::apply: " // << " m_nbLines: " << m_config.m_nbLines @@ -722,7 +719,7 @@ void ATVMod::apply(bool force) memset(m_SSBFilterBuffer, 0, sizeof(Complex)*(m_ssbFftLen>>1)); m_SSBFilterBufferIndex = 0; - applyStandard(rateUnits, nbPointsPerRateUnit); // set all timings + applyStandard(m_tvSampleRate, m_pointsPerLine); // set all timings m_settingsMutex.unlock(); MsgReportEffectiveSampleRate *report; @@ -774,7 +771,7 @@ void ATVMod::apply(bool force) m_running.m_forceDecimator = m_config.m_forceDecimator; } -void ATVMod::getBaseValues(int outputSampleRate, int linesPerSecond, int& sampleRateUnits, int& nbPointsPerRateUnit) +void ATVMod::getBaseValues(int outputSampleRate, int linesPerSecond, int& sampleRateUnits, uint32_t& nbPointsPerRateUnit) { int maxPoints = outputSampleRate / linesPerSecond; int i = maxPoints; @@ -808,14 +805,14 @@ float ATVMod::getRFBandwidthDivisor(ATVModulation modulation) void ATVMod::applyStandard(int rateUnits, int nbPointsPerRateUnit) { - m_pointsPerTU = m_tvSampleRate / rateUnits; // TV sample rate is already set at a multiple of rate units + m_pointsPerSync = (uint32_t) ((4.7f / 64.0f) * m_pointsPerLine); + m_pointsPerBP = (uint32_t) ((4.7f / 64.0f) * m_pointsPerLine); + m_pointsPerFP = (uint32_t) ((2.6f / 64.0f) * m_pointsPerLine); + m_pointsPerFSync = (uint32_t) ((2.3f / 64.0f) * m_pointsPerLine); + + m_pointsPerImgLine = m_pointsPerLine - m_pointsPerSync - m_pointsPerBP - m_pointsPerFP; + m_nbHorizPoints = m_pointsPerLine; - m_pointsPerSync = (uint32_t) roundf(4.7f * m_pointsPerTU); // normal sync pulse (4.7 us / rateUnits) - m_pointsPerBP = (uint32_t) roundf(4.7f * m_pointsPerTU); // back porch (4.7 us / rateUnits) - m_pointsPerFP = (uint32_t) roundf(1.5f * m_pointsPerTU); // front porch (1.5 us / rateUnits) - m_pointsPerFSync = (uint32_t) roundf(2.3f * m_pointsPerTU); // equalizing pulse (2.3 us / rateUnits) - m_pointsPerImgLine = nbPointsPerRateUnit * m_pointsPerTU - m_pointsPerSync - m_pointsPerBP - m_pointsPerFP; - m_nbHorizPoints = nbPointsPerRateUnit * m_pointsPerTU; // full line m_pointsPerHBar = m_pointsPerImgLine / m_nbBars; m_linesPerVBar = m_nbImageLines2 / m_nbBars; m_hBarIncrement = m_spanLevel / (float) m_nbBars; diff --git a/plugins/channeltx/modatv/atvmod.h b/plugins/channeltx/modatv/atvmod.h index 313ff80c1..42c30b26d 100644 --- a/plugins/channeltx/modatv/atvmod.h +++ b/plugins/channeltx/modatv/atvmod.h @@ -404,7 +404,7 @@ public: Real getMagSq() const { return m_movingAverage.average(); } void getCameraNumbers(std::vector& numbers); - static void getBaseValues(int outputSampleRate, int linesPerSecond, int& sampleRateUnits, int& nbPointsPerRateUnit); + static void getBaseValues(int outputSampleRate, int linesPerSecond, int& sampleRateUnits, uint32_t& nbPointsPerRateUnit); static float getRFBandwidthDivisor(ATVModulation modulation); signals: