/*
* 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
*/
#ifndef TNX_TERMIOSHELPER_H__
#define TNX_TERMIOSHELPER_H__
#include
#include
#include
#include
#include "qportsettings.h"
#include "qserialport.h"
struct termios;
namespace TNX {
/*!
Wrapper class for termios structure on Posix compatible systems.
*/
class TermiosHelper
{
enum { kDefaultReadTimeout = 0, kDefaultNumOfBytes = 1 }; // counted read
enum ControlSignals {
CSIGNAL_DSR = TIOCM_LE,
CSIGNAL_DTR = TIOCM_DTR,
CSIGNAL_RTS = TIOCM_RTS,
CSIGNAL_CTS = TIOCM_CTS,
CSIGNAL_DCD = TIOCM_CD,
CSIGNAL_RNG = TIOCM_RNG
};
public:
explicit TermiosHelper(int fileDescriptor);
~TermiosHelper();
bool applyChanges(ChangeApplyTypes apptype = AllAppTy);
QPortSettings::BaudRate baudRate() const;
void setBaudRate(QPortSettings::BaudRate baudRate);
QPortSettings::DataBits dataBits() const;
void setDataBits(QPortSettings::DataBits dataBits);
QPortSettings::Parity parity() const;
void setParity(QPortSettings::Parity parity);
QPortSettings::StopBits stopBits() const;
void setStopBits(QPortSettings::StopBits stopBits);
QPortSettings::FlowControl flowControl() const;
void setFlowControl(QPortSettings::FlowControl flow);
bool commTimeouts(CommTimeouts &timeouts) const;
void setCommTimeouts(const CommTimeouts commtimeouts);
inline QSerialPort::CommSignalValues rts() const {
return ctrSignal(CSIGNAL_RTS);
}
inline bool setRts(bool value = true) {
return setCtrSignal(CSIGNAL_RTS, value);
}
inline QSerialPort::CommSignalValues dtr() const {
return ctrSignal(CSIGNAL_DTR);
}
inline bool setDtr(bool value = true) {
return setCtrSignal(CSIGNAL_DTR, value);
}
inline QSerialPort::CommSignalValues cts() const {
return ctrSignal(CSIGNAL_CTS);
}
inline bool setCts(bool value = true) {
return setCtrSignal(CSIGNAL_CTS, value);
}
inline QSerialPort::CommSignalValues dsr() const {
return ctrSignal(CSIGNAL_DSR);
}
inline bool setDsr(bool value = true) {
return setCtrSignal(CSIGNAL_DSR, value);
}
inline QSerialPort::CommSignalValues dcd() const {
return ctrSignal(CSIGNAL_DCD);
}
inline bool setDcd(bool value = true) {
return setCtrSignal(CSIGNAL_DCD, value);
}
inline QSerialPort::CommSignalValues ri() const {
return ctrSignal(CSIGNAL_RNG);
}
inline bool setRi(bool value = true) {
return setCtrSignal(CSIGNAL_RNG, value);
}
// helper methods to manage port attributes in 'termios' data structure
private:
void saveTermios();
void restoreTermios();
void initTermios();
bool setCtrSignal(ControlSignals csig, bool value = true);
QSerialPort::CommSignalValues ctrSignal(ControlSignals csig) const;
private:
int fileDescriptor_;
struct termios *originalAttrs_;
struct termios *currentAttrs_;
private:
TermiosHelper();
};
}
#endif // TNX_TERMIOSHELPER_H__