Implemented power save mode for cDvbDevice

This commit is contained in:
Klaus Schmidinger 2024-07-08 09:34:33 +02:00
parent e7ea087a6e
commit f3972e4795
4 changed files with 47 additions and 3 deletions

View File

@ -2572,6 +2572,7 @@ Markus Ehrnsperger <markus.ehrnsperger@googlemail.com>
for making a device always being kept occupied if a timer is in VPS margin or needs the for making a device always being kept occupied if a timer is in VPS margin or needs the
transponder transponder
for suggesting to enable unused devices to be put into a power save mode for suggesting to enable unused devices to be put into a power save mode
for a patch that was used to implement power save mode for cDvbDevice
Werner Färber <w.faerber@gmx.de> Werner Färber <w.faerber@gmx.de>
for reporting a bug in handling the cPluginManager::Active() result when pressing for reporting a bug in handling the cPluginManager::Active() result when pressing

View File

@ -9919,7 +9919,7 @@ Video Disk Recorder Revision History
- A device is now always kept occupied if a timer is in VPS margin or needs the - A device is now always kept occupied if a timer is in VPS margin or needs the
transponder (thanks to Markus Ehrnsperger). transponder (thanks to Markus Ehrnsperger).
2024-07-06: 2024-07-08:
- Updated the Italian OSD texts (thanks to Diego Pierotto). - Updated the Italian OSD texts (thanks to Diego Pierotto).
- Fixed a possible access of a deleted object in the EIT scanner. - Fixed a possible access of a deleted object in the EIT scanner.
@ -9935,3 +9935,5 @@ Video Disk Recorder Revision History
- Unused devices can now be put into a power save mode (suggested by Markus - Unused devices can now be put into a power save mode (suggested by Markus
Ehrnsperger). Device plugins need to implement the new function Ehrnsperger). Device plugins need to implement the new function
cDevice::SetPowerSaveMode() to make this work. cDevice::SetPowerSaveMode() to make this work.
- Implemented power save mode for cDvbDevice (based on a patch from Markus
Ehrnsperger).

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 5.3 2022/12/05 14:04:10 kls Exp $ * $Id: dvbdevice.c 5.4 2024/07/08 09:34:33 kls Exp $
*/ */
#include "dvbdevice.h" #include "dvbdevice.h"
@ -593,6 +593,7 @@ public:
bool GetSignalStats(int &Valid, double *Strength = NULL, double *Cnr = NULL, double *BerPre = NULL, double *BerPost = NULL, double *Per = NULL, int *Status = 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;
void SetPowerSaveMode(bool On);
}; };
cMutex cDvbTuner::bondMutex; cMutex cDvbTuner::bondMutex;
@ -859,6 +860,8 @@ void cDvbTuner::ClearEventQueue(void) const
bool cDvbTuner::GetFrontendStatus(fe_status_t &Status) const bool cDvbTuner::GetFrontendStatus(fe_status_t &Status) const
{ {
if (fd_frontend == -1)
return false;
ClearEventQueue(); ClearEventQueue();
Status = (fe_status_t)0; // initialize here to fix buggy drivers Status = (fe_status_t)0; // initialize here to fix buggy drivers
while (1) { while (1) {
@ -876,6 +879,8 @@ bool cDvbTuner::GetFrontendStatus(fe_status_t &Status) const
bool cDvbTuner::GetSignalStats(int &Valid, double *Strength, double *Cnr, double *BerPre, double *BerPost, double *Per, int *Status) const bool cDvbTuner::GetSignalStats(int &Valid, double *Strength, double *Cnr, double *BerPre, double *BerPost, double *Per, int *Status) const
{ {
if (fd_frontend == -1)
return false;
ClearEventQueue(); ClearEventQueue();
fe_status_t FeStatus = (fe_status_t)0; // initialize here to fix buggy drivers fe_status_t FeStatus = (fe_status_t)0; // initialize here to fix buggy drivers
dtv_property Props[MAXFRONTENDCMDS]; dtv_property Props[MAXFRONTENDCMDS];
@ -1226,6 +1231,8 @@ int SignalToSQI(const cChannel *Channel, int Signal, int Ber, int FeModulation,
int cDvbTuner::GetSignalStrength(void) const int cDvbTuner::GetSignalStrength(void) const
{ {
if (fd_frontend == -1)
return 0;
ClearEventQueue(); ClearEventQueue();
// Try DVB API 5: // Try DVB API 5:
for (int i = 0; i < 1; i++) { // just a trick to break out with 'continue' ;-) for (int i = 0; i < 1; i++) { // just a trick to break out with 'continue' ;-)
@ -1291,6 +1298,8 @@ int cDvbTuner::GetSignalStrength(void) const
int cDvbTuner::GetSignalQuality(void) const int cDvbTuner::GetSignalQuality(void) const
{ {
if (fd_frontend == -1)
return 0;
// Try DVB API 5: // Try DVB API 5:
for (int i = 0; i < 1; i++) { // just a trick to break out with 'continue' ;-) for (int i = 0; i < 1; i++) { // just a trick to break out with 'continue' ;-)
dtv_property Props[MAXFRONTENDCMDS]; dtv_property Props[MAXFRONTENDCMDS];
@ -1536,6 +1545,8 @@ void cDvbTuner::ExecuteDiseqc(const cDiseqc *Diseqc, int *Frequency)
void cDvbTuner::ResetToneAndVoltage(void) void cDvbTuner::ResetToneAndVoltage(void)
{ {
if (fd_frontend == -1)
return;
CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, bondedTuner ? SEC_VOLTAGE_OFF : SEC_VOLTAGE_13)); CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, bondedTuner ? SEC_VOLTAGE_OFF : SEC_VOLTAGE_13));
CHECK(ioctl(fd_frontend, FE_SET_TONE, SEC_TONE_OFF)); CHECK(ioctl(fd_frontend, FE_SET_TONE, SEC_TONE_OFF));
} }
@ -1768,6 +1779,30 @@ void cDvbTuner::Action(void)
} }
} }
void cDvbTuner::SetPowerSaveMode(bool On)
{
cMutexLock MutexLock(&mutex);
if (On) {
if (fd_frontend != -1) {
dsyslog("closing frontend %d/%d", adapter, frontend);
tunerStatus = tsIdle;
dvbFrontend->Close();
fd_frontend = -1;
channel = cChannel();
}
}
else {
if (fd_frontend == -1) {
dsyslog("opening frontend %d/%d", adapter, frontend);
fd_frontend = dvbFrontend->Open();
lastUncValue = 0;
lastUncDelta = 0;
lastUncChange = 0;
lnbPowerTurnedOn = false;
}
}
}
// --- cDvbSourceParam ------------------------------------------------------- // --- cDvbSourceParam -------------------------------------------------------
class cDvbSourceParam : public cSourceParam { class cDvbSourceParam : public cSourceParam {
@ -2300,6 +2335,11 @@ bool cDvbDevice::MaySwitchTransponder(const cChannel *Channel) const
return BondingOk(Channel, true) && cDevice::MaySwitchTransponder(Channel); return BondingOk(Channel, true) && cDevice::MaySwitchTransponder(Channel);
} }
void cDvbDevice::SetPowerSaveMode(bool On)
{
dvbTuner->SetPowerSaveMode(On);
}
bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView) bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
{ {
if (dvbTuner->ProvidesFrontend(Channel, true)) { if (dvbTuner->ProvidesFrontend(Channel, true)) {

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.7 2020/06/27 10:24:46 kls Exp $ * $Id: dvbdevice.h 5.1 2024/07/08 09:34:33 kls Exp $
*/ */
#ifndef __DVBDEVICE_H #ifndef __DVBDEVICE_H
@ -244,6 +244,7 @@ public:
virtual const cChannel *GetCurrentlyTunedTransponder(void) const; virtual const cChannel *GetCurrentlyTunedTransponder(void) const;
virtual bool IsTunedToTransponder(const cChannel *Channel) const; virtual bool IsTunedToTransponder(const cChannel *Channel) const;
virtual bool MaySwitchTransponder(const cChannel *Channel) const; virtual bool MaySwitchTransponder(const cChannel *Channel) const;
virtual void SetPowerSaveMode(bool On);
protected: protected:
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView); virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
public: public: