1 #include "serialassistantwidget.h"
2 #include "console.h"
3 #include <QLabel>
4 #include "serialport.h"
5 #include <QSerialPortInfo>
6 #include <QDebug>
7 #include <QLineEdit>
8 #include <QTimer>
9 #include <QFileDialog>
10 #include <QIntValidator>
11 #include "ui_serialassistantwidget.h"
12 #include "messagebox.h"
13
SerialAssistantWidget(QWidget * parent)14 SerialAssistantWidget::SerialAssistantWidget(QWidget *parent) :
15 QWidget(parent),
16 ui(new Ui::SerialAssistantWidget),
17 m_timer(new QTimer(this))
18 {
19 ui->setupUi(this);
20
21 m_startID = getID();
22 PlatformServer *server = new PlatformServer(m_startID, this);
23 ServerManager::instance()->registerSever(server);
24 ServerManager::instance()->addHandler(m_startID, this);
25
26 foreach (QSerialPortInfo info, QSerialPortInfo::availablePorts()) {
27 ui->serialPortInfoListBox->addItem(info.portName());
28 }
29
30 ui->dataBitsBox->addItem("Data8", QVariant(QSerialPort::Data8));
31 ui->dataBitsBox->addItem("Data5", QVariant(QSerialPort::Data5));
32 ui->dataBitsBox->addItem("Data6", QVariant(QSerialPort::Data6));
33 ui->dataBitsBox->addItem("Data7", QVariant(QSerialPort::Data7));
34
35 ui->baudRateBox->addItem("Baud115200", QVariant(QSerialPort::Baud115200));
36 ui->baudRateBox->addItem("Baud1200", QVariant(QSerialPort::Baud1200));
37 ui->baudRateBox->addItem("Baud2400", QVariant(QSerialPort::Baud2400));
38 ui->baudRateBox->addItem("Baud4800", QVariant(QSerialPort::Baud4800));
39 ui->baudRateBox->addItem("Baud9600", QVariant(QSerialPort::Baud9600));
40 ui->baudRateBox->addItem("Baud19200", QVariant(QSerialPort::Baud19200));
41 ui->baudRateBox->addItem("Baud38400", QVariant(QSerialPort::Baud38400));
42 ui->baudRateBox->addItem("Baud57600", QVariant(QSerialPort::Baud57600));
43
44 ui->parityBox->addItem("NoParity", QVariant(QSerialPort::NoParity));
45 ui->parityBox->addItem("EvenParity", QVariant(QSerialPort::EvenParity));
46 ui->parityBox->addItem("OddParity", QVariant(QSerialPort::OddParity));
47 ui->parityBox->addItem("SpaceParity", QVariant(QSerialPort::SpaceParity));
48 ui->parityBox->addItem("MarkParity", QVariant(QSerialPort::MarkParity));
49
50 ui->stopBitsBox->addItem("OneStop", QVariant(QSerialPort::OneStop));
51 ui->stopBitsBox->addItem("OneAndHalfStop", QVariant(QSerialPort::OneAndHalfStop));
52 ui->stopBitsBox->addItem("TwoStop", QVariant(QSerialPort::TwoStop));
53
54 ui->flowControlBox->addItem("NoFlowControl", QVariant(QSerialPort::NoFlowControl));
55 ui->flowControlBox->addItem("HardwareControl", QVariant(QSerialPort::HardwareControl));
56 ui->flowControlBox->addItem("SoftwareControl", QVariant(QSerialPort::SoftwareControl));
57 ui->openBtn->setCheckable(true);
58
59 connect(m_timer, &QTimer::timeout, this, [=](){
60 QByteArray a = ui->plainTextEdit->toPlainText().toLocal8Bit();
61 if(ui->hexcheckBox->isChecked())
62 {
63 a =QByteArray::fromHex(a);
64 }
65 this->sendData(a+"\r");
66 });
67
68 connect(ui->timerCheckBox, &QCheckBox::clicked, this, [=](bool checked){
69 if(!checked && m_timer->isActive())
70 {
71 m_timer->stop();
72 }
73 });
74
75 QIntValidator *valid = new QIntValidator(10, 5000);
76 ui->timeEdt->setValidator(valid);
77 }
78
~SerialAssistantWidget()79 SerialAssistantWidget::~SerialAssistantWidget()
80 {
81 m_timer->stop();
82 delete m_timer;
83 ServerManager::instance()->stop(m_startID);
84 delete ui;
85 }
86
handleData(const QByteArray & d)87 void SerialAssistantWidget::handleData(const QByteArray &d)
88 {
89 ui->textBrowser->insertPlainText(d);
90 ui->textBrowser->moveCursor(QTextCursor::End);
91 }
92
handleError(const QString error)93 void SerialAssistantWidget::handleError(const QString error)
94 {
95 ui->textBrowser->insertPlainText(error);
96 ui->textBrowser->moveCursor(QTextCursor::End);
97
98 // "ERROR[code=111string=openfalire]";
99 if(error.contains(QString("code=%1").arg(QSerialPort::OpenError))
100 ||error.contains(QString("code=%1").arg(QSerialPort::DeviceNotFoundError))
101 ||error.contains(QString("code=%1").arg(QSerialPort::PermissionError))
102 ||error.contains(QString("code=%1").arg(QSerialPort::NotOpenError))
103 )
104 {
105
106 ui->openBtn->click();
107 }
108 }
109
getID()110 QString SerialAssistantWidget::getID()
111 {
112 static int i=0;
113 return QString("SERIAL %1").arg(i++);
114 }
115
setControl(QWidget * control)116 void SerialAssistantWidget::setControl(QWidget *control)
117 {
118 QVBoxLayout *pVLayout = dynamic_cast<QVBoxLayout*>(ui->switchWidget->layout());
119 if(pVLayout)
120 {
121 pVLayout->addWidget(control);
122 }
123 }
124
on_openBtn_clicked()125 void SerialAssistantWidget::on_openBtn_clicked()
126 {
127 if(ui->openBtn->isChecked()){
128 ui->openBtn->setText("关闭");
129 ui->textBrowser->clear();
130 ui->plainTextEdit->clear();
131 ServerManager::instance()->stop(m_startID);
132 QVariantList arg;
133 arg <<ui->serialPortInfoListBox->currentText()
134 << ui->baudRateBox->currentData().toInt()
135 << ui->dataBitsBox->currentData().toInt()
136 <<ui->stopBitsBox->currentData().toInt()
137 << ui->parityBox->currentData().toInt()
138 <<ui->flowControlBox->currentData().toInt();
139
140 ServerManager::instance()->config(m_startID, arg);
141 ServerManager::instance()->start(m_startID);
142
143 qDebug()<<"create server open "<< m_startID;
144 }else{
145 qDebug()<<"create server close"<< m_startID;
146 if(m_timer->isActive())
147 {
148 m_timer->stop();
149 }
150 ServerManager::instance()->stop(m_startID);
151 ui->openBtn->setText("打开");
152 }
153 }
154
on_clearTXBtn_clicked()155 void SerialAssistantWidget::on_clearTXBtn_clicked()
156 {
157 ui->textBrowser->clear();
158 }
159
on_sendBtn_clicked()160 void SerialAssistantWidget::on_sendBtn_clicked()
161 {
162 if(!ui->openBtn->isChecked())
163 {
164 MessageBox::showMessage(this ,"please open serial");
165 return;
166 }
167
168 if(!ui->timerCheckBox->isChecked())
169 {
170 m_timer->setSingleShot(true);
171 m_timer->start(0);
172 }else{
173 m_timer->setSingleShot(false);
174 int mSeconds= ui->timeEdt->text().toInt();
175 if(mSeconds <10){
176 mSeconds=10;
177 }else if(mSeconds >5000){
178 mSeconds=5000;
179 }
180 m_timer->start(mSeconds);
181 }
182 }
183
on_sendFileBtn_clicked()184 void SerialAssistantWidget::on_sendFileBtn_clicked()
185 {
186 if(!ui->openBtn->isChecked())
187 {
188 MessageBox::showMessage(this ,"please open serial");
189 return;
190 }
191
192 QString fileName = QFileDialog::getOpenFileName();
193 QFile file(fileName);
194 if(!fileName.isEmpty() && file.open(QFile::ReadOnly | QFile::Text))
195 {
196 QTextStream s(&file);
197 QString line;
198 while (s.readLineInto(&line)) {
199 QByteArray a = line.toUtf8() +"\n";
200 if(ui->hexcheckBox->isChecked()){
201 a =QByteArray::fromHex(a);
202 }
203 this->sendData(a);
204 }
205 }
206 }
207