/* * Copyright (C) 2015 by Multi-Tech Systems * * This file is part of libmts-io. * * libmts-io is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * libmts-io is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with libmts-io. If not, see . * */ /*! \file MTS_IO_SerialConnection.h \brief A brief description \date Jan 15, 2013 \author sgodinez A more elaborate description */ #ifndef MTS_IO_SERIALCONNECTION_H_ #define MTS_IO_SERIALCONNECTION_H_ #include #include #include #include namespace MTS { namespace IO { class SerialConnection : public Connection { public: enum ETYPE { RS232, RS422, RS485 }; enum EPARITY { OFF, ODD, EVEN }; enum EDATABITS { B5, B6, B7, B8 }; enum ESTOPBITS { B1, B2 }; enum IOCTL { LE = TIOCM_LE, DTR = TIOCM_DTR, RTS = TIOCM_RTS, ST = TIOCM_ST, SR = TIOCM_SR, CTS = TIOCM_CTS, CAR = TIOCM_CAR, CD = TIOCM_CD, RNG = TIOCM_RNG, RI = TIOCM_RI, DSR = TIOCM_DSR }; enum FLOW_CONTROL { NONE, RTS_CTS }; class Builder { public: Builder(const std::string& sPortName); Builder& type(const ETYPE& eType); Builder& rs232(); Builder& rs422(); Builder& rs485(); Builder& parity(const EPARITY& eParity); Builder& parityOff(); Builder& parityOdd(); Builder& parityEven(); Builder& dataBits(const EDATABITS& eDataLength); Builder& fiveDataBits(); Builder& sixDataBits(); Builder& sevenDataBits(); Builder& eightDataBits(); Builder& stopBits(const ESTOPBITS& eStopBits); Builder& oneStopBit(); Builder& twoStopBits(); Builder& useLockFile(bool enabled = true); Builder& flowControl(const FLOW_CONTROL& eFlowControl); Builder& baudRate(uint32_t iBaud); Builder& build(); const std::string& getPortName() const; const uint32_t& getBaudRate() const; ETYPE getType() const; EPARITY getParity() const; EDATABITS getDataBits() const; ESTOPBITS getStopBits() const; FLOW_CONTROL getFlowControl() const; std::string getTypeAsString() const; bool isUsingLockFile() const; bool isBuilt() const; private: std::string m_sPortName; uint32_t m_iBaudRate; ETYPE m_eType; EPARITY m_eParity; EDATABITS m_eDataBits; ESTOPBITS m_eStopBits; FLOW_CONTROL m_eFlowControl; bool m_bLockFile; bool m_bBuilt; }; SerialConnection(const Builder& oBuilder); virtual ~SerialConnection(); const std::string& getPortName() const; uint32_t getBaudRate() const; void flush(); void drain(); protected: virtual int getFileDescriptor(); private: const std::string m_sPortName; uint32_t m_iBaudRate; ETYPE m_eType; EPARITY m_eParity; EDATABITS m_eDataBits; ESTOPBITS m_eStopBits; FLOW_CONTROL m_eFlowControl; AutoPtr m_apLockFile; AutoPtr m_apHandleLock; #ifdef WIN32 HANDLE m_iHandle; #else int m_iHandle; termios m_stPrevOptions; #endif virtual bool doOpen(const int32_t& timeoutMillis); virtual void doClose(); virtual int doRead(char* pBuffer, const uint32_t& iSize, int32_t& timeoutMillis); virtual int doWrite(const char* pBuffer, const uint32_t& iSize, int32_t& timeoutMillis); void cleanup(); void printPortSetting(const termios *options); const char* humanSpeed(speed_t speed); }; } } #endif /* MTS_IO_SERIALCONNECTION_H_ */