cec: added CanPersistConfiguration()/cec_can_persist_configuration() and PersistConfi...
authorLars Op den Kamp <lars@opdenkamp.eu>
Fri, 10 Feb 2012 00:57:17 +0000 (01:57 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Fri, 10 Feb 2012 00:57:17 +0000 (01:57 +0100)
include/cec.h
include/cecc.h
include/cectypes.h
src/cec-config/cec-config.cpp
src/lib/CECProcessor.cpp
src/lib/CECProcessor.h
src/lib/LibCEC.cpp
src/lib/LibCEC.h
src/lib/LibCECC.cpp
src/lib/adapter/AdapterCommunication.h
src/lib/adapter/USBCECAdapterCommunication.h

index 35f41c9a7136bbc8fd0227431a83c83bb0fb3974..82c0a603fd7455417aa03960705bd4f056a1bc08 100644 (file)
@@ -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;
index d8cb791f87b2769a372ce251d11f3d4288915fdc..33ac02584eaf5ff4bfc74a024cd07383ef795653 100644 (file)
@@ -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
 };
index 01583927e294ccdea48f254da13b18392faac89b..3501ce356f74562dc83d4340678aaa75f525e5fb 100644 (file)
@@ -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;
   }
index 5d1454794c333db7ac242fe4e37608abbb4d6d4e..158848235e960e503ff8444fc55fc87b7ed24e81 100644 (file)
@@ -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();
index 1e655507e814ead3c7c0288198545dc7b6325270..2e345762b4dbacee216cdfe52055cc532bb0b433 100644 (file)
@@ -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);
+}
index 50d6bf253b6376d8e3d9be90e8e1a77148d30a63..5d0cfa2b53cbcab4e1d0fd7c49fa0d8d7f689f58 100644 (file)
@@ -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);
 
index fd85ea5f863a3e22efe5baa4d3bb496c713216a3..cdac0d0425bd120b3688c5173e89e79b4b15227b 100644 (file)
@@ -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);
+}
index c9713530ccccbcb61ec876b5da839ac86fba1aad..3e7d371f53a45c8cad36c5bc170b7f0efb830001 100644 (file)
@@ -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);
index d852c532878ec3238a7067acfa75e161dff9d147..fd10bbd504ce68400c88ef92ce3b341fc7527215 100644 (file)
@@ -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;
+}
+
 //@}
index 9762926cc10a23e0561b96914c13b2ba4fac2aa8..c169e169d3ae7c024f7bd75b2b9517a8e73cad06 100644 (file)
@@ -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;
   };
 };
index 081568206f175946872809029f6f09ca0b64d44e..659e65922d1a519fb946ffda8a7817d071f68e71 100644 (file)
@@ -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: