X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/b9bda8a0d43be892f2e5d96ea45ba8d4b2fdae20..1995abf236d34dd3264435a35f2c9c128cf3afaa:/lib/dvb/frontend.cpp diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 3ae9473e..d2730a26 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -625,6 +625,42 @@ int eDVBFrontend::readFrontendData(int type) eDebug("FE_READ_SNR failed (%m)"); return snr; } + case signalPowerdB: /* this will move into the driver */ + { + uint16_t snr=0; + if (ioctl(m_fd, FE_READ_SNR, &snr) < 0 && errno != ERANGE) + eDebug("FE_READ_SNR failed (%m)"); + unsigned int SDS_SNRE = snr << 16; + + static float SNR_COEFF[6] = { + 100.0 / 4194304.0, + -7136.0 / 4194304.0, + 197418.0 / 4194304.0, + -2602183.0 / 4194304.0, + 20377212.0 / 4194304.0, + -37791203.0 / 4194304.0, + }; + + float fval1, fval2, snr_in_db; + int i; + fval1 = 12.44714 - (2.0 * log10(SDS_SNRE / 256.0)); + fval2 = pow(10.0, fval1)-1; + fval1 = 10.0 * log10(fval2); + + if (fval1 < 10.0) + { + fval2 = SNR_COEFF[0]; + for (i=0; i<6; ++i) + { + fval2 *= fval1; + fval2 += SNR_COEFF[i]; + } + fval1 = fval2; + } + snr_in_db = fval1; + + return (int)(snr_in_db * 100.0); + } case signalQuality: { uint16_t strength=0; @@ -1001,6 +1037,7 @@ void eDVBFrontend::getFrontendStatus(ePyObject dest) PutToDict(dest, "tuner_synced", readFrontendData(synced)); PutToDict(dest, "tuner_bit_error_rate", readFrontendData(bitErrorRate)); PutToDict(dest, "tuner_signal_power", readFrontendData(signalPower)); + PutToDict(dest, "tuner_signal_power_db", readFrontendData(signalPowerdB)); PutToDict(dest, "tuner_signal_quality", readFrontendData(signalQuality)); } }