From ecc633c51b6c69bebaff4932e90245665ca06373 Mon Sep 17 00:00:00 2001 From: Lars Op den Kamp Date: Wed, 14 Nov 2012 01:45:39 +0100 Subject: [PATCH] added handler for philips. ignore repeating 'display information' keypresses from the tv, cause it keeps spamming this until another button is pressed --- project/libcec.vcxproj | 2 + project/libcec.vcxproj.filters | 6 ++ src/lib/Makefile.am | 3 +- src/lib/devices/CECBusDevice.cpp | 4 + src/lib/implementations/CECCommandHandler.cpp | 2 +- src/lib/implementations/CECCommandHandler.h | 2 +- src/lib/implementations/PHCommandHandler.cpp | 74 +++++++++++++++++++ src/lib/implementations/PHCommandHandler.h | 53 +++++++++++++ 8 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 src/lib/implementations/PHCommandHandler.cpp create mode 100644 src/lib/implementations/PHCommandHandler.h diff --git a/project/libcec.vcxproj b/project/libcec.vcxproj index fca9635..271d0df 100644 --- a/project/libcec.vcxproj +++ b/project/libcec.vcxproj @@ -43,6 +43,7 @@ + @@ -87,6 +88,7 @@ + diff --git a/project/libcec.vcxproj.filters b/project/libcec.vcxproj.filters index e867399..f966a2b 100644 --- a/project/libcec.vcxproj.filters +++ b/project/libcec.vcxproj.filters @@ -128,6 +128,9 @@ implementations + + implementations + @@ -221,6 +224,9 @@ implementations + + implementations + devices diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index ab00f1b..35166f2 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -25,7 +25,8 @@ libcec_la_SOURCES = CECProcessor.cpp \ implementations/CECCommandHandler.cpp \ implementations/SLCommandHandler.cpp \ implementations/VLCommandHandler.cpp \ - implementations/RLCommandHandler.cpp + implementations/RLCommandHandler.cpp \ + implementations/PHCommandHandler.cpp ## server sockets, currently unused ##libcec_la_SOURCES += platform/posix/serversocket.cpp diff --git a/src/lib/devices/CECBusDevice.cpp b/src/lib/devices/CECBusDevice.cpp index 0bd6dab..d50045a 100644 --- a/src/lib/devices/CECBusDevice.cpp +++ b/src/lib/devices/CECBusDevice.cpp @@ -39,6 +39,7 @@ #include "lib/implementations/CECCommandHandler.h" #include "lib/implementations/SLCommandHandler.h" #include "lib/implementations/VLCommandHandler.h" +#include "lib/implementations/PHCommandHandler.h" #include "lib/LibCEC.h" #include "lib/CECTypeUtils.h" #include "lib/platform/util/timeutils.h" @@ -132,6 +133,9 @@ bool CCECBusDevice::ReplaceHandler(bool bActivateSource /* = true */) case CEC_VENDOR_PANASONIC: m_handler = new CVLCommandHandler(this, iTransmitTimeout, iTransmitWait, iTransmitRetries, iActiveSourcePending); break; + case CEC_VENDOR_PHILIPS: + m_handler = new CPHCommandHandler(this, iTransmitTimeout, iTransmitWait, iTransmitRetries, iActiveSourcePending); + break; default: m_handler = new CCECCommandHandler(this, iTransmitTimeout, iTransmitWait, iTransmitRetries, iActiveSourcePending); break; diff --git a/src/lib/implementations/CECCommandHandler.cpp b/src/lib/implementations/CECCommandHandler.cpp index d1af939..ad24887 100644 --- a/src/lib/implementations/CECCommandHandler.cpp +++ b/src/lib/implementations/CECCommandHandler.cpp @@ -705,7 +705,7 @@ int CCECCommandHandler::HandleUserControlPressed(const cec_command &command) { // we're not marked as active source, but the tv sends keypresses to us, so assume it forgot to activate us if (!device->IsActiveSource() && command.initiator == CECDEVICE_TV) - device->ActivateSource(); + device->MarkAsActiveSource(); } return COMMAND_HANDLED; diff --git a/src/lib/implementations/CECCommandHandler.h b/src/lib/implementations/CECCommandHandler.h index b09f9b3..7ea5485 100644 --- a/src/lib/implementations/CECCommandHandler.h +++ b/src/lib/implementations/CECCommandHandler.h @@ -57,7 +57,7 @@ namespace CEC virtual bool HandleCommand(const cec_command &command); virtual cec_vendor_id GetVendorId(void) { return m_vendorId; }; virtual void SetVendorId(cec_vendor_id vendorId) { m_vendorId = vendorId; } - static bool HasSpecificHandler(cec_vendor_id vendorId) { return vendorId == CEC_VENDOR_LG || vendorId == CEC_VENDOR_SAMSUNG || vendorId == CEC_VENDOR_PANASONIC;} + static bool HasSpecificHandler(cec_vendor_id vendorId) { return vendorId == CEC_VENDOR_LG || vendorId == CEC_VENDOR_SAMSUNG || vendorId == CEC_VENDOR_PANASONIC || vendorId == CEC_VENDOR_PHILIPS;} virtual bool InitHandler(void) { return true; } virtual bool ActivateSource(bool bTransmitDelayedCommandsOnly = false); diff --git a/src/lib/implementations/PHCommandHandler.cpp b/src/lib/implementations/PHCommandHandler.cpp new file mode 100644 index 0000000..f8505c7 --- /dev/null +++ b/src/lib/implementations/PHCommandHandler.cpp @@ -0,0 +1,74 @@ +/* + * This file is part of the libCEC(R) library. + * + * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved. + * libCEC(R) is an original work, containing original code. + * + * libCEC(R) is a trademark of Pulse-Eight Limited. + * + * This program is dual-licensed; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * Alternatively, you can license this library under a commercial license, + * please contact Pulse-Eight Licensing for more information. + * + * For more information contact: + * Pulse-Eight Licensing + * http://www.pulse-eight.com/ + * http://www.pulse-eight.net/ + */ + +#include "env.h" +#include "PHCommandHandler.h" + +#include "lib/devices/CECBusDevice.h" +#include "lib/CECProcessor.h" +#include "lib/LibCEC.h" +#include "lib/CECClient.h" + +using namespace CEC; + +#define LIB_CEC m_busDevice->GetProcessor()->GetLib() +#define ToString(p) LIB_CEC->ToString(p) + +CPHCommandHandler::CPHCommandHandler(CCECBusDevice *busDevice, + int32_t iTransmitTimeout /* = CEC_DEFAULT_TRANSMIT_TIMEOUT */, + int32_t iTransmitWait /* = CEC_DEFAULT_TRANSMIT_WAIT */, + int8_t iTransmitRetries /* = CEC_DEFAULT_TRANSMIT_RETRIES */, + int64_t iActiveSourcePending /* = 0 */) : + CCECCommandHandler(busDevice, iTransmitTimeout, iTransmitWait, iTransmitRetries, iActiveSourcePending), + m_iLastKeyCode(CEC_USER_CONTROL_CODE_UNKNOWN) +{ + m_vendorId = CEC_VENDOR_PHILIPS; +} + +int CPHCommandHandler::HandleUserControlPressed(const cec_command& command) +{ + // tv keeps sending these until a button is pressed + if (command.parameters[0] == CEC_USER_CONTROL_CODE_DISPLAY_INFORMATION && + m_iLastKeyCode == CEC_USER_CONTROL_CODE_DISPLAY_INFORMATION) + return COMMAND_HANDLED; + + m_iLastKeyCode = command.parameters[0]; + + return CCECCommandHandler::HandleUserControlPressed(command); +} + +int CPHCommandHandler::HandleUserControlRelease(const cec_command& command) +{ + m_iLastKeyCode = CEC_USER_CONTROL_CODE_UNKNOWN; + + return CCECCommandHandler::HandleUserControlRelease(command); +} diff --git a/src/lib/implementations/PHCommandHandler.h b/src/lib/implementations/PHCommandHandler.h new file mode 100644 index 0000000..85338b4 --- /dev/null +++ b/src/lib/implementations/PHCommandHandler.h @@ -0,0 +1,53 @@ +#pragma once +/* + * This file is part of the libCEC(R) library. + * + * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved. + * libCEC(R) is an original work, containing original code. + * + * libCEC(R) is a trademark of Pulse-Eight Limited. + * + * This program is dual-licensed; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * Alternatively, you can license this library under a commercial license, + * please contact Pulse-Eight Licensing for more information. + * + * For more information contact: + * Pulse-Eight Licensing + * http://www.pulse-eight.com/ + * http://www.pulse-eight.net/ + */ + +#include "CECCommandHandler.h" + +namespace CEC +{ + class CPHCommandHandler : public CCECCommandHandler + { + public: + CPHCommandHandler(CCECBusDevice *busDevice, + int32_t iTransmitTimeout = CEC_DEFAULT_TRANSMIT_TIMEOUT, + int32_t iTransmitWait = CEC_DEFAULT_TRANSMIT_WAIT, + int8_t iTransmitRetries = CEC_DEFAULT_TRANSMIT_RETRIES, + int64_t iActiveSourcePending = 0); + virtual ~CPHCommandHandler(void) {}; + + protected: + virtual int HandleUserControlPressed(const cec_command& command); + virtual int HandleUserControlRelease(const cec_command& command); + uint8_t m_iLastKeyCode; + }; +}; -- 2.34.1