cec: implemented the write methods for the v2 configuration. bugzid: 543
[deb_libcec.git] / src / lib / adapter / USBCECAdapterCommunication.h
index 8cada4dbe0fd1259b13bf68cf6044f7a97958c61..98f72fc427c9a2a9d6cde09c675de8d74bab07a6 100644 (file)
@@ -31,7 +31,7 @@
  *     http://www.pulse-eight.net/
  */
 
-#include <cectypes.h>
+#include "../../../include/cectypes.h"
 #include "../platform/threads/threads.h"
 #include "../platform/util/buffer.h"
 #include "AdapterCommunication.h"
@@ -46,13 +46,30 @@ namespace CEC
 {
   class CCECProcessor;
 
+  class CUSBCECAdapterProcessor: public PLATFORM::CThread
+  {
+  public:
+    CUSBCECAdapterProcessor(IAdapterCommunicationCallback *cb) :
+      m_callback(cb) {};
+    virtual ~CUSBCECAdapterProcessor(void)
+    {
+      StopThread();
+    }
+
+    void *Process(void);
+    void AddCommand(cec_command command);
+  private:
+    IAdapterCommunicationCallback *     m_callback;
+    PLATFORM::SyncedBuffer<cec_command> m_inBuffer;
+  };
+
   class CUSBCECAdapterCommunication : public IAdapterCommunication, private PLATFORM::CThread
   {
   public:
     CUSBCECAdapterCommunication(CCECProcessor *processor, const char *strPort, uint16_t iBaudRate = 38400);
     virtual ~CUSBCECAdapterCommunication();
 
-    virtual bool Open(uint32_t iTimeoutMs = 10000);
+    virtual bool Open(IAdapterCommunicationCallback *cb, uint32_t iTimeoutMs = 10000, bool bSkipChecks = false);
     virtual void Close(void);
     virtual bool IsOpen(void);
     virtual CStdString GetError(void) const;
@@ -66,16 +83,30 @@ namespace CEC
     virtual bool PingAdapter(void);
     virtual uint16_t GetFirmwareVersion(void);
     virtual bool SetControlledMode(bool controlled);
+    virtual bool PersistConfiguration(libcec_configuration *configuration);
+    virtual CStdString GetPortName(void);
+    virtual uint16_t GetPhysicalAddress(void) { return 0; }
 
     void *Process(void);
   private:
+    bool SetAutoEnabled(bool enabled);
+    bool SetDefaultLogicalAddress(cec_logical_address address);
+    bool SetLogicalAddressMask(uint16_t iMask);
+    bool SetPhysicalAddress(uint16_t iPhysicalAddress);
+    bool SetCECVersion(cec_version version);
+    bool SetOSDName(const char *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);
+    bool ReadFromDevice(uint32_t iTimeout, size_t iSize = 256);
     bool WaitForAck(CCECAdapterMessage &message);
 
     PLATFORM::ISocket *                          m_port;
@@ -83,7 +114,8 @@ namespace CEC
     PLATFORM::SyncedBuffer<CCECAdapterMessage *> m_inBuffer;
     PLATFORM::SyncedBuffer<CCECAdapterMessage *> m_outBuffer;
     PLATFORM::CMutex                             m_mutex;
-    PLATFORM::CCondition                         m_rcvCondition;
+    PLATFORM::CCondition<volatile bool>          m_rcvCondition;
+    volatile bool                                m_bHasData;
     uint8_t                                      m_iLineTimeout;
     uint16_t                                     m_iFirmwareVersion;
     cec_command                                  m_currentframe;
@@ -91,5 +123,8 @@ namespace CEC
     CCECAdapterMessage                           m_currentAdapterMessage;
     bool                                         m_bNextIsEscaped;
     bool                                         m_bGotStart;
+    IAdapterCommunicationCallback *              m_callback;
+    CUSBCECAdapterProcessor *                    m_messageProcessor;
+    bool                                         m_bInitialised;
   };
 };