From 3faa971cecb5f713c611ba787b6b0a0486ecbd86 Mon Sep 17 00:00:00 2001 From: Lars Op den Kamp Date: Mon, 13 Feb 2012 10:28:14 +0100 Subject: [PATCH] cec: only let SL bug out when the power state is requested twice in 5 seconds. don't allow to send active source message when SL isn't initialised --- src/lib/implementations/SLCommandHandler.cpp | 36 ++++++++++++++------ src/lib/implementations/SLCommandHandler.h | 8 +++-- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/lib/implementations/SLCommandHandler.cpp b/src/lib/implementations/SLCommandHandler.cpp index 5a76d28..f1e3d7e 100644 --- a/src/lib/implementations/SLCommandHandler.cpp +++ b/src/lib/implementations/SLCommandHandler.cpp @@ -88,8 +88,11 @@ bool CSLCommandHandler::InitHandler(void) bool CSLCommandHandler::ActivateSource(void) { + if (!m_bSLEnabled) + return true; + if (m_bActiveSourceSent) - return false; + return true; m_bActiveSourceSent = true; CCECBusDevice *primary = m_processor->GetPrimaryDevice(); @@ -265,18 +268,29 @@ bool CSLCommandHandler::HandleGiveDevicePowerStatus(const cec_command &command) bReturn = device->TransmitPowerState(command.initiator); device->SetPowerStatus(CEC_POWER_STATUS_ON); } - else if (!ActivateSource()) - { - /* assume that we've bugged out */ - CLibCEC::AddLog(CEC_LOG_NOTICE, "LG seems to have bugged out. resetting to 'in transition standby to on'"); - m_bActiveSourceSent = false; - device->SetPowerStatus(CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON); - bReturn = device->TransmitPowerState(command.initiator); - device->SetPowerStatus(CEC_POWER_STATUS_ON); - } else { - bReturn = true; + if (!m_bActiveSourceSent) + { + device->SetPowerStatus(CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON); + bReturn = device->TransmitPowerState(command.initiator); + ActivateSource(); + } + else if (m_resetPowerState.IsSet() && m_resetPowerState.TimeLeft() > 0) + { + /* assume that we've bugged out */ + CLibCEC::AddLog(CEC_LOG_NOTICE, "LG seems to have bugged out. resetting to 'in transition standby to on'"); + m_bActiveSourceSent = false; + device->SetPowerStatus(CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON); + bReturn = device->TransmitPowerState(command.initiator); + device->SetPowerStatus(CEC_POWER_STATUS_ON); + m_resetPowerState.Init(5000); + } + else + { + bReturn = device->TransmitPowerState(command.initiator); + m_resetPowerState.Init(5000); + } } } diff --git a/src/lib/implementations/SLCommandHandler.h b/src/lib/implementations/SLCommandHandler.h index 8012f2e..9140835 100644 --- a/src/lib/implementations/SLCommandHandler.h +++ b/src/lib/implementations/SLCommandHandler.h @@ -32,6 +32,7 @@ */ #include "CECCommandHandler.h" +#include "../platform/util/timeutils.h" namespace CEC { @@ -65,8 +66,9 @@ namespace CEC virtual bool HandleFeatureAbort(const cec_command &command); virtual bool HandleStandby(const cec_command &command); - bool m_bSLEnabled; - bool m_bPowerStateReset; - bool m_bActiveSourceSent; + bool m_bSLEnabled; + bool m_bPowerStateReset; + bool m_bActiveSourceSent; + PLATFORM::CTimeout m_resetPowerState; }; }; -- 2.34.1