X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fplatform%2Fsockets%2Fserialport.h;h=cb78b37c17a2d3821ab7f9ea99f7ecd7b6747789;hb=2b44051cbfa70deafc30d9767323214debbc1a75;hp=bbe01363ce69266f484c4157df19cda7a0bb1734;hpb=24048d575419fe909fade9110fab48d17370ee6f;p=deb_libcec.git diff --git a/src/lib/platform/sockets/serialport.h b/src/lib/platform/sockets/serialport.h index bbe0136..cb78b37 100644 --- a/src/lib/platform/sockets/serialport.h +++ b/src/lib/platform/sockets/serialport.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,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 #include @@ -45,51 +45,77 @@ 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 + { + 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(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 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 + { + 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 (new CSerialSocket(strName, iBaudrate, iDatabits, iStopbits, iParity)) {} + virtual ~CSerialPort(void) {} }; };