mirror of https://github.com/qt/qtdoc.git
92 lines
2.5 KiB
C++
92 lines
2.5 KiB
C++
// Copyright (C) 2023 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
|
|
#include "lightningprovider.h"
|
|
|
|
#include <QJsonDocument>
|
|
#include <QJsonObject>
|
|
#include <QTimer>
|
|
#include <QWebSocket>
|
|
|
|
#define SECONDS_FROM_NS(ns) std::chrono::duration<int>{(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} );
|
|
}
|