xref: /OK3568_Linux_fs/app/forlinx/flapp/src/plugins/serialassistant/serialassistantwidget.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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