#pragma once
#include "env.h"
#include "adapter/AdapterCommunication.h"
namespace CEC
{
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_GET_ADAPTER_TYPE,
MSGCODE_SET_ACTIVE_SOURCE,
MSGCODE_GET_AUTO_POWER_ON,
MSGCODE_SET_AUTO_POWER_ON,
MSGCODE_FRAME_EOM = 0x80,
MSGCODE_FRAME_ACK = 0x40,
} cec_adapter_messagecode;
typedef enum p8_cec_adapter_type
{
P8_ADAPTERTYPE_UNKNOWN = 0,
P8_ADAPTERTYPE_EXTERNAL,
P8_ADAPTERTYPE_DAUGHTERBOARD,
} p8_cec_adapter_type;
#define USBCEC_MAX_MSG_SIZE (18 * 4)
class CCECAdapterMessage
{
public:
CCECAdapterMessage(void);
CCECAdapterMessage(const cec_command &command, uint8_t iLineTimeout = 3);
std::string ToString(void) const;
static const char *ToString(cec_adapter_messagecode msgCode);
uint8_t At(uint8_t pos) const;
uint8_t operator[](uint8_t pos) const;
uint8_t Size(void) const;
bool IsEmpty(void) const;
void Clear(void);
void Append(CCECAdapterMessage &data);
void PushBack(uint8_t byte);
void PushEscaped(uint8_t byte);
bool PushReceivedByte(uint8_t byte);
cec_adapter_messagecode Message(void) const;
cec_adapter_messagecode ResponseTo(void) const;
bool IsTransmission(void) const;
bool IsEOM(void) const;
bool IsACK(void) const;
static bool MessageCodeIsError(const cec_adapter_messagecode code);
bool IsError(void) const;
bool ReplyIsError(void) const;
bool NeedsRetry(void) const;
cec_logical_address Initiator(void) const;
cec_logical_address Destination(void) const;
bool HasStartMessage(void) const;
bool PushToCecCommand(cec_command &command) const;
cec_adapter_messagecode Reply(void) const;
uint8_t m_tx_data[USBCEC_MAX_MSG_SIZE];
uint8_t m_tx_len;
uint8_t m_rx_data[USBCEC_MAX_MSG_SIZE];
uint8_t m_rx_len;
cec_adapter_message_state state;
int32_t transmit_timeout;
uint8_t lineTimeout;
bool bFireAndForget;
private:
bool bNextByteIsEscaped;
};
}