cec: fixed - ensure that the correct libCEC version is set after initialising the...
[deb_libcec.git] / include / cectypes.h
index a90b6ffc42693ffe5eb9029f2f776fc2e7181eb0..759eb4fa50c941b24f3eaf27c8d2ecfdd4e6d600 100644 (file)
@@ -72,11 +72,22 @@ namespace CEC {
 #define CEC_BUTTON_TIMEOUT           500
 #define CEC_POWER_STATE_REFRESH_TIME 30000
 #define CEC_FW_VERSION_UNKNOWN       0xFFFF
+#define CEC_FW_BUILD_UNKNOWN         0
 #define CEC_CONNECT_TRIES            3
+
 #define CEC_PHYSICAL_ADDRESS_TV      0
+#define CEC_MIN_PHYSICAL_ADDRESS     0x1000
 #define CEC_MAX_PHYSICAL_ADDRESS     0xFFFE
 #define CEC_INVALID_PHYSICAL_ADDRESS 0xFFFF
 
+#define CEC_MIN_VENDORID             1
+#define CEC_MAX_VENDORID             0xFFFFFE
+#define CEC_INVALID_VENDORID         0xFFFFFF
+
+#define CEC_MIN_HDMI_PORTNUMBER      1
+#define CEC_MAX_HDMI_PORTNUMBER      15
+#define CEC_HDMI_PORTNUMBER_NONE     0
+
 #define CEC_DEFAULT_SETTING_USE_TV_MENU_LANGUAGE      1
 #define CEC_DEFAULT_SETTING_ACTIVATE_SOURCE           1
 #define CEC_DEFAULT_SETTING_POWER_OFF_SHUTDOWN        1
@@ -86,11 +97,12 @@ namespace CEC {
 #define CEC_DEFAULT_SETTING_SEND_INACTIVE_SOURCE      1
 #define CEC_DEFAULT_SETTING_POWER_OFF_DEVICES_STANDBY 1
 #define CEC_DEFAULT_DEVICE_LANGUAGE                   "eng"
-#define CEC_DEFAULT_FIRMWARE_BUILD_DATE               0
+#define CEC_DEFAULT_SETTING_AUTODETECT_ADDRESS        1
+#define CEC_DEFAULT_SETTING_GET_SETTINGS_FROM_ROM     0
 
 #define CEC_DEFAULT_TRANSMIT_RETRY_WAIT 500
 #define CEC_DEFAULT_TRANSMIT_TIMEOUT    1000
-#define CEC_DEFAULT_TRANSMIT_WAIT       2000
+#define CEC_DEFAULT_TRANSMIT_WAIT       1000
 #define CEC_DEFAULT_TRANSMIT_RETRIES    1
 
 #define CEC_DEFAULT_CONNECT_TIMEOUT     10000
@@ -572,6 +584,15 @@ typedef enum cec_opcode
   CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST     = 0x70,
   CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS      = 0x7E,
   CEC_OPCODE_SET_AUDIO_RATE                = 0x9A,
+
+  /* CEC 1.4 */
+  CEC_OPCODE_START_ARC                     = 0xC0,
+  CEC_OPCODE_REPORT_ARC_STARTED            = 0xC1,
+  CEC_OPCODE_REPORT_ARC_ENDED              = 0xC2,
+  CEC_OPCODE_REQUEST_ARC_START             = 0xC3,
+  CEC_OPCODE_REQUEST_ARC_END               = 0xC4,
+  CEC_OPCODE_END_ARC                       = 0xC5,
+  CEC_OPCODE_CDC                           = 0xF8,
   /* when this opcode is set, no opcode will be sent to the device. this is one of the reserved numbers */
   CEC_OPCODE_NONE                          = 0xFD
 } cec_opcode;
@@ -887,6 +908,19 @@ typedef struct cec_device_type_list
   cec_device_type types[5]; /**< the list of device types */
 
 #ifdef __cplusplus
+  cec_device_type_list operator+ (const cec_device_type_list &other)
+  {
+    cec_device_type_list retVal;
+    for (unsigned int iPtr = 0; iPtr < 5; iPtr++)
+    {
+      if (other.types[iPtr] != CEC_DEVICE_TYPE_RESERVED)
+        retVal.Add(other.types[iPtr]);
+      if (types[iPtr] != CEC_DEVICE_TYPE_RESERVED)
+        retVal.Add(types[iPtr]);
+    }
+    return retVal;
+  }
+
   /*!
    * @deprecated Use Clear() instead.
    * @brief Clear this list.
@@ -929,7 +963,7 @@ typedef struct cec_device_type_list
    * @param type The type to check.
    * @return True when set, false otherwise.
    */
-  bool IsSet(cec_device_type type)
+  bool IsSet(const cec_device_type type) const
   {
     bool bReturn(false);
     for (unsigned int iPtr = 0; !bReturn && iPtr < 5; iPtr++)
@@ -982,12 +1016,15 @@ typedef struct cec_logical_addresses
   int                 addresses[16]; /**< the list of addresses */
 
 #ifdef __cplusplus
+  cec_logical_addresses(void)          { Clear(); }
+  virtual ~cec_logical_addresses(void) { Clear(); }
+
   /*!
    * @brief Clear this list.
    */
   void Clear(void)
   {
-    primary = CECDEVICE_UNKNOWN;
+    primary = CECDEVICE_UNREGISTERED;
     for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
       addresses[iPtr] = 0;
   }
@@ -997,7 +1034,7 @@ typedef struct cec_logical_addresses
    */
   bool IsEmpty(void) const
   {
-    return primary == CECDEVICE_UNKNOWN;
+    return primary == CECDEVICE_UNREGISTERED;
   }
 
   /*!
@@ -1019,7 +1056,7 @@ typedef struct cec_logical_addresses
    */
   void Set(cec_logical_address address)
   {
-    if (primary == CECDEVICE_UNKNOWN)
+    if (primary == CECDEVICE_UNREGISTERED)
       primary = address;
 
     addresses[(int) address] = 1;
@@ -1029,10 +1066,10 @@ typedef struct cec_logical_addresses
    * @brief Mark a logical address as 'unset'
    * @param address The logical address to remove from this list.
    */
-  void Unset(cec_logical_address address)
+  void Unset(const cec_logical_address address)
   {
     if (primary == address)
-      primary = CECDEVICE_UNKNOWN;
+      primary = CECDEVICE_UNREGISTERED;
 
     addresses[(int) address] = 0;
   }
@@ -1042,7 +1079,7 @@ typedef struct cec_logical_addresses
    * @param address The address to check.
    * @return True when set, false otherwise.
    */
-  bool IsSet(cec_logical_address address) const { return addresses[(int) address] == 1; }
+  bool IsSet(const cec_logical_address address) const { return addresses[(int) address] == 1; }
 
   /*!
    * @brief Check whether an address is set in this list.
@@ -1063,6 +1100,27 @@ typedef struct cec_logical_addresses
   {
     return !(*this == other);
   }
+
+  cec_logical_addresses operator+ (const cec_logical_addresses &other)
+  {
+    cec_logical_addresses retVal;
+    for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
+    {
+      if (other.IsSet((cec_logical_address)iPtr) || IsSet((cec_logical_address)iPtr))
+        retVal.Set((cec_logical_address)iPtr);
+    }
+    return retVal;
+  }
+
+  cec_logical_addresses &operator+= (const cec_logical_addresses &other)
+  {
+    for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
+    {
+      if (other.IsSet((cec_logical_address)iPtr))
+        Set((cec_logical_address)iPtr);
+    }
+    return *this;
+  }
 #endif
 } cec_logical_addresses;
 
@@ -1074,13 +1132,30 @@ typedef enum libcec_alert
 
 typedef enum libcec_parameter_type
 {
-  CEC_PARAMETER_TYPE_STRING
+  CEC_PARAMETER_TYPE_STRING,
+  CEC_PARAMETER_TYPE_UNKOWN
 } libcec_parameter_type;
 
 struct libcec_parameter
 {
   libcec_parameter_type paramType; /**< the type of this parameter */
   void*                 paramData; /**< the value of this parameter */
+
+#ifdef __cplusplus
+  libcec_parameter(void)
+  {
+    paramType = CEC_PARAMETER_TYPE_UNKOWN;
+    paramData = NULL;
+  }
+
+  libcec_parameter(const char *strMessage)
+  {
+    paramType = CEC_PARAMETER_TYPE_STRING;
+    paramData = (void*)strMessage;
+  }
+
+  virtual ~libcec_parameter(void) {}
+#endif
 };
 
 struct libcec_configuration;
@@ -1258,14 +1333,14 @@ typedef struct libcec_configuration
    */
   void Clear(void)
   {
-    iPhysicalAddress =                0;
+    iPhysicalAddress =                CEC_PHYSICAL_ADDRESS_TV;
     baseDevice = (cec_logical_address)CEC_DEFAULT_BASE_DEVICE;
     iHDMIPort =                       CEC_DEFAULT_HDMI_PORT;
     tvVendor =              (uint64_t)CEC_VENDOR_UNKNOWN;
     clientVersion =         (uint32_t)CEC_CLIENT_VERSION_PRE_1_5;
     serverVersion =         (uint32_t)CEC_SERVER_VERSION_PRE_1_5;
-    bAutodetectAddress =              1;
-    bGetSettingsFromROM =             0;
+    bAutodetectAddress =              CEC_DEFAULT_SETTING_AUTODETECT_ADDRESS;
+    bGetSettingsFromROM =             CEC_DEFAULT_SETTING_GET_SETTINGS_FROM_ROM;
     bUseTVMenuLanguage =              CEC_DEFAULT_SETTING_USE_TV_MENU_LANGUAGE;
     bActivateSource =                 CEC_DEFAULT_SETTING_ACTIVATE_SOURCE;
     bPowerOffScreensaver =            CEC_DEFAULT_SETTING_POWER_OFF_SCREENSAVER;
@@ -1275,7 +1350,7 @@ typedef struct libcec_configuration
     iFirmwareVersion =                CEC_FW_VERSION_UNKNOWN;
     bPowerOffDevicesOnStandby =       CEC_DEFAULT_SETTING_POWER_OFF_DEVICES_STANDBY;
     memcpy(strDeviceLanguage,         CEC_DEFAULT_DEVICE_LANGUAGE, 3);
-    iFirmwareBuildDate =              CEC_DEFAULT_FIRMWARE_BUILD_DATE;
+    iFirmwareBuildDate =              CEC_FW_BUILD_UNKNOWN;
 
     memset(strDeviceName, 0, 13);
     deviceTypes.clear();