X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fadapter%2FAdapterCommunication.h;h=cec8501a0c3e22a051fee4e3709dd758281577bf;hb=7bb4ed43f15a0fa2be17d2c3f580b181ac7430a7;hp=3d74546d5e5b970a0ab93204fdea01591ac4f77e;hpb=1fc16cfd0bc42166ca6a184d42ee50d393c95a34;p=deb_libcec.git diff --git a/src/lib/adapter/AdapterCommunication.h b/src/lib/adapter/AdapterCommunication.h index 3d74546..cec8501 100644 --- a/src/lib/adapter/AdapterCommunication.h +++ b/src/lib/adapter/AdapterCommunication.h @@ -2,7 +2,7 @@ /* * This file is part of the libCEC(R) library. * - * libCEC(R) is Copyright (C) 2011 Pulse-Eight Limited. All rights reserved. + * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved. * libCEC(R) is an original work, containing original code. * * libCEC(R) is a trademark of Pulse-Eight Limited. @@ -31,55 +31,93 @@ * http://www.pulse-eight.net/ */ -#include -#include "platform/os.h" - -namespace PLATFORM -{ - class CSerialPort; -} +#include "../platform/util/StdString.h" namespace CEC { - class CCECProcessor; - class CCECAdapterMessage; + typedef enum cec_adapter_message_state + { + ADAPTER_MESSAGE_STATE_UNKNOWN = 0, /**< the initial state */ + ADAPTER_MESSAGE_STATE_WAITING_TO_BE_SENT, /**< waiting in the send queue of the adapter, or timed out */ + ADAPTER_MESSAGE_STATE_SENT, /**< sent and waiting on an ACK */ + ADAPTER_MESSAGE_STATE_SENT_NOT_ACKED, /**< sent, but failed to ACK */ + ADAPTER_MESSAGE_STATE_SENT_ACKED, /**< sent, and ACK received */ + ADAPTER_MESSAGE_STATE_INCOMING, /**< received from another device */ + ADAPTER_MESSAGE_STATE_ERROR /**< an error occured */ + } cec_adapter_message_state; - class CAdapterCommunication : private PLATFORM::CThread + class IAdapterCommunication { public: - CAdapterCommunication(CCECProcessor *processor); - virtual ~CAdapterCommunication(); + /*! + * @brief Open a connection to the CEC adapter + * @param iTimeoutMs Connection timeout in ms + * @return True when connected, false otherwise + */ + virtual bool Open(uint32_t iTimeoutMs = 10000) = 0; + + /*! + * @brief Close an open connection + */ + virtual void Close(void) = 0; + + /*! + * @return True when the connection is open, false otherwise + */ + virtual bool IsOpen(void) = 0; + + /*! + * @return The last error message, or an empty string if there was none + */ + virtual CStdString GetError(void) const = 0; + + /*! + * @brief Reads one cec_command from the adapter + * @param command The command that will be read (output) + * @param iTimeout The read timeout + * @return True when a command has been read, false otherwise. + */ + virtual bool Read(cec_command &command, uint32_t iTimeout) = 0; - bool Open(const char *strPort, uint16_t iBaudRate = 38400, uint32_t iTimeoutMs = 10000); - bool Read(CCECAdapterMessage &msg, uint32_t iTimeout = 1000); - bool Write(CCECAdapterMessage *data); - void Close(void); - bool IsOpen(void); - std::string GetError(void) const; + /*! + * @brief Write a cec_command to the adapter + * @param data The command to write + * @param iMaxTries The maximum number of tries + * @param iLineTimeout The line timeout for the first try + * @param iRetryLineTimeout The line timeout for each next try + * @return The last state of the transmitted command + */ + virtual cec_adapter_message_state Write(const cec_command &data, uint8_t iMaxTries, uint8_t iLineTimeout = 3, uint8_t iRetryLineTimeout = 3) = 0; - void *Process(void); + /*! + * @brief Change the current line timeout on the CEC bus + * @param iTimeout The new timeout + * @return True when set, false otherwise + */ + virtual bool SetLineTimeout(uint8_t iTimeout) = 0; - bool SetLineTimeout(uint8_t iTimeout); - bool StartBootloader(void); - bool SetAckMask(uint16_t iMask); - bool PingAdapter(void); - uint16_t GetFirmwareVersion(void); + /*! + * @brief Put the device in bootloader mode (which will disrupt CEC communication when it succeeds) + * @return True when the bootloader command has been sent, false otherwise. + */ + virtual bool StartBootloader(void) = 0; - bool WaitForTransmitSucceeded(CCECAdapterMessage *message); + /*! + * @brief Change the ACK-mask of the device, the mask for logical addresses to which the CEC device should ACK + * @param iMask The new mask + * @return True when set, false otherwise. + */ + virtual bool SetAckMask(uint16_t iMask) = 0; - private: - void SendMessageToAdapter(CCECAdapterMessage *msg); - void WriteNextCommand(void); - void AddData(uint8_t *data, uint8_t iLen); - bool ReadFromDevice(uint32_t iTimeout); + /*! + * @brief Check whether the CEC adapter responds + * @return True when the ping was sent and acked, false otherwise. + */ + virtual bool PingAdapter(void) = 0; - PLATFORM::CSerialPort * m_port; - CCECProcessor * m_processor; - PLATFORM::SyncedBuffer m_inBuffer; - PLATFORM::SyncedBuffer m_outBuffer; - PLATFORM::CMutex m_mutex; - PLATFORM::CCondition m_rcvCondition; - uint8_t m_iLineTimeout; - uint16_t m_iFirmwareVersion; + /*! + * @return The firmware version of this CEC adapter. + */ + virtual uint16_t GetFirmwareVersion(void) = 0; }; };