From 224ea8772f229d2d7dafcdbf64c4266c9b4de35e Mon Sep 17 00:00:00 2001 From: Lars Op den Kamp Date: Fri, 10 Feb 2012 01:57:17 +0100 Subject: [PATCH] cec: added CanPersistConfiguration()/cec_can_persist_configuration() and PersistConfiguration()/cec_persist_configuration() --- include/cec.h | 12 +++++ include/cecc.h | 7 +++ include/cectypes.h | 38 +++++++++++--- src/cec-config/cec-config.cpp | 53 +++++++++++++------- src/lib/CECProcessor.cpp | 10 ++++ src/lib/CECProcessor.h | 2 + src/lib/LibCEC.cpp | 12 ++++- src/lib/LibCEC.h | 2 + src/lib/LibCECC.cpp | 10 ++++ src/lib/adapter/AdapterCommunication.h | 7 +++ src/lib/adapter/USBCECAdapterCommunication.h | 1 + 11 files changed, 126 insertions(+), 28 deletions(-) diff --git a/include/cec.h b/include/cec.h index 35f41c9..82c0a60 100644 --- a/include/cec.h +++ b/include/cec.h @@ -376,6 +376,18 @@ namespace CEC */ virtual bool GetCurrentConfiguration(libcec_configuration *configuration) = 0; + /*! + * @return True when this device can persist the user configuration, false otherwise. + */ + virtual bool CanPersistConfiguration(void) = 0; + + /*! + * @brief Persist the given configuration in adapter (if supported) + * @brief The configuration to store. + * @return True when the configuration was persisted, false otherwise. + */ + virtual bool PersistConfiguration(libcec_configuration *configuration) = 0; + virtual const char *ToString(const cec_menu_state state) = 0; virtual const char *ToString(const cec_version version) = 0; virtual const char *ToString(const cec_power_status status) = 0; diff --git a/include/cecc.h b/include/cecc.h index d8cb791..33ac025 100644 --- a/include/cecc.h +++ b/include/cecc.h @@ -278,6 +278,13 @@ extern DECLSPEC int cec_get_current_configuration(CEC::libcec_configuration *con extern DECLSPEC int cec_get_current_configuration(libcec_configuration *configuration); #endif +extern DECLSPEC int cec_can_persist_configuration(void); + +#ifdef __cplusplus +extern DECLSPEC int persist_configuration(CEC::libcec_configuration *configuration); +#else +extern DECLSPEC int persist_configuration(libcec_configuration *configuration); +#endif #ifdef __cplusplus }; diff --git a/include/cectypes.h b/include/cectypes.h index 0158392..3501ce3 100644 --- a/include/cectypes.h +++ b/include/cectypes.h @@ -73,6 +73,12 @@ namespace CEC { #define CEC_POWER_STATE_REFRESH_TIME 30000 #define CEC_FW_VERSION_UNKNOWN 0xFFFF +#define CEC_DEFAULT_SETTING_USE_TV_MENU_LANGUAGE 1 +#define CEC_DEFAULT_SETTING_POWER_ON_STARTUP 1 +#define CEC_DEFAULT_SETTING_POWER_OFF_SHUTDOWN 1 +#define CEC_DEFAULT_SETTING_POWER_OFF_SCREENSAVER 1 +#define CEC_DEFAULT_SETTING_POWER_OFF_ON_STANDBY 1 + #define CEC_DEFAULT_TRANSMIT_RETRY_WAIT 500 #define CEC_DEFAULT_TRANSMIT_TIMEOUT 1000 #define CEC_DEFAULT_TRANSMIT_WAIT 2000 @@ -912,15 +918,23 @@ 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_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_client_version clientVersion; /*!< the version of the client that is connecting */ + + // 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 */ - 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) @@ -931,6 +945,14 @@ typedef struct libcec_configuration baseDevice = (cec_logical_address)CEC_DEFAULT_BASE_DEVICE; iHDMIPort = CEC_DEFAULT_HDMI_PORT; clientVersion = CEC_CLIENT_VERSION_PRE_1_5; + + bGetSettingsFromROM = 0; + bUseTVMenuLanguage = CEC_DEFAULT_SETTING_USE_TV_MENU_LANGUAGE; + bPowerOnStartup = CEC_DEFAULT_SETTING_POWER_ON_STARTUP; + bPowerOffShutdown = CEC_DEFAULT_SETTING_POWER_OFF_SHUTDOWN; + bPowerOffScreensaver = CEC_DEFAULT_SETTING_POWER_OFF_SCREENSAVER; + bPowerOffOnStandby = CEC_DEFAULT_SETTING_POWER_OFF_ON_STANDBY; + callbackParam = NULL; callbacks = NULL; } diff --git a/src/cec-config/cec-config.cpp b/src/cec-config/cec-config.cpp index 5d14547..1588482 100644 --- a/src/cec-config/cec-config.cpp +++ b/src/cec-config/cec-config.cpp @@ -305,24 +305,23 @@ uint16_t FindPhysicalAddress(void) return iAddress; } -bool PowerOnTV(uint64_t iTimeout = 60000, unsigned iTries = 2) +bool PowerOnTV(uint64_t iTimeout = 60000) { cec_power_status currentTvPower(CEC_POWER_STATUS_UNKNOWN); uint64_t iNow = GetTimeMs(); uint64_t iTarget = iNow + iTimeout; - unsigned iTry(0); - while (currentTvPower != CEC_POWER_STATUS_ON && iTarget > iNow && iTry < iTries) + if (currentTvPower != CEC_POWER_STATUS_ON) { currentTvPower = g_parser->GetDevicePowerStatus(CECDEVICE_TV); if (currentTvPower != CEC_POWER_STATUS_ON) { - PrintToStdOut("Sending 'power on' command to the TV"); + PrintToStdOut("Sending 'power on' command to the TV\n=== Please wait ==="); g_parser->PowerOnDevices(CECDEVICE_TV); while (iTarget > iNow) { CLockObject lock(g_responseMutex); - g_responseCondtion.Wait(g_responseMutex, (uint32_t)((iTarget - iNow)/iTries)); + g_responseCondtion.Wait(g_responseMutex, (uint32_t)(iTarget - iNow)); if (g_lastCommand == CEC_OPCODE_REQUEST_ACTIVE_SOURCE) break; iNow = GetTimeMs(); @@ -362,7 +361,6 @@ int main (int argc, char *argv[]) g_parser->GetCurrentConfiguration(&g_config); - bool bUseTVMenuLanguage(false); { cec_menu_language lang; if (g_parser->GetDeviceMenuLanguage(CECDEVICE_TV, &lang)) @@ -372,7 +370,7 @@ int main (int argc, char *argv[]) string input; getline(cin, input); cin.clear(); - bUseTVMenuLanguage = (input == "y" || input == "Y"); + g_config.bUseTVMenuLanguage = (input == "y" || input == "Y") ? 1 : 0; } else { @@ -380,50 +378,67 @@ int main (int argc, char *argv[]) } } - bool bPowerOnStartup(false); { PrintToStdOut("Do you want to power on CEC devices when starting the application (y/n)?"); string input; getline(cin, input); cin.clear(); - bPowerOnStartup = (input == "y" || input == "Y"); + g_config.bPowerOnStartup = (input == "y" || input == "Y") ? 1 : 0; } - bool bPowerOffShutdown(false); { PrintToStdOut("Do you want to power off CEC devices when closing the application (y/n)?"); string input; getline(cin, input); cin.clear(); - bPowerOffShutdown = (input == "y" || input == "Y"); + g_config.bPowerOffShutdown = (input == "y" || input == "Y") ? 1 : 0; } - bool bPowerOffScreensaver(false); { PrintToStdOut("Do you want to power off CEC devices when the screensaver is activated (y/n)?"); string input; getline(cin, input); cin.clear(); - bPowerOffScreensaver = (input == "y" || input == "Y"); + g_config.bPowerOffScreensaver = (input == "y" || input == "Y") ? 1 : 0; } - bool bPowerOffOnStandby(false); { PrintToStdOut("Do you want to put the PC in standby when the TV is put in standby mode (y/n)?"); string input; getline(cin, input); cin.clear(); - bPowerOffOnStandby = (input == "y" || input == "Y"); + g_config.bPowerOffOnStandby = (input == "y" || input == "Y"); } PrintToStdOut("\n\n=== USB-CEC Adapter Configuration Summary ==="); PrintToStdOut("HDMI port number: %d", g_config.iHDMIPort); PrintToStdOut("Connected to HDMI device: %X", (uint8_t)g_config.baseDevice); PrintToStdOut("Physical address: %4X", g_config.iPhysicalAddress); - PrintToStdOut("Use the TV's language setting: %s", bUseTVMenuLanguage ? "yes" : "no"); - PrintToStdOut("Power on the TV when starting XBMC: %s", bPowerOnStartup ? "yes" : "no"); - PrintToStdOut("Put devices in standby mode when activating screensaver: %s", bPowerOffScreensaver ? "yes" : "no"); - PrintToStdOut("Put this PC in standby mode when the TV is switched off: %s", bPowerOffOnStandby ? "yes" : "no"); + PrintToStdOut("Use the TV's language setting: %s", g_config.bUseTVMenuLanguage ? "yes" : "no"); + PrintToStdOut("Power on the TV when starting XBMC: %s", g_config.bPowerOnStartup ? "yes" : "no"); + PrintToStdOut("Power off devices when stopping XBMC: %s", g_config.bPowerOffShutdown ? "yes" : "no"); + PrintToStdOut("Put devices in standby mode when activating screensaver: %s", g_config.bPowerOffScreensaver ? "yes" : "no"); + PrintToStdOut("Put this PC in standby mode when the TV is switched off: %s\n\n", g_config.bPowerOffOnStandby ? "yes" : "no"); + + if (g_parser->CanPersistConfiguration()) + { + PrintToStdOut("Do you want to store these settings in the adapter (y/n)?"); + string input; + getline(cin, input); + cin.clear(); + if (input == "y" || input == "Y") + { + PrintToStdOut("Storing settings ..."); + if (g_parser->PersistConfiguration(&g_config)) + PrintToStdOut("Settings stored."); + else + PrintToStdOut("The settings could not be stored"); + } + } + else + { + PrintToStdOut("This adapter doesn't support settings persistence. Please set up these settings in your media player application."); + } g_parser->StandbyDevices(); g_parser->Close(); diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index 1e65550..2e34576 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -1379,3 +1379,13 @@ bool CCECProcessor::GetCurrentConfiguration(libcec_configuration *configuration) configuration->deviceTypes = m_types; return true; } + +bool CCECProcessor::CanPersistConfiguration(void) +{ + return m_communication->GetFirmwareVersion() >= 2; +} + +bool CCECProcessor::PersistConfiguration(libcec_configuration *configuration) +{ + return m_communication->PersistConfiguration(configuration); +} diff --git a/src/lib/CECProcessor.h b/src/lib/CECProcessor.h index 50d6bf2..5d0cfa2 100644 --- a/src/lib/CECProcessor.h +++ b/src/lib/CECProcessor.h @@ -101,6 +101,8 @@ namespace CEC void SetStandardLineTimeout(uint8_t iTimeout); void SetRetryLineTimeout(uint8_t iTimeout); virtual bool GetCurrentConfiguration(libcec_configuration *configuration); + virtual bool CanPersistConfiguration(void); + virtual bool PersistConfiguration(libcec_configuration *configuration); bool SetLineTimeout(uint8_t iTimeout); diff --git a/src/lib/LibCEC.cpp b/src/lib/LibCEC.cpp index fd85ea5..cdac0d0 100644 --- a/src/lib/LibCEC.cpp +++ b/src/lib/LibCEC.cpp @@ -544,4 +544,14 @@ const char *CLibCEC::ToString(const cec_client_version version) bool CLibCEC::GetCurrentConfiguration(libcec_configuration *configuration) { return m_cec->GetCurrentConfiguration(configuration); -} \ No newline at end of file +} + +bool CLibCEC::CanPersistConfiguration(void) +{ + return m_cec->CanPersistConfiguration(); +} + +bool CLibCEC::PersistConfiguration(libcec_configuration *configuration) +{ + return m_cec->PersistConfiguration(configuration); +} diff --git a/src/lib/LibCEC.h b/src/lib/LibCEC.h index c971353..3e7d371 100644 --- a/src/lib/LibCEC.h +++ b/src/lib/LibCEC.h @@ -103,6 +103,8 @@ namespace CEC virtual bool SetStreamPath(uint16_t iPhysicalAddress); virtual cec_logical_addresses GetLogicalAddresses(void); virtual bool GetCurrentConfiguration(libcec_configuration *configuration); + virtual bool CanPersistConfiguration(void); + virtual bool PersistConfiguration(libcec_configuration *configuration); const char *ToString(const cec_menu_state state); const char *ToString(const cec_version version); diff --git a/src/lib/LibCECC.cpp b/src/lib/LibCECC.cpp index d852c53..fd10bbd 100644 --- a/src/lib/LibCECC.cpp +++ b/src/lib/LibCECC.cpp @@ -395,4 +395,14 @@ int cec_get_current_configuration(libcec_configuration *configuration) return cec_parser ? (cec_parser->GetCurrentConfiguration(configuration) ? 1 : 0) : -1; } +int cec_can_persist_configuration(void) +{ + return cec_parser ? (cec_parser->CanPersistConfiguration() ? 1 : 0) : -1; +} + +int persist_configuration(libcec_configuration *configuration) +{ + return cec_parser ? (cec_parser->PersistConfiguration(configuration) ? 1 : 0) : -1; +} + //@} diff --git a/src/lib/adapter/AdapterCommunication.h b/src/lib/adapter/AdapterCommunication.h index 9762926..c169e16 100644 --- a/src/lib/adapter/AdapterCommunication.h +++ b/src/lib/adapter/AdapterCommunication.h @@ -136,5 +136,12 @@ namespace CEC * @return True when the control mode has been set, false otherwise. */ virtual bool SetControlledMode(bool controlled) = 0; + + /*! + * @brief Persist the given configuration in adapter (if supported) + * @brief The configuration to store. + * @return True when the configuration was persisted, false otherwise. + */ + virtual bool PersistConfiguration(libcec_configuration *configuration) = 0; }; }; diff --git a/src/lib/adapter/USBCECAdapterCommunication.h b/src/lib/adapter/USBCECAdapterCommunication.h index 0815682..659e659 100644 --- a/src/lib/adapter/USBCECAdapterCommunication.h +++ b/src/lib/adapter/USBCECAdapterCommunication.h @@ -66,6 +66,7 @@ namespace CEC virtual bool PingAdapter(void); virtual uint16_t GetFirmwareVersion(void); virtual bool SetControlledMode(bool controlled); + virtual bool PersistConfiguration(libcec_configuration * UNUSED(configuration)) { return false; } // TODO void *Process(void); private: -- 2.34.1