#pragma once
#include "env.h"
#if defined(HAVE_AOCEC_API)
#include "p8-platform/threads/mutex.h"
#include "p8-platform/threads/threads.h"
#include "../AdapterCommunication.h"
#include <map>
namespace CEC
{
class CAOCECAdapterCommunication : public IAdapterCommunication, public P8PLATFORM::CThread
{
public:
CAOCECAdapterCommunication(IAdapterCommunicationCallback *callback);
virtual ~CAOCECAdapterCommunication(void);
bool Open(uint32_t iTimeoutMs = CEC_DEFAULT_CONNECT_TIMEOUT, bool bSkipChecks = false, bool bStartListening = true);
void Close(void);
bool IsOpen(void);
std::string GetError(void) const;
cec_adapter_message_state Write(const cec_command &data, bool &bRetry, uint8_t iLineTimeout, bool bIsReply);
bool SetLineTimeout(uint8_t UNUSED(iTimeout)) { return true; }
bool StartBootloader(void) { return false; }
bool SetLogicalAddresses(const cec_logical_addresses &addresses);
cec_logical_addresses GetLogicalAddresses(void) const;
bool PingAdapter(void) { return IsInitialised(); }
uint16_t GetFirmwareVersion(void);
uint32_t GetFirmwareBuildDate(void) { return 0; }
bool IsRunningLatestFirmware(void) { return true; }
bool SaveConfiguration(const libcec_configuration & UNUSED(configuration)) { return false; }
bool SetAutoMode(bool UNUSED(automode)) { return false; }
bool GetConfiguration(libcec_configuration & UNUSED(configuration)) { return false; }
std::string GetPortName(void) { return std::string("AOCEC"); }
uint16_t GetPhysicalAddress(void);
bool SetControlledMode(bool UNUSED(controlled)) { return true; }
cec_vendor_id GetVendorId(void);
bool SupportsSourceLogicalAddress(const cec_logical_address address) { return address > CECDEVICE_TV && address <= CECDEVICE_BROADCAST; }
cec_adapter_type GetAdapterType(void) { return ADAPTERTYPE_AOCEC; }
uint16_t GetAdapterVendorId(void) const { return 1; }
uint16_t GetAdapterProductId(void) const { return 1; }
void HandleLogicalAddressLost(cec_logical_address oldAddress);
void SetActiveSource(bool UNUSED(bSetTo), bool UNUSED(bClientUnregistered)) {}
#if CEC_LIB_VERSION_MAJOR >= 5
bool GetStats(struct cec_adapter_stats* UNUSED(stats)) { return false; }
#endif
void *Process(void);
private:
bool IsInitialised(void) const { return 1; };
std::string m_strError;
bool m_bLogicalAddressChanged;
cec_logical_addresses m_logicalAddresses;
mutable P8PLATFORM::CMutex m_mutex;
int m_fd;
};
};
#endif