diff --git a/Qt/mainwindow.cpp b/Qt/mainwindow.cpp index ca4647c..cd4aae5 100644 --- a/Qt/mainwindow.cpp +++ b/Qt/mainwindow.cpp @@ -19,6 +19,8 @@ MainWindow::MainWindow(QWidget *parent) : ui->setupUi(this); this->setWindowTitle("Simulator Selector"); + m_error_dialog->set_error("Connection timed out\nCheck if the server is running"); + //Default sim //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_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 ) diff --git a/Qt/simulatorbase.cpp b/Qt/simulatorbase.cpp index 1712429..5193cfd 100644 --- a/Qt/simulatorbase.cpp +++ b/Qt/simulatorbase.cpp @@ -5,6 +5,7 @@ SimulatorBase::SimulatorBase(Web_socket_wrapper* web_socket, QWidget* parent) : m_error_dialog(new NetworkError(this)) { 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 ) @@ -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_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) diff --git a/Qt/web_socket_wrapper.cpp b/Qt/web_socket_wrapper.cpp index 444b2e3..17eabb7 100644 --- a/Qt/web_socket_wrapper.cpp +++ b/Qt/web_socket_wrapper.cpp @@ -3,10 +3,20 @@ Web_socket_wrapper::Web_socket_wrapper(const QUrl &url, 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::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); } @@ -111,6 +121,9 @@ void Web_socket_wrapper::m_on_connected() m_connected = true; connect(m_web_socket, &QWebSocket::textMessageReceived, this, &Web_socket_wrapper::m_on_received); + + m_ping_timer->start(1000); + emit on_connected(); } @@ -128,3 +141,22 @@ void Web_socket_wrapper::m_on_received(QString message) 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(); +} diff --git a/Qt/web_socket_wrapper.h b/Qt/web_socket_wrapper.h index 6e8a51b..adce380 100644 --- a/Qt/web_socket_wrapper.h +++ b/Qt/web_socket_wrapper.h @@ -2,6 +2,7 @@ #define WEB_SOCKET_WRAPPER_H #include +#include #include using json = nlohmann::json; @@ -48,10 +49,14 @@ class Web_socket_wrapper : public QObject private Q_SLOTS: void m_on_connected(); void m_on_received(QString message); + void m_on_pong(quint64 elapsedTime); + void m_on_pong_timeout(); private: bool m_connected = false; QWebSocket* m_web_socket; + QTimer* m_ping_timer; + QTimer* m_pong_timer; }; #endif // WEB_SOCKET_WRAPPER_H