From d068b3d4be849b301cd8e0b481080628289c897b Mon Sep 17 00:00:00 2001 From: Lars Op den Kamp Date: Tue, 14 Feb 2012 02:14:50 +0100 Subject: [PATCH] cec: add an option to wake multiple devices via the initial configuration --- include/cectypes.h | 32 +++++++++++++++++--------------- src/lib/CECProcessor.cpp | 10 +++++++++- src/lib/CECProcessor.h | 1 + 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/include/cectypes.h b/include/cectypes.h index 0a0270f..1adf2fd 100644 --- a/include/cectypes.h +++ b/include/cectypes.h @@ -918,24 +918,25 @@ typedef enum cec_client_version typedef struct libcec_configuration { - char strDeviceName[13]; /*!< how to name the device on the CEC bus */ - cec_device_type_list deviceTypes; /*!< the CEC device types to emulate */ - uint16_t iPhysicalAddress; /*!< the physical address of the CEC adapter */ - cec_logical_address baseDevice; /*!< the logical address of the device to which the adapter is connected. only used when iPhysicalAddress = 0 */ - uint8_t iHDMIPort; /*!< the HDMI port to which the adapter is connected. only used when iPhysicalAddress = 0 */ - cec_vendor_id tvVendor; /*!< the vendor ID of the TV. leave this untouched to autodetect */ - cec_client_version clientVersion; /*!< the version of the client that is connecting */ + char strDeviceName[13]; /*!< how to name the device on the CEC bus */ + cec_device_type_list deviceTypes; /*!< the CEC device types to emulate */ + uint16_t iPhysicalAddress; /*!< the physical address of the CEC adapter */ + cec_logical_address baseDevice; /*!< the logical address of the device to which the adapter is connected. only used when iPhysicalAddress = 0 */ + uint8_t iHDMIPort; /*!< the HDMI port to which the adapter is connected. only used when iPhysicalAddress = 0 */ + cec_vendor_id tvVendor; /*!< the vendor ID of the TV. leave this untouched to autodetect */ + cec_client_version clientVersion; /*!< the version of the client that is connecting */ + cec_logical_addresses wakeDevices; /*!< wake these CEC devices when starting libCEC */ // player specific settings - uint8_t bGetSettingsFromROM; /*!< true to get the settings from the ROM (if set, and a v2 ROM is present), false to use these settings. */ - uint8_t bUseTVMenuLanguage; /*!< use the menu language of the TV in the player application */ - uint8_t bPowerOnStartup; /*!< power on CEC devices when start the player application */ - uint8_t bPowerOffShutdown; /*!< power off CEC devices when stopping the player application */ - uint8_t bPowerOffScreensaver; /*!< put devices in standby mode when activating the screensaver */ - uint8_t bPowerOffOnStandby; /*!< put this PC in standby mode when the TV is switched off */ + uint8_t bGetSettingsFromROM; /*!< true to get the settings from the ROM (if set, and a v2 ROM is present), false to use these settings. */ + uint8_t bUseTVMenuLanguage; /*!< use the menu language of the TV in the player application */ + uint8_t bPowerOnStartup; /*!< power on CEC devices when start the player application */ + uint8_t bPowerOffShutdown; /*!< power off CEC devices when stopping the player application */ + uint8_t bPowerOffScreensaver; /*!< put devices in standby mode when activating the screensaver */ + uint8_t bPowerOffOnStandby; /*!< put this PC in standby mode when the TV is switched off */ - void * callbackParam; /*!< the object to pass along with a call of the callback methods. NULL to ignore */ - ICECCallbacks * callbacks; /*!< the callback methods to use. set this to NULL when not using callbacks */ + void * callbackParam; /*!< the object to pass along with a call of the callback methods. NULL to ignore */ + ICECCallbacks * callbacks; /*!< the callback methods to use. set this to NULL when not using callbacks */ #ifdef __cplusplus void Clear(void) @@ -947,6 +948,7 @@ typedef struct libcec_configuration iHDMIPort = CEC_DEFAULT_HDMI_PORT; tvVendor = CEC_VENDOR_UNKNOWN; clientVersion = CEC_CLIENT_VERSION_PRE_1_5; + wakeDevices.Clear(); bGetSettingsFromROM = 0; bUseTVMenuLanguage = CEC_DEFAULT_SETTING_USE_TV_MENU_LANGUAGE; diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index f4e485a..0ec1ef7 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -60,7 +60,8 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, const libcec_configuration *co m_iStandardLineTimeout(3), m_iRetryLineTimeout(3), m_iLastTransmission(0), - m_clientVersion(configuration->clientVersion) + m_clientVersion(configuration->clientVersion), + m_wakeDevices(configuration->wakeDevices) { m_logicalAddresses.Clear(); CreateBusDevices(); @@ -86,6 +87,7 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, const char *strDeviceName, con m_iLastTransmission(0), m_clientVersion(clientVersion) { + m_wakeDevices.Clear(); m_logicalAddresses.Clear(); CreateBusDevices(); } @@ -227,6 +229,12 @@ bool CCECProcessor::Initialise(void) else if (m_iPhysicalAddress == 0 && (bReturn = SetHDMIPort(m_iBaseDevice, m_iHDMIPort, true)) == false) CLibCEC::AddLog(CEC_LOG_ERROR, "unable to set HDMI port %d on %s (%x)", m_iHDMIPort, ToString(m_iBaseDevice), (uint8_t)m_iBaseDevice); + for (uint8_t iPtr = 0; iPtr <= 0xF; iPtr++) + { + if (m_wakeDevices[iPtr]) + m_busDevices[iPtr]->PowerOn(); + } + SetInitialised(bReturn); return bReturn; diff --git a/src/lib/CECProcessor.h b/src/lib/CECProcessor.h index 5d0cfa2..3aa8f25 100644 --- a/src/lib/CECProcessor.h +++ b/src/lib/CECProcessor.h @@ -171,6 +171,7 @@ namespace CEC uint8_t m_iRetryLineTimeout; uint64_t m_iLastTransmission; cec_client_version m_clientVersion; + cec_logical_addresses m_wakeDevices; }; class CCECBusScan : public PLATFORM::CThread -- 2.34.1