Set the port settings before open in the examples
[qt:qtserialport.git] / examples / serialport / master / dialog.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Denis Shienkov <denis.shienkov@gmail.com>
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the QtSerialPort module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.  For licensing terms and
14 ** conditions see http://qt.digia.com/licensing.  For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file.  Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights.  These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file.  Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include "dialog.h"
43
44 #include <QLabel>
45 #include <QLineEdit>
46 #include <QComboBox>
47 #include <QSpinBox>
48 #include <QPushButton>
49 #include <QGridLayout>
50
51 #include <QtSerialPort/QSerialPortInfo>
52
53 QT_USE_NAMESPACE
54
55 Dialog::Dialog(QWidget *parent)
56     : QDialog(parent)
57     , transactionCount(0)
58     , serialPortLabel(new QLabel(tr("Serial port:")))
59     , serialPortComboBox(new QComboBox())
60     , waitResponseLabel(new QLabel(tr("Wait response, msec:")))
61     , waitResponseSpinBox(new QSpinBox())
62     , requestLabel(new QLabel(tr("Request:")))
63     , requestLineEdit(new QLineEdit(tr("Who are you?")))
64     , trafficLabel(new QLabel(tr("No traffic.")))
65     , statusLabel(new QLabel(tr("Status: Not running.")))
66     , runButton(new QPushButton(tr("Start")))
67 {
68     foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
69         serialPortComboBox->addItem(info.portName());
70
71     waitResponseSpinBox->setRange(0, 10000);
72     waitResponseSpinBox->setValue(100);
73
74     QGridLayout *mainLayout = new QGridLayout;
75     mainLayout->addWidget(serialPortLabel, 0, 0);
76     mainLayout->addWidget(serialPortComboBox, 0, 1);
77     mainLayout->addWidget(waitResponseLabel, 1, 0);
78     mainLayout->addWidget(waitResponseSpinBox, 1, 1);
79     mainLayout->addWidget(runButton, 0, 2, 2, 1);
80     mainLayout->addWidget(requestLabel, 2, 0);
81     mainLayout->addWidget(requestLineEdit, 2, 1, 1, 3);
82     mainLayout->addWidget(trafficLabel, 3, 0, 1, 4);
83     mainLayout->addWidget(statusLabel, 4, 0, 1, 5);
84     setLayout(mainLayout);
85
86     setWindowTitle(tr("Master"));
87     serialPortComboBox->setFocus();
88
89     timer.setSingleShot(true);
90
91     connect(runButton, SIGNAL(clicked()),
92             this, SLOT(sendRequest()));
93     connect(&serial, SIGNAL(readyRead()),
94             this, SLOT(readResponse()));
95     connect(&timer, SIGNAL(timeout()),
96             this, SLOT(processTimeout()));
97 }
98
99 void Dialog::sendRequest()
100 {
101     if (serial.portName() != serialPortComboBox->currentText()) {
102         serial.close();
103         serial.setPortName(serialPortComboBox->currentText());
104
105         if (!serial.open(QIODevice::ReadWrite)) {
106             processError(tr("Can't open %1, error code %2")
107                          .arg(serial.portName()).arg(serial.error()));
108             return;
109         }
110     }
111
112     setControlsEnabled(false);
113     statusLabel->setText(tr("Status: Running, connected to port %1.")
114                          .arg(serialPortComboBox->currentText()));
115
116     serial.write(requestLineEdit->text().toLocal8Bit());
117     timer.start(waitResponseSpinBox->value());
118 }
119
120 void Dialog::readResponse()
121 {
122     response.append(serial.readAll());
123 }
124
125 void Dialog::processTimeout()
126 {
127     setControlsEnabled(true);
128     trafficLabel->setText(tr("Traffic, transaction #%1:"
129                              "\n\r-request: %2"
130                              "\n\r-response: %3")
131                           .arg(++transactionCount).arg(requestLineEdit->text()).arg(QString(response)));
132     response.clear();
133 }
134
135 void Dialog::processError(const QString &error)
136 {
137     setControlsEnabled(true);
138     statusLabel->setText(tr("Status: Not running, %1.").arg(error));
139     trafficLabel->setText(tr("No traffic."));
140 }
141
142 void Dialog::setControlsEnabled(bool enable)
143 {
144     runButton->setEnabled(enable);
145     serialPortComboBox->setEnabled(enable);
146     waitResponseSpinBox->setEnabled(enable);
147     requestLineEdit->setEnabled(enable);
148 }