websocket

add ping pong to simbase, mainwindow and websocket wrapper
This commit is contained in:
2026-02-01 18:59:36 +01:00
parent e72ec3e01d
commit 34cdcd6078
4 changed files with 43 additions and 1 deletions
+3
View File
@@ -19,6 +19,8 @@ MainWindow::MainWindow(QWidget *parent) :
ui->setupUi(this); ui->setupUi(this);
this->setWindowTitle("Simulator Selector"); this->setWindowTitle("Simulator Selector");
m_error_dialog->set_error("Connection timed out\nCheck if the server is running");
//Default sim //Default sim
//defaultSim("CVS_I10"); //defaultSim("CVS_I10");
@@ -37,6 +39,7 @@ void MainWindow::setup_cb(void)
{ {
connect(m_web_socket, &Web_socket_wrapper::on_command_cb, this, [=](json& j){on_cmd_cb(j);}); connect(m_web_socket, &Web_socket_wrapper::on_command_cb, this, [=](json& j){on_cmd_cb(j);});
connect(m_web_socket, &Web_socket_wrapper::on_connected, this, [=]{m_web_socket->send_command(Web_socket_wrapper::Command::get_simulators);}); connect(m_web_socket, &Web_socket_wrapper::on_connected, this, [=]{m_web_socket->send_command(Web_socket_wrapper::Command::get_simulators);});
connect(m_web_socket, &Web_socket_wrapper::on_closed, this, [=]{m_error_dialog->open();});
} }
void MainWindow::showEvent( QShowEvent* event ) void MainWindow::showEvent( QShowEvent* event )
+2
View File
@@ -5,6 +5,7 @@ SimulatorBase::SimulatorBase(Web_socket_wrapper* web_socket, QWidget* parent) :
m_error_dialog(new NetworkError(this)) m_error_dialog(new NetworkError(this))
{ {
this->m_web_socket = web_socket; this->m_web_socket = web_socket;
m_error_dialog->set_error("Connection timed out\nCheck if the server is running");
} }
void SimulatorBase::showEvent( QShowEvent* event ) void SimulatorBase::showEvent( QShowEvent* event )
@@ -33,6 +34,7 @@ void SimulatorBase::setup_cb(void)
{ {
connect(m_web_socket, &Web_socket_wrapper::on_command_cb, this, [=](json& j){on_cmd_cb(j);}); connect(m_web_socket, &Web_socket_wrapper::on_command_cb, this, [=](json& j){on_cmd_cb(j);});
connect(m_web_socket, &Web_socket_wrapper::on_event_cb, this, [=](json& j){on_event_cb(j);}); connect(m_web_socket, &Web_socket_wrapper::on_event_cb, this, [=](json& j){on_event_cb(j);});
connect(m_web_socket, &Web_socket_wrapper::on_closed, this, [=]{m_error_dialog->open();});
} }
void SimulatorBase::on_cmd_cb(json& j) void SimulatorBase::on_cmd_cb(json& j)
+33 -1
View File
@@ -3,10 +3,20 @@
Web_socket_wrapper::Web_socket_wrapper(const QUrl &url, QObject *parent) : Web_socket_wrapper::Web_socket_wrapper(const QUrl &url, QObject *parent) :
QObject(parent), QObject(parent),
m_web_socket(new QWebSocket("", QWebSocketProtocol::VersionLatest, this)) m_web_socket(new QWebSocket("", QWebSocketProtocol::VersionLatest, this)),
m_ping_timer(new QTimer(this)),
m_pong_timer(new QTimer(this))
{ {
connect(m_web_socket, &QWebSocket::connected, this, &Web_socket_wrapper::m_on_connected); connect(m_web_socket, &QWebSocket::connected, this, &Web_socket_wrapper::m_on_connected);
connect(m_web_socket, &QWebSocket::disconnected, this, &Web_socket_wrapper::on_closed); connect(m_web_socket, &QWebSocket::disconnected, this, &Web_socket_wrapper::on_closed);
connect(m_web_socket, &QWebSocket::pong, this, &Web_socket_wrapper::m_on_pong);
connect(m_ping_timer, &QTimer::timeout, this, [=]{
m_web_socket->ping();
m_pong_timer->start(500);
});
connect(m_pong_timer, &QTimer::timeout, this, &Web_socket_wrapper::m_on_pong_timeout);
m_ping_timer->setSingleShot(true);
m_pong_timer->setSingleShot(true);
m_web_socket->open(url); m_web_socket->open(url);
} }
@@ -111,6 +121,9 @@ void Web_socket_wrapper::m_on_connected()
m_connected = true; m_connected = true;
connect(m_web_socket, &QWebSocket::textMessageReceived, connect(m_web_socket, &QWebSocket::textMessageReceived,
this, &Web_socket_wrapper::m_on_received); this, &Web_socket_wrapper::m_on_received);
m_ping_timer->start(1000);
emit on_connected(); emit on_connected();
} }
@@ -128,3 +141,22 @@ void Web_socket_wrapper::m_on_received(QString message)
return; return;
} }
} }
void Web_socket_wrapper::m_on_pong(quint64 elapsedTime)
{
if (elapsedTime > 500)
{
m_web_socket->close();
emit on_closed();
}
m_pong_timer->stop();
m_ping_timer->start(1000);
}
void Web_socket_wrapper::m_on_pong_timeout()
{
qDebug() << "Pong timeout";
m_web_socket->close();
emit on_closed();
}
+5
View File
@@ -2,6 +2,7 @@
#define WEB_SOCKET_WRAPPER_H #define WEB_SOCKET_WRAPPER_H
#include <QtWebSockets/QWebSocket> #include <QtWebSockets/QWebSocket>
#include <QTimer>
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
using json = nlohmann::json; using json = nlohmann::json;
@@ -48,10 +49,14 @@ class Web_socket_wrapper : public QObject
private Q_SLOTS: private Q_SLOTS:
void m_on_connected(); void m_on_connected();
void m_on_received(QString message); void m_on_received(QString message);
void m_on_pong(quint64 elapsedTime);
void m_on_pong_timeout();
private: private:
bool m_connected = false; bool m_connected = false;
QWebSocket* m_web_socket; QWebSocket* m_web_socket;
QTimer* m_ping_timer;
QTimer* m_pong_timer;
}; };
#endif // WEB_SOCKET_WRAPPER_H #endif // WEB_SOCKET_WRAPPER_H