// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "lightningprovider.h" #include #include #include #include #define SECONDS_FROM_NS(ns) std::chrono::duration{(ns) / 1000000000} namespace { constexpr auto REQUEST_MSG = "{\"action\": \"simulatelightningdata\"}"; constexpr auto WEB_SOCKET_URL = "wss://ewea0y4bn0.execute-api.eu-north-1.amazonaws.com/production/"; constexpr auto JK_TIME = "time"; constexpr auto JK_LATITUDE = "lat"; constexpr auto JK_LONGITUDE = "lon"; } LightningProvider::LightningProvider(QObject *parent) : QObject{parent} , m_timer{new QTimer{}} , m_webSocket{new QWebSocket{}} { connect(m_timer.get(), &QTimer::timeout, this, &LightningProvider::onTimerTimeout); connect(m_webSocket.get(), &QWebSocket::connected, this, &LightningProvider::onSocketConnected); connect(m_webSocket.get(), &QWebSocket::textMessageReceived, this, &LightningProvider::onSocketMessageReceived); m_timer->start(1000); } LightningProvider::~LightningProvider() { m_webSocket.reset(); m_timer.reset(); } void LightningProvider::onSocketMessageReceived(const QString &message) { QJsonParseError error; const QJsonDocument &&doc = QJsonDocument::fromJson(message.toLatin1(), &error); if (error.error != QJsonParseError::NoError) return; if (!doc.isObject()) return; const QJsonObject &&object = doc.object(); auto timeIter = object.constFind(JK_TIME); if (timeIter == object.constEnd()) return; auto latIter = object.constFind(JK_LATITUDE); if (latIter == object.constEnd()) return; auto lonIter = object.constFind(JK_LONGITUDE); if (lonIter == object.constEnd()) return; LightningItemData data; data.timestamp = SECONDS_FROM_NS(timeIter->toInteger()); data.latitude = latIter->toDouble(); data.longitude = lonIter->toDouble(); emit dataReady(data); } void LightningProvider::onSocketConnected() { requestSocket(); } void LightningProvider::onTimerTimeout() { if (m_webSocket->state() == QAbstractSocket::UnconnectedState) openSocket(); } void LightningProvider::requestSocket() { if (m_webSocket->state() == QAbstractSocket::ConnectedState) m_webSocket->sendTextMessage(REQUEST_MSG); } void LightningProvider::openSocket() { if (m_webSocket->state() != QAbstractSocket::UnconnectedState) return; m_webSocket->open( QUrl{WEB_SOCKET_URL} ); }