cec: added RescanDevices()/cec_rescan_devices() to the interface, to let libCEC force...
authorLars Op den Kamp <lars@opdenkamp.eu>
Thu, 16 Feb 2012 13:11:09 +0000 (14:11 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Thu, 16 Feb 2012 13:11:09 +0000 (14:11 +0100)
16 files changed:
include/cec.h
include/cecc.h
include/cecloader.h
include/cectypes.h
src/CecSharpTester/CecSharpClient.cs
src/LibCecSharp/CecSharpTypes.h
src/LibCecSharp/LibCecSharp.cpp
src/cec-config-gui/CecConfigGUI.cs
src/cec-config-gui/actions/RescanDevices.cs
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/testclient/main.cpp

index cbc83463e6d327d2c953310e9cf54c3c7d1f1cca..b159117fe7def9a42a21a7716a3b049b0dd5ce27 100644 (file)
@@ -88,42 +88,6 @@ namespace CEC
     virtual bool StartBootloader(void) = 0;
     //@}
 
-    /*!
-     * @return Get the minimal version of libcec that this version of libcec can interface with.
-     */
-    virtual int8_t GetMinLibVersion(void) const = 0;
-
-    /*!
-     * @return Get the major version of libcec.
-     */
-    virtual int8_t GetLibVersionMajor(void) const = 0;
-
-    /*!
-     * @return Get the minor version of libcec.
-     */
-    virtual int8_t GetLibVersionMinor(void) const = 0;
-
-    /*!
-     * @brief Get the next log message in the queue, if there is one.
-     * @param message The next message.
-     * @return True if a message was passed, false otherwise.
-     */
-    virtual bool GetNextLogMessage(cec_log_message *message) = 0;
-
-    /*!
-     * @brief Get the next keypress in the queue, if there is one.
-     * @param key The next keypress.
-     * @return True if a key was passed, false otherwise.
-     */
-    virtual bool GetNextKeypress(cec_keypress *key) = 0;
-
-    /*!
-     * @brief Get the next CEC command that was received by the adapter.
-     * @param action The next command.
-     * @return True when a command was passed, false otherwise.
-     */
-    virtual bool GetNextCommand(cec_command *command) = 0;
-
     /*!
      * @brief Transmit a command over the CEC line.
      * @param data The command to send.
@@ -145,13 +109,6 @@ namespace CEC
      */
     virtual bool SetPhysicalAddress(uint16_t iPhysicalAddress = CEC_DEFAULT_PHYSICAL_ADDRESS) = 0;
 
-    /*!
-     * @deprecated Use libcec_configuration instead.
-     * @brief Enable physical address detection (if the connected adapter supports this).
-     * @return True when physical address detection was enabled, false otherwise.
-     */
-    virtual bool EnablePhysicalAddressDetection(void) = 0;
-
     /*!
      * @brief Changes the active HDMI port.
      * @param iBaseDevice The device to which this libcec is connected.
@@ -181,11 +138,6 @@ namespace CEC
      */
     virtual bool SetActiveSource(cec_device_type type = CEC_DEVICE_TYPE_RESERVED) = 0;
 
-    /*!
-     * @deprecated Use SetActiveSource() instead
-     */
-    virtual bool SetActiveView(void) = 0;
-
     /*!
      * @brief Change the deck control mode, if this adapter is registered as playback device.
      * @param mode The new control mode.
@@ -279,6 +231,11 @@ namespace CEC
      */
     virtual cec_logical_addresses GetActiveDevices(void) = 0;
 
+               /*!
+     * @brief Tell libCEC to poll for active devices on the bus.
+     */
+    virtual void RescanActiveDevices(void) = 0;
+
     /*!
      * @brief Check whether a device is active on the bus.
      * @param iAddress The address to check.
@@ -407,6 +364,64 @@ namespace CEC
     virtual const char *ToString(const cec_audio_status status) = 0;
     virtual const char *ToString(const cec_vendor_id vendor) = 0;
     virtual const char *ToString(const cec_client_version version) = 0;
+    virtual const char *ToString(const cec_server_version version) = 0;
+
+    ////// deprecated methods, may be removed in a future version //////
+
+    /*!
+     * @deprecated Use libcec_configuration instead.
+     * @brief Enable physical address detection (if the connected adapter supports this).
+     * @return True when physical address detection was enabled, false otherwise.
+     */
+    virtual bool EnablePhysicalAddressDetection(void) = 0;
+
+    /*!
+     * @deprecated Use SetActiveSource() instead
+     */
+    virtual bool SetActiveView(void) = 0;
+
+        /*!
+     * @deprecated Use libcec_configuration instead
+     * @return Get the minimal version of libcec that this version of libcec can interface with.
+     */
+    virtual int8_t GetMinLibVersion(void) const = 0;
+
+    /*!
+     * @deprecated Use libcec_configuration instead
+     * @return Get the major version of libcec.
+     */
+    virtual int8_t GetLibVersionMajor(void) const = 0;
+
+    /*!
+     * @deprecated Use libcec_configuration instead
+     * @return Get the minor version of libcec.
+     */
+    virtual int8_t GetLibVersionMinor(void) const = 0;
+
+    /*!
+     * @deprecated Use callback methods instead
+     * @brief Get the next log message in the queue, if there is one.
+     * @param message The next message.
+     * @return True if a message was passed, false otherwise.
+     */
+    virtual bool GetNextLogMessage(cec_log_message *message) = 0;
+
+    /*!
+     * @deprecated Use callback methods instead
+     * @brief Get the next keypress in the queue, if there is one.
+     * @param key The next keypress.
+     * @return True if a key was passed, false otherwise.
+     */
+    virtual bool GetNextKeypress(cec_keypress *key) = 0;
+
+    /*!
+     * @deprecated Use callback methods instead
+     * @brief Get the next CEC command that was received by the adapter.
+     * @param action The next command.
+     * @return True when a command was passed, false otherwise.
+     */
+    virtual bool GetNextCommand(cec_command *command) = 0;
+
   };
 };
 
@@ -424,7 +439,7 @@ extern "C" DECLSPEC void * CECInit(const char *strDeviceName, CEC::cec_device_ty
  * @param configuration The configuration to pass to libCEC
  * @return An instance of ICECAdapter or NULL on error.
  */
-extern "C" DECLSPEC void * CECInitialise(const CEC::libcec_configuration *configuration);
+extern "C" DECLSPEC void * CECInitialise(CEC::libcec_configuration *configuration);
 
 /*!
  * @brief Unload the CEC adapter library.
index 072678bac2c6de86b4834703fdc2bc1d632ea13b..f2928ed7f22f2ac16782004d6cb8f96d0c8c3ce5 100644 (file)
@@ -41,9 +41,9 @@ extern "C" {
 #endif
 
 #ifdef __cplusplus
-extern DECLSPEC int cec_initialise(const CEC::libcec_configuration *configuration);
+extern DECLSPEC int cec_initialise(CEC::libcec_configuration *configuration);
 #else
-extern DECLSPEC int cec_initialise(const libcec_configuration *configuration);
+extern DECLSPEC int cec_initialise(libcec_configuration *configuration);
 #endif
 
 #ifdef __cplusplus
@@ -74,12 +74,6 @@ extern DECLSPEC int cec_ping_adapters(void);
 
 extern DECLSPEC int cec_start_bootloader(void);
 
-extern DECLSPEC int8_t cec_get_min_lib_version(void);
-
-extern DECLSPEC int8_t cec_get_lib_version_major(void);
-
-extern DECLSPEC int8_t cec_get_lib_version_minor(void);
-
 #ifdef __cplusplus
 extern DECLSPEC int cec_power_on_devices(CEC::cec_logical_address address);
 #else
@@ -92,8 +86,6 @@ extern DECLSPEC int cec_standby_devices(CEC::cec_logical_address address);
 extern DECLSPEC int cec_standby_devices(cec_logical_address address);
 #endif
 
-extern DECLSPEC int cec_set_active_view(void);
-
 #ifdef __cplusplus
 extern DECLSPEC int cec_set_active_source(CEC::cec_device_type type);
 #else
@@ -120,24 +112,6 @@ extern DECLSPEC int cec_set_menu_state(CEC::cec_menu_state state, int bSendUpdat
 extern DECLSPEC int cec_set_menu_state(cec_menu_state state, int bSendUpdate);
 #endif
 
-#ifdef __cplusplus
-extern DECLSPEC int cec_get_next_log_message(CEC::cec_log_message *message);
-#else
-extern DECLSPEC int cec_get_next_log_message(cec_log_message *message);
-#endif
-
-#ifdef __cplusplus
-extern DECLSPEC int cec_get_next_keypress(CEC::cec_keypress *key);
-#else
-extern DECLSPEC int cec_get_next_keypress(cec_keypress *key);
-#endif
-
-#ifdef __cplusplus
-extern DECLSPEC int cec_get_next_command(CEC::cec_command *command);
-#else
-extern DECLSPEC int cec_get_next_command(cec_command *command);
-#endif
-
 #ifdef __cplusplus
 extern DECLSPEC int cec_transmit(const CEC::cec_command *data);
 #else
@@ -256,8 +230,6 @@ extern DECLSPEC CEC::cec_osd_name cec_get_device_osd_name(CEC::cec_logical_addre
 extern DECLSPEC cec_osd_name cec_get_device_osd_name(cec_logical_address iAddress);
 #endif
 
-extern DECLSPEC int cec_enable_physical_address_detection(void);
-
 #ifdef __cplusplus
 extern DECLSPEC int cec_set_stream_path_logical(CEC::cec_logical_address iAddress);
 #else
@@ -292,6 +264,38 @@ extern DECLSPEC int cec_set_configuration(const CEC::libcec_configuration *confi
 extern DECLSPEC int cec_set_configuration(const libcec_configuration *configuration);
 #endif
 
+extern DECLSPEC void cec_rescan_devices(void);
+
+////// deprecated methods, may be removed in a future version //////
+
+extern DECLSPEC int cec_enable_physical_address_detection(void);
+
+extern DECLSPEC int cec_set_active_view(void);
+
+extern DECLSPEC int8_t cec_get_min_lib_version(void);
+
+extern DECLSPEC int8_t cec_get_lib_version_major(void);
+
+extern DECLSPEC int8_t cec_get_lib_version_minor(void);
+
+#ifdef __cplusplus
+extern DECLSPEC int cec_get_next_log_message(CEC::cec_log_message *message);
+#else
+extern DECLSPEC int cec_get_next_log_message(cec_log_message *message);
+#endif
+
+#ifdef __cplusplus
+extern DECLSPEC int cec_get_next_keypress(CEC::cec_keypress *key);
+#else
+extern DECLSPEC int cec_get_next_keypress(cec_keypress *key);
+#endif
+
+#ifdef __cplusplus
+extern DECLSPEC int cec_get_next_command(CEC::cec_command *command);
+#else
+extern DECLSPEC int cec_get_next_command(cec_command *command);
+#endif
+
 #ifdef __cplusplus
 };
 #endif
index 1a75169154fed380f059d5f5e941cee3db2bac12..624f29a5c7a54961ab53f0565e95945138fbb65c 100644 (file)
@@ -72,7 +72,7 @@ CEC::ICECAdapter *LibCecInit(const char *strDeviceName, CEC::cec_device_type_lis
  * @param strLib The name of and/or path to libCEC
  * @return An instance of ICECAdapter or NULL on error.
  */
-CEC::ICECAdapter *LibCecInitialise(const CEC::libcec_configuration *configuration, const char *strLib = NULL)
+CEC::ICECAdapter *LibCecInitialise(CEC::libcec_configuration *configuration, const char *strLib = NULL)
 {
   if (!g_libCEC)
 #if defined(_WIN64)
@@ -83,7 +83,7 @@ CEC::ICECAdapter *LibCecInitialise(const CEC::libcec_configuration *configuratio
   if (!g_libCEC)
     return NULL;
 
-  typedef void* (__cdecl*_LibCecInitialise)(const CEC::libcec_configuration *);
+  typedef void* (__cdecl*_LibCecInitialise)(CEC::libcec_configuration *);
   _LibCecInitialise LibCecInitialise;
   LibCecInitialise = (_LibCecInitialise) (GetProcAddress(g_libCEC, "CECInitialise"));
   if (!LibCecInitialise)
@@ -161,7 +161,7 @@ CEC::ICECAdapter *LibCecInit(const char *strDeviceName, CEC::cec_device_type_lis
  * @param strLib The name of and/or path to libCEC
  * @return An instance of ICECAdapter or NULL on error.
  */
-CEC::ICECAdapter *LibCecInitialise(const CEC::libcec_configuration *configuration, const char *strLib = NULL)
+CEC::ICECAdapter *LibCecInitialise(CEC::libcec_configuration *configuration, const char *strLib = NULL)
 {
   if (!g_libCEC)
   {
@@ -181,7 +181,7 @@ CEC::ICECAdapter *LibCecInitialise(const CEC::libcec_configuration *configuratio
     }
   }
 
-  typedef void* _LibCecInitialise(const CEC::libcec_configuration *);
+  typedef void* _LibCecInitialise(CEC::libcec_configuration *);
   _LibCecInitialise* LibCecInitialise = (_LibCecInitialise*) dlsym(g_libCEC, "CECInitialise");
   if (!LibCecInitialise)
   {
index ca02f09487cc156d3971d08610502f16e44763cf..960f6a04fc602e0b7b491c65450beb454c9f6019 100644 (file)
@@ -86,7 +86,7 @@ namespace CEC {
 
 #define CEC_MIN_LIB_VERSION          1
 #define CEC_LIB_VERSION_MAJOR        1
-#define CEC_LIB_VERSION_MINOR        4
+#define CEC_LIB_VERSION_MINOR        5
 
 typedef enum cec_abort_reason
 {
@@ -947,19 +947,27 @@ typedef enum cec_client_version
   CEC_CLIENT_VERSION_1_5_0   = 0x1500
 } cec_client_version;
 
+typedef enum cec_server_version
+{
+  CEC_SERVER_VERSION_PRE_1_5 = 0,
+  CEC_SERVER_VERSION_1_5_0   = 0x1500
+} cec_server_version;
+
 typedef struct libcec_configuration
 {
-  cec_client_version    clientVersion;        /*!< the version of the client that is connecting */
+  uint32_t              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 */
   uint8_t               bAutodetectAddress;   /*!< try to autodetect the physical address when 1 */
   uint16_t              iPhysicalAddress;     /*!< the physical address of the CEC adapter. only used when bAutodetectAddress = 0 or when the adapter doesn't support autodetection */
   cec_logical_address   baseDevice;           /*!< the logical address of the device to which the adapter is connected. only used when iPhysicalAddress = 0 and bAutodetectAddress = 0 or when the adapter doesn't support autodetection */
   uint8_t               iHDMIPort;            /*!< the HDMI port to which the adapter is connected. only used when iPhysicalAddress = 0 and bAutodetectAddress = 0 or when the adapter doesn't support autodetection */
-  cec_vendor_id         tvVendor;             /*!< override the vendor ID of the TV. leave this untouched to autodetect */
+  uint64_t              tvVendor;             /*!< override the vendor ID of the TV. leave this untouched to autodetect */
   cec_logical_addresses wakeDevices;          /*!< wake these CEC devices when initialising libCEC or when calling PowerOnDevices() without any parameter */
   cec_logical_addresses powerOffDevices;      /*!< power off these devices when calling StandbyDevices() without any parameter */
 
+  uint32_t              serverVersion;         /*!< the version number of the server. read-only */
+
   // 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 */
@@ -978,8 +986,9 @@ typedef struct libcec_configuration
     iPhysicalAddress = 0;
     baseDevice       = (cec_logical_address)CEC_DEFAULT_BASE_DEVICE;
     iHDMIPort        = CEC_DEFAULT_HDMI_PORT;
-    tvVendor         = CEC_VENDOR_UNKNOWN;
-    clientVersion    = CEC_CLIENT_VERSION_PRE_1_5;
+    tvVendor         = (uint64_t)CEC_VENDOR_UNKNOWN;
+    clientVersion    = (uint32_t)CEC_CLIENT_VERSION_PRE_1_5;
+    serverVersion    = (uint32_t)CEC_SERVER_VERSION_PRE_1_5;
     wakeDevices.Clear();
     powerOffDevices.Clear();
 
index 061a992047877beebe9b9ec6fd1d7bbc22c19579..006c83ae24e15a72e0063aff54690dfd4867ede2 100644 (file)
@@ -50,7 +50,7 @@ namespace CecSharpClient
 
       Lib = new LibCecSharp(Config);
 
-      Console.WriteLine("CEC Parser created - libcec version " + Lib.GetLibVersionMajor() + "." + Lib.GetLibVersionMinor());
+      Console.WriteLine("CEC Parser created - libcec version " + Lib.ToString(Config.ServerVersion));
     }
 
     public override int ReceiveCommand(CecCommand command)
@@ -198,9 +198,6 @@ namespace CecSharpClient
 
     public void MainLoop()
     {
-      Lib.PowerOnDevices(CecLogicalAddress.Tv);
-      Lib.SetActiveSource(CecDeviceType.PlaybackDevice);
-
       bool bContinue = true;
       string command;
       while (bContinue)
index 135eecf98ec84f7eb78c416f816061d4e98303b8..5d617941b0f4316c422cd257c249d5aba62281b8 100644 (file)
@@ -329,6 +329,12 @@ namespace CecSharp
                Version1_5_0  = 0x1500
        };
 
+  public enum class CecServerVersion
+       {
+               VersionPre1_5 = 0,
+               Version1_5_0  = 0x1500
+       };
+
        public ref class CecAdapter
        {
        public:
@@ -524,6 +530,7 @@ namespace CecSharp
                        BaseDevice          = (CecLogicalAddress)CEC_DEFAULT_BASE_DEVICE;
                        HDMIPort            = CEC_DEFAULT_HDMI_PORT;
                        ClientVersion       = CecClientVersion::VersionPre1_5;
+                       ServerVersion       = CecServerVersion::VersionPre1_5;
                        TvVendor            = CecVendorId::Unknown;
 
                        GetSettingsFromROM  = false;
@@ -547,6 +554,40 @@ namespace CecSharp
                        Callbacks = callbacks;
                }
 
+               void Update(const CEC::libcec_configuration &config)
+               {
+                       DeviceName = gcnew System::String(config.strDeviceName);
+
+                       for (unsigned int iPtr = 0; iPtr < 5; iPtr++)
+                               DeviceTypes->Types[iPtr] = (CecDeviceType)config.deviceTypes.types[iPtr];
+
+                       AutodetectAddress  = config.bAutodetectAddress == 1;
+                       PhysicalAddress    = config.iPhysicalAddress;
+                       BaseDevice         = (CecLogicalAddress)config.baseDevice;
+                       HDMIPort           = config.iHDMIPort;
+                       ClientVersion      = (CecClientVersion)config.clientVersion;
+                       ServerVersion      = (CecServerVersion)config.serverVersion;
+                       TvVendor           = (CecVendorId)config.tvVendor;
+
+                       // player specific settings
+                       GetSettingsFromROM = config.bGetSettingsFromROM == 1;
+                       UseTVMenuLanguage = config.bUseTVMenuLanguage == 1;
+                       ActivateSource = config.bActivateSource == 1;
+
+                       WakeDevices->Clear();
+                       for (uint8_t iPtr = 0; iPtr <= 16; iPtr++)
+                               if (config.wakeDevices[iPtr])
+                                       WakeDevices->Set((CecLogicalAddress)iPtr);
+
+                       PowerOffDevices->Clear();
+                       for (uint8_t iPtr = 0; iPtr <= 16; iPtr++)
+                               if (config.powerOffDevices[iPtr])
+                                       PowerOffDevices->Set((CecLogicalAddress)iPtr);
+
+                       PowerOffScreensaver = config.bPowerOffScreensaver == 1;
+                       PowerOffOnStandby = config.bPowerOffOnStandby == 1;
+               }
+
                property System::String ^     DeviceName;
                property CecDeviceTypeList ^  DeviceTypes;
                property bool                 AutodetectAddress;
@@ -554,6 +595,7 @@ namespace CecSharp
                property CecLogicalAddress    BaseDevice;
                property uint8_t              HDMIPort;
                property CecClientVersion     ClientVersion;
+               property CecServerVersion     ServerVersion;
                property CecVendorId          TvVendor;
 
                // player specific settings
@@ -740,30 +782,7 @@ namespace CecSharp
                        if (m_bHasCallbacks)
                        {
                                LibCECConfiguration ^netConfig = gcnew LibCECConfiguration();
-                         netConfig->DeviceName = gcnew System::String(config.strDeviceName);
-                               for (unsigned int iPtr = 0; iPtr < 5; iPtr++)
-                                 netConfig->DeviceTypes->Types[iPtr] = (CecDeviceType)config.deviceTypes.types[iPtr];
-
-                               netConfig->PhysicalAddress = config.iPhysicalAddress;
-                               netConfig->BaseDevice = (CecLogicalAddress)config.baseDevice;
-                               netConfig->HDMIPort = config.iHDMIPort;
-                               netConfig->ClientVersion = (CecClientVersion)config.clientVersion;
-                               netConfig->GetSettingsFromROM = config.bGetSettingsFromROM == 1;
-                               netConfig->ActivateSource = config.bActivateSource == 1;
-
-                               netConfig->WakeDevices->Clear();
-                               for (uint8_t iPtr = 0; iPtr <= 16; iPtr++)
-                                       if (config.wakeDevices[iPtr])
-                                               netConfig->WakeDevices->Set((CecLogicalAddress)iPtr);
-
-                               netConfig->PowerOffDevices->Clear();
-                               for (uint8_t iPtr = 0; iPtr <= 16; iPtr++)
-                                       if (config.powerOffDevices[iPtr])
-                                               netConfig->PowerOffDevices->Set((CecLogicalAddress)iPtr);
-
-                               netConfig->PowerOffScreensaver = config.bPowerOffScreensaver == 1;
-                               netConfig->PowerOffOnStandby = config.bPowerOffOnStandby == 1;
-
+                               netConfig->Update(config);
                                iReturn = m_callbacks->ConfigurationChanged(netConfig);
                        }
                        return iReturn;
index 4bf39f06354378f82ab4d0fc4f9b13d5b707f33b..014dea00741571e7d6b9c2af440d5ab83551e2df 100644 (file)
@@ -80,6 +80,8 @@ namespace CecSharp
                        ConvertConfiguration(context, config, libCecConfig);
 
                        m_libCec = (ICECAdapter *) CECInitialise(&libCecConfig);
+                       config->Update(libCecConfig);
+
 
                        delete context;
                        return m_libCec != NULL;
@@ -334,6 +336,11 @@ namespace CecSharp
                        return (CecPowerStatus) m_libCec->GetDevicePowerStatus((cec_logical_address) logicalAddress);
                }
 
+               void RescanActiveDevices(void)
+               {
+                       m_libCec->RescanActiveDevices();
+               }
+
                CecLogicalAddresses ^ GetActiveDevices(void)
                {
                        CecLogicalAddresses ^ retVal = gcnew CecLogicalAddresses();
@@ -436,29 +443,7 @@ namespace CecSharp
 
                        if (m_libCec->GetCurrentConfiguration(&config))
                        {
-                               configuration->AutodetectAddress = config.bAutodetectAddress == 1;
-                               configuration->BaseDevice = (CecLogicalAddress)config.baseDevice;
-                               configuration->DeviceName = gcnew String(config.strDeviceName);
-                               configuration->HDMIPort = config.iHDMIPort;
-                               configuration->PhysicalAddress = config.iPhysicalAddress;
-                               configuration->PowerOffOnStandby = config.bPowerOffOnStandby == 1;
-                               configuration->PowerOffScreensaver = config.bPowerOffScreensaver == 1;
-                               configuration->ActivateSource = config.bActivateSource == 1;
-                               configuration->TvVendor = (CecVendorId)config.tvVendor;
-
-                               configuration->WakeDevices->Clear();
-                               for (uint8_t iPtr = 0; iPtr <= 16; iPtr++)
-                                       if (config.wakeDevices[iPtr])
-                                               configuration->WakeDevices->Set((CecLogicalAddress)iPtr);
-
-                               configuration->PowerOffDevices->Clear();
-                               for (uint8_t iPtr = 0; iPtr <= 16; iPtr++)
-                                       if (config.powerOffDevices[iPtr])
-                                               configuration->PowerOffDevices->Set((CecLogicalAddress)iPtr);
-
-                               configuration->UseTVMenuLanguage = config.bUseTVMenuLanguage == 1;
-                               for (unsigned int iPtr = 0; iPtr < 5; iPtr++)
-                                       configuration->DeviceTypes->Types[iPtr] = (CecDeviceType)config.deviceTypes.types[iPtr];
+                               configuration->Update(config);
                                return true;
                        }
                        return false;
@@ -553,6 +538,18 @@ namespace CecSharp
                        return gcnew String(retVal);
                }
 
+               String ^ ToString(CecClientVersion version)
+               {
+                       const char *retVal = m_libCec->ToString((cec_client_version)version);
+                       return gcnew String(retVal);
+               }
+
+               String ^ ToString(CecServerVersion version)
+               {
+                       const char *retVal = m_libCec->ToString((cec_server_version)version);
+                       return gcnew String(retVal);
+               }
+
        private:
                ICECAdapter *        m_libCec;
        };
index 4f84b2cf2f22de0005c37e87d98ce5b5c5f56cf3..e3decec7fe03ef9907b602182cc21f214f52136b 100644 (file)
@@ -884,7 +884,7 @@ namespace CecConfigGui
       if (!SuppressUpdates && ActiveProcess == null)
       {
         SetControlsEnabled(false);
-        ActiveProcess = new RescanDevices();
+        ActiveProcess = new RescanDevices(ref Lib);
         ActiveProcess.EventHandler += new EventHandler<UpdateEvent>(ProcessEventHandler);
         (new Thread(new ThreadStart(ActiveProcess.Run))).Start();
       }
@@ -1032,6 +1032,8 @@ namespace CecConfigGui
         SetCheckboxItemChecked(cbWakeDevices, iPtr, Config.WakeDevices.IsSet((CecLogicalAddress)iPtr));
       for (int iPtr = 0; iPtr < 15; iPtr++)
         SetCheckboxItemChecked(cbPowerOffDevices, iPtr, Config.PowerOffDevices.IsSet((CecLogicalAddress)iPtr));
+
+      SetControlText(this, "Pulse-Eight USB-CEC Adapter - libCEC " + Lib.ToString(Config.ServerVersion));
       return 1;
     }
 
index 0e110a8250202589c4f6caa64e7c8a5863a12627..c81538d6577a3185391c3532429d3d47da06449d 100644 (file)
@@ -5,14 +5,25 @@ namespace CecConfigGui.actions
 {
   class RescanDevices : UpdateProcess
   {
+    public RescanDevices(ref LibCecSharp lib)
+    {
+      Lib = lib;
+    }
+
     public override void Process()
     {
       SendEvent(UpdateEventType.ProgressBar, 10);
       SendEvent(UpdateEventType.StatusText, "Polling active devices");
+      Lib.RescanActiveDevices();
+
+      SendEvent(UpdateEventType.ProgressBar, 80);
+      SendEvent(UpdateEventType.StatusText, "Refreshing device list");
       SendEvent(UpdateEventType.PollDevices);
 
       SendEvent(UpdateEventType.ProgressBar, 100);
       SendEvent(UpdateEventType.StatusText, "Ready.");
     }
+
+    private LibCecSharp Lib;
   }
 }
index b5ecd8e7235b643c7669fa10793c51e455595974..d0840cec926546a56c6e1660c82cb832279f9de1 100644 (file)
@@ -185,7 +185,7 @@ bool OpenConnection(cec_device_type type = CEC_DEVICE_TYPE_RECORDING_DEVICE)
   g_config.Clear();
   snprintf(g_config.strDeviceName, 13, "CEC-config");
   g_config.callbackParam      = NULL;
-  g_config.clientVersion      = CEC_CLIENT_VERSION_1_5_0;
+  g_config.clientVersion      = (uint32_t)CEC_CLIENT_VERSION_1_5_0;
   g_callbacks.CBCecLogMessage = &CecLogMessage;
   g_callbacks.CBCecKeyPress   = &CecKeyPress;
   g_callbacks.CBCecCommand    = &CecCommand;
index 643defad7cf17746f0fe4b452fd740353e6f631c..54162b92257f9f4e6f1fa9e6517009c46b87c4e2 100644 (file)
@@ -47,7 +47,7 @@ using namespace CEC;
 using namespace std;
 using namespace PLATFORM;
 
-CCECProcessor::CCECProcessor(CLibCEC *controller, const libcec_configuration *configuration) :
+CCECProcessor::CCECProcessor(CLibCEC *controller, libcec_configuration *configuration) :
     m_bInitialised(false),
     m_communication(NULL),
     m_controller(controller),
@@ -59,11 +59,13 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, const libcec_configuration *co
   m_logicalAddresses.Clear();
   CreateBusDevices();
   m_configuration.Clear();
-
+  m_configuration.serverVersion = CEC_SERVER_VERSION_1_5_0;
   SetConfiguration(configuration);
 
   if (m_configuration.tvVendor != CEC_VENDOR_UNKNOWN)
     m_busDevices[CECDEVICE_TV]->ReplaceHandler(false);
+
+  GetCurrentConfiguration(configuration);
 }
 
 CCECProcessor::CCECProcessor(CLibCEC *controller, const char *strDeviceName, const cec_device_type_list &types, uint16_t iPhysicalAddress) :
@@ -76,9 +78,10 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, const char *strDeviceName, con
     m_iLastTransmission(0)
 {
   m_configuration.Clear();
+  m_configuration.serverVersion = CEC_SERVER_VERSION_1_5_0;
 
   // client version < 1.5.0
-  m_configuration.clientVersion    = CEC_CLIENT_VERSION_PRE_1_5;
+  m_configuration.clientVersion    = (uint32_t)CEC_CLIENT_VERSION_PRE_1_5;
   snprintf(m_configuration.strDeviceName, 13, "%s", strDeviceName);
   m_configuration.deviceTypes      = types;
   m_configuration.iPhysicalAddress = iPhysicalAddress;
@@ -182,7 +185,7 @@ bool CCECProcessor::OpenConnection(const char *strPort, uint16_t iBaudRate, uint
   }
 
   if (bReturn)
-    CLibCEC::AddLog(CEC_LOG_NOTICE, "connected to the CEC adapter. firmware version = %d, client version = %s", m_communication->GetFirmwareVersion(), ToString(m_configuration.clientVersion));
+    CLibCEC::AddLog(CEC_LOG_NOTICE, "connected to the CEC adapter. firmware version = %d, client version = %s", m_communication->GetFirmwareVersion(), ToString((cec_client_version)m_configuration.clientVersion));
 
   return bReturn;
 }
@@ -1365,6 +1368,19 @@ const char *CCECProcessor::ToString(const cec_client_version version)
   }
 }
 
+const char *CCECProcessor::ToString(const cec_server_version version)
+{
+  switch (version)
+  {
+  case CEC_SERVER_VERSION_PRE_1_5:
+    return "pre-1.5";
+  case CEC_SERVER_VERSION_1_5_0:
+    return "1.5.0";
+  default:
+    return "Unknown";
+  }
+}
+
 void *CCECBusScan::Process(void)
 {
   CCECBusDevice *device(NULL);
@@ -1520,6 +1536,8 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration)
   }
 
   // just copy these
+  m_configuration.clientVersion        = configuration->clientVersion;
+  m_configuration.bActivateSource      = configuration->bActivateSource;
   m_configuration.bGetSettingsFromROM  = configuration->bGetSettingsFromROM;
   m_configuration.powerOffDevices      = configuration->powerOffDevices;
   m_configuration.bPowerOffScreensaver = configuration->bPowerOffScreensaver;
@@ -1545,16 +1563,20 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration)
 bool CCECProcessor::GetCurrentConfiguration(libcec_configuration *configuration)
 {
   // client version 1.5.0
-  configuration->clientVersion        = m_configuration.clientVersion;
   snprintf(configuration->strDeviceName, 13, "%s", m_configuration.strDeviceName);
   configuration->deviceTypes          = m_configuration.deviceTypes;
   configuration->bAutodetectAddress   = m_configuration.bAutodetectAddress;
   configuration->iPhysicalAddress     = m_configuration.iPhysicalAddress;
   configuration->baseDevice           = m_configuration.baseDevice;
   configuration->iHDMIPort            = m_configuration.iHDMIPort;
+  configuration->clientVersion        = m_configuration.clientVersion;
+  configuration->serverVersion        = m_configuration.serverVersion;
   configuration->tvVendor             = m_configuration.tvVendor;
-  configuration->wakeDevices          = m_configuration.wakeDevices;
+
   configuration->bGetSettingsFromROM  = m_configuration.bGetSettingsFromROM;
+  configuration->bUseTVMenuLanguage   = m_configuration.bUseTVMenuLanguage;
+  configuration->bActivateSource      = m_configuration.bActivateSource;
+  configuration->wakeDevices          = m_configuration.wakeDevices;
   configuration->powerOffDevices      = m_configuration.powerOffDevices;
   configuration->bPowerOffScreensaver = m_configuration.bPowerOffScreensaver;
   configuration->bPowerOffOnStandby   = m_configuration.bPowerOffOnStandby;
@@ -1571,3 +1593,9 @@ bool CCECProcessor::PersistConfiguration(libcec_configuration *configuration)
 {
   return m_communication->PersistConfiguration(configuration);
 }
+
+void CCECProcessor::RescanActiveDevices(void)
+{
+  for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
+    m_busDevices[iPtr]->GetStatus(true);
+}
index 9a6f842331e407b975644a5e3a599bd8989bb3f2..5a657533664c465c4e7e0527fc87c7d35f724c38 100644 (file)
@@ -47,7 +47,7 @@ namespace CEC
   {
     public:
       CCECProcessor(CLibCEC *controller, const char *strDeviceName, const cec_device_type_list &types, uint16_t iPhysicalAddress);
-      CCECProcessor(CLibCEC *controller, const libcec_configuration *configuration);
+      CCECProcessor(CLibCEC *controller, libcec_configuration *configuration);
       virtual ~CCECProcessor(void);
 
       virtual bool Start(const char *strPort, uint16_t iBaudRate = 38400, uint32_t iTimeoutMs = 10000);
@@ -84,7 +84,7 @@ namespace CEC
       virtual bool                  IsActiveSource(cec_logical_address iAddress);
       virtual bool                  IsInitialised(void);
       virtual bool                  SetStreamPath(uint16_t iPhysicalAddress);
-      virtual cec_client_version    GetClientVersion(void) const { return m_configuration.clientVersion; };
+      virtual cec_client_version    GetClientVersion(void) const { return (cec_client_version)m_configuration.clientVersion; };
       virtual bool                  StandbyDevices(cec_logical_address address = CECDEVICE_BROADCAST);
       virtual bool                  PowerOnDevices(cec_logical_address address = CECDEVICE_BROADCAST);
 
@@ -112,6 +112,7 @@ namespace CEC
       virtual bool SetConfiguration(const libcec_configuration *configuration);
       virtual bool CanPersistConfiguration(void);
       virtual bool PersistConfiguration(libcec_configuration *configuration);
+      virtual void RescanActiveDevices(void);
 
       bool SetLineTimeout(uint8_t iTimeout);
 
@@ -127,6 +128,7 @@ namespace CEC
       const char *ToString(const cec_audio_status status);
       const char *ToString(const cec_vendor_id vendor);
       const char *ToString(const cec_client_version version);
+      const char *ToString(const cec_server_version version);
 
       virtual bool Transmit(const cec_command &data);
       virtual void TransmitAbort(cec_logical_address address, cec_opcode opcode, cec_abort_reason reason = CEC_ABORT_REASON_UNRECOGNIZED_OPCODE);
@@ -150,7 +152,6 @@ namespace CEC
       void CreateBusDevices(void);
 
       void ReplaceHandlers(void);
-      void ScanCECBus(void);
       bool PhysicalAddressInUse(uint16_t iPhysicalAddress);
       bool TryLogicalAddress(cec_logical_address address);
       bool FindLogicalAddressRecordingDevice(void);
index 44e368f8c06250bc45aee0c64ff3b69c32bce970..01ce2cf3e406f20904dc6b39413ca27e2b93f909 100644 (file)
@@ -52,7 +52,7 @@ CLibCEC::CLibCEC(const char *strDeviceName, cec_device_type_list types, uint16_t
   m_cec = new CCECProcessor(this, strDeviceName, types, iPhysicalAddress);
 }
 
-CLibCEC::CLibCEC(const libcec_configuration *configuration) :
+CLibCEC::CLibCEC(libcec_configuration *configuration) :
     m_iStartTime(GetTimeMs()),
     m_iCurrentButton(CEC_USER_CONTROL_CODE_UNKNOWN),
     m_buttontime(0),
@@ -485,7 +485,7 @@ void * CECInit(const char *strDeviceName, CEC::cec_device_type_list types, uint1
   return static_cast< void* > (lib);
 }
 
-void * CECInitialise(const libcec_configuration *configuration)
+void * CECInitialise(libcec_configuration *configuration)
 {
   CLibCEC *lib = new CLibCEC(configuration);
   CLibCEC::SetInstance(lib);
@@ -552,6 +552,11 @@ const char *CLibCEC::ToString(const cec_client_version version)
   return m_cec->ToString(version);
 }
 
+const char *CLibCEC::ToString(const cec_server_version version)
+{
+  return m_cec->ToString(version);
+}
+
 bool CLibCEC::GetCurrentConfiguration(libcec_configuration *configuration)
 {
   return m_cec->GetCurrentConfiguration(configuration);
@@ -571,3 +576,8 @@ bool CLibCEC::PersistConfiguration(libcec_configuration *configuration)
 {
   return m_cec->PersistConfiguration(configuration);
 }
+
+void CLibCEC::RescanActiveDevices(void)
+{
+  return m_cec->RescanActiveDevices();
+}
index 2df5b63ec1973751f3c35428a2910bb40b90641d..a2ed9ac09bd9e1fde849ecd35211f85773d7b37f 100644 (file)
@@ -48,7 +48,7 @@ namespace CEC
      */
     //@{
       CLibCEC(const char *strDeviceName, cec_device_type_list types, uint16_t iPhysicalAddress = 0);
-      CLibCEC(const libcec_configuration *configuration);
+      CLibCEC(libcec_configuration *configuration);
       virtual ~CLibCEC(void);
 
       virtual bool Open(const char *strPort, uint32_t iTimeout = 10000);
@@ -58,7 +58,7 @@ namespace CEC
       virtual bool PingAdapter(void);
       virtual bool StartBootloader(void);
 
-      virtual int8_t GetMinLibVersion(void) const{ return CEC_MIN_LIB_VERSION; };
+      virtual int8_t GetMinLibVersion(void) const   { return CEC_MIN_LIB_VERSION; };
       virtual int8_t GetLibVersionMajor(void) const { return CEC_LIB_VERSION_MAJOR; };
       virtual int8_t GetLibVersionMinor(void) const { return CEC_LIB_VERSION_MINOR; };
 
@@ -106,6 +106,7 @@ namespace CEC
       virtual bool SetConfiguration(const libcec_configuration *configuration);
       virtual bool CanPersistConfiguration(void);
       virtual bool PersistConfiguration(libcec_configuration *configuration);
+      virtual void RescanActiveDevices(void);
 
       const char *ToString(const cec_menu_state state);
       const char *ToString(const cec_version version);
@@ -118,6 +119,7 @@ namespace CEC
       const char *ToString(const cec_audio_status status);
       const char *ToString(const cec_vendor_id vendor);
       const char *ToString(const cec_client_version version);
+      const char *ToString(const cec_server_version version);
     //@}
 
       static void AddLog(const cec_log_level level, const char *strFormat, ...);
index c6f1563a5cf829453b12c8ec43d70530ac610755..b87e06c611f28946a58331a26d9d73e6e25e0d6b 100644 (file)
@@ -42,7 +42,7 @@ using namespace std;
 //@{
 ICECAdapter *cec_parser;
 
-int cec_initialise(const libcec_configuration *configuration)
+int cec_initialise(libcec_configuration *configuration)
 {
   cec_parser = (ICECAdapter *) CECInitialise(configuration);
   return (cec_parser != NULL) ? 1 : 0;
@@ -410,4 +410,10 @@ int cec_set_configuration(libcec_configuration *configuration)
   return cec_parser ? (cec_parser->SetConfiguration(configuration) ? 1 : 0) : -1;
 }
 
+void cec_rescan_devices(void)
+{
+  if (cec_parser)
+    cec_parser->RescanActiveDevices();
+}
+
 //@}
index a8f03a51b184ff276894f057dff061358f853e1b..69309bc7dfc078592691e4b99acb035dcca1097a 100644 (file)
@@ -1058,7 +1058,7 @@ int main (int argc, char *argv[])
   if (!g_bSingleCommand)
   {
     CStdString strLog;
-    strLog.Format("CEC Parser created - libcec version %d.%d", parser->GetLibVersionMajor(), parser->GetLibVersionMinor());
+    strLog.Format("CEC Parser created - libCEC version %s", parser->ToString((cec_server_version)g_config.serverVersion));
     cout << strLog.c_str() << endl;
 
     //make stdin non-blocking