apart-controller/src/transport/SerialTransport.cpp

103 lines
2.6 KiB
C++

#include "SerialTransport.h"
#include "protocol/Concept1Protocol.h"
#include <QSerialPort>
#include <QSerialPortInfo>
SerialTransport::SerialTransport(const QString &portName, QObject *parent)
: ITransport(parent)
, m_port(new QSerialPort(this))
, m_portName(portName)
{
m_port->setBaudRate(Concept1::kBaudRate);
m_port->setDataBits(QSerialPort::Data8);
m_port->setParity(QSerialPort::NoParity);
m_port->setStopBits(QSerialPort::OneStop);
m_port->setFlowControl(QSerialPort::NoFlowControl);
connect(m_port, &QSerialPort::readyRead, this, &SerialTransport::onReadyRead);
connect(m_port, &QSerialPort::errorOccurred, this,
[this](QSerialPort::SerialPortError e) {
if (e == QSerialPort::NoError)
return;
emit errorOccurred(m_port->errorString());
if (e == QSerialPort::ResourceError && m_port->isOpen()) {
m_port->close();
emit openedChanged(false);
}
});
}
SerialTransport::~SerialTransport()
{
if (m_port->isOpen())
m_port->close();
}
void SerialTransport::setPortName(const QString &portName)
{
m_portName = portName;
}
bool SerialTransport::open()
{
if (m_port->isOpen())
return true;
m_port->setPortName(m_portName);
const bool ok = m_port->open(QIODevice::ReadWrite);
if (ok) {
m_port->setBaudRate(Concept1::kBaudRate);
m_port->setDataBits(QSerialPort::Data8);
m_port->setParity(QSerialPort::NoParity);
m_port->setStopBits(QSerialPort::OneStop);
m_port->setFlowControl(QSerialPort::NoFlowControl);
emit openedChanged(true);
} else {
emit errorOccurred(m_port->errorString());
}
return ok;
}
void SerialTransport::close()
{
if (m_port->isOpen()) {
m_port->close();
emit openedChanged(false);
}
}
bool SerialTransport::isOpen() const
{
return m_port->isOpen();
}
void SerialTransport::write(const QByteArray &data)
{
if (m_port->isOpen())
m_port->write(data);
}
QString SerialTransport::endpointName() const
{
return m_portName;
}
void SerialTransport::onReadyRead()
{
const QByteArray data = m_port->readAll();
if (!data.isEmpty())
emit bytesReceived(data);
}
QStringList SerialTransport::availablePorts()
{
QStringList result;
const auto ports = QSerialPortInfo::availablePorts();
for (const QSerialPortInfo &info : ports) {
QString entry = info.portName();
if (!info.description().isEmpty())
entry += QStringLiteral(" :: ") + info.description();
result << entry;
}
return result;
}