X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fadapter%2FUSBCECAdapterCommunication.h;h=4ca8e87e1810c794c088dc4a15a7c053422e129c;hb=56e53c14cf072c449743fa36f2f80318cd64bfc3;hp=d2de30e17447c7f41e15b895dd5ee5aa73af4613;hpb=960f33c651b2dd1e6331dafe5b21705c11cee1a2;p=deb_libcec.git diff --git a/src/lib/adapter/USBCECAdapterCommunication.h b/src/lib/adapter/USBCECAdapterCommunication.h index d2de30e..4ca8e87 100644 --- a/src/lib/adapter/USBCECAdapterCommunication.h +++ b/src/lib/adapter/USBCECAdapterCommunication.h @@ -45,14 +45,15 @@ namespace PLATFORM namespace CEC { class CCECProcessor; + class CAdapterPingThread; class CUSBCECAdapterCommunication : public IAdapterCommunication, private PLATFORM::CThread { public: CUSBCECAdapterCommunication(CCECProcessor *processor, const char *strPort, uint16_t iBaudRate = 38400); - virtual ~CUSBCECAdapterCommunication(); + virtual ~CUSBCECAdapterCommunication() {}; - virtual bool Open(IAdapterCommunicationCallback *cb, uint32_t iTimeoutMs = 10000); + virtual bool Open(IAdapterCommunicationCallback *cb, uint32_t iTimeoutMs = 10000, bool bSkipChecks = false, bool bStartListening = true); virtual void Close(void); virtual bool IsOpen(void); virtual CStdString GetError(void) const; @@ -66,16 +67,46 @@ namespace CEC virtual bool PingAdapter(void); virtual uint16_t GetFirmwareVersion(void); virtual bool SetControlledMode(bool controlled); - virtual bool PersistConfiguration(libcec_configuration * UNUSED(configuration)) { return false; } // TODO + virtual bool PersistConfiguration(libcec_configuration *configuration); + virtual bool GetConfiguration(libcec_configuration *configuration); + virtual CStdString GetPortName(void); + virtual uint16_t GetPhysicalAddress(void) { return 0; } void *Process(void); private: + bool SendCommand(cec_adapter_messagecode msgCode, CCECAdapterMessage ¶ms, bool bExpectAck = true, bool bIsTransmission = false, bool bSendDirectly = true, bool bIsRetry = false); + cec_datapacket GetSetting(cec_adapter_messagecode msgCode, uint8_t iResponseLength); + + bool SetSettingAutoEnabled(bool enabled); + bool GetSettingAutoEnabled(bool &enabled); + + bool SetSettingDeviceType(cec_device_type type); + bool GetSettingDeviceType(cec_device_type &type); + + bool SetSettingDefaultLogicalAddress(cec_logical_address address); + bool GetSettingDefaultLogicalAddress(cec_logical_address &address); + + bool SetSettingLogicalAddressMask(uint16_t iMask); + bool GetSettingLogicalAddressMask(uint16_t &iMask); + + bool SetSettingPhysicalAddress(uint16_t iPhysicalAddress); + bool GetSettingPhysicalAddress(uint16_t &iPhysicalAddress); + + bool SetSettingCECVersion(cec_version version); + bool GetSettingCECVersion(cec_version &version); + + bool SetSettingOSDName(const char *strOSDName); + bool GetSettingOSDName(CStdString &strOSDName); + + bool WriteEEPROM(void); + + bool SetAckMaskInternal(uint16_t iMask, bool bWriteDirectly = false); + bool CheckAdapter(uint32_t iTimeoutMs = 10000); bool Write(CCECAdapterMessage *data); bool Read(CCECAdapterMessage &msg, uint32_t iTimeout = 1000); bool ParseMessage(const CCECAdapterMessage &msg); void SendMessageToAdapter(CCECAdapterMessage *msg); - void WriteNextCommand(void); void AddData(uint8_t *data, size_t iLen); bool ReadFromDevice(uint32_t iTimeout, size_t iSize = 256); bool WaitForAck(CCECAdapterMessage &message); @@ -83,17 +114,33 @@ namespace CEC PLATFORM::ISocket * m_port; CCECProcessor * m_processor; PLATFORM::SyncedBuffer m_inBuffer; - PLATFORM::SyncedBuffer m_outBuffer; PLATFORM::CMutex m_mutex; - PLATFORM::CCondition m_rcvCondition; + PLATFORM::CCondition m_rcvCondition; volatile bool m_bHasData; uint8_t m_iLineTimeout; uint16_t m_iFirmwareVersion; cec_command m_currentframe; - cec_logical_address m_lastInitiator; + cec_logical_address m_lastDestination; CCECAdapterMessage m_currentAdapterMessage; bool m_bNextIsEscaped; bool m_bGotStart; IAdapterCommunicationCallback * m_callback; + bool m_bInitialised; + bool m_bWaitingForAck[15]; + CAdapterPingThread * m_pingThread; + }; + + class CAdapterPingThread : public PLATFORM::CThread + { + public: + CAdapterPingThread(CUSBCECAdapterCommunication *com, uint32_t iTimeout) : + m_com(com), + m_timeout(iTimeout){} + virtual ~CAdapterPingThread(void) {} + + virtual void* Process(void); + private: + CUSBCECAdapterCommunication *m_com; + PLATFORM::CTimeout m_timeout; }; };