/* * Unofficial Qt Serial Port Library * * Copyright (c) 2010 Inbiza Systems Inc. All rights reserved. * * This program 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 3 of the License, or (at your * option) any later version. * * This program 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 General Public License for * more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see * * author labs@inbiza.com * @brief Declares QPortSettings class that is required to set the port attributes. */ #ifndef TNX_QSERIALPORTSETTINGS_H__ #define TNX_QSERIALPORTSETTINGS_H__ #include #include "qserialport_export.h" #ifdef TNX_POSIX_SERIAL_PORT #undef TNX_POSIX_SERIAL_PORT #endif #ifdef TNX_WINDOWS_SERIAL_PORT #undef TNX_WINDOWS_SERIAL_PORT #endif #if defined(Q_OS_UNIX) || defined(Q_OS_LINUX) || defined(Q_OS_DARWIN) #define TNX_POSIX_SERIAL_PORT #endif #if defined(Q_OS_WIN32) || defined(Q_OS_WINCE) #include #define TNX_WINDOWS_SERIAL_PORT #endif namespace TNX { enum ChangeApplyTypes { AllAppTy, PortAttrOnlyAppTy, CommTimeoutsOnlyAppTy }; /** * Communication timeout values for Win32/CE and Posix platforms. * @see www.unixwiz.net/techtips/termios-vmin-vtime.html */ struct CommTimeouts { #ifdef TNX_WINDOWS_SERIAL_PORT typedef DWORD commt_t; static const DWORD NoTimeout = MAXDWORD; #else typedef quint8 commt_t; static const qint8 NoTimeout = -1; #endif // Win32 only section commt_t Win32ReadIntervalTimeout; ///< Maximum time between read chars. Win32 only. commt_t Win32ReadTotalTimeoutMultiplier; ///< Multiplier of characters. Win32 only. commt_t Win32ReadTotalTimeoutConstant; ///< Constant in milliseconds. Win32 only. commt_t Win32WriteTotalTimeoutMultiplier; ///< Multiplier of characters. Win32 only. commt_t Win32WriteTotalTimeoutConstant; ///< Constant in milliseconds. Win32 only. // Posix only section commt_t PosixVTIME; ///< Read timeout. Posix only. commt_t PosixVMIN; ///< Minimum number of bytes before returning from ///< read operation. Posix only. CommTimeouts() : Win32ReadIntervalTimeout(NoTimeout), Win32ReadTotalTimeoutMultiplier(0), Win32ReadTotalTimeoutConstant(0), Win32WriteTotalTimeoutMultiplier(25), Win32WriteTotalTimeoutConstant(250), PosixVTIME(0), PosixVMIN(1) { } }; /** * Wrapper class for serial port settings. */ class TONIX_EXPORT QPortSettings { public: enum BaudRate { BAUDR_UNKNOWN = 0, #ifdef TNX_POSIX_SERIAL_PORT BAUDR_50, BAUDR_75, BAUDR_134, BAUDR_150, BAUDR_200, BAUDR_1800, //BAUDR_76800, #endif #ifdef Q_OS_LINUX BAUDR_230400, BAUDR_460800, BAUDR_500000, BAUDR_576000, BAUDR_921600, #endif #ifdef TNX_WINDOWS_SERIAL_PORT BAUDR_14400, BAUDR_56000, BAUDR_128000, BAUDR_256000, #endif // baud rates supported by all OSs BAUDR_110, BAUDR_300, BAUDR_600, BAUDR_1200, BAUDR_2400, BAUDR_4800, BAUDR_9600, BAUDR_19200, BAUDR_38400, BAUDR_57600, BAUDR_115200 }; enum DataBits { DB_5, // simulated in POSIX DB_6, DB_7, DB_8, DB_UNKNOWN }; enum Parity { PAR_NONE, PAR_ODD, PAR_EVEN, #ifdef TNX_WINDOWS_SERIAL_PORT PAR_MARK, #endif PAR_SPACE, // simulated in POSIX PAR_UNKNOWN }; enum StopBits { STOP_1, #ifdef TNX_WINDOWS_SERIAL_PORT STOP_1_5, #endif STOP_2, STOP_UNKNOWN }; enum FlowControl { FLOW_OFF, FLOW_HARDWARE, FLOW_XONXOFF, FLOW_UNKNOWN }; QPortSettings(); QPortSettings(const QString &settings); // port configuration methods bool set(const QString &settings); inline BaudRate baudRate() const { return baudRate_; } void setBaudRate(BaudRate baudRate) { baudRate_ = baudRate; switch ( baudRate_ ) { #ifdef TNX_POSIX_SERIAL_PORT case BAUDR_50: baudRateInt_=50; break; case BAUDR_75: baudRateInt_=75; break; case BAUDR_134: baudRateInt_=134; break; case BAUDR_150: baudRateInt_=150; break; case BAUDR_200: baudRateInt_=200; break; case BAUDR_1800: baudRateInt_=1800; break; //case 76800: baudRateInt_=76800; break; #endif #ifdef TNX_WINDOWS_SERIAL_PORT case BAUDR_14400: baudRateInt_=14400; break; case BAUDR_56000: baudRateInt_=56000; break; case BAUDR_128000: baudRateInt_=128000; break; case BAUDR_256000: baudRateInt_=256000; break; #endif #if defined(Q_OS_LINUX) case BAUDR_230400: baudRateInt_=230400; break; case BAUDR_460800: baudRateInt_=460800; break; case BAUDR_500000: baudRateInt_=500000; break; case BAUDR_576000: baudRateInt_=576000; break; case BAUDR_921600: baudRateInt_=921600; break; #endif // baud rates supported by all platforms case BAUDR_110: baudRateInt_=110; break; case BAUDR_300: baudRateInt_=300; break; case BAUDR_600: baudRateInt_=600; break; case BAUDR_1200: baudRateInt_=1200; break; case BAUDR_2400: baudRateInt_=2400; break; case BAUDR_4800: baudRateInt_=4800; break; case BAUDR_9600: baudRateInt_=9600; break; case BAUDR_19200: baudRateInt_=19200; break; case BAUDR_38400: baudRateInt_=38400; break; case BAUDR_57600: baudRateInt_=57600; break; case BAUDR_115200: baudRateInt_=115200; break; default: baudRateInt_ = 0; // unknown baudrate } } inline Parity parity() const { return parity_; } inline void setParity(Parity parity) { parity_ = parity; } inline StopBits stopBits() const { return stopBits_; } inline void setStopBits(StopBits stopBits) { stopBits_ = stopBits; } inline DataBits dataBits() const { return dataBits_; } inline void setDataBits(DataBits dataBits) { dataBits_ = dataBits; } inline FlowControl flowControl() const { return flowControl_; } inline void setFlowControl(FlowControl flowControl) { flowControl_ = flowControl; } QString toString() const; // helper methods to configure port settings private: static BaudRate baudRateFromInt(int baud, bool &ok); static DataBits dataBitsFromString(const QString &databits, bool &ok); static Parity parityFromString(const QString &parity, bool &ok); static StopBits stopBitsFromString(const QString &stopbits, bool &ok); static FlowControl flowControlFromString(const QString &flow, bool &ok); private: BaudRate baudRate_; DataBits dataBits_; Parity parity_; StopBits stopBits_; FlowControl flowControl_; qint32 baudRateInt_; }; } #endif // TNX_QSERIALPORTSETTINGS_H__