From 05c454f3563ed6a73a7269555b1d861c81d5bc50 Mon Sep 17 00:00:00 2001 From: Shraddha Basantwani Date: Fri, 18 Jun 2021 12:42:27 +0530 Subject: [PATCH] CEC: Add implementation of WAKEUP option to default HdmiCec When WAKEUP is set to false, HAL does not wake up the system upon receiving or messages. Bug: 185434120 Test: manual Change-Id: Iaf98020decc887f04b02da480adc70b76189b66d --- tv/cec/1.0/default/HdmiCecDefault.cpp | 32 +++++++++++++++++++++++++++ tv/cec/1.0/default/HdmiCecDefault.h | 2 ++ 2 files changed, 34 insertions(+) diff --git a/tv/cec/1.0/default/HdmiCecDefault.cpp b/tv/cec/1.0/default/HdmiCecDefault.cpp index 8ce4d11178..299bcf0c06 100644 --- a/tv/cec/1.0/default/HdmiCecDefault.cpp +++ b/tv/cec/1.0/default/HdmiCecDefault.cpp @@ -38,6 +38,11 @@ namespace implementation { // When set to false, all the CEC commands are discarded. True by default after initialization. bool mCecEnabled; +/* + * When set to false, HAL does not wake up the system upon receiving or + * . True by default after initialization. + */ +bool mWakeupEnabled; int mCecFd; int mExitFd; @@ -48,6 +53,7 @@ HdmiCecDefault::HdmiCecDefault() { mCecFd = -1; mExitFd = -1; mCecEnabled = false; + mWakeupEnabled = false; mCallback = nullptr; } @@ -244,6 +250,10 @@ Return HdmiCecDefault::setOption(OptionKey key, bool value) { LOG(DEBUG) << "setOption: Enable CEC: " << value; mCecEnabled = value; break; + case OptionKey::WAKEUP: + LOG(DEBUG) << "setOption: WAKEUP: " << value; + mWakeupEnabled = value; + break; default: break; } @@ -317,6 +327,7 @@ Return HdmiCecDefault::init() { } mCecEnabled = true; + mWakeupEnabled = true; return Result::SUCCESS; } @@ -333,6 +344,7 @@ Return HdmiCecDefault::release() { close(mCecFd); } mCecEnabled = false; + mWakeupEnabled = false; setCallback(nullptr); return Void(); } @@ -402,6 +414,11 @@ void* HdmiCecDefault::event_thread(void*) { continue; } + if (!mWakeupEnabled && isWakeupMessage(msg)) { + LOG(DEBUG) << "Filter wakeup message"; + continue; + } + if (mCallback != nullptr) { size_t length = std::min(msg.len - 1, (uint32_t)MaxLength::MESSAGE_BODY); CecMessage cecMessage{ @@ -421,6 +438,21 @@ void* HdmiCecDefault::event_thread(void*) { return NULL; } +int HdmiCecDefault::getOpcode(struct cec_msg message) { + return (static_cast(message.msg[1]) & 0xff); +} + +bool HdmiCecDefault::isWakeupMessage(struct cec_msg message) { + int opcode = getOpcode(message); + switch (opcode) { + case CEC_MESSAGE_TEXT_VIEW_ON: + case CEC_MESSAGE_IMAGE_VIEW_ON: + return true; + default: + return false; + } +} + } // namespace implementation } // namespace V1_0 } // namespace cec diff --git a/tv/cec/1.0/default/HdmiCecDefault.h b/tv/cec/1.0/default/HdmiCecDefault.h index c3682f7ea2..c1bb2c74d0 100644 --- a/tv/cec/1.0/default/HdmiCecDefault.h +++ b/tv/cec/1.0/default/HdmiCecDefault.h @@ -48,6 +48,8 @@ struct HdmiCecDefault : public IHdmiCec, public hidl_death_recipient { Return init(); Return release(); static void* event_thread(void*); + static int getOpcode(struct cec_msg message); + static bool isWakeupMessage(struct cec_msg message); }; } // namespace implementation