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