// Copyright (C) 2018 Andre Hartmann // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef VIRTUALCANBACKEND_H #define VIRTUALCANBACKEND_H #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QTcpServer; class QTcpSocket; class VirtualCanServer : public QObject { Q_OBJECT Q_DISABLE_COPY(VirtualCanServer) public: explicit VirtualCanServer(QObject *parent = nullptr); ~VirtualCanServer() override; void start(quint16 port); private: void connected(); void disconnected(); void readyRead(); QTcpServer *m_server = nullptr; QList m_serverSockets; }; class VirtualCanBackend : public QCanBusDevice { Q_OBJECT Q_DISABLE_COPY(VirtualCanBackend) public: explicit VirtualCanBackend(const QString &interface, QObject *parent = nullptr); ~VirtualCanBackend() override; bool open() override; void close() override; void setConfigurationParameter(ConfigurationKey key, const QVariant &value) override; bool writeFrame(const QCanBusFrame &frame) override; QString interpretErrorFrame(const QCanBusFrame &errorFrame) override; static QList interfaces(); QCanBusDeviceInfo deviceInfo() const override; private: static QCanBusDeviceInfo virtualCanDeviceInfo(uint channel); void clientConnected(); void clientDisconnected(); void clientReadyRead(); QUrl m_url; uint m_channel = 0; QTcpSocket *m_clientSocket = nullptr; }; QT_END_NAMESPACE #endif // VIRTUALCANBACKEND_H