#include <stdint.h>
#include <string.h>
-#include <stdbool.h>
-
-#ifdef __cplusplus
-extern "C" {
-namespace CEC {
-#endif
#if !defined(DECLSPEC)
#if defined(_WIN32) || defined(_WIN64)
#endif
#endif
+#ifdef __cplusplus
+extern "C" {
+namespace CEC {
+#endif
+
typedef enum
{
CEC_ABORT_REASON_UNRECOGNIZED_OPCODE = 0,
CEC_TRUE = 1
} ECecBoolean;
-typedef enum
+typedef enum cec_version
{
- CEC_VERSION_1_2 = 0x01,
- CEC_VERSION_1_2A = 0x02,
- CEC_VERSION_1_3 = 0x03,
- CEC_VERSION_1_3A = 0x04
-} ECecVersion;
+ 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;
typedef enum
{
CEC_DEVICE_TYPE_AUDIO_SYSTEM = 5
} ECecDeviceType;
-typedef enum
+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
-} ECecDisplayControl;
+} cec_display_control;
typedef enum
{
CEC_PLAY_MODE_SLOW_REVERSE_MAX_SPEED = 0x1B
} ECecPlayMode;
-typedef enum
+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
-} ECecPowerStatus;
+ CEC_POWER_STATUS_IN_TRANSITION_ON_TO_STANDBY = 0x03,
+ CEC_POWER_STATUS_UNKNOWN = 0x99
+} cec_power_status;
typedef enum
{
CEC_USER_CONTROL_CODE_UNKNOWN
} cec_user_control_code;
+typedef enum cec_an_user_control_code
+{
+ CEC_AN_USER_CONTROL_CODE_RETURN = 0x91
+} cec_an_user_control_code;
+
typedef enum cec_logical_address
{
CECDEVICE_UNKNOWN = -1, //not a valid logical address
typedef enum cec_log_level
{
- CEC_LOG_DEBUG = 0,
- CEC_LOG_NOTICE,
- CEC_LOG_WARNING,
- CEC_LOG_ERROR
+ 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 struct cec_menu_language
+{
+ char language[4];
+ cec_logical_address device;
+} cec_menu_language;
+
typedef struct cec_log_message
{
char message[1024];
} cec_datapacket;
-typedef struct cec_adapter_message
-{
- cec_datapacket packet;
-
-#ifdef __cplusplus
- 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; };
-#endif
-} cec_adapter_message;
-
typedef struct cec_command
{
cec_logical_address initiator;
cec_logical_address destination;
- bool ack;
- bool eom;
+ int8_t ack;
+ int8_t eom;
cec_opcode opcode;
cec_datapacket parameters;
- bool opcode_set;
+ int8_t opcode_set;
+ int32_t ack_timeout;
#ifdef __cplusplus
static void format(cec_command &command, cec_logical_address initiator, cec_logical_address destination, cec_opcode opcode)
command.initiator = initiator;
command.destination = destination;
command.opcode = opcode;
- command.opcode_set = true;
+ command.opcode_set = 1;
+ command.ack_timeout = 1000;
}
void push_back(uint8_t data)
{
- if (!opcode_set)
+ 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 = true;
+ opcode_set = 1;
opcode = (cec_opcode) data;
}
else
{
initiator = CECDEVICE_UNKNOWN;
destination = CECDEVICE_UNKNOWN;
- ack = false;
- eom = false;
- opcode_set = false;
+ ack = 0;
+ eom = 0;
+ opcode_set = 0;
opcode = CEC_OPCODE_FEATURE_ABORT;
+ ack_timeout = 1000;
parameters.clear();
};
#endif
typedef enum cec_vendor_id
{
- CEC_VENDOR_SAMSUNG = 240,
+ CEC_VENDOR_SAMSUNG = 0x00F0,
+ CEC_VENDOR_LG = 0xE091,
CEC_VENDOR_UNKNOWN = 0
} vendor_id;
-//default physical address 1.0.0.0
+//default physical address 1.0.0.0, HDMI port 1
#define CEC_DEFAULT_PHYSICAL_ADDRESS 0x1000
#define MSGSTART 0xFF
#define MSGEND 0xFE
#define MSGESC 0xFD
#define ESCOFFSET 3
-#define CEC_MIN_VERSION 6
-#define CEC_LIB_VERSION 7
-#define CEC_SETTLE_DOWN_TIME 1500
+#define CEC_MIN_VERSION 8
+#define CEC_LIB_VERSION 8
#define CEC_BUTTON_TIMEOUT 500
#ifdef __cplusplus