1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
* 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 <http://www.gnu.org/licenses/>
*
* author labs@inbiza.com
*/
#ifndef TNX_COMMDCBHELPER_H__
#define TNX_COMMDCBHELPER_H__
#include <QString>
#include <QStringList>
#include <QDebug>
#include "qportsettings.h"
#include "qserialport.h"
#include <windows.h>
namespace TNX {
/*!
Wrapper class for DCB structure on Windows systems.
*/
class CommDCBHelper
{
enum { kDefaultReadTimeout = 0, kDefaultNumOfBytes = 1 };
enum ControlSignals {
CSIGNAL_DSR,
CSIGNAL_DTR,
CSIGNAL_RTS,
CSIGNAL_CTS,
CSIGNAL_DCD,
CSIGNAL_RNG
};
public:
explicit CommDCBHelper(HANDLE fileDescriptor);
~CommDCBHelper();
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);
void setCommTimeouts(const CommTimeouts commtimeouts);
inline bool setRts(bool value = true) {
return setCtrSignal(CSIGNAL_RTS, value);
}
inline bool setDtr(bool value = true) {
return setCtrSignal(CSIGNAL_DTR, value);
}
inline QSerialPort::CommSignalValues cts() const {
return ctrSignal(CSIGNAL_CTS);
}
inline QSerialPort::CommSignalValues dsr() const {
return ctrSignal(CSIGNAL_DSR);
}
inline QSerialPort::CommSignalValues dcd() const {
return ctrSignal(CSIGNAL_DCD);
}
inline QSerialPort::CommSignalValues ri() const {
return ctrSignal(CSIGNAL_RNG);
}
static QString errorText(DWORD err);
// helper methods to manage port attributes in 'termios' data structure
private:
void saveDCB();
bool getCommTimeouts();
void restoreDCB();
void initDCB();
bool setCtrSignal(ControlSignals csig, bool value = true);
QSerialPort::CommSignalValues ctrSignal(ControlSignals csig) const;
private:
HANDLE fileHandle_;
DCB *originalAttrs_;
DCB *currentAttrs_;
COMMTIMEOUTS commTimeouts_;
private:
CommDCBHelper();
Q_DISABLE_COPY(CommDCBHelper);
};
}
#endif // TNX_COMMDCBHELPER_H__