updated copyright messages for 2013
[deb_libcec.git] / src / lib / platform / sockets / serialport.h
index 7b0a3a0be8af8b9764c74e2ca4f68d5f94871f26..bf33df9aa61cdfc1e6a74a6d116828ffcc884f04 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * This file is part of the libCEC(R) library.
  *
- * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited.  All rights reserved.
+ * libCEC(R) is Copyright (C) 2011-2013 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,8 +31,8 @@
  *     http://www.pulse-eight.net/
  */
 
-#include "../os.h"
-#include "../util/buffer.h"
+#include "lib/platform/os.h"
+#include "lib/platform/util/buffer.h"
 
 #include <string>
 #include <stdint.h>
 
 namespace PLATFORM
 {
-  #define PAR_NONE 0
-  #define PAR_EVEN 1
-  #define PAR_ODD  2
+  enum SerialParity
+  {
+    SERIAL_PARITY_NONE = 0,
+    SERIAL_PARITY_EVEN,
+    SERIAL_PARITY_ODD
+  };
 
-  class CSerialPort : public CSocket
+  enum SerialStopBits
   {
-    public:
-      CSerialPort(void);
-      virtual ~CSerialPort(void) {}
+    SERIAL_STOP_BITS_ONE = 1,
+    SERIAL_STOP_BITS_TWO = 2
+  };
 
-      bool Open(std::string name, uint32_t baudrate, uint8_t databits = 8, uint8_t stopbits = 1, uint8_t parity = PAR_NONE);
+  enum SerialDataBits
+  {
+    SERIAL_DATA_BITS_FIVE  = 5,
+    SERIAL_DATA_BITS_SIX   = 6,
+    SERIAL_DATA_BITS_SEVEN = 7,
+    SERIAL_DATA_BITS_EIGHT = 8
+  };
 
-      CStdString GetName(void) const
-      {
-        CStdString strName;
-        strName = m_strName;
-        return strName;
-      }
+  class CSerialSocket : public CCommonSocket<serial_socket_t>
+  {
+    public:
+      CSerialSocket(const std::string &strName, uint32_t iBaudrate, SerialDataBits iDatabits = SERIAL_DATA_BITS_EIGHT, SerialStopBits iStopbits = SERIAL_STOP_BITS_ONE, SerialParity iParity = SERIAL_PARITY_NONE) :
+          CCommonSocket<serial_socket_t>(INVALID_SERIAL_SOCKET_VALUE, strName),
+          #ifdef __WINDOWS__
+          m_iCurrentReadTimeout(MAXDWORD),
+          #endif
+          m_bIsOpen(false),
+          m_iBaudrate(iBaudrate),
+          m_iDatabits(iDatabits),
+          m_iStopbits(iStopbits),
+          m_iParity(iParity) {}
+
+      virtual ~CSerialSocket(void) { Close(); }
 
-    #ifdef __WINDOWS__
-      virtual bool IsOpen(void);
+      virtual bool Open(uint64_t iTimeoutMs = 0);
       virtual void Close(void);
-      virtual int64_t Write(uint8_t* data, uint32_t len);
-      virtual int32_t Read(uint8_t* data, uint32_t len, uint64_t iTimeoutMs = 0);
-    #endif
+      virtual void Shutdown(void);
+      virtual ssize_t Write(void* data, size_t len);
+      virtual ssize_t Read(void* data, size_t len, uint64_t iTimeoutMs = 0);
 
-    private:
-      bool SetBaudRate(uint32_t baudrate);
+      virtual bool IsOpen(void)
+      {
+        return m_socket != INVALID_SERIAL_SOCKET_VALUE &&
+            m_bIsOpen;
+      }
 
-    private:
-    #ifdef __WINDOWS__
-      void FormatWindowsError(int iErrorCode, CStdString &strMessage);
-      bool SetTimeouts(bool bBlocking);
+      virtual bool SetBaudRate(uint32_t baudrate);
 
-      HANDLE                m_handle; 
-      bool                  m_bIsOpen;
-      uint32_t              m_iBaudrate;
-      uint8_t               m_iDatabits;
-      uint8_t               m_iStopbits;
-      uint8_t               m_iParity;
-      int64_t               m_iTimeout;
-      SyncedBuffer<uint8_t> m_buffer;
-      HANDLE                m_ovHandle;
+    protected:
+  #ifndef __WINDOWS__
+      struct termios  m_options;
   #else
-      struct termios     m_options;
+      bool SetTimeouts(serial_socket_t socket, int* iError, DWORD iTimeoutMs);
+      DWORD           m_iCurrentReadTimeout;
   #endif
-      std::string  m_strName;
-      bool         m_bToStdOut;
+
+      bool            m_bIsOpen;
+      uint32_t        m_iBaudrate;
+      SerialDataBits  m_iDatabits;
+      SerialStopBits  m_iStopbits;
+      SerialParity    m_iParity;
+  };
+
+  class CSerialPort : public CProtectedSocket<CSerialSocket>
+  {
+  public:
+    CSerialPort(const std::string &strName, uint32_t iBaudrate, SerialDataBits iDatabits = SERIAL_DATA_BITS_EIGHT, SerialStopBits iStopbits = SERIAL_STOP_BITS_ONE, SerialParity iParity = SERIAL_PARITY_NONE) :
+      CProtectedSocket<CSerialSocket> (new CSerialSocket(strName, iBaudrate, iDatabits, iStopbits, iParity)) {}
+    virtual ~CSerialPort(void) {}
   };
 };