/*
* 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.
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_name;
- return strName;
- }
+ class CSerialSocket : public CCommonSocket<serial_socket_t>
+ {
+ public:
+ CSerialSocket(const CStdString &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) {}
- #ifdef __WINDOWS__
- virtual bool IsOpen(void);
- 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);
+ virtual ~CSerialSocket(void) { Close(); }
- private:
- void FormatWindowsError(int iErrorCode, CStdString &strMessage);
- bool SetBaudRate(uint32_t baudrate);
+ virtual bool Open(uint64_t iTimeoutMs = 0);
+ virtual void Close(void);
+ 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);
- std::string m_name;
- bool m_tostdout;
+ virtual bool IsOpen(void)
+ {
+ return m_socket != INVALID_SERIAL_SOCKET_VALUE &&
+ m_bIsOpen;
+ }
- 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
+
+ bool m_bIsOpen;
+ uint32_t m_iBaudrate;
+ SerialDataBits m_iDatabits;
+ SerialStopBits m_iStopbits;
+ SerialParity m_iParity;
+ };
+
+ class CSerialPort : public CProtectedSocket<CSerialSocket>
+ {
+ public:
+ CSerialPort(const CStdString &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) {}
};
};