Set the port settings before open in the examples
[qt:qtserialport.git] / examples / serialport / slave / 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     , waitRequestLabel(new QLabel(tr("Wait request, msec:")))
61     , waitRequestSpinBox(new QSpinBox())
62     , responseLabel(new QLabel(tr("Response:")))
63     , responseLineEdit(new QLineEdit(tr("Hello, I'm Slave.")))
64     , trafficLabel(new QLabel(tr("No traffic.")))
65     , statusLabel(new QLabel(tr("Status: Not running.")))
66     , runButton(new QPushButton(tr("Start")))
67 {
68     waitRequestSpinBox->setRange(0, 10000);
69     waitRequestSpinBox->setValue(20);
70
71     foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
72         serialPortComboBox->addItem(info.portName());
73
74     QGridLayout *mainLayout = new QGridLayout;
75     mainLayout->addWidget(serialPortLabel, 0, 0);
76     mainLayout->addWidget(serialPortComboBox, 0, 1);
77     mainLayout->addWidget(waitRequestLabel, 1, 0);
78     mainLayout->addWidget(waitRequestSpinBox, 1, 1);
79     mainLayout->addWidget(runButton, 0, 2, 2, 1);
80     mainLayout->addWidget(responseLabel, 2, 0);
81     mainLayout->addWidget(responseLineEdit, 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("Slave"));
87     serialPortComboBox->setFocus();
88
89     timer.setSingleShot(true);
90
91     connect(runButton, SIGNAL(clicked()),
92             this, SLOT(startSlave()));
93     connect(&serial, SIGNAL(readyRead()),
94             this, SLOT(readRequest()));
95     connect(&timer, SIGNAL(timeout()),
96             this, SLOT(processTimeout()));
97
98     connect(serialPortComboBox, SIGNAL(currentIndexChanged(QString)),
99             this, SLOT(activateRunButton()));
100     connect(waitRequestSpinBox, SIGNAL(valueChanged(int)),
101             this, SLOT(activateRunButton()));
102     connect(responseLineEdit, SIGNAL(textChanged(QString)),
103             this, SLOT(activateRunButton()));
104 }
105
106 void Dialog::startSlave()
107 {
108     if (serial.portName() != serialPortComboBox->currentText()) {
109         serial.close();
110         serial.setPortName(serialPortComboBox->currentText());
111
112         if (!serial.open(QIODevice::ReadWrite)) {
113             processError(tr("Can't open %1, error code %2")
114                          .arg(serial.portName()).arg(serial.error()));
115             return;
116         }
117     }
118
119     runButton->setEnabled(false);
120     statusLabel->setText(tr("Status: Running, connected to port %1.")
121                          .arg(serialPortComboBox->currentText()));
122 }
123
124 void Dialog::readRequest()
125 {
126     if (!timer.isActive())
127         timer.start(waitRequestSpinBox->value());
128     request.append(serial.readAll());
129 }
130
131 void Dialog::processTimeout()
132 {
133     serial.write(responseLineEdit->text().toLocal8Bit());
134
135     trafficLabel->setText(tr("Traffic, transaction #%1:"
136                              "\n\r-request: %2"
137                              "\n\r-response: %3")
138                           .arg(++transactionCount).arg(QString(request)).arg(responseLineEdit->text()));
139     request.clear();
140 }
141
142 void Dialog::activateRunButton()
143 {
144     runButton->setEnabled(true);
145 }
146
147 void Dialog::processError(const QString &s)
148 {
149     activateRunButton();
150     statusLabel->setText(tr("Status: Not running, %1.").arg(s));
151     trafficLabel->setText(tr("No traffic."));
152 }