1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Denis Shienkov <denis.shienkov@gmail.com>
4 ** Copyright (C) 2012 Laszlo Papp <lpapp@kde.org>
5 ** Contact: http://www.qt.io/licensing/
6 **
7 ** This file is part of the QtSerialPort module of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL21$
10 ** Commercial License Usage
11 ** Licensees holding valid commercial Qt licenses may use this file in
12 ** accordance with the commercial license agreement provided with the
13 ** Software or, alternatively, in accordance with the terms contained in
14 ** a written agreement between you and The Qt Company. For licensing terms
15 ** and conditions see http://www.qt.io/terms-conditions. For further
16 ** information use the contact form at http://www.qt.io/contact-us.
17 **
18 ** GNU Lesser General Public License Usage
19 ** Alternatively, this file may be used under the terms of the GNU Lesser
20 ** General Public License version 2.1 or version 3 as published by the Free
21 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
22 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
23 ** following information to ensure the GNU Lesser General Public License
24 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
25 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
26 **
27 ** As a special exception, The Qt Company gives you certain additional
28 ** rights. These rights are described in The Qt Company LGPL Exception
29 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
30 **
31 ** $QT_END_LICENSE$
32 **
33 ****************************************************************************/
34
35 #include "mainwindow.h"
36 #include "ui_mainwindow.h"
37 #include "console.h"
38 #include "settingsdialog.h"
39
40 #include <QMessageBox>
41 #include <QLabel>
42 #include <QtSerialPort/QSerialPort>
43
44 //! [0]
TeriminalWidget(QWidget * parent)45 TeriminalWidget::TeriminalWidget(QWidget *parent) :
46 QMainWindow(parent),
47 ui(new Ui::TeriminalWidget)
48 {
49
50 //! [0]
51 ui->setupUi(this);
52 console = new Console;
53 console->setEnabled(false);
54 setCentralWidget(console);
55
56 console->installEventFilter(this);
57 console->viewport()->installEventFilter(this);
58
59 //! [1]
60 serial = new QSerialPort(this);
61 //! [1]
62 settings = new SettingsDialog;
63
64 ui->actionConnect->setEnabled(true);
65 ui->actionDisconnect->setEnabled(false);
66 ui->actionQuit->setEnabled(true);
67 ui->actionConfigure->setEnabled(true);
68
69 status = new QLabel("Disconnected");
70 ui->statusBar->addWidget(status);
71
72 initActionsConnections();
73
74 connect(serial, static_cast<void (QSerialPort::*)(QSerialPort::SerialPortError)>(&QSerialPort::error),
75 this, &TeriminalWidget::handleError);
76
77 //! [2]
78 connect(serial, &QSerialPort::readyRead, this, &TeriminalWidget::readData);
79 //! [2]
80 connect(console, &Console::getData, this, &TeriminalWidget::writeData);
81 //! [3]
82 ui->menuBar->setVisible(false);
83
84 }
85 //! [3]
86
~TeriminalWidget()87 TeriminalWidget::~TeriminalWidget()
88 {
89 delete settings;
90 delete ui;
91 }
92
93 //! [4]
openSerialPort()94 void TeriminalWidget::openSerialPort()
95 {
96 SettingsDialog::Settings p = settings->settings();
97 serial->setPortName(p.name);
98 serial->setBaudRate(p.baudRate);
99 serial->setDataBits(p.dataBits);
100 serial->setParity(p.parity);
101 serial->setStopBits(p.stopBits);
102 serial->setFlowControl(p.flowControl);
103 if (serial->open(QIODevice::ReadWrite)) {
104 console->setEnabled(true);
105 console->setLocalEchoEnabled(p.localEchoEnabled);
106 ui->actionConnect->setEnabled(false);
107 ui->actionDisconnect->setEnabled(true);
108 ui->actionConfigure->setEnabled(false);
109 showStatusMessage(tr("Connected to %1 : %2, %3, %4, %5, %6")
110 .arg(p.name).arg(p.stringBaudRate).arg(p.stringDataBits)
111 .arg(p.stringParity).arg(p.stringStopBits).arg(p.stringFlowControl));
112 } else {
113 QMessageBox::critical(this, tr("Error"), serial->errorString());
114
115 showStatusMessage(tr("Open error"));
116 }
117 }
118 //! [4]
119
120 //! [5]
closeSerialPort()121 void TeriminalWidget::closeSerialPort()
122 {
123 if (serial->isOpen())
124 serial->close();
125 console->setEnabled(false);
126 ui->actionConnect->setEnabled(true);
127 ui->actionDisconnect->setEnabled(false);
128 ui->actionConfigure->setEnabled(true);
129 showStatusMessage(tr("Disconnected"));
130 }
131 //! [5]
132
about()133 void TeriminalWidget::about()
134 {
135 QMessageBox::about(this, tr("About Simple Terminal"),
136 tr("The <b>Simple Terminal</b> example demonstrates how to "
137 "use the Qt Serial Port module in modern GUI applications "
138 "using Qt, with a menu bar, toolbars, and a status bar."));
139 }
140
141 //! [6]
writeData(const QByteArray & data)142 void TeriminalWidget::writeData(const QByteArray &data)
143 {
144 serial->write(data);
145 }
146 //! [6]
147
148 //! [7]
readData()149 void TeriminalWidget::readData()
150 {
151 QByteArray data = serial->readAll();
152 console->putData(data);
153 }
154 //! [7]
155
156 //! [8]
handleError(QSerialPort::SerialPortError error)157 void TeriminalWidget::handleError(QSerialPort::SerialPortError error)
158 {
159 if (error == QSerialPort::ResourceError) {
160 QMessageBox::critical(this, tr("Critical Error"), serial->errorString());
161 closeSerialPort();
162 }
163 }
164 //! [8]
165
initActionsConnections()166 void TeriminalWidget::initActionsConnections()
167 {
168 connect(ui->actionConnect, &QAction::triggered, this, &TeriminalWidget::openSerialPort);
169 connect(ui->actionDisconnect, &QAction::triggered, this, &TeriminalWidget::closeSerialPort);
170 connect(ui->actionQuit, &QAction::triggered, this, &TeriminalWidget::close);
171 connect(ui->actionConfigure, &QAction::triggered, settings, &TeriminalWidget::show);
172 connect(ui->actionClear, &QAction::triggered, console, &Console::clear);
173 connect(ui->actionAbout, &QAction::triggered, this, &TeriminalWidget::about);
174 connect(ui->actionAboutQt, &QAction::triggered, qApp, &QApplication::aboutQt);
175 }
176
showStatusMessage(const QString & message)177 void TeriminalWidget::showStatusMessage(const QString &message)
178 {
179 status->setText(message);
180 }
181