1#include <QSerialPortInfo>
2#include <QLoggingCategory>
3#include "OperateSerialPort.h"
4#include "DlgSettingsSerialPort.h"
7static Q_LOGGING_CATEGORY(log,
"SerialPort.Operate")
12 SetParameter(&m_Parameter);
15COperateSerialPort::~COperateSerialPort()
28int COperateSerialPort::Start()
33 slotUpdateParameter(
this);
36 check = connect(m_pTerminal, &QTermWidget::sendData,
37 this, [&](
const char* buf,
int len){
38 if(!m_SerialPort.isOpen())
return;
39 QByteArray data(buf, len);
41 qint64 nLen = m_SerialPort.write(data);
43 GetStats()->AddSends(nLen);
46 check = connect(&m_SerialPort, SIGNAL(readyRead()),
47 this, SLOT(slotReadyRead()));
49 check = connect(&m_SerialPort, &QSerialPort::errorOccurred,
50 this, [&](QSerialPort::SerialPortError error) {
51 qCritical(log) << m_SerialPort.errorString() << error;
52 if(m_SerialPort.isOpen())
53 emit
sigError(error, m_SerialPort.errorString());
57 if(-1 == m_Parameter.GetSerialPort()
58 && m_Parameter.GetSerialPortName().isEmpty()) {
59 qCritical(log) <<
"Serial port is invalid";
63 int index = m_Parameter.GetSerialPort();
64 if(0 < index && index < QSerialPortInfo::availablePorts().size()) {
65 QSerialPortInfo info = QSerialPortInfo::availablePorts().at(index);
66 if(info.portName() == m_Parameter.GetSerialPortName())
67 m_SerialPort.setPort(info);
69 m_SerialPort.setPortName(m_Parameter.GetSerialPortName());
71 if(m_Parameter.GetSerialPortName().isEmpty()) {
72 qCritical(log) <<
"Serial port is invalid";
76 m_SerialPort.setPortName(m_Parameter.GetSerialPortName());
78 m_SerialPort.setBaudRate(m_Parameter.GetBaudRate());
79 m_SerialPort.setParity(m_Parameter.GetParity());
80 m_SerialPort.setDataBits(m_Parameter.GetDataBits());
81 m_SerialPort.setStopBits(m_Parameter.GetStopBits());
82 m_SerialPort.setFlowControl(m_Parameter.GetFlowControl());
83 if(!m_SerialPort.open(QIODevice::ReadWrite)) {
85 szError = tr(
"Open Serial port [%1] fail errno[%2]: %3").
86 arg(m_Parameter.GetSerialPortName(),
87 QString::number(m_SerialPort.error()), m_SerialPort.errorString());
88 qCritical(log) << szError;
89 emit
sigError(m_SerialPort.error(), szError);
93 m_pTerminal->startTerminalTeletype();
98int COperateSerialPort::Stop()
101 m_pTerminal->close();
103 m_SerialPort.close();
108void COperateSerialPort::slotReadyRead()
110 if(!m_SerialPort.isOpen())
112 auto data = m_SerialPort.readAll();
114 GetStats()->AddReceives(data.length());
115 WriteTerminal(data.data(), data.length());
122 if(!m_Parameter.GetName().isEmpty())
123 return m_Parameter.GetName();
125 if(!m_Parameter.GetSerialPortName().isEmpty())
126 szName = m_Parameter.GetSerialPortName();
135 QString szDescription;
136 if(!
Name().isEmpty())
137 szDescription = tr(
"Name: ") +
Name() +
"\n";
140 szDescription += tr(
"Type: ") +
GetTypeName() +
"\n";
143 szDescription += tr(
"Protocol: ") +
Protocol();
145 if(!
GetPlugin()->DisplayName().isEmpty())
148 szDescription +=
"\n";
151 if(!m_Parameter.GetSerialPortName().isEmpty())
152 szDescription += tr(
"Serial port: ") + m_Parameter.GetSerialPortName() +
"\n";
154 if(GetSecurityLevel() != SecurityLevel::No)
155 szDescription += tr(
"Security level: ") + GetSecurityLevelString() +
"\n";
160 return szDescription;
virtual QDialog * OnOpenDialogSettings(QWidget *parent) override
Open settgins dialog.
const QString Name() override
Name.
const QString Description() override
Description.
virtual CBackend * InstanceBackend() override
New CBackend.
Terminal operate interface.
virtual const QString Name() override
Name.
void sigFinished()
Successful disconnection signal.
void sigRunning()
Start success signal.
void sigError(const int nError, const QString &szError)
Triggered when an error is generated.
virtual const QString Protocol() const
Protocol.
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin.
virtual const QString GetTypeName() const
Get type name.
virtual const QString DisplayName() const
The plugin display name.
virtual const QString Description() const =0
Plugin description.