X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=include%2Fcectypes.h;h=5d6144ae5aac2f7a0a93912b2bfcafe316e71b54;hb=09407b00af5cb2e296f416970990400e054df473;hp=cc0b57ee449877333c85e2b073e217c6c0808a0a;hpb=0b7822f9dbac67b733a7cbcb094535fe4a59a086;p=deb_libcec.git diff --git a/include/cectypes.h b/include/cectypes.h index cc0b57e..5d6144a 100644 --- a/include/cectypes.h +++ b/include/cectypes.h @@ -2,7 +2,7 @@ /* * This file is part of the libCEC(R) library. * - * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved. + * libCEC(R) is Copyright (C) 2011-2013 Pulse-Eight Limited. All rights reserved. * libCEC(R) is an original work, containing original code. * * libCEC(R) is a trademark of Pulse-Eight Limited. @@ -61,67 +61,284 @@ extern "C" { namespace CEC { #endif -//default physical address 1.0.0.0, HDMI port 1 +/*! + * default physical address 1.0.0.0, HDMI port 1 + */ #define CEC_DEFAULT_PHYSICAL_ADDRESS 0x1000 +/*! + * default HDMI port to which the adapter is connected, port 1 + */ #define CEC_DEFAULT_HDMI_PORT 1 +/*! + * default logical address of the device to which the adapter is connected, TV + */ #define CEC_DEFAULT_BASE_DEVICE 0 -#define MSGSTART 0xFF -#define MSGEND 0xFE -#define MSGESC 0xFD -#define ESCOFFSET 3 + +/*! + * timeout in milliseconds to send a key release event after receiving a key press + */ #define CEC_BUTTON_TIMEOUT 500 + +/*! + * don't send the same key twice within this timeout in milliseconds + */ +#define CEC_DOUBLE_TAP_TIMEOUT_MS 250 + +/*! + * don't query the power state for the same device within this timeout in milliseconds + */ #define CEC_POWER_STATE_REFRESH_TIME 30000 + +/*! + * unknown firmware version value + */ #define CEC_FW_VERSION_UNKNOWN 0xFFFF + +/*! + * unknown build date value + */ #define CEC_FW_BUILD_UNKNOWN 0 + +/*! + * maximum number of retries when opening a connection + */ #define CEC_CONNECT_TRIES 3 +/*! + * physical address of the TV + */ #define CEC_PHYSICAL_ADDRESS_TV 0 + +/*! + * minimum physical address for the adapter + */ #define CEC_MIN_PHYSICAL_ADDRESS 0x1000 + +/*! + * maximum physical address for the adapter + */ #define CEC_MAX_PHYSICAL_ADDRESS 0xFFFE + +/*! + * invalid physical address value + */ #define CEC_INVALID_PHYSICAL_ADDRESS 0xFFFF +/*! + * minimum vendor ID value + */ #define CEC_MIN_VENDORID 1 + +/*! + * maximum vendor ID value + */ #define CEC_MAX_VENDORID 0xFFFFFE + +/*! + * invalid vendor ID value + */ #define CEC_INVALID_VENDORID 0xFFFFFF +/*! + * minimum HDMI port number value + */ #define CEC_MIN_HDMI_PORTNUMBER 1 + +/*! + * maximum HDMI port number value + */ #define CEC_MAX_HDMI_PORTNUMBER 15 + +/*! + * invalid HDMI port number value + */ #define CEC_HDMI_PORTNUMBER_NONE 0 +/*! + * default value for settings "use tv menu language" + */ #define CEC_DEFAULT_SETTING_USE_TV_MENU_LANGUAGE 1 + +/*! + * default value for settings "activate source" + */ #define CEC_DEFAULT_SETTING_ACTIVATE_SOURCE 1 + +/*! + * default value for settings "power off on shutdown" + */ #define CEC_DEFAULT_SETTING_POWER_OFF_SHUTDOWN 1 + +/*! + * default value for settings "power off when activating the screensaver" + */ #define CEC_DEFAULT_SETTING_POWER_OFF_SCREENSAVER 1 + +/*! + * default value for settings "wake up when deactivating the screensaver" + */ +#define CEC_DEFAULT_SETTING_POWER_ON_SCREENSAVER 1 + +/*! + * default value for settings "power off on standby" + */ #define CEC_DEFAULT_SETTING_POWER_OFF_ON_STANDBY 1 + +/*! + * default value for settings "shutdown on standby" + */ #define CEC_DEFAULT_SETTING_SHUTDOWN_ON_STANDBY 0 + +/*! + * default value for settings "send inactive source when stopping" + */ #define CEC_DEFAULT_SETTING_SEND_INACTIVE_SOURCE 1 + +/*! + * default value for settings "power off devices when going to standby" + */ #define CEC_DEFAULT_SETTING_POWER_OFF_DEVICES_STANDBY 1 + +/*! + * default value for settings "device menu language" + */ #define CEC_DEFAULT_DEVICE_LANGUAGE "eng" + +/*! + * default value for settings "autodetect physical address" + */ #define CEC_DEFAULT_SETTING_AUTODETECT_ADDRESS 0 + +/*! + * default value for settings "get settings from ROM" + */ #define CEC_DEFAULT_SETTING_GET_SETTINGS_FROM_ROM 0 +/*! + * default value for settings "libCEC CEC version" + */ +#define CEC_DEFAULT_SETTING_CEC_VERSION 0x05 + +/*! + * wait this amount of milliseconds before retrying to send a failed message + */ #define CEC_DEFAULT_TRANSMIT_RETRY_WAIT 500 + +/*! + * transmission fails when not acked within this amount of milliseconds after sending the initial packet + */ #define CEC_DEFAULT_TRANSMIT_TIMEOUT 1000 + +/*! + * wait this amount of milliseconds for an ack + */ #define CEC_DEFAULT_TRANSMIT_WAIT 1000 + +/*! + * default number of retries + */ #define CEC_DEFAULT_TRANSMIT_RETRIES 1 +/*! + * default connection timeout in milliseconds + */ #define CEC_DEFAULT_CONNECT_TIMEOUT 10000 + +/*! + * wait this amount of milliseconds before retrying when failing to connect + */ #define CEC_DEFAULT_CONNECT_RETRY_WAIT 1000 + +/*! + * default serial baudrate + */ #define CEC_SERIAL_DEFAULT_BAUDRATE 38400 + +/*! + * maximum time to wait when clearing input + */ #define CEC_CLEAR_INPUT_DEFAULT_WAIT 1000 -#define CEC_MIN_LIB_VERSION 1 -#define CEC_LIB_VERSION_MAJOR 1 -#define CEC_LIB_VERSION_MAJOR_STR "1" -#define CEC_LIB_VERSION_MINOR 7 +/*! + * wait this amount of milliseconds before retrying when libCEC failed to make itself the active source + */ +#define CEC_ACTIVE_SOURCE_SWITCH_RETRY_TIME_MS 1000 + +/*! + * don't forward any power off command to the client application for this amount of milliseconds after sending a power off command + */ +#define CEC_FORWARD_STANDBY_MIN_INTERVAL 10000 + +/*! + * default timeout in milliseconds for combo keys + */ +#define CEC_DEFAULT_COMBO_TIMEOUT_MS 1000 + +/*! + * the virtual device path to use for the Raspberry Pi's CEC wire + */ +#define CEC_RPI_VIRTUAL_PATH "Raspberry Pi" + +/*! + * the name of the virtual COM port to use for the Raspberry Pi's CEC wire + */ +#define CEC_RPI_VIRTUAL_COM "RPI" + +/*! + * the path to use for the TDA995x's CEC wire + */ +#define CEC_TDA995x_PATH "/dev/hdmicec" + +/*! + * the name of the virtual COM port to use for the TDA995x's CEC wire + */ +#define CEC_TDA995x_VIRTUAL_COM "CuBox" + +/*! + * the path to use for the Exynos HDMI CEC device + */ +#define CEC_EXYNOS_PATH "/dev/CEC" + +/*! + * the name of the virtual COM port to use for the EXYNOS' CEC wire + */ +#define CEC_EXYNOS_VIRTUAL_COM "Exynos" + +/*! + * Mimimum client version + */ +#define CEC_MIN_LIB_VERSION 2 + +/*! + * libCEC's major version number + */ +#define CEC_LIB_VERSION_MAJOR 2 + +/*! + * libCEC's major version number as string + */ +#define CEC_LIB_VERSION_MAJOR_STR "2" + +/*! + * libCEC's minor version number + */ +#define CEC_LIB_VERSION_MINOR 1 + +#define MSGSTART 0xFF +#define MSGEND 0xFE +#define MSGESC 0xFD +#define ESCOFFSET 3 + +// defines to make compile time checks for certain features easy +#define CEC_FEATURE_CONFIGURABLE_COMBO_KEY 1 typedef enum cec_abort_reason { - CEC_ABORT_REASON_UNRECOGNIZED_OPCODE = 0, - CEC_ABORT_REASON_NOT_IN_CORRECT_MODE_TO_RESPOND = 1, - CEC_ABORT_REASON_CANNOT_PROVIDE_SOURCE = 2, - CEC_ABORT_REASON_INVALID_OPERAND = 3, - CEC_ABORT_REASON_REFUSED = 4 + CEC_ABORT_REASON_UNRECOGNIZED_OPCODE = 0,//!< CEC_ABORT_REASON_UNRECOGNIZED_OPCODE + CEC_ABORT_REASON_NOT_IN_CORRECT_MODE_TO_RESPOND = 1,//!< CEC_ABORT_REASON_NOT_IN_CORRECT_MODE_TO_RESPOND + CEC_ABORT_REASON_CANNOT_PROVIDE_SOURCE = 2,//!< CEC_ABORT_REASON_CANNOT_PROVIDE_SOURCE + CEC_ABORT_REASON_INVALID_OPERAND = 3,//!< CEC_ABORT_REASON_INVALID_OPERAND + CEC_ABORT_REASON_REFUSED = 4 //!< CEC_ABORT_REASON_REFUSED } cec_abort_reason; typedef enum cec_analogue_broadcast_type @@ -429,6 +646,13 @@ typedef enum cec_user_control_code CEC_USER_CONTROL_CODE_CONTENTS_MENU = 0x0B, CEC_USER_CONTROL_CODE_FAVORITE_MENU = 0x0C, CEC_USER_CONTROL_CODE_EXIT = 0x0D, + // reserved: 0x0E, 0x0F + CEC_USER_CONTROL_CODE_TOP_MENU = 0x10, + CEC_USER_CONTROL_CODE_DVD_MENU = 0x11, + // reserved: 0x12 ... 0x1C + CEC_USER_CONTROL_CODE_NUMBER_ENTRY_MODE = 0x1D, + CEC_USER_CONTROL_CODE_NUMBER11 = 0x1E, + CEC_USER_CONTROL_CODE_NUMBER12 = 0x1F, CEC_USER_CONTROL_CODE_NUMBER0 = 0x20, CEC_USER_CONTROL_CODE_NUMBER1 = 0x21, CEC_USER_CONTROL_CODE_NUMBER2 = 0x22, @@ -452,6 +676,7 @@ typedef enum cec_user_control_code CEC_USER_CONTROL_CODE_HELP = 0x36, CEC_USER_CONTROL_CODE_PAGE_UP = 0x37, CEC_USER_CONTROL_CODE_PAGE_DOWN = 0x38, + // reserved: 0x39 ... 0x3F CEC_USER_CONTROL_CODE_POWER = 0x40, CEC_USER_CONTROL_CODE_VOLUME_UP = 0x41, CEC_USER_CONTROL_CODE_VOLUME_DOWN = 0x42, @@ -467,12 +692,16 @@ typedef enum cec_user_control_code CEC_USER_CONTROL_CODE_BACKWARD = 0x4C, CEC_USER_CONTROL_CODE_STOP_RECORD = 0x4D, CEC_USER_CONTROL_CODE_PAUSE_RECORD = 0x4E, + // reserved: 0x4F CEC_USER_CONTROL_CODE_ANGLE = 0x50, CEC_USER_CONTROL_CODE_SUB_PICTURE = 0x51, CEC_USER_CONTROL_CODE_VIDEO_ON_DEMAND = 0x52, CEC_USER_CONTROL_CODE_ELECTRONIC_PROGRAM_GUIDE = 0x53, CEC_USER_CONTROL_CODE_TIMER_PROGRAMMING = 0x54, CEC_USER_CONTROL_CODE_INITIAL_CONFIGURATION = 0x55, + CEC_USER_CONTROL_CODE_SELECT_BROADCAST_TYPE = 0x56, + CEC_USER_CONTROL_CODE_SELECT_SOUND_PRESENTATION = 0x57, + // reserved: 0x58 ... 0x5F CEC_USER_CONTROL_CODE_PLAY_FUNCTION = 0x60, CEC_USER_CONTROL_CODE_PAUSE_PLAY_FUNCTION = 0x61, CEC_USER_CONTROL_CODE_RECORD_FUNCTION = 0x62, @@ -487,16 +716,18 @@ typedef enum cec_user_control_code CEC_USER_CONTROL_CODE_POWER_TOGGLE_FUNCTION = 0x6B, CEC_USER_CONTROL_CODE_POWER_OFF_FUNCTION = 0x6C, CEC_USER_CONTROL_CODE_POWER_ON_FUNCTION = 0x6D, + // reserved: 0x6E ... 0x70 CEC_USER_CONTROL_CODE_F1_BLUE = 0x71, CEC_USER_CONTROL_CODE_F2_RED = 0X72, CEC_USER_CONTROL_CODE_F3_GREEN = 0x73, CEC_USER_CONTROL_CODE_F4_YELLOW = 0x74, CEC_USER_CONTROL_CODE_F5 = 0x75, CEC_USER_CONTROL_CODE_DATA = 0x76, - CEC_USER_CONTROL_CODE_AN_RETURN = 0x91, - CEC_USER_CONTROL_CODE_AN_CHANNELS_LIST = 0x96, + // reserved: 0x77 ... 0xFF + CEC_USER_CONTROL_CODE_AN_RETURN = 0x91, // return (Samsung) + CEC_USER_CONTROL_CODE_AN_CHANNELS_LIST = 0x96, // channels list (Samsung) CEC_USER_CONTROL_CODE_MAX = 0x96, - CEC_USER_CONTROL_CODE_UNKNOWN + CEC_USER_CONTROL_CODE_UNKNOWN = 0xFF } cec_user_control_code; typedef enum cec_logical_address @@ -608,52 +839,6 @@ typedef enum cec_log_level CEC_LOG_ALL = 31 } cec_log_level; -typedef enum cec_adapter_messagecode -{ - MSGCODE_NOTHING = 0, - MSGCODE_PING, - MSGCODE_TIMEOUT_ERROR, - MSGCODE_HIGH_ERROR, - MSGCODE_LOW_ERROR, - MSGCODE_FRAME_START, - MSGCODE_FRAME_DATA, - MSGCODE_RECEIVE_FAILED, - MSGCODE_COMMAND_ACCEPTED, - MSGCODE_COMMAND_REJECTED, - MSGCODE_SET_ACK_MASK, - MSGCODE_TRANSMIT, - MSGCODE_TRANSMIT_EOM, - MSGCODE_TRANSMIT_IDLETIME, - MSGCODE_TRANSMIT_ACK_POLARITY, - MSGCODE_TRANSMIT_LINE_TIMEOUT, - MSGCODE_TRANSMIT_SUCCEEDED, - MSGCODE_TRANSMIT_FAILED_LINE, - MSGCODE_TRANSMIT_FAILED_ACK, - MSGCODE_TRANSMIT_FAILED_TIMEOUT_DATA, - MSGCODE_TRANSMIT_FAILED_TIMEOUT_LINE, - MSGCODE_FIRMWARE_VERSION, - MSGCODE_START_BOOTLOADER, - MSGCODE_GET_BUILDDATE, - MSGCODE_SET_CONTROLLED, - MSGCODE_GET_AUTO_ENABLED, - MSGCODE_SET_AUTO_ENABLED, - MSGCODE_GET_DEFAULT_LOGICAL_ADDRESS, - MSGCODE_SET_DEFAULT_LOGICAL_ADDRESS, - MSGCODE_GET_LOGICAL_ADDRESS_MASK, - MSGCODE_SET_LOGICAL_ADDRESS_MASK, - MSGCODE_GET_PHYSICAL_ADDRESS, - MSGCODE_SET_PHYSICAL_ADDRESS, - MSGCODE_GET_DEVICE_TYPE, - MSGCODE_SET_DEVICE_TYPE, - MSGCODE_GET_HDMI_VERSION, - MSGCODE_SET_HDMI_VERSION, - MSGCODE_GET_OSD_NAME, - MSGCODE_SET_OSD_NAME, - MSGCODE_WRITE_EEPROM, - MSGCODE_FRAME_EOM = 0x80, - MSGCODE_FRAME_ACK = 0x40, -} cec_adapter_messagecode; - typedef enum cec_bus_device_status { CEC_DEVICE_STATUS_UNKNOWN, @@ -664,18 +849,44 @@ typedef enum cec_bus_device_status typedef enum cec_vendor_id { - CEC_VENDOR_SAMSUNG = 0x0000F0, - CEC_VENDOR_LG = 0x00E091, - CEC_VENDOR_PANASONIC = 0x008045, - CEC_VENDOR_PIONEER = 0x00E036, - CEC_VENDOR_ONKYO = 0x0009B0, - CEC_VENDOR_YAMAHA = 0x00A0DE, - CEC_VENDOR_PHILIPS = 0x00903E, - CEC_VENDOR_SONY = 0x080046, - CEC_VENDOR_TOSHIBA = 0x000039, - CEC_VENDOR_UNKNOWN = 0 + CEC_VENDOR_TOSHIBA = 0x000039, + CEC_VENDOR_SAMSUNG = 0x0000F0, + CEC_VENDOR_DENON = 0x0005CD, + CEC_VENDOR_MARANTZ = 0x000678, + CEC_VENDOR_LOEWE = 0x000982, + CEC_VENDOR_ONKYO = 0x0009B0, + CEC_VENDOR_MEDION = 0x000CB8, + CEC_VENDOR_TOSHIBA2 = 0x000CE7, + CEC_VENDOR_PULSE_EIGHT = 0x001582, + CEC_VENDOR_HARMAN_KARDON2 = 0x001950, + CEC_VENDOR_AKAI = 0x0020C7, + CEC_VENDOR_AOC = 0x002467, + CEC_VENDOR_PANASONIC = 0x008045, + CEC_VENDOR_PHILIPS = 0x00903E, + CEC_VENDOR_DAEWOO = 0x009053, + CEC_VENDOR_YAMAHA = 0x00A0DE, + CEC_VENDOR_GRUNDIG = 0x00D0D5, + CEC_VENDOR_PIONEER = 0x00E036, + CEC_VENDOR_LG = 0x00E091, + CEC_VENDOR_SHARP = 0x08001F, + CEC_VENDOR_SONY = 0x080046, + CEC_VENDOR_BROADCOM = 0x18C086, + CEC_VENDOR_VIZIO = 0x6B746D, + CEC_VENDOR_BENQ = 0x8065E9, + CEC_VENDOR_HARMAN_KARDON = 0x9C645E, + CEC_VENDOR_UNKNOWN = 0 } cec_vendor_id; +typedef enum cec_adapter_type +{ + ADAPTERTYPE_UNKNOWN = 0, + ADAPTERTYPE_P8_EXTERNAL = 0x1, + ADAPTERTYPE_P8_DAUGHTERBOARD = 0x2, + ADAPTERTYPE_RPI = 0x100, + ADAPTERTYPE_TDA995x = 0x200, + ADAPTERTYPE_EXYNOS = 0x300 +} cec_adapter_type; + typedef struct cec_menu_language { char language[4]; /**< the iso language code. @bug the language code is only 3 chars long, not 4. will be changed in v2.0, because changing it now would break backwards compat */ @@ -707,6 +918,18 @@ typedef struct cec_adapter char comm[1024]; /**< the name of the com port */ } cec_adapter; +typedef struct cec_adapter_descriptor +{ + char strComPath[1024]; /**< the path to the com port */ + char strComName[1024]; /**< the name of the com port */ + uint16_t iVendorId; + uint16_t iProductId; + uint16_t iFirmwareVersion; + uint16_t iPhysicalAddress; + uint32_t iFirmwareBuildDate; + cec_adapter_type adapterType; +} cec_adapter_descriptor; + typedef struct cec_datapacket { uint8_t data[100]; /**< the actual data */ @@ -722,6 +945,16 @@ typedef struct cec_datapacket return *this; } + bool operator ==(const struct cec_datapacket& packet) const + { + if (size != packet.size) + return false; + for (uint8_t iPtr = 0; iPtr < size; iPtr++) + if (packet.data[iPtr] != data[iPtr]) + return false; + return true; + } + bool IsEmpty(void) const { return size == 0; } /**< @return True when this packet is empty, false otherwise. */ bool IsFull(void) const { return size == 100; } /**< @return True when this packet is false, false otherwise. */ @@ -915,18 +1148,6 @@ typedef struct cec_device_type_list cec_device_type types[5]; /**< the list of device types */ #ifdef __cplusplus - /*! - * @deprecated Use Clear() instead. - * @brief Clear this list. - */ - void clear(void) { Clear(); } - /*! - * @deprecated Use Add() instead. - * @brief Add a type to this list. - * @param type The type to add. - */ - void add(const cec_device_type type) { Add(type); } - /*! * @brief Clear this list. */ @@ -1099,7 +1320,9 @@ typedef enum libcec_alert CEC_ALERT_SERVICE_DEVICE, CEC_ALERT_CONNECTION_LOST, CEC_ALERT_PERMISSION_ERROR, - CEC_ALERT_PORT_BUSY + CEC_ALERT_PORT_BUSY, + CEC_ALERT_PHYSICAL_ADDRESS_ERROR, + CEC_ALERT_TV_POLL_FAILED } libcec_alert; typedef enum libcec_parameter_type @@ -1108,20 +1331,21 @@ typedef enum libcec_parameter_type CEC_PARAMETER_TYPE_UNKOWN } libcec_parameter_type; -struct libcec_parameter +typedef struct libcec_parameter { libcec_parameter_type paramType; /**< the type of this parameter */ void* paramData; /**< the value of this parameter */ -}; +} libcec_parameter; -struct libcec_configuration; +typedef struct libcec_configuration libcec_configuration; -typedef int (CEC_CDECL* CBCecLogMessageType)(void *param, const cec_log_message &); -typedef int (CEC_CDECL* CBCecKeyPressType)(void *param, const cec_keypress &); -typedef int (CEC_CDECL* CBCecCommandType)(void *param, const cec_command &); -typedef int (CEC_CDECL* CBCecConfigurationChangedType)(void *param, const libcec_configuration &); -typedef int (CEC_CDECL* CBCecAlertType)(void *param, const libcec_alert, const libcec_parameter &); -typedef int (CEC_CDECL* CBCecMenuStateChangedType)(void *param, const cec_menu_state); +typedef int (CEC_CDECL* CBCecLogMessageType)(void*, const cec_log_message); +typedef int (CEC_CDECL* CBCecKeyPressType)(void*, const cec_keypress); +typedef int (CEC_CDECL* CBCecCommandType)(void*, const cec_command); +typedef int (CEC_CDECL* CBCecConfigurationChangedType)(void*, const libcec_configuration); +typedef int (CEC_CDECL* CBCecAlertType)(void*, const libcec_alert, const libcec_parameter); +typedef int (CEC_CDECL* CBCecMenuStateChangedType)(void*, const cec_menu_state); +typedef void (CEC_CDECL* CBCecSourceActivatedType)(void*, const cec_logical_address, const uint8_t); typedef struct ICECCallbacks { @@ -1172,6 +1396,13 @@ typedef struct ICECCallbacks */ CBCecMenuStateChangedType CBCecMenuStateChanged; + /*! + * @brief Called when a source that's handled by this client is activated. + * @param logicalAddress The address that was just activated. + * @param bActivated 1 when activated, 0 when deactivated. + */ + CBCecSourceActivatedType CBCecSourceActivated; + #ifdef __cplusplus ICECCallbacks(void) { Clear(); } ~ICECCallbacks(void) { Clear(); }; @@ -1184,6 +1415,7 @@ typedef struct ICECCallbacks CBCecConfigurationChanged = NULL; CBCecAlert = NULL; CBCecMenuStateChanged = NULL; + CBCecSourceActivated = NULL; } #endif } ICECCallbacks; @@ -1199,7 +1431,26 @@ typedef enum cec_client_version CEC_CLIENT_VERSION_1_6_1 = 0x1601, CEC_CLIENT_VERSION_1_6_2 = 0x1602, CEC_CLIENT_VERSION_1_6_3 = 0x1603, - CEC_CLIENT_VERSION_1_7_0 = 0x1700 + CEC_CLIENT_VERSION_1_7_0 = 0x1700, + CEC_CLIENT_VERSION_1_7_1 = 0x1701, + CEC_CLIENT_VERSION_1_7_2 = 0x1702, + CEC_CLIENT_VERSION_1_8_0 = 0x1800, + CEC_CLIENT_VERSION_1_8_1 = 0x1801, + CEC_CLIENT_VERSION_1_8_2 = 0x1802, + CEC_CLIENT_VERSION_1_9_0 = 0x1900, + CEC_CLIENT_VERSION_1_99_0 = 0x1990, + CEC_CLIENT_VERSION_2_0_0 = 0x2000, + CEC_CLIENT_VERSION_2_0_1 = 0x2001, + CEC_CLIENT_VERSION_2_0_2 = 0x2002, + CEC_CLIENT_VERSION_2_0_3 = 0x2003, + CEC_CLIENT_VERSION_2_0_4 = 0x2004, + CEC_CLIENT_VERSION_2_0_5 = 0x2005, + CEC_CLIENT_VERSION_2_1_0 = 0x2100, + CEC_CLIENT_VERSION_2_1_1 = 0x2101, + CEC_CLIENT_VERSION_2_1_2 = 0x2102, + CEC_CLIENT_VERSION_2_1_3 = 0x2103, + CEC_CLIENT_VERSION_2_1_4 = 0x2104, + CEC_CLIENT_VERSION_CURRENT = 0x2104 } cec_client_version; typedef enum cec_server_version @@ -1213,21 +1464,40 @@ typedef enum cec_server_version CEC_SERVER_VERSION_1_6_1 = 0x1601, CEC_SERVER_VERSION_1_6_2 = 0x1602, CEC_SERVER_VERSION_1_6_3 = 0x1603, - CEC_SERVER_VERSION_1_7_0 = 0x1700 + CEC_SERVER_VERSION_1_7_0 = 0x1700, + CEC_SERVER_VERSION_1_7_1 = 0x1701, + CEC_SERVER_VERSION_1_7_2 = 0x1702, + CEC_SERVER_VERSION_1_8_0 = 0x1800, + CEC_SERVER_VERSION_1_8_1 = 0x1801, + CEC_SERVER_VERSION_1_8_2 = 0x1802, + CEC_SERVER_VERSION_1_9_0 = 0x1900, + CEC_SERVER_VERSION_1_99_0 = 0x1990, + CEC_SERVER_VERSION_2_0_0 = 0x2000, + CEC_SERVER_VERSION_2_0_1 = 0x2001, + CEC_SERVER_VERSION_2_0_2 = 0x2002, + CEC_SERVER_VERSION_2_0_3 = 0x2003, + CEC_SERVER_VERSION_2_0_4 = 0x2004, + CEC_SERVER_VERSION_2_0_5 = 0x2005, + CEC_SERVER_VERSION_2_1_0 = 0x2100, + CEC_SERVER_VERSION_2_1_1 = 0x2101, + CEC_SERVER_VERSION_2_1_2 = 0x2102, + CEC_SERVER_VERSION_2_1_3 = 0x2103, + CEC_SERVER_VERSION_2_1_4 = 0x2104, + CEC_SERVER_VERSION_CURRENT = 0x2104 } cec_server_version; -typedef struct libcec_configuration +struct libcec_configuration { 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 */ + char strDeviceName[13]; /*!< the device name to use on the CEC bus */ + cec_device_type_list deviceTypes; /*!< the device type(s) to use on the CEC bus for libCEC */ uint8_t bAutodetectAddress; /*!< (read only) set to 1 by libCEC when the physical address was autodetected */ - 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 */ + 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 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 or when the adapter doesn't support autodetection */ 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 */ + cec_logical_addresses wakeDevices; /*!< list of devices to wake when initialising libCEC or when calling PowerOnDevices() without any parameter. */ + cec_logical_addresses powerOffDevices; /*!< list of devices to power off when calling StandbyDevices() without any parameter. */ uint32_t serverVersion; /*!< the version number of the server. read-only */ @@ -1236,6 +1506,7 @@ typedef struct libcec_configuration uint8_t bUseTVMenuLanguage; /*!< use the menu language of the TV in the player application */ uint8_t bActivateSource; /*!< make libCEC the active source on the bus when starting the player application */ uint8_t bPowerOffScreensaver; /*!< put devices in standby mode when activating the screensaver */ + uint8_t bPowerOnScreensaver; /*!< wake devices when deactivating the screensaver */ uint8_t bPowerOffOnStandby; /*!< put this PC in standby mode when the TV is switched off. only used when bShutdownOnStandby = 0 */ uint8_t bSendInactiveSource; /*!< send an 'inactive source' message when stopping the player. added in 1.5.1 */ @@ -1249,6 +1520,11 @@ typedef struct libcec_configuration char strDeviceLanguage[3]; /*!< the menu language used by the client. 3 character ISO 639-2 country code. see http://http://www.loc.gov/standards/iso639-2/ added in 1.6.2 */ uint32_t iFirmwareBuildDate; /*!< (read-only) the build date of the firmware, in seconds since epoch. if not available, this value will be set to 0. added in 1.6.2 */ uint8_t bMonitorOnly; /*!< won't allocate a CCECClient when starting the connection when set (same as monitor mode). added in 1.6.3 */ + cec_version cecVersion; /*!< CEC spec version to use by libCEC. defaults to v1.4. added in 1.8.0 */ + cec_adapter_type adapterType; /*!< type of the CEC adapter that we're connected to. added in 1.8.2 */ + uint8_t iDoubleTapTimeoutMs; /*!< prevent double taps withing this timeout. defaults to 200ms. added in 2.0.0 */ + cec_user_control_code comboKey; /*!< key code that initiates combo keys. defaults to CEC_USER_CONTROL_CODE_F1_BLUE. CEC_USER_CONTROL_CODE_UNKNOWN to disable. added in 2.0.5 */ + uint32_t iComboKeyTimeoutMs; /*!< timeout until the combo key is sent as normal keypress */ #ifdef __cplusplus libcec_configuration(void) { Clear(); } @@ -1256,34 +1532,36 @@ typedef struct libcec_configuration bool operator==(const libcec_configuration &other) const { - return ( clientVersion == other.clientVersion && - !strncmp(strDeviceName, other.strDeviceName, 13) && - deviceTypes == other.deviceTypes && - bAutodetectAddress == other.bAutodetectAddress && - iPhysicalAddress == other.iPhysicalAddress && - baseDevice == other.baseDevice && - iHDMIPort == other.iHDMIPort && - tvVendor == other.tvVendor && - wakeDevices == other.wakeDevices && - powerOffDevices == other.powerOffDevices && - serverVersion == other.serverVersion && - bGetSettingsFromROM == other.bGetSettingsFromROM && - bUseTVMenuLanguage == other.bUseTVMenuLanguage && - bActivateSource == other.bActivateSource && - bPowerOffScreensaver == other.bPowerOffScreensaver && - bPowerOffOnStandby == other.bPowerOffOnStandby && - bSendInactiveSource == other.bSendInactiveSource && - /* libcec 1.5.3+ */ - (other.clientVersion < CEC_CLIENT_VERSION_1_5_3 || logicalAddresses == other.logicalAddresses) && - /* libcec 1.6.0+ */ - (other.clientVersion < CEC_CLIENT_VERSION_1_6_0 || iFirmwareVersion == other.iFirmwareVersion) && - (other.clientVersion < CEC_CLIENT_VERSION_1_6_0 || bPowerOffDevicesOnStandby == other.bPowerOffDevicesOnStandby) && - (other.clientVersion < CEC_CLIENT_VERSION_1_6_0 || bShutdownOnStandby == other.bShutdownOnStandby) && - /* libcec 1.6.2+ */ - (other.clientVersion < CEC_CLIENT_VERSION_1_6_2 || !strncmp(strDeviceLanguage, other.strDeviceLanguage, 3)) && - (other.clientVersion < CEC_CLIENT_VERSION_1_6_2 || iFirmwareBuildDate == other.iFirmwareBuildDate) && - /* libcec 1.6.3+ */ - (other.clientVersion < CEC_CLIENT_VERSION_1_6_3 || bMonitorOnly == other.bMonitorOnly)); + return ( clientVersion == other.clientVersion && + !strncmp(strDeviceName, other.strDeviceName, 13) && + deviceTypes == other.deviceTypes && + bAutodetectAddress == other.bAutodetectAddress && + iPhysicalAddress == other.iPhysicalAddress && + baseDevice == other.baseDevice && + iHDMIPort == other.iHDMIPort && + tvVendor == other.tvVendor && + wakeDevices == other.wakeDevices && + powerOffDevices == other.powerOffDevices && + serverVersion == other.serverVersion && + bGetSettingsFromROM == other.bGetSettingsFromROM && + bUseTVMenuLanguage == other.bUseTVMenuLanguage && + bActivateSource == other.bActivateSource && + bPowerOffScreensaver == other.bPowerOffScreensaver && + bPowerOffOnStandby == other.bPowerOffOnStandby && + bSendInactiveSource == other.bSendInactiveSource && + logicalAddresses == other.logicalAddresses && + iFirmwareVersion == other.iFirmwareVersion && + bPowerOffDevicesOnStandby == other.bPowerOffDevicesOnStandby && + bShutdownOnStandby == other.bShutdownOnStandby && + !strncmp(strDeviceLanguage, other.strDeviceLanguage, 3) && + iFirmwareBuildDate == other.iFirmwareBuildDate && + bMonitorOnly == other.bMonitorOnly && + cecVersion == other.cecVersion && + adapterType == other.adapterType && + iDoubleTapTimeoutMs == other.iDoubleTapTimeoutMs && + (other.clientVersion <= CEC_CLIENT_VERSION_2_0_4 || comboKey == other.comboKey) && + (other.clientVersion <= CEC_CLIENT_VERSION_2_0_4 || iComboKeyTimeoutMs == other.iComboKeyTimeoutMs) && + (other.clientVersion < CEC_CLIENT_VERSION_2_1_0 || bPowerOnScreensaver == other.bPowerOnScreensaver)); } bool operator!=(const libcec_configuration &other) const @@ -1300,13 +1578,14 @@ typedef struct libcec_configuration 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; + clientVersion = (uint32_t)CEC_CLIENT_VERSION_CURRENT; + serverVersion = (uint32_t)CEC_SERVER_VERSION_CURRENT; bAutodetectAddress = 0; 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; + bPowerOnScreensaver = CEC_DEFAULT_SETTING_POWER_ON_SCREENSAVER; bPowerOffOnStandby = CEC_DEFAULT_SETTING_POWER_OFF_ON_STANDBY; bShutdownOnStandby = CEC_DEFAULT_SETTING_SHUTDOWN_ON_STANDBY; bSendInactiveSource = CEC_DEFAULT_SETTING_SEND_INACTIVE_SOURCE; @@ -1315,9 +1594,14 @@ typedef struct libcec_configuration memcpy(strDeviceLanguage, CEC_DEFAULT_DEVICE_LANGUAGE, 3); iFirmwareBuildDate = CEC_FW_BUILD_UNKNOWN; bMonitorOnly = 0; + cecVersion = (cec_version)CEC_DEFAULT_SETTING_CEC_VERSION; + adapterType = ADAPTERTYPE_UNKNOWN; + iDoubleTapTimeoutMs = CEC_DOUBLE_TAP_TIMEOUT_MS; + comboKey = CEC_USER_CONTROL_CODE_STOP; + iComboKeyTimeoutMs = CEC_DEFAULT_COMBO_TIMEOUT_MS; memset(strDeviceName, 0, 13); - deviceTypes.clear(); + deviceTypes.Clear(); logicalAddresses.Clear(); wakeDevices.Clear(); powerOffDevices.Clear(); @@ -1333,16 +1617,7 @@ typedef struct libcec_configuration callbacks = NULL; } #endif -} libcec_configuration; - -#ifdef UNUSED -#elif defined(__GNUC__) -#define UNUSED(x) UNUSED_ ## x __attribute__((unused)) -#elif defined(__LCLINT__) -#define UNUSED(x) /*@unused@*/ x -#else -#define UNUSED(x) x -#endif +}; #ifdef __cplusplus };