Rabbit Remote Control 0.1.0-alpha
Loading...
Searching...
No Matches
OperateSerialPort.cpp
1#include <QSerialPortInfo>
2#include <QLoggingCategory>
3#include "OperateSerialPort.h"
4#include "DlgSettingsSerialPort.h"
5#include "Plugin.h"
6
7static Q_LOGGING_CATEGORY(log, "SerialPort.Operate")
8
10 : COperateTerminal(plugin)
11{
12 SetParameter(&m_Parameter);
13}
14
15COperateSerialPort::~COperateSerialPort()
16{}
17
19{
20 return new CDlgSettingsSerialPort(&m_Parameter, parent);
21}
22
24{
25 return nullptr;
26}
27
28int COperateSerialPort::Start()
29{
30 if(!m_pTerminal)
31 return -1;
32
33 slotUpdateParameter(this);
34
35 bool check = false;
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);
40 //qDebug(log) << "Send data:" << data << data.toHex(':');
41 qint64 nLen = m_SerialPort.write(data);
42 if(GetStats())
43 GetStats()->AddSends(nLen);
44 });
45 Q_ASSERT(check);
46 check = connect(&m_SerialPort, SIGNAL(readyRead()),
47 this, SLOT(slotReadyRead()));
48 Q_ASSERT(check);
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());
54 });
55 Q_ASSERT(check);
56
57 if(-1 == m_Parameter.GetSerialPort()
58 && m_Parameter.GetSerialPortName().isEmpty()) {
59 qCritical(log) << "Serial port is invalid";
60 return -1;
61 }
62
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);
68 else
69 m_SerialPort.setPortName(m_Parameter.GetSerialPortName());
70 } else {
71 if(m_Parameter.GetSerialPortName().isEmpty()) {
72 qCritical(log) << "Serial port is invalid";
73 return -1;
74 }
75 else
76 m_SerialPort.setPortName(m_Parameter.GetSerialPortName());
77 }
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)) {
84 QString szError;
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);
90 return -1;
91 }
92
93 m_pTerminal->startTerminalTeletype();
94 emit sigRunning();
95 return 0;
96}
97
98int COperateSerialPort::Stop()
99{
100 if(m_pTerminal)
101 m_pTerminal->close();
102
103 m_SerialPort.close();
104 emit sigFinished();
105 return 0;
106}
107
108void COperateSerialPort::slotReadyRead()
109{
110 if(!m_SerialPort.isOpen())
111 return;
112 auto data = m_SerialPort.readAll();
113 if(GetStats())
114 GetStats()->AddReceives(data.length());
115 WriteTerminal(data.data(), data.length());
116}
117
119{
120 QString szName;
121
122 if(!m_Parameter.GetName().isEmpty())
123 return m_Parameter.GetName();
124
125 if(!m_Parameter.GetSerialPortName().isEmpty())
126 szName = m_Parameter.GetSerialPortName();
127
128 if(szName.isEmpty())
129 szName = COperateTerminal::Name();
130 return szName;
131}
132
134{
135 QString szDescription;
136 if(!Name().isEmpty())
137 szDescription = tr("Name: ") + Name() + "\n";
138
139 if(!GetTypeName().isEmpty())
140 szDescription += tr("Type: ") + GetTypeName() + "\n";
141
142 if(!Protocol().isEmpty()) {
143 szDescription += tr("Protocol: ") + Protocol();
144#ifdef DEBUG
145 if(!GetPlugin()->DisplayName().isEmpty())
146 szDescription += " - " + GetPlugin()->DisplayName();
147#endif
148 szDescription += "\n";
149 }
150
151 if(!m_Parameter.GetSerialPortName().isEmpty())
152 szDescription += tr("Serial port: ") + m_Parameter.GetSerialPortName() + "\n";
153
154 if(GetSecurityLevel() != SecurityLevel::No)
155 szDescription += tr("Security level: ") + GetSecurityLevelString() + "\n";
156
157 if(!GetPlugin()->Description().isEmpty())
158 szDescription += tr("Description: ") + GetPlugin()->Description();
159
160 return szDescription;
161}
Backend interface.
Definition Backend.h:42
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.
Definition Operate.cpp:71
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin.
Definition Operate.cpp:259
virtual const QString GetTypeName() const
Get type name.
Definition Operate.cpp:76
Plugin interface.
Definition Plugin.h:15
virtual const QString DisplayName() const
The plugin display name.
Definition Plugin.cpp:73
virtual const QString Description() const =0
Plugin description.