aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb/frontend.cpp
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2007-06-12 22:37:52 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2007-06-12 22:37:52 +0000
commit330f9198e1a85021c32a1ce9f53e5259eabc6795 (patch)
tree670db830d00c50e4a68aa395bfcb298fb76f3aff /lib/dvb/frontend.cpp
parentb6fb1984add5d1fbc08686d510d6aa46efa7f3bd (diff)
downloadenigma2-330f9198e1a85021c32a1ce9f53e5259eabc6795.tar.gz
enigma2-330f9198e1a85021c32a1ce9f53e5259eabc6795.zip
add stv0299 snr to dB Calculation (thx to adenin for this)
fallback to normal SNR when no SNR to dB calculation is available
Diffstat (limited to 'lib/dvb/frontend.cpp')
-rw-r--r--lib/dvb/frontend.cpp86
1 files changed, 60 insertions, 26 deletions
diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp
index 4df362e4..92507645 100644
--- a/lib/dvb/frontend.cpp
+++ b/lib/dvb/frontend.cpp
@@ -631,36 +631,50 @@ int eDVBFrontend::readFrontendData(int type)
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,
- };
+ if (!strcmp(m_description, "BCM4501 (internal)"))
+ {
+ 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);
+ 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)
+ if (fval1 < 10.0)
{
- fval2 *= fval1;
- fval2 += SNR_COEFF[i];
+ fval2 = SNR_COEFF[0];
+ for (i=0; i<6; ++i)
+ {
+ fval2 *= fval1;
+ fval2 += SNR_COEFF[i];
+ }
+ fval1 = fval2;
}
- fval1 = fval2;
- }
- snr_in_db = fval1;
+ snr_in_db = fval1;
- return (int)(snr_in_db * 100.0);
+ return (int)(snr_in_db * 100.0);
+ }
+ else if (!strcmp(m_description, "Alps BSBE1 702A") || // some frontends with STV0299
+ !strcmp(m_description, "Alps -S") ||
+ !strcmp(m_description, "Philips -S") ||
+ !strcmp(m_description, "LG -S") )
+ {
+ float snr_in_db=(snr-39075)/1764.7;
+ return (int)(snr_in_db * 100.0);
+ }
+ else
+ eDebug("no SNR dB caluclation for frontendtype %s yet", m_description);
+ return 0x12345678;
}
case signalQuality:
{
@@ -710,6 +724,18 @@ void PutToDict(ePyObject &dict, const char*key, long value)
eDebug("could not create PyObject for %s", key);
}
+void PutToDict(ePyObject &dict, const char*key, ePyObject item)
+{
+ if (item)
+ {
+ if (PyDict_SetItemString(dict, key, item))
+ eDebug("put %s to dict failed", key);
+ Py_DECREF(item);
+ }
+ else
+ eDebug("invalid PyObject for %s", key);
+}
+
void PutToDict(ePyObject &dict, const char*key, const char *value)
{
ePyObject item = PyString_FromString(value);
@@ -1038,7 +1064,15 @@ 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));
+ int sigPowerdB = readFrontendData(signalPowerdB);
+ if (sigPowerdB == 0x12345678) // not support yet
+ {
+ ePyObject obj=Py_None;
+ Py_INCREF(obj);
+ PutToDict(dest, "tuner_signal_power_db", obj);
+ }
+ else
+ PutToDict(dest, "tuner_signal_power_db", sigPowerdB);
PutToDict(dest, "tuner_signal_quality", readFrontendData(signalQuality));
}
}