Imported existing sources
This commit is contained in:
28
DbSerialServer.pro
Normal file
28
DbSerialServer.pro
Normal file
@@ -0,0 +1,28 @@
|
||||
QT += core network serialport
|
||||
QT -= gui widgets
|
||||
|
||||
DBLIBS +=
|
||||
|
||||
TARGET = serialserver
|
||||
|
||||
PROJECT_ROOT = ..
|
||||
|
||||
SOURCES += main.cpp \
|
||||
master.cpp \
|
||||
slave.cpp
|
||||
|
||||
HEADERS += \
|
||||
master.h \
|
||||
slave.h
|
||||
|
||||
FORMS +=
|
||||
|
||||
RESOURCES +=
|
||||
|
||||
TRANSLATIONS +=
|
||||
|
||||
configinstall.path = $${OUT_PWD}/$${PROJECT_ROOT}/bin
|
||||
configinstall.files += serialserver.ini
|
||||
INSTALLS += configinstall
|
||||
|
||||
include($${PROJECT_ROOT}/app.pri)
|
65
main.cpp
Normal file
65
main.cpp
Normal file
@@ -0,0 +1,65 @@
|
||||
#include <QCoreApplication>
|
||||
#include <QDir>
|
||||
#include <QSettings>
|
||||
#include <QSerialPort>
|
||||
#include <QTcpServer>
|
||||
|
||||
#include "master.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QCoreApplication app(argc, argv);
|
||||
QCoreApplication::setApplicationName("serialserver");
|
||||
QCoreApplication::setOrganizationDomain("brunner.ninja");
|
||||
QCoreApplication::setOrganizationName("0xFEEDC0DE64");
|
||||
|
||||
const auto configPath = QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(QCoreApplication::applicationName() + QStringLiteral(".ini"));
|
||||
QSettings settings(configPath, QSettings::IniFormat);
|
||||
|
||||
qDebug() << "Opening serialport...";
|
||||
auto serialPort = new QSerialPort;
|
||||
serialPort->setPortName(settings.value("serial/port").toString());
|
||||
serialPort->setBaudRate(settings.value("serial/baudrate").toInt());
|
||||
if(!serialPort->open(QIODevice::ReadWrite))
|
||||
{
|
||||
qWarning() << serialPort->errorString();
|
||||
qFatal("could not open serialport");
|
||||
return -1;
|
||||
}
|
||||
|
||||
qDebug() << "Starting tcp server...";
|
||||
auto server = new QTcpServer;
|
||||
|
||||
{
|
||||
auto listenAddress = settings.value("server/address", "Any").toString();
|
||||
QHostAddress hostAddress;
|
||||
|
||||
if(listenAddress == "Null")
|
||||
hostAddress = QHostAddress::Null;
|
||||
else if(listenAddress == "Broadcast")
|
||||
hostAddress = QHostAddress::Broadcast;
|
||||
else if(listenAddress == "LocalHost")
|
||||
hostAddress = QHostAddress::LocalHost;
|
||||
else if(listenAddress == "LocalHostIPv6")
|
||||
hostAddress = QHostAddress::LocalHostIPv6;
|
||||
else if(listenAddress == "Any")
|
||||
hostAddress = QHostAddress::Any;
|
||||
else if(listenAddress == "AnyIPv6")
|
||||
hostAddress = QHostAddress::AnyIPv6;
|
||||
else if(listenAddress == "AnyIPv4")
|
||||
hostAddress = QHostAddress::AnyIPv4;
|
||||
else
|
||||
hostAddress = QHostAddress(listenAddress);
|
||||
|
||||
if(!server->listen(hostAddress, (quint16)settings.value("server/port", 1234).toUInt()))
|
||||
{
|
||||
qWarning() << server->errorString();
|
||||
qFatal("could not start listening");
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
|
||||
new Master(serialPort, server, &app);
|
||||
|
||||
return app.exec();
|
||||
}
|
53
master.cpp
Normal file
53
master.cpp
Normal file
@@ -0,0 +1,53 @@
|
||||
#include "master.h"
|
||||
|
||||
#include <QSerialPort>
|
||||
#include <QTcpServer>
|
||||
#include <QCoreApplication>
|
||||
|
||||
#include "slave.h"
|
||||
|
||||
Master::Master(QSerialPort *serialPort, QTcpServer *server, QObject *parent) :
|
||||
QObject(parent),
|
||||
m_serialPort(serialPort),
|
||||
m_server(server)
|
||||
{
|
||||
m_serialPort->setParent(this);
|
||||
connect(m_serialPort, &QIODevice::readyRead, this, &Master::readyRead);
|
||||
connect(m_serialPort, &QSerialPort::errorOccurred, this, &Master::errorOccurred);
|
||||
|
||||
m_server->setParent(this);
|
||||
connect(m_server, SIGNAL(newConnection()), this, SLOT(newConnection()));
|
||||
|
||||
qDebug() << "startup successfull!";
|
||||
}
|
||||
|
||||
void Master::writeData(const QByteArray &byteArray)
|
||||
{
|
||||
m_serialPort->write(byteArray);
|
||||
}
|
||||
|
||||
void Master::readyRead()
|
||||
{
|
||||
Q_EMIT dataReady(m_serialPort->readAll());
|
||||
}
|
||||
|
||||
void Master::errorOccurred(QSerialPort::SerialPortError error)
|
||||
{
|
||||
if(error == QSerialPort::NoError) //actually occured! qt is dumb
|
||||
return;
|
||||
|
||||
qWarning() << error << enumToKey(error);
|
||||
qFatal("error occured in serial port");
|
||||
qApp->quit();
|
||||
}
|
||||
|
||||
void Master::newConnection()
|
||||
{
|
||||
auto socket = m_server->nextPendingConnection();
|
||||
if(socket)
|
||||
{
|
||||
auto slave = new Slave(socket, this);
|
||||
connect(slave, &Slave::dataReady, this, &Master::writeData);
|
||||
connect(this, &Master::dataReady, slave, &Slave::writeData);
|
||||
}
|
||||
}
|
46
master.h
Normal file
46
master.h
Normal file
@@ -0,0 +1,46 @@
|
||||
#ifndef MASTER_H
|
||||
#define MASTER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QSerialPort>
|
||||
#include <QMetaEnum>
|
||||
|
||||
class QTcpServer;
|
||||
|
||||
class Master : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit Master(QSerialPort *serialPort, QTcpServer *server, QObject *parent = 0);
|
||||
|
||||
Q_SIGNALS:
|
||||
void dataReady(const QByteArray &byteArray);
|
||||
|
||||
public Q_SLOTS:
|
||||
void writeData(const QByteArray &byteArray);
|
||||
|
||||
private Q_SLOTS:
|
||||
void readyRead();
|
||||
void errorOccurred(QSerialPort::SerialPortError error);
|
||||
void newConnection();
|
||||
|
||||
private:
|
||||
template<typename T> static const char *enumToKey(T value)
|
||||
{
|
||||
Q_STATIC_ASSERT_X(QtPrivate::IsQEnumHelper<T>::Value, "QMetaEnum::fromType only works with enums declared as Q_ENUM or Q_FLAG");
|
||||
|
||||
const QMetaObject *metaObject = qt_getEnumMetaObject(T());
|
||||
const char *nameOfEnum = qt_getEnumName(T());
|
||||
int index = metaObject->indexOfEnumerator(nameOfEnum);
|
||||
if(index == -1)
|
||||
return "!!ENUM_NOT_FOUND!!";
|
||||
auto metaEnum = metaObject->enumerator(index);
|
||||
return metaEnum.valueToKey((int)value);
|
||||
}
|
||||
|
||||
QSerialPort *m_serialPort;
|
||||
QTcpServer *m_server;
|
||||
};
|
||||
|
||||
#endif // MASTER_H
|
7
serialserver.ini
Normal file
7
serialserver.ini
Normal file
@@ -0,0 +1,7 @@
|
||||
[serial]
|
||||
port = COM3
|
||||
baudrate = 9600
|
||||
|
||||
[server]
|
||||
address = Any
|
||||
port = 1234
|
32
slave.cpp
Normal file
32
slave.cpp
Normal file
@@ -0,0 +1,32 @@
|
||||
#include "slave.h"
|
||||
|
||||
#include <QTcpSocket>
|
||||
#include <QHostAddress>
|
||||
|
||||
Slave::Slave(QTcpSocket *socket, QObject *parent) :
|
||||
QObject(parent),
|
||||
m_socket(socket)
|
||||
{
|
||||
m_socket->setParent(this);
|
||||
|
||||
qDebug() << this << "connected from" << m_socket->peerAddress();
|
||||
|
||||
connect(m_socket, &QIODevice::readyRead, this, &Slave::readyRead);
|
||||
connect(m_socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
|
||||
connect(m_socket, SIGNAL(disconnected()), this, SLOT(deleteLater()));
|
||||
}
|
||||
|
||||
void Slave::writeData(const QByteArray &byteArray)
|
||||
{
|
||||
m_socket->write(byteArray);
|
||||
}
|
||||
|
||||
void Slave::readyRead()
|
||||
{
|
||||
Q_EMIT dataReady(m_socket->readAll());
|
||||
}
|
||||
|
||||
void Slave::disconnected()
|
||||
{
|
||||
qDebug() << this << "disconnected!";
|
||||
}
|
28
slave.h
Normal file
28
slave.h
Normal file
@@ -0,0 +1,28 @@
|
||||
#ifndef SLAVE_H
|
||||
#define SLAVE_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
class QTcpSocket;
|
||||
|
||||
class Slave : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit Slave(QTcpSocket *socket, QObject *parent = 0);
|
||||
|
||||
Q_SIGNALS:
|
||||
void dataReady(const QByteArray &byteArray);
|
||||
|
||||
public Q_SLOTS:
|
||||
void writeData(const QByteArray &byteArray);
|
||||
|
||||
private Q_SLOTS:
|
||||
void readyRead();
|
||||
void disconnected();
|
||||
|
||||
private:
|
||||
QTcpSocket *m_socket;
|
||||
};
|
||||
|
||||
#endif // SLAVE_H
|
Reference in New Issue
Block a user