1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Added a Status parameter to the interface of cDevice::SignalStats() and cDvbDevice::SignalStats()

This commit is contained in:
Klaus Schmidinger 2017-05-09 11:53:41 +02:00
parent 6bed5368e6
commit 44287ca25e
6 changed files with 40 additions and 12 deletions

View File

@ -1199,6 +1199,8 @@ Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>
for the "binary skip" patch for the "binary skip" patch
for adding support for LCN (Logical Channel Numbers) for adding support for LCN (Logical Channel Numbers)
for suggesting to change the naming of "binary skip mode" to "adaptive skip mode" for suggesting to change the naming of "binary skip mode" to "adaptive skip mode"
for adding a Status parameter to the interface of cDevice::SignalStats() and
cDvbDevice::SignalStats()
Ralf Klueber <ralf.klueber@vodafone.com> Ralf Klueber <ralf.klueber@vodafone.com>
for reporting a bug in cutting a recording if there is only a single editing mark for reporting a bug in cutting a recording if there is only a single editing mark

View File

@ -9019,3 +9019,5 @@ Video Disk Recorder Revision History
Jessich). Jessich).
- Changed the legacy delivery system name "DMBTH" to "DTMB", and added names for - Changed the legacy delivery system name "DMBTH" to "DTMB", and added names for
DVBC_ANNEX_C and DVBC2. DVBC_ANNEX_C and DVBC2.
- Added a Status parameter to the interface of cDevice::SignalStats() and
cDvbDevice::SignalStats() (thanks to Rolf Ahrenberg).

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: device.c 4.18 2017/05/09 09:03:14 kls Exp $ * $Id: device.c 4.19 2017/05/09 11:24:47 kls Exp $
*/ */
#include "device.h" #include "device.h"
@ -750,7 +750,7 @@ const cPositioner *cDevice::Positioner(void) const
return NULL; return NULL;
} }
bool cDevice::SignalStats(int &Valid, double *Strength, double *Cnr, double *BerPre, double *BerPost, double *Per) const bool cDevice::SignalStats(int &Valid, double *Strength, double *Cnr, double *BerPre, double *BerPost, double *Per, int *Status) const
{ {
return false; return false;
} }

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: device.h 4.8 2017/04/17 14:46:57 kls Exp $ * $Id: device.h 4.9 2017/05/09 11:24:47 kls Exp $
*/ */
#ifndef __DEVICE_H #ifndef __DEVICE_H
@ -112,6 +112,14 @@ public:
#define DTV_STAT_VALID_BERPRE 0x0004 #define DTV_STAT_VALID_BERPRE 0x0004
#define DTV_STAT_VALID_BERPOST 0x0008 #define DTV_STAT_VALID_BERPOST 0x0008
#define DTV_STAT_VALID_PER 0x0010 #define DTV_STAT_VALID_PER 0x0010
#define DTV_STAT_VALID_STATUS 0x0020
#define DTV_STAT_HAS_NONE 0x0000
#define DTV_STAT_HAS_SIGNAL 0x0001
#define DTV_STAT_HAS_CARRIER 0x0002
#define DTV_STAT_HAS_VITERBI 0x0004
#define DTV_STAT_HAS_SYNC 0x0008
#define DTV_STAT_HAS_LOCK 0x0010
class cDevice : public cThread { class cDevice : public cThread {
friend class cLiveSubtitle; friend class cLiveSubtitle;
@ -291,13 +299,14 @@ public:
///< move the satellite dish to the requested position (only applies to DVB-S ///< move the satellite dish to the requested position (only applies to DVB-S
///< devices). If no positioner is involved, or this is not a DVB-S device, ///< devices). If no positioner is involved, or this is not a DVB-S device,
///< NULL will be returned. ///< NULL will be returned.
virtual bool SignalStats(int &Valid, double *Strength = NULL, double *Cnr = NULL, double *BerPre = NULL, double *BerPost = NULL, double *Per = NULL) const; virtual bool SignalStats(int &Valid, double *Strength = NULL, double *Cnr = NULL, double *BerPre = NULL, double *BerPost = NULL, double *Per = NULL, int *Status = NULL) const;
///< Returns statistics about the currently received signal (if available). ///< Returns statistics about the currently received signal (if available).
///< Strength is the signal strength in dBm (typical range -100dBm...0dBm). ///< Strength is the signal strength in dBm (typical range -100dBm...0dBm).
///< Cnr is the carrier to noise ratio in dB (typical range 0dB...40dB). ///< Cnr is the carrier to noise ratio in dB (typical range 0dB...40dB).
///< BerPre is the bit error rate before the forward error correction (FEC). ///< BerPre is the bit error rate before the forward error correction (FEC).
///< BerPost is the bit error rate after the forward error correction (FEC). ///< BerPost is the bit error rate after the forward error correction (FEC).
///< Per is the block error rate after the forward error correction (FEC). ///< Per is the block error rate after the forward error correction (FEC).
///< Status is the masked frontend status (signal/carrier/viterbi/sync/lock).
///< Typical range for BerPre, BerPost and Per is 0...1. ///< Typical range for BerPre, BerPost and Per is 0...1.
///< If any of the given pointers is not NULL, the value of the respective signal ///< If any of the given pointers is not NULL, the value of the respective signal
///< statistic is returned in it. Upon return, Valid holds a combination of ///< statistic is returned in it. Upon return, Valid holds a combination of

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: dvbdevice.c 4.12 2017/05/09 09:44:10 kls Exp $ * $Id: dvbdevice.c 4.13 2017/05/09 11:50:38 kls Exp $
*/ */
#include "dvbdevice.h" #include "dvbdevice.h"
@ -349,7 +349,7 @@ public:
void SetChannel(const cChannel *Channel); void SetChannel(const cChannel *Channel);
bool Locked(int TimeoutMs = 0); bool Locked(int TimeoutMs = 0);
const cPositioner *Positioner(void) const { return positioner; } const cPositioner *Positioner(void) const { return positioner; }
bool GetSignalStats(int &Valid, double *Strength = NULL, double *Cnr = NULL, double *BerPre = NULL, double *BerPost = NULL, double *Per = NULL) const; bool GetSignalStats(int &Valid, double *Strength = NULL, double *Cnr = NULL, double *BerPre = NULL, double *BerPost = NULL, double *Per = NULL, int *Status = NULL) const;
int GetSignalStrength(void) const; int GetSignalStrength(void) const;
int GetSignalQuality(void) const; int GetSignalQuality(void) const;
}; };
@ -574,14 +574,29 @@ bool cDvbTuner::GetFrontendStatus(fe_status_t &Status) const
}\ }\
} }
bool cDvbTuner::GetSignalStats(int &Valid, double *Strength, double *Cnr, double *BerPre, double *BerPost, double *Per) const bool cDvbTuner::GetSignalStats(int &Valid, double *Strength, double *Cnr, double *BerPre, double *BerPost, double *Per, int *Status) const
{ {
ClearEventQueue(); ClearEventQueue();
fe_status_t FeStatus;
dtv_property Props[MAXFRONTENDCMDS]; dtv_property Props[MAXFRONTENDCMDS];
dtv_properties CmdSeq; dtv_properties CmdSeq;
memset(&Props, 0, sizeof(Props)); memset(&Props, 0, sizeof(Props));
memset(&CmdSeq, 0, sizeof(CmdSeq)); memset(&CmdSeq, 0, sizeof(CmdSeq));
CmdSeq.props = Props; CmdSeq.props = Props;
Valid = DTV_STAT_VALID_NONE;
if (ioctl(fd_frontend, FE_READ_STATUS, &FeStatus) != 0) {
esyslog("ERROR: frontend %d/%d: %m", adapter, frontend);
return false;
}
if (Status) {
*Status = DTV_STAT_HAS_NONE;
if (FeStatus & FE_HAS_SIGNAL) *Status |= DTV_STAT_HAS_SIGNAL;
if (FeStatus & FE_HAS_CARRIER) *Status |= DTV_STAT_HAS_CARRIER;
if (FeStatus & FE_HAS_VITERBI) *Status |= DTV_STAT_HAS_VITERBI;
if (FeStatus & FE_HAS_SYNC) *Status |= DTV_STAT_HAS_SYNC;
if (FeStatus & FE_HAS_LOCK) *Status |= DTV_STAT_HAS_LOCK;
Valid |= DTV_STAT_VALID_STATUS;
}
if (Strength) SETCMD(DTV_STAT_SIGNAL_STRENGTH, 0); if (Strength) SETCMD(DTV_STAT_SIGNAL_STRENGTH, 0);
if (Cnr) SETCMD(DTV_STAT_CNR, 0); if (Cnr) SETCMD(DTV_STAT_CNR, 0);
if (BerPre) { SETCMD(DTV_STAT_PRE_ERROR_BIT_COUNT, 0); if (BerPre) { SETCMD(DTV_STAT_PRE_ERROR_BIT_COUNT, 0);
@ -594,7 +609,6 @@ bool cDvbTuner::GetSignalStats(int &Valid, double *Strength, double *Cnr, double
esyslog("ERROR: frontend %d/%d: %m", adapter, frontend); esyslog("ERROR: frontend %d/%d: %m", adapter, frontend);
return false; return false;
} }
Valid = DTV_STAT_VALID_NONE;
int i = 0; int i = 0;
if (Strength) { if (Strength) {
if (Props[i].u.st.len > 0) { if (Props[i].u.st.len > 0) {
@ -659,6 +673,7 @@ bool cDvbTuner::GetSignalStats(int &Valid, double *Strength, double *Cnr, double
} }
#ifdef DEBUG_SIGNALSTATS #ifdef DEBUG_SIGNALSTATS
fprintf(stderr, "FE %d/%d: API5 %04X", adapter, frontend, Valid); fprintf(stderr, "FE %d/%d: API5 %04X", adapter, frontend, Valid);
if ((Valid & DTV_STAT_VALID_STATUS) != 0) fprintf(stderr, " STAT=%04X", *Status);
if ((Valid & DTV_STAT_VALID_STRENGTH) != 0) fprintf(stderr, " STR=%1.1fdBm", *Strength); if ((Valid & DTV_STAT_VALID_STRENGTH) != 0) fprintf(stderr, " STR=%1.1fdBm", *Strength);
if ((Valid & DTV_STAT_VALID_CNR) != 0) fprintf(stderr, " CNR=%1.1fdB", *Cnr); if ((Valid & DTV_STAT_VALID_CNR) != 0) fprintf(stderr, " CNR=%1.1fdB", *Cnr);
if ((Valid & DTV_STAT_VALID_BERPRE) != 0) fprintf(stderr, " BERPRE=%1.1e", *BerPre); if ((Valid & DTV_STAT_VALID_BERPRE) != 0) fprintf(stderr, " BERPRE=%1.1e", *BerPre);
@ -1841,9 +1856,9 @@ const cPositioner *cDvbDevice::Positioner(void) const
return dvbTuner ? dvbTuner->Positioner() : NULL; return dvbTuner ? dvbTuner->Positioner() : NULL;
} }
bool cDvbDevice::SignalStats(int &Valid, double *Strength, double *Cnr, double *BerPre, double *BerPost, double *Per) const bool cDvbDevice::SignalStats(int &Valid, double *Strength, double *Cnr, double *BerPre, double *BerPost, double *Per, int *Status) const
{ {
return dvbTuner ? dvbTuner->GetSignalStats(Valid, Strength, Cnr, BerPre, BerPost, Per) : false; return dvbTuner ? dvbTuner->GetSignalStats(Valid, Strength, Cnr, BerPre, BerPost, Per, Status) : false;
} }
int cDvbDevice::SignalStrength(void) const int cDvbDevice::SignalStrength(void) const

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: dvbdevice.h 4.3 2017/04/17 14:44:43 kls Exp $ * $Id: dvbdevice.h 4.4 2017/05/09 11:24:47 kls Exp $
*/ */
#ifndef __DVBDEVICE_H #ifndef __DVBDEVICE_H
@ -244,7 +244,7 @@ public:
virtual bool ProvidesEIT(void) const; virtual bool ProvidesEIT(void) const;
virtual int NumProvidedSystems(void) const; virtual int NumProvidedSystems(void) const;
virtual const cPositioner *Positioner(void) const; virtual const cPositioner *Positioner(void) const;
virtual bool SignalStats(int &Valid, double *Strength = NULL, double *Cnr = NULL, double *BerPre = NULL, double *BerPost = NULL, double *Per = NULL) const; virtual bool SignalStats(int &Valid, double *Strength = NULL, double *Cnr = NULL, double *BerPre = NULL, double *BerPost = NULL, double *Per = NULL, int *Status = NULL) const;
virtual int SignalStrength(void) const; virtual int SignalStrength(void) const;
virtual int SignalQuality(void) const; virtual int SignalQuality(void) const;
virtual const cChannel *GetCurrentlyTunedTransponder(void) const; virtual const cChannel *GetCurrentlyTunedTransponder(void) const;