X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=include%2FCECExports.h;h=fd6162ced744b2db0e47f2c4bb33f74462f5ca64;hb=ddb76c470aa282f59064c8e2ffe20a0785463167;hp=ad1eb969fb4225c84468edebb8f437f65c0c2812;hpb=6dfe921375b746dab058c1f1c3a8263fbd409d3d;p=deb_libcec.git diff --git a/include/CECExports.h b/include/CECExports.h index ad1eb96..fd6162c 100644 --- a/include/CECExports.h +++ b/include/CECExports.h @@ -34,9 +34,8 @@ #ifndef CECEXPORTS_H_ #define CECEXPORTS_H_ -#include #include -#include +#include #if !defined(DECLSPEC) #if defined(_WIN32) || defined(_WIN64) @@ -55,11 +54,10 @@ extern "C" { namespace CEC { #endif - #define CEC_MIN_VERSION 2 - #define CEC_LIB_VERSION 2 - #define CEC_SETTLE_DOWN_TIME 1000 - - typedef std::vector cec_frame; + #define CEC_MIN_VERSION 6 + #define CEC_LIB_VERSION 6 + #define CEC_SETTLE_DOWN_TIME 1500 + #define CEC_BUTTON_TIMEOUT 500 typedef enum cec_user_control_code { @@ -167,6 +165,72 @@ namespace CEC { 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; + typedef enum cec_log_level { CEC_LOG_DEBUG = 0, @@ -177,8 +241,9 @@ namespace CEC { typedef struct cec_log_message { - std::string message; + char message[1024]; cec_log_level level; + int64_t time; } cec_log_message; typedef struct cec_keypress @@ -187,11 +252,155 @@ namespace CEC { unsigned int duration; } cec_keypress; - typedef struct cec_device + typedef struct cec_adapter + { + char path[1024]; + char comm[1024]; + } cec_adapter; + + 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_FRAME_EOM = 0x80, + MSGCODE_FRAME_ACK = 0x40, + } cec_adapter_messagecode; + + typedef struct cec_datapacket + { + uint8_t data[100]; + uint8_t size; + + bool empty(void) const { return size == 0; } + bool full(void) const { return size == 100; } + 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 push_back(uint8_t add) + { + if (size < 100) + data[size++] = add; + } + + void clear(void) + { + memset(data, 0, sizeof(data)); + size = 0; + } + + } cec_datapacket; + + typedef struct cec_adapter_message + { + cec_datapacket packet; + + bool empty(void) const { return packet.empty(); } + uint8_t operator[](uint8_t pos) const { return packet[pos]; } + uint8_t at(uint8_t pos) const { return packet[pos]; } + uint8_t size(void) const { return packet.size; } + void clear(void) { packet.clear(); } + void shift(uint8_t iShiftBy) { packet.shift(iShiftBy); } + void push_back(uint8_t add) { packet.push_back(add); } + cec_adapter_messagecode message(void) const { return packet.size >= 1 ? (cec_adapter_messagecode) (packet.at(0) & ~(MSGCODE_FRAME_EOM | MSGCODE_FRAME_ACK)) : MSGCODE_NOTHING; } + bool eom(void) const { return packet.size >= 1 ? (packet.at(0) & MSGCODE_FRAME_EOM) != 0 : false; } + bool ack(void) const { return packet.size >= 1 ? (packet.at(0) & MSGCODE_FRAME_ACK) != 0 : false; } + cec_logical_address initiator(void) const { return packet.size >= 2 ? (cec_logical_address) (packet.at(1) >> 4) : CECDEVICE_UNKNOWN; }; + cec_logical_address destination(void) const { return packet.size >= 2 ? (cec_logical_address) (packet.at(1) & 0xF) : CECDEVICE_UNKNOWN; }; + } cec_adapter_message; + + typedef struct cec_command + { + cec_logical_address initiator; + cec_logical_address destination; + bool ack; + bool eom; + cec_opcode opcode; + cec_datapacket parameters; + bool opcode_set; + + static void format(cec_command &command, cec_logical_address initiator, cec_logical_address destination, cec_opcode opcode) + { + command.clear(); + command.initiator = initiator; + command.destination = destination; + command.opcode = opcode; + command.opcode_set = true; + } + + void push_back(uint8_t data) + { + if (!opcode_set) + { + opcode_set = true; + opcode = (cec_opcode) data; + } + else + parameters.push_back(data); + } + + void clear(void) + { + initiator = CECDEVICE_UNKNOWN; + destination = CECDEVICE_UNKNOWN; + ack = false; + eom = false; + opcode_set = false; + opcode = CEC_OPCODE_FEATURE_ABORT; + parameters.clear(); + }; + } cec_command; + + typedef enum cec_vendor_id + { + CEC_VENDOR_SAMSUNG = 240, + CEC_VENDOR_UNKNOWN = 0 + } vendor_id; + + static const char *CECVendorIdToString(const uint64_t iVendorId) { - std::string path; - std::string comm; - } cec_device; + switch (iVendorId) + { + case CEC_VENDOR_SAMSUNG: + return "Samsung"; + default: + return "Unknown"; + } + } //default physical address 1.0.0.0 #define CEC_DEFAULT_PHYSICAL_ADDRESS 0x1000