#pragma once
#ifndef CECTYPES_H_
#define CECTYPES_H_
#include "version.h"
#include <stdint.h>
#include <string.h>
#if defined(_WIN32) || defined(_WIN64) || defined(_M_ARM64)
#define CEC_CDECL __cdecl
#else
#define CEC_CDECL
#endif
#if !defined(DECLSPEC)
#if defined(_WIN32) || defined(_WIN64) || defined(_M_ARM64)
#include <windows.h>
#if defined DLL_EXPORT
#define DECLSPEC __declspec(dllexport)
#else
#define DECLSPEC __declspec(dllimport)
#endif
#else
#define DECLSPEC
#endif
#endif
#ifdef __cplusplus
#include <string>
extern "C" {
namespace CEC {
#endif
#define CEC_DEFAULT_PHYSICAL_ADDRESS 0x1000
#define CEC_DEFAULT_HDMI_PORT 1
#define CEC_DEFAULT_BASE_DEVICE 0
#define CEC_BUTTON_TIMEOUT 500
#define CEC_DOUBLE_TAP_TIMEOUT_MS 200
#define CEC_POWER_STATE_REFRESH_TIME 30000
#define CEC_AUDIO_STATUS_REFRESH_TIME 200
#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_ACTIVATE_SOURCE 1
#define CEC_DEFAULT_SETTING_POWER_OFF_SHUTDOWN 1
#define CEC_DEFAULT_SETTING_POWER_OFF_ON_STANDBY 1
#define CEC_DEFAULT_DEVICE_LANGUAGE "eng"
#define CEC_DEFAULT_SETTING_AUTODETECT_ADDRESS 0
#define CEC_DEFAULT_SETTING_GET_SETTINGS_FROM_ROM 0
#define CEC_DEFAULT_SETTING_CEC_VERSION 0x05
#define CEC_DEFAULT_TRANSMIT_RETRY_WAIT 500
#define CEC_DEFAULT_TRANSMIT_TIMEOUT 1000
#define CEC_DEFAULT_TRANSMIT_WAIT 1000
#define CEC_DEFAULT_TRANSMIT_RETRIES 1
#define CEC_DEFAULT_CONNECT_TIMEOUT 10000
#define CEC_DEFAULT_CONNECT_RETRY_WAIT 1000
#define CEC_SERIAL_DEFAULT_BAUDRATE 38400
#define CEC_CLEAR_INPUT_DEFAULT_WAIT 1000
#define CEC_ACTIVE_SOURCE_SWITCH_RETRY_TIME_MS 1000
#define CEC_FORWARD_STANDBY_MIN_INTERVAL 10000
#define CEC_DEFAULT_COMBO_TIMEOUT_MS 1000
#define CEC_RPI_VIRTUAL_PATH "Raspberry Pi"
#define CEC_RPI_VIRTUAL_COM "RPI"
#define CEC_TDA995x_PATH "/dev/hdmicec"
#define CEC_TDA995x_VIRTUAL_COM "CuBox"
#define CEC_EXYNOS_PATH "/dev/CEC"
#define CEC_EXYNOS_VIRTUAL_COM "Exynos"
#define CEC_MAX_DATA_PACKET_SIZE (16 * 4)
#define CEC_LINUX_PATH "/dev/cec0"
#define CEC_LINUX_VIRTUAL_COM "Linux"
#define CEC_AOCEC_PATH "/dev/aocec"
#define CEC_AOCEC_VIRTUAL_COM "AOCEC"
#define CEC_IMX_PATH "/dev/mxc_hdmi_cec"
#define CEC_IMX_VIRTUAL_COM "i.MX"
#define CEC_MIN_LIB_VERSION 4
#define MSGSTART 0xFF
#define MSGEND 0xFE
#define MSGESC 0xFD
#define ESCOFFSET 3
#define DOUBLE_TAP_TIMEOUT_UNIT_SIZE (50)
#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;
typedef enum cec_analogue_broadcast_type
{
CEC_ANALOGUE_BROADCAST_TYPE_CABLE = 0x00,
CEC_ANALOGUE_BROADCAST_TYPE_SATELLITE = 0x01,
CEC_ANALOGUE_BROADCAST_TYPE_TERRESTIAL = 0x02
} cec_analogue_broadcast_type;
typedef enum cec_audio_rate
{
CEC_AUDIO_RATE_RATE_CONTROL_OFF = 0,
CEC_AUDIO_RATE_STANDARD_RATE_100 = 1,
CEC_AUDIO_RATE_FAST_RATE_MAX_101 = 2,
CEC_AUDIO_RATE_SLOW_RATE_MIN_99 = 3,
CEC_AUDIO_RATE_STANDARD_RATE_100_0 = 4,
CEC_AUDIO_RATE_FAST_RATE_MAX_100_1 = 5,
CEC_AUDIO_RATE_SLOW_RATE_MIN_99_9 = 6
} cec_audio_rate;
typedef enum cec_audio_status
{
CEC_AUDIO_MUTE_STATUS_MASK = 0x80,
CEC_AUDIO_VOLUME_STATUS_MASK = 0x7F,
CEC_AUDIO_VOLUME_MIN = 0x00,
CEC_AUDIO_VOLUME_MAX = 0x64,
CEC_AUDIO_VOLUME_STATUS_UNKNOWN = 0x7F
} cec_audio_status;
typedef enum cec_boolean
{
CEC_FALSE = 0,
CEC_TRUE = 1
} cec_boolean;
typedef enum cec_version
{
CEC_VERSION_UNKNOWN = 0x00,
CEC_VERSION_1_2 = 0x01,
CEC_VERSION_1_2A = 0x02,
CEC_VERSION_1_3 = 0x03,
CEC_VERSION_1_3A = 0x04,
CEC_VERSION_1_4 = 0x05,
CEC_VERSION_2_0 = 0x06,
} cec_version;
typedef enum cec_channel_identifier
{
CEC_CHANNEL_NUMBER_FORMAT_MASK = 0xFC000000,
CEC_1_PART_CHANNEL_NUMBER = 0x04000000,
CEC_2_PART_CHANNEL_NUMBER = 0x08000000,
CEC_MAJOR_CHANNEL_NUMBER_MASK = 0x3FF0000,
CEC_MINOR_CHANNEL_NUMBER_MASK = 0xFFFF
} cec_channel_identifier;
typedef enum cec_deck_control_mode
{
CEC_DECK_CONTROL_MODE_SKIP_FORWARD_WIND = 1,
CEC_DECK_CONTROL_MODE_SKIP_REVERSE_REWIND = 2,
CEC_DECK_CONTROL_MODE_STOP = 3,
CEC_DECK_CONTROL_MODE_EJECT = 4
} cec_deck_control_mode;
typedef enum cec_deck_info
{
CEC_DECK_INFO_PLAY = 0x11,
CEC_DECK_INFO_RECORD = 0x12,
CEC_DECK_INFO_PLAY_REVERSE = 0x13,
CEC_DECK_INFO_STILL = 0x14,
CEC_DECK_INFO_SLOW = 0x15,
CEC_DECK_INFO_SLOW_REVERSE = 0x16,
CEC_DECK_INFO_FAST_FORWARD = 0x17,
CEC_DECK_INFO_FAST_REVERSE = 0x18,
CEC_DECK_INFO_NO_MEDIA = 0x19,
CEC_DECK_INFO_STOP = 0x1A,
CEC_DECK_INFO_SKIP_FORWARD_WIND = 0x1B,
CEC_DECK_INFO_SKIP_REVERSE_REWIND = 0x1C,
CEC_DECK_INFO_INDEX_SEARCH_FORWARD = 0x1D,
CEC_DECK_INFO_INDEX_SEARCH_REVERSE = 0x1E,
CEC_DECK_INFO_OTHER_STATUS = 0x1F,
CEC_DECK_INFO_OTHER_STATUS_LG = 0x20
} cec_deck_info;
typedef enum cec_device_type
{
CEC_DEVICE_TYPE_TV = 0,
CEC_DEVICE_TYPE_RECORDING_DEVICE = 1,
CEC_DEVICE_TYPE_RESERVED = 2,
CEC_DEVICE_TYPE_TUNER = 3,
CEC_DEVICE_TYPE_PLAYBACK_DEVICE = 4,
CEC_DEVICE_TYPE_AUDIO_SYSTEM = 5
} cec_device_type;
typedef enum cec_display_control
{
CEC_DISPLAY_CONTROL_DISPLAY_FOR_DEFAULT_TIME = 0x00,
CEC_DISPLAY_CONTROL_DISPLAY_UNTIL_CLEARED = 0x40,
CEC_DISPLAY_CONTROL_CLEAR_PREVIOUS_MESSAGE = 0x80,
CEC_DISPLAY_CONTROL_RESERVED_FOR_FUTURE_USE = 0xC0
} cec_display_control;
typedef enum cec_external_source_specifier
{
CEC_EXTERNAL_SOURCE_SPECIFIER_EXTERNAL_PLUG = 4,
CEC_EXTERNAL_SOURCE_SPECIFIER_EXTERNAL_PHYSICAL_ADDRESS = 5
} cec_external_source_specifier;
typedef enum cec_menu_request_type
{
CEC_MENU_REQUEST_TYPE_ACTIVATE = 0,
CEC_MENU_REQUEST_TYPE_DEACTIVATE = 1,
CEC_MENU_REQUEST_TYPE_QUERY = 2
} cec_menu_request_type;
typedef enum cec_menu_state
{
CEC_MENU_STATE_ACTIVATED = 0,
CEC_MENU_STATE_DEACTIVATED = 1
} cec_menu_state;
typedef enum cec_play_mode
{
CEC_PLAY_MODE_PLAY_FORWARD = 0x24,
CEC_PLAY_MODE_PLAY_REVERSE = 0x20,
CEC_PLAY_MODE_PLAY_STILL = 0x25,
CEC_PLAY_MODE_FAST_FORWARD_MIN_SPEED = 0x05,
CEC_PLAY_MODE_FAST_FORWARD_MEDIUM_SPEED = 0x06,
CEC_PLAY_MODE_FAST_FORWARD_MAX_SPEED = 0x07,
CEC_PLAY_MODE_FAST_REVERSE_MIN_SPEED = 0x09,
CEC_PLAY_MODE_FAST_REVERSE_MEDIUM_SPEED = 0x0A,
CEC_PLAY_MODE_FAST_REVERSE_MAX_SPEED = 0x0B,
CEC_PLAY_MODE_SLOW_FORWARD_MIN_SPEED = 0x15,
CEC_PLAY_MODE_SLOW_FORWARD_MEDIUM_SPEED = 0x16,
CEC_PLAY_MODE_SLOW_FORWARD_MAX_SPEED = 0x17,
CEC_PLAY_MODE_SLOW_REVERSE_MIN_SPEED = 0x19,
CEC_PLAY_MODE_SLOW_REVERSE_MEDIUM_SPEED = 0x1A,
CEC_PLAY_MODE_SLOW_REVERSE_MAX_SPEED = 0x1B
} cec_play_mode;
typedef enum cec_power_status
{
CEC_POWER_STATUS_ON = 0x00,
CEC_POWER_STATUS_STANDBY = 0x01,
CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON = 0x02,
CEC_POWER_STATUS_IN_TRANSITION_ON_TO_STANDBY = 0x03,
CEC_POWER_STATUS_UNKNOWN = 0x99
} cec_power_status;
typedef enum cec_record_source_type
{
CEC_RECORD_SOURCE_TYPE_OWN_SOURCE = 1,
CEC_RECORD_SOURCE_TYPE_DIGITAL_SERVICE = 2,
CEC_RECORD_SOURCE_TYPE_ANALOGUE_SERVICE = 3,
CEC_RECORD_SOURCE_TYPE_EXTERNAL_PLUS = 4,
CEC_RECORD_SOURCE_TYPE_EXTERNAL_PHYSICAL_ADDRESS = 5
} cec_record_source_type;
typedef enum cec_record_status_info
{
CEC_RECORD_STATUS_INFO_RECORDING_CURRENTLY_SELECTED_SOURCE = 0x01,
CEC_RECORD_STATUS_INFO_RECORDING_DIGITAL_SERVICE = 0x02,
CEC_RECORD_STATUS_INFO_RECORDING_ANALOGUE_SERVICE = 0x03,
CEC_RECORD_STATUS_INFO_RECORDING_EXTERNAL_INPUT = 0x04,
CEC_RECORD_STATUS_INFO_NO_RECORDING_UNABLE_TO_RECORD_DIGITAL_SERVICE = 0x05,
CEC_RECORD_STATUS_INFO_NO_RECORDING_UNABLE_TO_RECORD_ANALOGUE_SERVICE = 0x06,
CEC_RECORD_STATUS_INFO_NO_RECORDING_UNABLE_TO_SELECT_REQUIRED_SERVICE = 0x07,
CEC_RECORD_STATUS_INFO_NO_RECORDING_INVALID_EXTERNAL_PLUG_NUMBER = 0x09,
CEC_RECORD_STATUS_INFO_NO_RECORDING_INVALID_EXTERNAL_ADDRESS = 0x0A,
CEC_RECORD_STATUS_INFO_NO_RECORDING_CA_SYSTEM_NOT_SUPPORTED = 0x0B,
CEC_RECORD_STATUS_INFO_NO_RECORDING_NO_OR_INSUFFICIENT_ENTITLEMENTS = 0x0C,
CEC_RECORD_STATUS_INFO_NO_RECORDING_NOT_ALLOWED_TO_COPY_SOURCE = 0x0D,
CEC_RECORD_STATUS_INFO_NO_RECORDING_NO_FURTHER_COPIES_ALLOWED = 0x0E,
CEC_RECORD_STATUS_INFO_NO_RECORDING_NO_MEDIA = 0x10,
CEC_RECORD_STATUS_INFO_NO_RECORDING_PLAYING = 0x11,
CEC_RECORD_STATUS_INFO_NO_RECORDING_ALREADY_RECORDING = 0x12,
CEC_RECORD_STATUS_INFO_NO_RECORDING_MEDIA_PROTECTED = 0x13,
CEC_RECORD_STATUS_INFO_NO_RECORDING_NO_SOURCE_SIGNAL = 0x14,
CEC_RECORD_STATUS_INFO_NO_RECORDING_MEDIA_PROBLEM = 0x15,
CEC_RECORD_STATUS_INFO_NO_RECORDING_NOT_ENOUGH_SPACE_AVAILABLE = 0x16,
CEC_RECORD_STATUS_INFO_NO_RECORDING_PARENTAL_LOCK_ON = 0x17,
CEC_RECORD_STATUS_INFO_RECORDING_TERMINATED_NORMALLY = 0x1A,
CEC_RECORD_STATUS_INFO_RECORDING_HAS_ALREADY_TERMINATED = 0x1B,
CEC_RECORD_STATUS_INFO_NO_RECORDING_OTHER_REASON = 0x1F
} cec_record_status_info;
typedef enum cec_recording_sequence
{
CEC_RECORDING_SEQUENCE_SUNDAY = 0x01,
CEC_RECORDING_SEQUENCE_MONDAY = 0x02,
CEC_RECORDING_SEQUENCE_TUESDAY = 0x04,
CEC_RECORDING_SEQUENCE_WEDNESDAY = 0x08,
CEC_RECORDING_SEQUENCE_THURSDAY = 0x10,
CEC_RECORDING_SEQUENCE_FRIDAY = 0x20,
CEC_RECORDING_SEQUENCE_SATURDAY = 0x40,
CEC_RECORDING_SEQUENCE_ONCE_ONLY = 0x00
} cec_recording_sequence;
typedef enum cec_status_request
{
CEC_STATUS_REQUEST_ON = 1,
CEC_STATUS_REQUEST_OFF = 2,
CEC_STATUS_REQUEST_ONCE = 3
} cec_status_request;
typedef enum cec_system_audio_status
{
CEC_SYSTEM_AUDIO_STATUS_OFF = 0,
CEC_SYSTEM_AUDIO_STATUS_ON = 1,
CEC_SYSTEM_AUDIO_STATUS_UNKNOWN = 2
} cec_system_audio_status;
typedef enum cec_timer_cleared_status_data
{
CEC_TIMER_CLEARED_STATUS_DATA_TIMER_NOT_CLEARED_RECORDING = 0x00,
CEC_TIMER_CLEARED_STATUS_DATA_TIMER_NOT_CLEARED_NO_MATCHING = 0x01,
CEC_TIMER_CLEARED_STATUS_DATA_TIMER_NOT_CLEARED_NO_INF0_AVAILABLE = 0x02,
CEC_TIMER_CLEARED_STATUS_DATA_TIMER_CLEARED = 0x80
} cec_timer_cleared_status_data;
typedef enum cec_timer_overlap_warning
{
CEC_TIMER_OVERLAP_WARNING_NO_OVERLAP = 0,
CEC_TIMER_OVERLAP_WARNING_TIMER_BLOCKS_OVERLAP = 1
} cec_timer_overlap_warning;
typedef enum cec_media_info
{
CEC_MEDIA_INFO_MEDIA_PRESENT_AND_NOT_PROTECTED = 0x00,
CEC_MEDIA_INFO_MEDIA_PRESENT_BUT_PROTECTED = 0x01,
CEC_MEDIA_INFO_MEDIA_NOT_PRESENT = 0x02,
CEC_MEDIA_INFO_FUTURE_USE = 0x03
} cec_media_info;
typedef enum cec_programmed_indicator
{
CEC_PROGRAMMED_INDICATOR_NOT_PROGRAMMED = 0,
CEC_PROGRAMMED_INDICATOR_PROGRAMMED = 1
} cec_programmed_indicator;
typedef enum cec_programmed_info
{
CEC_PROGRAMMED_INFO_FUTURE_USE = 0x0,
CEC_PROGRAMMED_INFO_ENOUGH_SPACE_AVAILABLE_FOR_RECORDING = 0x08,
CEC_PROGRAMMED_INFO_NOT_ENOUGH_SPACE_AVAILABLE_FOR_RECORDING = 0x09,
CEC_PROGRAMMED_INFO_MAY_NOT_BE_ENOUGH_SPACE_AVAILABLE = 0x0B,
CEC_PROGRAMMED_INFO_NO_MEDIA_INFO_AVAILABLE = 0x0A
} cec_programmed_info;
typedef enum cec_not_programmed_error_info
{
CEC_NOT_PROGRAMMED_ERROR_INFO_FUTURE_USE = 0x0,
CEC_NOT_PROGRAMMED_ERROR_INFO_NO_FREE_TIMER_AVAILABLE = 0x01,
CEC_NOT_PROGRAMMED_ERROR_INFO_DATE_OUT_OF_RANGE = 0x02,
CEC_NOT_PROGRAMMED_ERROR_INFO_RECORDING_SEQUENCE_ERROR = 0x03,
CEC_NOT_PROGRAMMED_ERROR_INFO_INVALID_EXTERNAL_PLUG_NUMBER = 0x04,
CEC_NOT_PROGRAMMED_ERROR_INFO_INVALID_EXTERNAL_PHYSICAL_ADDRESS = 0x05,
CEC_NOT_PROGRAMMED_ERROR_INFO_CA_SYSTEM_NOT_SUPPORTED = 0x06,
CEC_NOT_PROGRAMMED_ERROR_INFO_NO_OR_INSUFFICIENT_CA_ENTITLEMENTS = 0x07,
CEC_NOT_PROGRAMMED_ERROR_INFO_DOES_NOT_SUPPORT_RESOLUTION = 0x08,
CEC_NOT_PROGRAMMED_ERROR_INFO_PARENTAL_LOCK_ON = 0x09,
CEC_NOT_PROGRAMMED_ERROR_INFO_CLOCK_FAILURE = 0x0A,
CEC_NOT_PROGRAMMED_ERROR_INFO_RESERVED_FOR_FUTURE_USE_START = 0x0B,
CEC_NOT_PROGRAMMED_ERROR_INFO_RESERVED_FOR_FUTURE_USE_END = 0x0D,
CEC_NOT_PROGRAMMED_ERROR_INFO_DUPLICATE_ALREADY_PROGRAMMED = 0x0E
} cec_not_programmed_error_info;
typedef enum cec_recording_flag
{
CEC_RECORDING_FLAG_NOT_BEING_USED_FOR_RECORDING = 0,
CEC_RECORDING_FLAG_BEING_USED_FOR_RECORDING = 1
} cec_recording_flag;
typedef enum cec_tuner_display_info
{
CEC_TUNER_DISPLAY_INFO_DISPLAYING_DIGITAL_TUNER = 0,
CEC_TUNER_DISPLAY_INFO_NOT_DISPLAYING_TUNER = 1,
CEC_TUNER_DISPLAY_INFO_DISPLAYING_ANALOGUE_TUNER = 2
} cec_tuner_display_info;
typedef enum cec_broadcast_system
{
CEC_BROADCAST_SYSTEM_PAL_B_G = 0,
CEC_BROADCAST_SYSTEM_SECAM_L1 = 1,
CEC_BROADCAST_SYSTEM_PAL_M = 2,
CEC_BROADCAST_SYSTEM_NTSC_M = 3,
CEC_BROADCAST_SYSTEM_PAL_I = 4,
CEC_BROADCAST_SYSTEM_SECAM_DK = 5,
CEC_BROADCAST_SYSTEM_SECAM_B_G = 6,
CEC_BROADCAST_SYSTEM_SECAM_L2 = 7,
CEC_BROADCAST_SYSTEM_PAL_DK = 8,
CEC_BROADCAST_SYSTEM_OTHER_SYSTEM = 30
} cec_broadcast_system;
typedef enum cec_user_control_code
{
CEC_USER_CONTROL_CODE_SELECT = 0x00,
CEC_USER_CONTROL_CODE_UP = 0x01,
CEC_USER_CONTROL_CODE_DOWN = 0x02,
CEC_USER_CONTROL_CODE_LEFT = 0x03,
CEC_USER_CONTROL_CODE_RIGHT = 0x04,
CEC_USER_CONTROL_CODE_RIGHT_UP = 0x05,
CEC_USER_CONTROL_CODE_RIGHT_DOWN = 0x06,
CEC_USER_CONTROL_CODE_LEFT_UP = 0x07,
CEC_USER_CONTROL_CODE_LEFT_DOWN = 0x08,
CEC_USER_CONTROL_CODE_ROOT_MENU = 0x09,
CEC_USER_CONTROL_CODE_SETUP_MENU = 0x0A,
CEC_USER_CONTROL_CODE_CONTENTS_MENU = 0x0B,
CEC_USER_CONTROL_CODE_FAVORITE_MENU = 0x0C,
CEC_USER_CONTROL_CODE_EXIT = 0x0D,
CEC_USER_CONTROL_CODE_TOP_MENU = 0x10,
CEC_USER_CONTROL_CODE_DVD_MENU = 0x11,
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,
CEC_USER_CONTROL_CODE_NUMBER3 = 0x23,
CEC_USER_CONTROL_CODE_NUMBER4 = 0x24,
CEC_USER_CONTROL_CODE_NUMBER5 = 0x25,
CEC_USER_CONTROL_CODE_NUMBER6 = 0x26,
CEC_USER_CONTROL_CODE_NUMBER7 = 0x27,
CEC_USER_CONTROL_CODE_NUMBER8 = 0x28,
CEC_USER_CONTROL_CODE_NUMBER9 = 0x29,
CEC_USER_CONTROL_CODE_DOT = 0x2A,
CEC_USER_CONTROL_CODE_ENTER = 0x2B,
CEC_USER_CONTROL_CODE_CLEAR = 0x2C,
CEC_USER_CONTROL_CODE_NEXT_FAVORITE = 0x2F,
CEC_USER_CONTROL_CODE_CHANNEL_UP = 0x30,
CEC_USER_CONTROL_CODE_CHANNEL_DOWN = 0x31,
CEC_USER_CONTROL_CODE_PREVIOUS_CHANNEL = 0x32,
CEC_USER_CONTROL_CODE_SOUND_SELECT = 0x33,
CEC_USER_CONTROL_CODE_INPUT_SELECT = 0x34,
CEC_USER_CONTROL_CODE_DISPLAY_INFORMATION = 0x35,
CEC_USER_CONTROL_CODE_HELP = 0x36,
CEC_USER_CONTROL_CODE_PAGE_UP = 0x37,
CEC_USER_CONTROL_CODE_PAGE_DOWN = 0x38,
CEC_USER_CONTROL_CODE_POWER = 0x40,
CEC_USER_CONTROL_CODE_VOLUME_UP = 0x41,
CEC_USER_CONTROL_CODE_VOLUME_DOWN = 0x42,
CEC_USER_CONTROL_CODE_MUTE = 0x43,
CEC_USER_CONTROL_CODE_PLAY = 0x44,
CEC_USER_CONTROL_CODE_STOP = 0x45,
CEC_USER_CONTROL_CODE_PAUSE = 0x46,
CEC_USER_CONTROL_CODE_RECORD = 0x47,
CEC_USER_CONTROL_CODE_REWIND = 0x48,
CEC_USER_CONTROL_CODE_FAST_FORWARD = 0x49,
CEC_USER_CONTROL_CODE_EJECT = 0x4A,
CEC_USER_CONTROL_CODE_FORWARD = 0x4B,
CEC_USER_CONTROL_CODE_BACKWARD = 0x4C,
CEC_USER_CONTROL_CODE_STOP_RECORD = 0x4D,
CEC_USER_CONTROL_CODE_PAUSE_RECORD = 0x4E,
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,
CEC_USER_CONTROL_CODE_PLAY_FUNCTION = 0x60,
CEC_USER_CONTROL_CODE_PAUSE_PLAY_FUNCTION = 0x61,
CEC_USER_CONTROL_CODE_RECORD_FUNCTION = 0x62,
CEC_USER_CONTROL_CODE_PAUSE_RECORD_FUNCTION = 0x63,
CEC_USER_CONTROL_CODE_STOP_FUNCTION = 0x64,
CEC_USER_CONTROL_CODE_MUTE_FUNCTION = 0x65,
CEC_USER_CONTROL_CODE_RESTORE_VOLUME_FUNCTION = 0x66,
CEC_USER_CONTROL_CODE_TUNE_FUNCTION = 0x67,
CEC_USER_CONTROL_CODE_SELECT_MEDIA_FUNCTION = 0x68,
CEC_USER_CONTROL_CODE_SELECT_AV_INPUT_FUNCTION = 0x69,
CEC_USER_CONTROL_CODE_SELECT_AUDIO_INPUT_FUNCTION = 0x6A,
CEC_USER_CONTROL_CODE_POWER_TOGGLE_FUNCTION = 0x6B,
CEC_USER_CONTROL_CODE_POWER_OFF_FUNCTION = 0x6C,
CEC_USER_CONTROL_CODE_POWER_ON_FUNCTION = 0x6D,
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, CEC_USER_CONTROL_CODE_MAX = 0x96,
CEC_USER_CONTROL_CODE_UNKNOWN = 0xFF
} cec_user_control_code;
typedef enum cec_logical_address
{
CECDEVICE_UNKNOWN = -1, CECDEVICE_TV = 0,
CECDEVICE_RECORDINGDEVICE1 = 1,
CECDEVICE_RECORDINGDEVICE2 = 2,
CECDEVICE_TUNER1 = 3,
CECDEVICE_PLAYBACKDEVICE1 = 4,
CECDEVICE_AUDIOSYSTEM = 5,
CECDEVICE_TUNER2 = 6,
CECDEVICE_TUNER3 = 7,
CECDEVICE_PLAYBACKDEVICE2 = 8,
CECDEVICE_RECORDINGDEVICE3 = 9,
CECDEVICE_TUNER4 = 10,
CECDEVICE_PLAYBACKDEVICE3 = 11,
CECDEVICE_RESERVED1 = 12,
CECDEVICE_RESERVED2 = 13,
CECDEVICE_FREEUSE = 14,
CECDEVICE_UNREGISTERED = 15,
CECDEVICE_BROADCAST = 15
} cec_logical_address;
typedef enum cec_opcode
{
CEC_OPCODE_ACTIVE_SOURCE = 0x82,
CEC_OPCODE_IMAGE_VIEW_ON = 0x04,
CEC_OPCODE_TEXT_VIEW_ON = 0x0D,
CEC_OPCODE_INACTIVE_SOURCE = 0x9D,
CEC_OPCODE_REQUEST_ACTIVE_SOURCE = 0x85,
CEC_OPCODE_ROUTING_CHANGE = 0x80,
CEC_OPCODE_ROUTING_INFORMATION = 0x81,
CEC_OPCODE_SET_STREAM_PATH = 0x86,
CEC_OPCODE_STANDBY = 0x36,
CEC_OPCODE_RECORD_OFF = 0x0B,
CEC_OPCODE_RECORD_ON = 0x09,
CEC_OPCODE_RECORD_STATUS = 0x0A,
CEC_OPCODE_RECORD_TV_SCREEN = 0x0F,
CEC_OPCODE_CLEAR_ANALOGUE_TIMER = 0x33,
CEC_OPCODE_CLEAR_DIGITAL_TIMER = 0x99,
CEC_OPCODE_CLEAR_EXTERNAL_TIMER = 0xA1,
CEC_OPCODE_SET_ANALOGUE_TIMER = 0x34,
CEC_OPCODE_SET_DIGITAL_TIMER = 0x97,
CEC_OPCODE_SET_EXTERNAL_TIMER = 0xA2,
CEC_OPCODE_SET_TIMER_PROGRAM_TITLE = 0x67,
CEC_OPCODE_TIMER_CLEARED_STATUS = 0x43,
CEC_OPCODE_TIMER_STATUS = 0x35,
CEC_OPCODE_CEC_VERSION = 0x9E,
CEC_OPCODE_GET_CEC_VERSION = 0x9F,
CEC_OPCODE_GIVE_PHYSICAL_ADDRESS = 0x83,
CEC_OPCODE_GET_MENU_LANGUAGE = 0x91,
CEC_OPCODE_REPORT_PHYSICAL_ADDRESS = 0x84,
CEC_OPCODE_SET_MENU_LANGUAGE = 0x32,
CEC_OPCODE_DECK_CONTROL = 0x42,
CEC_OPCODE_DECK_STATUS = 0x1B,
CEC_OPCODE_GIVE_DECK_STATUS = 0x1A,
CEC_OPCODE_PLAY = 0x41,
CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS = 0x08,
CEC_OPCODE_SELECT_ANALOGUE_SERVICE = 0x92,
CEC_OPCODE_SELECT_DIGITAL_SERVICE = 0x93,
CEC_OPCODE_TUNER_DEVICE_STATUS = 0x07,
CEC_OPCODE_TUNER_STEP_DECREMENT = 0x06,
CEC_OPCODE_TUNER_STEP_INCREMENT = 0x05,
CEC_OPCODE_DEVICE_VENDOR_ID = 0x87,
CEC_OPCODE_GIVE_DEVICE_VENDOR_ID = 0x8C,
CEC_OPCODE_VENDOR_COMMAND = 0x89,
CEC_OPCODE_VENDOR_COMMAND_WITH_ID = 0xA0,
CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN = 0x8A,
CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP = 0x8B,
CEC_OPCODE_SET_OSD_STRING = 0x64,
CEC_OPCODE_GIVE_OSD_NAME = 0x46,
CEC_OPCODE_SET_OSD_NAME = 0x47,
CEC_OPCODE_MENU_REQUEST = 0x8D,
CEC_OPCODE_MENU_STATUS = 0x8E,
CEC_OPCODE_USER_CONTROL_PRESSED = 0x44,
CEC_OPCODE_USER_CONTROL_RELEASE = 0x45,
CEC_OPCODE_GIVE_DEVICE_POWER_STATUS = 0x8F,
CEC_OPCODE_REPORT_POWER_STATUS = 0x90,
CEC_OPCODE_FEATURE_ABORT = 0x00,
CEC_OPCODE_ABORT = 0xFF,
CEC_OPCODE_GIVE_AUDIO_STATUS = 0x71,
CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS = 0x7D,
CEC_OPCODE_REPORT_AUDIO_STATUS = 0x7A,
CEC_OPCODE_SET_SYSTEM_AUDIO_MODE = 0x72,
CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST = 0x70,
CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS = 0x7E,
CEC_OPCODE_SET_AUDIO_RATE = 0x9A,
CEC_OPCODE_REPORT_SHORT_AUDIO_DESCRIPTORS = 0xA3,
CEC_OPCODE_REQUEST_SHORT_AUDIO_DESCRIPTORS = 0xA4,
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,
CEC_OPCODE_NONE = 0xFD
} cec_opcode;
typedef enum cec_log_level
{
CEC_LOG_ERROR = 1,
CEC_LOG_WARNING = 2,
CEC_LOG_NOTICE = 4,
CEC_LOG_TRAFFIC = 8,
CEC_LOG_DEBUG = 16,
CEC_LOG_ALL = 31
} cec_log_level;
typedef enum cec_bus_device_status
{
CEC_DEVICE_STATUS_UNKNOWN,
CEC_DEVICE_STATUS_PRESENT,
CEC_DEVICE_STATUS_NOT_PRESENT,
CEC_DEVICE_STATUS_HANDLED_BY_LIBCEC
} cec_bus_device_status;
typedef enum cec_vendor_id
{
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_APPLE = 0x0010FA,
CEC_VENDOR_PULSE_EIGHT = 0x001582,
CEC_VENDOR_HARMAN_KARDON2 = 0x001950,
CEC_VENDOR_GOOGLE = 0x001A11,
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_TEUFEL = 0x232425,
CEC_VENDOR_BROADCOM = 0x18C086,
CEC_VENDOR_SHARP2 = 0x534850,
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,
ADAPTERTYPE_LINUX = 0x400,
ADAPTERTYPE_AOCEC = 0x500,
ADAPTERTYPE_IMX = 0x600,
ADAPTERTYPE_TEGRA = 0x700
} cec_adapter_type;
enum libcec_version
{
LIBCEC_VERSION_CURRENT = _LIBCEC_VERSION_CURRENT
};
typedef char cec_menu_language[4];
typedef char cec_osd_name[14];
typedef struct cec_log_message
{
const char* message;
cec_log_level level;
int64_t time;
} cec_log_message;
typedef struct cec_keypress
{
cec_user_control_code keycode;
unsigned int duration;
} cec_keypress;
typedef struct cec_adapter
{
char path[1024];
char comm[1024];
} cec_adapter;
typedef struct cec_adapter_descriptor
{
char strComPath[1024];
char strComName[1024];
uint16_t iVendorId;
uint16_t iProductId;
uint16_t iFirmwareVersion;
uint16_t iPhysicalAddress;
uint32_t iFirmwareBuildDate;
cec_adapter_type adapterType;
} cec_adapter_descriptor;
#if defined(__cplusplus)
typedef struct AdapterDescriptor
{
AdapterDescriptor(void) :
iVendorId(0),
iProductId(0),
iFirmwareVersion(0),
iPhysicalAddress(0),
iFirmwareBuildDate(0),
adapterType(ADAPTERTYPE_UNKNOWN)
{
}
AdapterDescriptor(const cec_adapter_descriptor& other)
{
strComPath = other.strComPath;
strComName = other.strComName;
iVendorId = other.iVendorId;
iProductId = other.iProductId;
iFirmwareVersion = other.iFirmwareVersion;
iPhysicalAddress = other.iPhysicalAddress;
iFirmwareBuildDate = other.iFirmwareBuildDate;
adapterType = other.adapterType;
}
std::string strComPath;
std::string strComName;
uint16_t iVendorId;
uint16_t iProductId;
uint16_t iFirmwareVersion;
uint16_t iPhysicalAddress;
uint32_t iFirmwareBuildDate;
cec_adapter_type adapterType;
} AdapterDescriptor;
#endif
typedef struct cec_datapacket
{
uint8_t data[CEC_MAX_DATA_PACKET_SIZE];
uint8_t size;
#ifdef __cplusplus
cec_datapacket &operator =(const struct cec_datapacket &packet)
{
Clear();
for (uint8_t iPtr = 0; iPtr < packet.size; iPtr++)
PushBack(packet[iPtr]);
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; }
bool IsFull(void) const { return size == CEC_MAX_DATA_PACKET_SIZE; }
uint8_t operator[](uint8_t pos) const { return pos < size ? data[pos] : 0; }
uint8_t At(uint8_t pos) const { return pos < size ? data[pos] : 0; }
void Shift(uint8_t iShiftBy)
{
if (iShiftBy >= size)
{
Clear();
}
else
{
for (uint8_t iPtr = 0; iPtr < size; iPtr++)
data[iPtr] = (iPtr + iShiftBy < size) ? data[iPtr + iShiftBy] : 0;
size = (uint8_t) (size - iShiftBy);
}
}
void PushBack(uint8_t add)
{
if (size < CEC_MAX_DATA_PACKET_SIZE)
data[size++] = add;
}
void Clear(void)
{
memset(data, 0, sizeof(data));
size = 0;
}
#endif
} cec_datapacket;
typedef struct cec_command
{
cec_logical_address initiator;
cec_logical_address destination;
int8_t ack;
int8_t eom;
cec_opcode opcode;
cec_datapacket parameters;
int8_t opcode_set;
int32_t transmit_timeout;
#ifdef __cplusplus
cec_command(void)
{
Clear();
}
cec_command &operator =(const struct cec_command &command)
{
initiator = command.initiator;
destination = command.destination;
ack = command.ack;
eom = command.eom;
opcode = command.opcode;
opcode_set = command.opcode_set;
transmit_timeout = command.transmit_timeout;
parameters = command.parameters;
return *this;
}
uint8_t Size(void) const
{
return parameters.size + opcode_set + 1;
}
static void Format(cec_command &command, cec_logical_address initiator, cec_logical_address destination, cec_opcode opcode, int32_t timeout = CEC_DEFAULT_TRANSMIT_TIMEOUT)
{
command.Clear();
command.initiator = initiator;
command.destination = destination;
command.transmit_timeout = timeout;
if (opcode != CEC_OPCODE_NONE)
{
command.opcode = opcode;
command.opcode_set = 1;
}
}
void PushBack(uint8_t data)
{
if (initiator == CECDEVICE_UNKNOWN && destination == CECDEVICE_UNKNOWN)
{
initiator = (cec_logical_address) (data >> 4);
destination = (cec_logical_address) (data & 0xF);
}
else if (!opcode_set)
{
opcode_set = 1;
opcode = (cec_opcode) data;
}
else
parameters.PushBack(data);
}
void Clear(void)
{
initiator = CECDEVICE_UNKNOWN;
destination = CECDEVICE_UNKNOWN;
ack = 0;
eom = 0;
opcode_set = 0;
opcode = CEC_OPCODE_FEATURE_ABORT;
transmit_timeout = CEC_DEFAULT_TRANSMIT_TIMEOUT;
parameters.Clear();
};
static cec_opcode GetResponseOpcode(cec_opcode opcode)
{
switch (opcode)
{
case CEC_OPCODE_REQUEST_ACTIVE_SOURCE:
return CEC_OPCODE_ACTIVE_SOURCE;
case CEC_OPCODE_GET_CEC_VERSION:
return CEC_OPCODE_CEC_VERSION;
case CEC_OPCODE_GIVE_PHYSICAL_ADDRESS:
return CEC_OPCODE_REPORT_PHYSICAL_ADDRESS;
case CEC_OPCODE_GET_MENU_LANGUAGE:
return CEC_OPCODE_SET_MENU_LANGUAGE;
case CEC_OPCODE_GIVE_DECK_STATUS:
return CEC_OPCODE_DECK_STATUS;
case CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS:
return CEC_OPCODE_TUNER_DEVICE_STATUS;
case CEC_OPCODE_GIVE_DEVICE_VENDOR_ID:
return CEC_OPCODE_DEVICE_VENDOR_ID;
case CEC_OPCODE_GIVE_OSD_NAME:
return CEC_OPCODE_SET_OSD_NAME;
case CEC_OPCODE_MENU_REQUEST:
return CEC_OPCODE_MENU_STATUS;
case CEC_OPCODE_GIVE_DEVICE_POWER_STATUS:
return CEC_OPCODE_REPORT_POWER_STATUS;
case CEC_OPCODE_GIVE_AUDIO_STATUS:
return CEC_OPCODE_REPORT_AUDIO_STATUS;
case CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS:
return CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS;
case CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST:
return CEC_OPCODE_SET_SYSTEM_AUDIO_MODE;
default:
break;
}
return CEC_OPCODE_NONE;
}
void PushArray(size_t len, const uint8_t *data)
{
for (size_t iPtr = 0; iPtr < len; iPtr++)
PushBack(data[iPtr]);
}
#endif
} cec_command;
typedef struct cec_device_type_list
{
cec_device_type types[5];
#ifdef __cplusplus
void Clear(void)
{
for (unsigned int iPtr = 0; iPtr < 5; iPtr++)
types[iPtr] = CEC_DEVICE_TYPE_RESERVED;
}
void Add(const cec_device_type type)
{
for (unsigned int iPtr = 0; iPtr < 5; iPtr++)
{
if (types[iPtr] == CEC_DEVICE_TYPE_RESERVED)
{
types[iPtr] = type;
break;
}
}
}
bool IsSet(cec_device_type type)
{
bool bReturn(false);
for (unsigned int iPtr = 0; !bReturn && iPtr < 5; iPtr++)
{
if (types[iPtr] == type)
bReturn = true;
}
return bReturn;
}
bool IsEmpty() const
{
bool bReturn(true);
for (unsigned int iPtr = 0; bReturn && iPtr < 5; iPtr++)
{
if (types[iPtr] != CEC_DEVICE_TYPE_RESERVED)
bReturn = false;
}
return bReturn;
}
cec_device_type operator[](uint8_t pos) const { return pos < 5 ? types[pos] : CEC_DEVICE_TYPE_RESERVED; }
bool operator==(const cec_device_type_list &other) const
{
bool bEqual(true);
for (uint8_t iPtr = 0; iPtr < 5; iPtr++)
bEqual &= (types[iPtr] == other[iPtr]);
return bEqual;
}
bool operator!=(const cec_device_type_list &other) const
{
return !(*this == other);
}
#endif
} cec_device_type_list;
typedef struct cec_logical_addresses
{
cec_logical_address primary;
int addresses[16];
#ifdef __cplusplus
void Clear(void)
{
primary = CECDEVICE_UNREGISTERED;
for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
addresses[iPtr] = 0;
}
bool IsEmpty(void) const
{
return primary == CECDEVICE_UNREGISTERED;
}
uint16_t AckMask(void) const
{
uint16_t mask = 0;
for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
if (addresses[iPtr] == 1)
mask |= 0x1 << iPtr;
return mask;
}
void Set(cec_logical_address address)
{
if (primary == CECDEVICE_UNREGISTERED)
primary = address;
addresses[(int) address] = 1;
}
void Unset(const cec_logical_address address)
{
if (primary == address)
primary = CECDEVICE_UNREGISTERED;
addresses[(int) address] = 0;
}
bool IsSet(cec_logical_address address) const { return addresses[(int) address] == 1; }
bool operator[](uint8_t pos) const { return pos < 16 ? IsSet((cec_logical_address) pos) : false; }
bool operator==(const cec_logical_addresses &other) const
{
bool bEqual(true);
for (uint8_t iPtr = 0; iPtr < 16; iPtr++)
bEqual &= ((addresses[(int)iPtr] == 1) == other[iPtr]);
return bEqual;
}
bool operator!=(const cec_logical_addresses &other) const
{
return !(*this == other);
}
#endif
} cec_logical_addresses;
typedef enum libcec_alert
{
CEC_ALERT_SERVICE_DEVICE,
CEC_ALERT_CONNECTION_LOST,
CEC_ALERT_PERMISSION_ERROR,
CEC_ALERT_PORT_BUSY,
CEC_ALERT_PHYSICAL_ADDRESS_ERROR,
CEC_ALERT_TV_POLL_FAILED
} libcec_alert;
typedef enum libcec_parameter_type
{
CEC_PARAMETER_TYPE_STRING,
CEC_PARAMETER_TYPE_UNKOWN
} libcec_parameter_type;
typedef struct libcec_parameter
{
libcec_parameter_type paramType;
void* paramData;
} libcec_parameter;
struct cec_adapter_stats
{
unsigned int tx_ack;
unsigned int tx_nack;
unsigned int tx_error;
unsigned int rx_total;
unsigned int rx_error;
};
typedef struct libcec_configuration libcec_configuration;
typedef struct ICECCallbacks
{
void (CEC_CDECL* logMessage)(void* cbparam, const cec_log_message* message);
void (CEC_CDECL* keyPress)(void* cbparam, const cec_keypress* key);
void (CEC_CDECL* commandReceived)(void* cbparam, const cec_command* command);
void (CEC_CDECL* configurationChanged)(void* cbparam, const libcec_configuration* configuration);
void (CEC_CDECL* alert)(void* cbparam, const libcec_alert alert, const libcec_parameter param);
int (CEC_CDECL* menuStateChanged)(void* cbparam, const cec_menu_state state);
void (CEC_CDECL* sourceActivated)(void* cbParam, const cec_logical_address logicalAddress, const uint8_t bActivated);
int (CEC_CDECL* commandHandler)(void* cbparam, const cec_command* command);
#ifdef __cplusplus
ICECCallbacks(void) { Clear(); }
~ICECCallbacks(void) { Clear(); };
void Clear(void)
{
logMessage = nullptr;
keyPress = nullptr;
commandReceived = nullptr;
configurationChanged = nullptr;
alert = nullptr;
menuStateChanged = nullptr;
sourceActivated = nullptr;
commandHandler = nullptr;
}
#endif
} ICECCallbacks;
#if CEC_LIB_VERSION_MAJOR >= 5
#define LIBCEC_OSD_NAME_SIZE (15)
#else
#define LIBCEC_OSD_NAME_SIZE (13)
#endif
struct libcec_configuration
{
uint32_t clientVersion;
char strDeviceName[LIBCEC_OSD_NAME_SIZE];
cec_device_type_list deviceTypes;
uint8_t bAutodetectAddress;
uint16_t iPhysicalAddress;
cec_logical_address baseDevice;
uint8_t iHDMIPort;
uint32_t tvVendor;
cec_logical_addresses wakeDevices;
cec_logical_addresses powerOffDevices;
uint32_t serverVersion;
uint8_t bGetSettingsFromROM;
uint8_t bActivateSource;
uint8_t bPowerOffOnStandby;
void * callbackParam;
ICECCallbacks * callbacks;
cec_logical_addresses logicalAddresses;
uint16_t iFirmwareVersion;
char strDeviceLanguage[3];
uint32_t iFirmwareBuildDate;
uint8_t bMonitorOnly;
cec_version cecVersion;
cec_adapter_type adapterType;
cec_user_control_code comboKey;
uint32_t iComboKeyTimeoutMs;
uint32_t iButtonRepeatRateMs;
uint32_t iButtonReleaseDelayMs;
uint32_t iDoubleTapTimeoutMs;
uint8_t bAutoWakeAVR;
#if CEC_LIB_VERSION_MAJOR >= 5
uint8_t bAutoPowerOn;
#endif
#ifdef __cplusplus
libcec_configuration(void) { Clear(); }
~libcec_configuration(void) { Clear(); }
bool operator==(const libcec_configuration &other) const
{
return ( clientVersion == other.clientVersion &&
!strcmp(strDeviceName, other.strDeviceName) &&
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 &&
bActivateSource == other.bActivateSource &&
bPowerOffOnStandby == other.bPowerOffOnStandby &&
logicalAddresses == other.logicalAddresses &&
iFirmwareVersion == other.iFirmwareVersion &&
!strncmp(strDeviceLanguage, other.strDeviceLanguage, 3) &&
iFirmwareBuildDate == other.iFirmwareBuildDate &&
bMonitorOnly == other.bMonitorOnly &&
cecVersion == other.cecVersion &&
adapterType == other.adapterType &&
iDoubleTapTimeoutMs == other.iDoubleTapTimeoutMs &&
iButtonRepeatRateMs == other.iButtonRepeatRateMs &&
iButtonReleaseDelayMs == other.iButtonReleaseDelayMs &&
comboKey == other.comboKey &&
iComboKeyTimeoutMs == other.iComboKeyTimeoutMs &&
bAutoWakeAVR == other.bAutoWakeAVR
#if CEC_LIB_VERSION_MAJOR >= 5
&& bAutoPowerOn == other.bAutoPowerOn
#endif
);
}
bool operator!=(const libcec_configuration &other) const
{
return !(*this == other);
}
void Clear(void)
{
iPhysicalAddress = CEC_PHYSICAL_ADDRESS_TV;
baseDevice = (cec_logical_address)CEC_DEFAULT_BASE_DEVICE;
iHDMIPort = CEC_HDMI_PORTNUMBER_NONE;
tvVendor = (uint32_t)CEC_VENDOR_UNKNOWN;
clientVersion = LIBCEC_VERSION_CURRENT;
serverVersion = LIBCEC_VERSION_CURRENT;
bAutodetectAddress = 1;
bGetSettingsFromROM = CEC_DEFAULT_SETTING_GET_SETTINGS_FROM_ROM;
bActivateSource = CEC_DEFAULT_SETTING_ACTIVATE_SOURCE;
bPowerOffOnStandby = CEC_DEFAULT_SETTING_POWER_OFF_ON_STANDBY;
iFirmwareVersion = CEC_FW_VERSION_UNKNOWN;
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;
iButtonRepeatRateMs = 0;
iButtonReleaseDelayMs = CEC_BUTTON_TIMEOUT;
bAutoWakeAVR = 0;
#if CEC_LIB_VERSION_MAJOR >= 5
bAutoPowerOn = 2;
#endif
strDeviceName[0] = (char)0;
deviceTypes.Clear();
logicalAddresses.Clear();
wakeDevices.Clear();
powerOffDevices.Clear();
#if CEC_DEFAULT_SETTING_POWER_OFF_SHUTDOWN == 1
powerOffDevices.Set(CECDEVICE_BROADCAST);
#endif
#if CEC_DEFAULT_SETTING_ACTIVATE_SOURCE == 1
wakeDevices.Set(CECDEVICE_TV);
#endif
callbackParam = nullptr;
callbacks = nullptr;
}
#endif
};
#ifdef __cplusplus
};
};
#endif
#endif