From: Andreas Monzner Date: Sat, 3 Dec 2005 21:16:59 +0000 (+0000) Subject: add support for read signal quality, power and biterror rate from python X-Git-Tag: 2.6.0~4835 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/391f7559e77cf98ea3b5a1fba94a8fa6f4307da8 add support for read signal quality, power and biterror rate from python --- diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 8d035bfa..a26f6bd8 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -376,6 +376,35 @@ void eDVBFrontend::timeout() m_tuning = 0; } +int eDVBFrontend::readFrontendData(int type) +{ + switch(type) + { + case bitErrorRate: + { + uint32_t ber=0; + if (ioctl(m_fd, FE_READ_BER, &ber) < 0 && errno != ERANGE) + eDebug("FE_READ_BER failed (%m)"); + return ber; + } + case signalPower: + { + uint16_t snr=0; + if (ioctl(m_fd, FE_READ_SNR, &snr) < 0 && errno != ERANGE) + eDebug("FE_READ_SNR failed (%m)"); + return snr; + } + case signalQuality: + { + uint16_t strength=0; + if (ioctl(m_fd, FE_READ_SIGNAL_STRENGTH, &strength) < 0 && errno != ERANGE) + eDebug("FE_READ_SIGNAL_STRENGTH failed (%m)"); + return strength; + } + } + return 0; +} + #ifndef FP_IOCTL_GET_ID #define FP_IOCTL_GET_ID 0 #endif diff --git a/lib/dvb/frontend.h b/lib/dvb/frontend.h index d06da32a..8da0829c 100644 --- a/lib/dvb/frontend.h +++ b/lib/dvb/frontend.h @@ -91,7 +91,9 @@ public: RESULT setSecSequence(const eSecCommandList &list); RESULT getData(int num, int &data); RESULT setData(int num, int val); - + + int readFrontendData(int type); // bitErrorRate, signalPower, signalQuality + int isCompatibleWith(ePtr &feparm); int getID() { return m_fe; } diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index a14e0af5..22eccbd9 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -344,6 +344,12 @@ public: virtual RESULT sendToneburst(int burst)=0; virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0; virtual RESULT setSecSequence(const eSecCommandList &list)=0; + + enum { + bitErrorRate, signalPower, signalQuality + }; + virtual int readFrontendData(int type)=0; + virtual RESULT getData(int num, int &data)=0; virtual RESULT setData(int num, int val)=0; diff --git a/lib/service/iservice.h b/lib/service/iservice.h index 232e66f2..dfd06693 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -224,6 +224,19 @@ public: TEMPLATE_TYPEDEF(ePtr, iServiceInformationPtr); +class iFrontendStatusInformation: public iObject +{ +public: + enum { + bitErrorRate, + signalPower, + signalQuality + }; + virtual int getFrontendInfo(int w)=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iFrontendStatusInformationPtr); + class iPauseableService: public iObject { public: @@ -287,6 +300,7 @@ public: virtual SWIG_VOID(RESULT) pause(ePtr &SWIG_OUTPUT)=0; virtual SWIG_VOID(RESULT) info(ePtr &SWIG_OUTPUT)=0; virtual SWIG_VOID(RESULT) audioTracks(ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) frontendStatusInfo(ePtr &SWIG_OUTPUT)=0; }; TEMPLATE_TYPEDEF(ePtr, iPlayableServicePtr); diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 96f942ab..9e77a7a7 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -681,6 +681,12 @@ RESULT eDVBServicePlay::getPlayPosition(pts_t &pos) return pvr_channel->getCurrentPosition(demux, pos); } +RESULT eDVBServicePlay::frontendStatusInfo(ePtr &ptr) +{ + ptr = this; + return 0; +} + RESULT eDVBServicePlay::info(ePtr &ptr) { ptr = this; @@ -811,6 +817,17 @@ int eDVBServicePlay::selectAudioStream(int i) return 0; } +int eDVBServicePlay::getFrontendInfo(int w) +{ + eUsePtr channel; + if(m_service_handler.getChannel(channel)) + return 0; + ePtr fe; + if(channel->getFrontend(fe)) + return 0; + return fe->readFrontendData(w); +} + DEFINE_REF(eDVBServicePlay) eAutoInitPtr init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB"); diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index 44d920f8..4b6ef3e1 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -54,7 +54,7 @@ private: class eDVBServicePlay: public iPlayableService, public iPauseableService, public iSeekableService, public Object, public iServiceInformation, - public iAudioTrackSelection + public iAudioTrackSelection, public iFrontendStatusInformation { DECLARE_REF(eDVBServicePlay); public: @@ -68,6 +68,7 @@ public: RESULT pause(ePtr &ptr); RESULT info(ePtr &ptr); RESULT audioTracks(ePtr &ptr); + RESULT frontendStatusInfo(ePtr &ptr); // iPauseableService RESULT pause(); @@ -90,6 +91,9 @@ public: RESULT selectTrack(unsigned int i); RESULT getTrackInfo(struct iAudioTrackInfo &, unsigned int n); + // iFrontendStatusInformation + int getFrontendInfo(int w); + private: friend class eServiceFactoryDVB; eServiceReference m_reference; diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index dc038a85..8f999471 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -149,6 +149,7 @@ RESULT eServiceMP3::stop() RESULT eServiceMP3::pause(ePtr &ptr) { ptr=this; return 0; } RESULT eServiceMP3::seek(ePtr &ptr) { ptr = 0; return -1; } +RESULT eServiceMP3::frontendStatusInfo(ePtr &ptr) { ptr = 0; return -1; } RESULT eServiceMP3::audioTracks(ePtr &ptr) { ptr = 0; return -1; }; // iPausableService diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h index bf18e92b..9f1a8e9f 100644 --- a/lib/service/servicemp3.h +++ b/lib/service/servicemp3.h @@ -58,6 +58,7 @@ public: RESULT pause(ePtr &ptr); RESULT seek(ePtr &ptr); RESULT audioTracks(ePtr &ptr); + RESULT frontendStatusInfo(ePtr &ptr); // iPausableService RESULT pause();