diff --git a/plugins/channelrx/demoddatv/datvconstellation.h b/plugins/channelrx/demoddatv/datvconstellation.h index 217c945b1..e4d19dbb1 100644 --- a/plugins/channelrx/demoddatv/datvconstellation.h +++ b/plugins/channelrx/demoddatv/datvconstellation.h @@ -101,7 +101,11 @@ static inline cstln_lut * make_dvbs_constellation(cstln_lut(c, 10, gamma1, gamma2, gamma3); + cstln_lut *newCstln = new cstln_lut(c, 10, gamma1, gamma2, gamma3); + newCstln->m_rateCode = (int) r; + newCstln->m_typeCode = (int) c; + newCstln->m_setByModcod = false; + return newCstln; } template struct datvconstellation: runnable diff --git a/plugins/channelrx/demoddatv/datvdemod.cpp b/plugins/channelrx/demoddatv/datvdemod.cpp index fa3a0c2ab..5ce80b620 100644 --- a/plugins/channelrx/demoddatv/datvdemod.cpp +++ b/plugins/channelrx/demoddatv/datvdemod.cpp @@ -49,6 +49,7 @@ DATVDemod::DATVDemod(DeviceAPI *deviceAPI) : m_audioFifo(48000), m_blnRenderingVideo(false), m_blnStartStopVideo(false), + m_cstlnSetByModcod(false), m_enmModulation(DATVDemodSettings::BPSK /*DATV_FM1*/), m_sampleRate(1024000), m_objSettingsMutex(QMutex::NonRecursive) @@ -1080,7 +1081,7 @@ void DATVDemod::InitDATVS2Framework() objDemodulatorDVBS2->cstln = make_dvbs2_constellation(m_objCfg.constellation, m_objCfg.fec); - + m_cstlnSetByModcod = false; //constellation @@ -1254,6 +1255,23 @@ void DATVDemod::feed(const SampleVector::const_iterator& begin, const SampleVect } } + } // Samples for loop + + // DVBS2: Track change of constellation via MODCOD + if (m_settings.m_standard==DATVDemodSettings::DVB_S2) + { + leansdr::s2_frame_receiver * objDemodulatorDVBS2 = (leansdr::s2_frame_receiver *) m_objDemodulatorDVBS2; + + if (objDemodulatorDVBS2->cstln->m_setByModcod && !m_cstlnSetByModcod) + { + qDebug("DATVDemod::feed: change by MODCOD detected"); + + if (r_scope_symbols_dvbs2) { + r_scope_symbols_dvbs2->calculate_cstln_points(); + } + } + + m_cstlnSetByModcod = objDemodulatorDVBS2->cstln->m_setByModcod; } } @@ -1425,3 +1443,61 @@ int DATVDemod::GetSampleRate() { return m_sampleRate; } + +DATVDemodSettings::DATVCodeRates getCodeRateFromLeanDVBCode(int leanDVBCodeRate) +{ + if (leanDVBCodeRate == leansdr::code_rate::FEC12) { + return DATVDemodSettings::DATVCodeRates::FEC12; + } else if (leanDVBCodeRate == leansdr::code_rate::FEC13) { + return DATVDemodSettings::DATVCodeRates::FEC13; + } else if (leanDVBCodeRate == leansdr::code_rate::FEC14) { + return DATVDemodSettings::DATVCodeRates::FEC14; + } else if (leanDVBCodeRate == leansdr::code_rate::FEC23) { + return DATVDemodSettings::DATVCodeRates::FEC23; + } else if (leanDVBCodeRate == leansdr::code_rate::FEC25) { + return DATVDemodSettings::DATVCodeRates::FEC25; + } else if (leanDVBCodeRate == leansdr::code_rate::FEC34) { + return DATVDemodSettings::DATVCodeRates::FEC34; + } else if (leanDVBCodeRate == leansdr::code_rate::FEC35) { + return DATVDemodSettings::DATVCodeRates::FEC35; + } else if (leanDVBCodeRate == leansdr::code_rate::FEC45) { + return DATVDemodSettings::DATVCodeRates::FEC45; + } else if (leanDVBCodeRate == leansdr::code_rate::FEC46) { + return DATVDemodSettings::DATVCodeRates::FEC46; + } else if (leanDVBCodeRate == leansdr::code_rate::FEC56) { + return DATVDemodSettings::DATVCodeRates::FEC56; + } else if (leanDVBCodeRate == leansdr::code_rate::FEC78) { + return DATVDemodSettings::DATVCodeRates::FEC78; + } else if (leanDVBCodeRate == leansdr::code_rate::FEC89) { + return DATVDemodSettings::DATVCodeRates::FEC89; + } else if (leanDVBCodeRate == leansdr::code_rate::FEC910) { + return DATVDemodSettings::DATVCodeRates::FEC910; + } else { + return DATVDemodSettings::DATVCodeRates::FEC12; + } +} + +DATVDemodSettings::DATVModulation getModulationFromLeanDVBCode(int leanDVBModulation) +{ + if (leanDVBModulation == leansdr::cstln_base::predef::APSK16) { + return DATVDemodSettings::DATVModulation::APSK16; + } else if (leanDVBModulation == leansdr::cstln_base::predef::APSK32) { + return DATVDemodSettings::DATVModulation::APSK32; + } else if (leanDVBModulation == leansdr::cstln_base::predef::APSK64E) { + return DATVDemodSettings::DATVModulation::APSK64E; + } else if (leanDVBModulation == leansdr::cstln_base::predef::BPSK) { + return DATVDemodSettings::DATVModulation::BPSK; + } else if (leanDVBModulation == leansdr::cstln_base::predef::PSK8) { + return DATVDemodSettings::DATVModulation::PSK8; + } else if (leanDVBModulation == leansdr::cstln_base::predef::QAM16) { + return DATVDemodSettings::DATVModulation::QAM16; + } else if (leanDVBModulation == leansdr::cstln_base::predef::QAM64) { + return DATVDemodSettings::DATVModulation::QAM64; + } else if (leanDVBModulation == leansdr::cstln_base::predef::QAM256) { + return DATVDemodSettings::DATVModulation::QAM256; + } else if (leanDVBModulation == leansdr::cstln_base::predef::QPSK) { + return DATVDemodSettings::DATVModulation::QPSK; + } else { + return DATVDemodSettings::DATVModulation::BPSK; + } +} diff --git a/plugins/channelrx/demoddatv/datvdemod.h b/plugins/channelrx/demoddatv/datvdemod.h index 0046a9a3b..586d046be 100644 --- a/plugins/channelrx/demoddatv/datvdemod.h +++ b/plugins/channelrx/demoddatv/datvdemod.h @@ -185,6 +185,8 @@ public: void InitDATVFramework(); void InitDATVS2Framework(); double getMagSq() const { return m_objMagSqAverage; } //!< Beware this is scaled to 2^30 + static DATVDemodSettings::DATVCodeRates getCodeRateFromLeanDVBCode(int leanDVBCodeRate); + static DATVDemodSettings::DATVModulation getModulationFromLeanDVBCode(int leanDVBModulation); static const QString m_channelIdURI; static const QString m_channelId; @@ -381,6 +383,7 @@ private: bool m_blnInitialized; bool m_blnRenderingVideo; bool m_blnStartStopVideo; + bool m_cstlnSetByModcod; DATVDemodSettings::DATVModulation m_enmModulation; diff --git a/plugins/channelrx/demoddatv/datvdemodsettings.h b/plugins/channelrx/demoddatv/datvdemodsettings.h index 8d223671d..689504a4b 100644 --- a/plugins/channelrx/demoddatv/datvdemodsettings.h +++ b/plugins/channelrx/demoddatv/datvdemodsettings.h @@ -47,6 +47,23 @@ struct DATVDemodSettings QAM256 }; + enum DATVCodeRates + { + FEC12, + FEC23, + FEC46, + FEC34, + FEC56, + FEC78, // DVB-S + FEC45, + FEC89, + FEC910, // DVB-S2 + FEC14, + FEC13, + FEC25, + FEC35 + }; + enum dvb_sampler { SAMP_NEAREST, diff --git a/plugins/channelrx/demoddatv/datvdvbs2constellation.h b/plugins/channelrx/demoddatv/datvdvbs2constellation.h index d51e600a3..27fe08202 100644 --- a/plugins/channelrx/demoddatv/datvdvbs2constellation.h +++ b/plugins/channelrx/demoddatv/datvdvbs2constellation.h @@ -103,7 +103,11 @@ static inline cstln_lut * make_dvbs2_constellation(cstln_lut(c, 10, gamma1, gamma2, gamma3); + cstln_lut *newCstln = new cstln_lut(c, 10, gamma1, gamma2, gamma3); + newCstln->m_rateCode = (int) r; + newCstln->m_typeCode = (int) c; + newCstln->m_setByModcod = false; + return newCstln; } template struct datvdvbs2constellation: runnable diff --git a/plugins/channelrx/demoddatv/leansdr/dvbs2.h b/plugins/channelrx/demoddatv/leansdr/dvbs2.h index 034d47ff6..b99cee0bf 100644 --- a/plugins/channelrx/demoddatv/leansdr/dvbs2.h +++ b/plugins/channelrx/demoddatv/leansdr/dvbs2.h @@ -808,6 +808,9 @@ struct s2_frame_receiver : runnable cstln_base::names[mcinfo->c], mcinfo->rate); cstln = new cstln_lut(mcinfo->c, mcinfo->esn0_nf, mcinfo->g1, mcinfo->g2, mcinfo->g3); + cstln->m_rateCode = (int) mcinfo->rate; + cstln->m_typeCode = (int) mcinfo->c; + cstln->m_setByModcod = true; #if 0 fprintf(stderr, "Dumping constellation LUT to stdout.\n"); cstln->dump(stdout); diff --git a/plugins/channelrx/demoddatv/leansdr/sdr.h b/plugins/channelrx/demoddatv/leansdr/sdr.h index 9c19e33d1..c7c2375c5 100644 --- a/plugins/channelrx/demoddatv/leansdr/sdr.h +++ b/plugins/channelrx/demoddatv/leansdr/sdr.h @@ -875,6 +875,10 @@ struct cstln_lut : cstln_base softsymb_harden(&lut[i][q].ss); } } + + int m_typeCode; + int m_rateCode; + bool m_setByModcod; }; // cstln_lut