diff --git a/HISTORY b/HISTORY index a5b2c44..fa4ab1f 100644 --- a/HISTORY +++ b/HISTORY @@ -417,4 +417,6 @@ VDR Plugin 'femon' Revision History 2011-xx-xx: Version 1.7.11 -- Added cppcheck target into Makefile. \ No newline at end of file +- Updated for vdr-1.7.19: New API functions for signal strength + and quality used to provide information for the OSD. +- Added cppcheck target into Makefile. diff --git a/README b/README index 9c685ea..ffcbca7 100644 --- a/README +++ b/README @@ -32,15 +32,15 @@ Terminology: -------------------------------------------------------------- |## Channel Name ################### [SVDRP][AR][VF][A/DD][D]| -|[=====Signal Strength in % ==============|=================]| -|[=====Signal-to-Noise Ratio in % ========|=================]| +|[=====Signal Strength ===================|=================]| +|[=====Signal Quality ================|=====================]| | STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s | | SNR: #0000 (0%) UNC: #00000000 Audio: 0 kbit/s | | [LOCK] [SIGNAL] [CARRIER] [VITERBI] [SYNC] | -------------------------------------------------------------- -STR - Signal strength -SNR - Signal-to-noise ratio +STR - Signal strength from driver +SNR - Signal-to-noise ratio from driver BER - Bit error rate UNC - Uncorrected blocks Video - Calculated video bitrate in Mbit/s diff --git a/femon.c b/femon.c index 7880afb..4c0b135 100644 --- a/femon.c +++ b/femon.c @@ -14,8 +14,8 @@ #include "femonservice.h" #include "femontools.h" -#if defined(APIVERSNUM) && APIVERSNUM < 10718 -#error "VDR-1.7.18 API version or greater is required!" +#if defined(APIVERSNUM) && APIVERSNUM < 10719 +#error "VDR-1.7.19 API version or greater is required!" #endif static const char VERSION[] = "1.7.11"; @@ -169,10 +169,14 @@ const char **cPluginFemon::SVDRPHelpPages(void) " Print the current frontend name.", "STAT\n" " Print the current frontend status.", - "SGNL\n" + "STRG\n" " Print the current signal strength.", + "QUAL\n" + " Print the current signal quality.", + "SGNL\n" + " Print the current signal strength from driver.", "SNRA\n" - " Print the current signal-to-noise ratio.", + " Print the current signal-to-noise ratio from driver.", "BERA\n" " Print the current bit error rate.", "UNCB\n" @@ -225,6 +229,12 @@ cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int else if (strcasecmp(Command, "STAT") == 0) { return getFrontendStatus(cDevice::ActualDevice()->CardIndex()); } + else if (strcasecmp(Command, "STRG") == 0) { + return cString::sprintf("%d on device #%d", cDevice::ActualDevice()->SignalStrength(), cDevice::ActualDevice()->CardIndex()); + } + else if (strcasecmp(Command, "QUAL") == 0) { + return cString::sprintf("%d on device #%d", cDevice::ActualDevice()->SignalQuality(), cDevice::ActualDevice()->CardIndex()); + } else if (strcasecmp(Command, "SGNL") == 0) { int value = getSignal(cDevice::ActualDevice()->CardIndex()); return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex()); diff --git a/femonosd.c b/femonosd.c index 974cab3..536a5e2 100644 --- a/femonosd.c +++ b/femonosd.c @@ -171,6 +171,10 @@ cFemonOsd::cFemonOsd() m_SvdrpPlugin(NULL), m_Number(0), m_OldNumber(0), + m_Quality(0), + m_QualityValid(false), + m_Strength(0), + m_StrengthValid(false), m_SNR(0), m_SNRValid(false), m_Signal(0), @@ -333,11 +337,11 @@ void cFemonOsd::DrawStatusWindow(void) OSDDRAWSTATUSBM(OSDSPACING); } offset += OSDROWHEIGHT; - if (m_SignalValid) - OSDDRAWSTATUSBAR(m_Signal / 655); + if (m_StrengthValid) + OSDDRAWSTATUSBAR(m_Strength); offset += OSDROWHEIGHT; - if (m_SNRValid) - OSDDRAWSTATUSBAR(m_SNR / 655); + if (m_QualityValid) + OSDDRAWSTATUSBAR(m_Quality); offset += OSDROWHEIGHT; OSDDRAWSTATUSVALUES("STR:", m_SignalValid ? *cString::sprintf("%04x", m_Signal) : "", m_SignalValid ? *cString::sprintf("(%2d%%)", m_Signal / 655) : "", "BER:", m_BERValid ? *cString::sprintf("%08x", m_BER) : "", *cString::sprintf("%s:", tr("Video")), @@ -521,6 +525,10 @@ void cFemonOsd::Action(void) m_SvdrpVideoBitrate = -1.0; m_SvdrpAudioBitrate = -1.0; if (m_Frontend != -1) { + m_Quality = cDevice::ActualDevice()->SignalQuality(); + m_QualityValid = (m_Quality >= 0); + m_Strength = cDevice::ActualDevice()->SignalStrength(); + m_StrengthValid = (m_Strength >= 0); m_FrontendStatusValid = (ioctl(m_Frontend, FE_READ_STATUS, &m_FrontendStatus) >= 0); m_SignalValid = (ioctl(m_Frontend, FE_READ_SIGNAL_STRENGTH, &m_Signal) >= 0); m_SNRValid = (ioctl(m_Frontend, FE_READ_SNR, &m_SNR) >= 0); @@ -533,6 +541,8 @@ void cFemonOsd::Action(void) cmd.handle = m_SvdrpConnection.handle; m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd); if (cmd.responseCode == 900) { + m_StrengthValid = false; + m_QualityValid = false; m_FrontendStatusValid = false; m_SignalValid = false; m_SNRValid = false; @@ -542,6 +552,14 @@ void cFemonOsd::Action(void) const char *s = line->Text(); if (!strncasecmp(s, "CARD:", 5)) m_SvdrpFrontend = (int)strtol(s + 5, NULL, 10); + else if (!strncasecmp(s, "STRG:", 5)) { + m_Strength = (int)strtol(s + 5, NULL, 10); + m_StrengthValid = (m_Strength >= 0); + } + else if (!strncasecmp(s, "QUAL:", 5)) { + m_Quality = (int)strtol(s + 5, NULL, 10); + m_QualityValid = (m_Quality >= 0); + } else if (!strncasecmp(s, "TYPE:", 5)) m_FrontendInfo.type = (fe_type_t)strtol(s + 5, NULL, 10); else if (!strncasecmp(s, "NAME:", 5)) { diff --git a/femonosd.h b/femonosd.h index a2d0151..4741c54 100644 --- a/femonosd.h +++ b/femonosd.h @@ -36,6 +36,10 @@ private: cPlugin *m_SvdrpPlugin; int m_Number; int m_OldNumber; + int m_Quality; + bool m_QualityValid; + int m_Strength; + bool m_StrengthValid; uint16_t m_SNR; bool m_SNRValid; uint16_t m_Signal; diff --git a/femontools.c b/femontools.c index a059d88..958239a 100644 --- a/femontools.c +++ b/femontools.c @@ -92,7 +92,7 @@ cString getFrontendInfo(int cardIndex) if (fe < 0) return NULL; - info = cString::sprintf("CARD:%d", cardIndex); + info = cString::sprintf("CARD:%d\nSTRG:%d\nQUAL:%d", cardIndex, cDevice::ActualDevice()->SignalStrength(), cDevice::ActualDevice()->SignalQuality()); if (ioctl(fe, FE_GET_INFO, &value) >= 0) info = cString::sprintf("%s\nTYPE:%d\nNAME:%s", *info, value.type, value.name);