FemaLocalSoftware/sensorservice.h
2025-01-13 11:30:39 +03:00

502 lines
18 KiB
C++

#ifndef SENSORSERVICE_H
#define SENSORSERVICE_H
#include "HttpClient.h"
#include "SensorGroups_r.h"
#include "getsensors_p.h"
#include "getsensors_r.h"
#include "utils.h"
#include <QJsonArray>
#include <QJsonObject>
#include <QList>
#include <QObject>
#include <QString>
#include <QStringList>
#include <QTime>
#include <QGeoCoordinate>
#include <QList>
class PlotData {
public:
QList<double> X;
QList<double> Y;
PlotData(QList<double>& x, QList<double> y)
: X(x)
, Y(y)
{}
};
struct sensorGroupTree {
QMap<QString, QString> groupToLocalGroup;
QMap<QString, QMap<QString, QString>> groupToSensorWithLocal;
sensorGroupTree(QMap<QString, QString>& a, QMap<QString, QMap<QString, QString>> b)
: groupToLocalGroup(a)
, groupToSensorWithLocal(b)
{}
};
struct Settings {
QString serial;
QString factory;
QString exhuyant;
QString fleet;
QString side;
QString gosNumber;
QString factoryNumber;
QString group;
QString adres;
QString userName;
QString userPassword;
QString argusSerial;
QList<QPair<QString, QString>> servers;
Settings(QString seriala,
QString factorya,
QString operatoroa,
QString fleeta,
QString sidea,
QString gosNumbera,
QString factoryNumbera,
QString groupa,
QString adresa,
QString userNamea,
QString userPassworda,
QString argusSeriala,
QList<QPair<QString, QString>> serversa)
: serial(seriala)
, factory(factorya)
, exhuyant(operatoroa)
, fleet(fleeta)
, side(sidea)
, gosNumber(gosNumbera)
, factoryNumber(factoryNumbera)
, group(groupa)
, adres(adresa)
, userName(userNamea)
, userPassword(userPassworda)
, argusSerial(argusSeriala)
, servers(serversa)
{}
Settings()
: serial("")
, factory("")
, exhuyant("")
, fleet("")
, side("")
, gosNumber("")
, factoryNumber("")
, group("")
, adres("")
, userName("")
, userPassword("")
, argusSerial("")
,servers({})
{}
};
class SensorService : public QObject
{
Q_OBJECT
public:
explicit SensorService(HttpClient *client, QObject *parent = nullptr)
: QObject(parent)
, httpClient(client)
{}
Settings getSettings()
{
QJsonObject responseJson = httpClient->get(utils::API_URL + "/settings/deviceSettings");
Settings settings;
if (responseJson.isEmpty()) {
return settings;
}
if (responseJson.contains("SYSTEM")) {
QJsonObject systemObj = responseJson.value("SYSTEM").toObject();
settings.serial = systemObj.value("VIN").toString();
settings.factory = systemObj.value("MANUFACTURER").toString();
settings.exhuyant = systemObj.value("OPERATOR").toString();
settings.fleet = systemObj.value("TP").toString();
settings.gosNumber = systemObj.value("GOS_NUMBER").toString();
settings.side = systemObj.value("REG_NUMBER").toString();
settings.group = systemObj.value("GROUP").toString();
settings.factoryNumber = systemObj.value("FACTORY_NUMBER").toString();
}
if (responseJson.contains("SENSORS")) {
QJsonObject sensorsObj = responseJson.value("SENSORS").toObject();
if (sensorsObj.contains("*SYSTEM")) {
QJsonObject systemSensorsObj = sensorsObj.value("*SYSTEM").toObject();
if (systemSensorsObj.contains("*ARGUS")) {
QJsonObject argusObj = systemSensorsObj.value("*ARGUS").toObject();
QString extra = argusObj.value("EXTRA").toString();
QJsonDocument extraDoc = QJsonDocument::fromJson(extra.toUtf8());
if (!extraDoc.isNull() && extraDoc.isObject()) {
QJsonObject extraObj = extraDoc.object();
settings.adres = extraObj.value("IP").toString();
settings.userName = extraObj.value("DB_USER").toString();
settings.userPassword = extraObj.value("DB_PASSWORD").toString();
settings.argusSerial = extraObj.value("SERIAL").toString();
}
}
}
}
if (responseJson.contains("HOSTS")) {
QJsonArray hostsArray = responseJson.value("HOSTS").toArray();
for (const QJsonValue &hostValue : hostsArray) {
QJsonObject hostObj = hostValue.toObject();
QString domain = hostObj.value("DOMAIN").toString();
int port = hostObj.value("PORT").toInt();
settings.servers.append(qMakePair(domain, QString::number(port)));
}
}
return settings;
}
void updateSettings(Settings& settings)
{
QJsonObject responseJson = httpClient->get(utils::API_URL + "/settings/deviceSettings");
if (responseJson.contains("SYSTEM")) {
QJsonObject systemObj = responseJson.value("SYSTEM").toObject();
systemObj["VIN"] = settings.serial;
systemObj["FACTORY_NUMBER"] = settings.factoryNumber;
systemObj["MANUFACTURER"] = settings.factory;
systemObj["OPERATOR"] = settings.exhuyant;
systemObj["TP"] = settings.fleet;
systemObj["GOS_NUMBER"] = settings.gosNumber;
systemObj["REG_NUMBER"] = settings.side;
systemObj["GROUP"] = settings.group;
responseJson["SYSTEM"] = systemObj;
}
if (responseJson.contains("SENSORS")) {
QJsonObject sensorsObj = responseJson.value("SENSORS").toObject();
if (sensorsObj.contains("*SYSTEM")) {
QJsonObject systemSensorsObj = sensorsObj.value("*SYSTEM").toObject();
if (systemSensorsObj.contains("*ARGUS")) {
QJsonObject argusObj = systemSensorsObj.value("*ARGUS").toObject();
QJsonObject extraObj;
extraObj["IP"] = settings.adres;
extraObj["DB_USER"] = settings.userName;
extraObj["DB_PASSWORD"] = settings.userPassword;
extraObj["SERIAL"] = settings.argusSerial;
QJsonDocument extraDoc(extraObj);
argusObj["EXTRA"] = QString(extraDoc.toJson(QJsonDocument::Compact));
systemSensorsObj["*ARGUS"] = argusObj;
sensorsObj["*SYSTEM"] = systemSensorsObj;
responseJson["SENSORS"] = sensorsObj;
}
}
}
if (responseJson.contains("HOSTS")) {
QJsonArray hostsArray;
for (const auto& server : settings.servers) {
QJsonObject newHostObj;
newHostObj["DOMAIN"] = server.first;
newHostObj["PORT"] = server.second.toInt();
hostsArray.append(newHostObj);
}
responseJson["HOSTS"] = hostsArray;
}
httpClient->post(utils::API_URL + "/settings/deviceSettings", responseJson);
}
QList<Sensor> getSensors(const QString &group)
{
GetSensorsP requestParams;
requestParams.setGroup(group);
QByteArray requestData = requestParams.createRequestJson();
QJsonObject responseJson = httpClient->post(utils::API_URL + "/data/getDeviceSensors",
QJsonDocument::fromJson(requestData).object());
GetSensorsR response;
response.parseResponse(responseJson);
return response.getSensors();
}
QStringList getSensorGroups()
{
QJsonObject responseJson = httpClient->post(utils::API_URL + "/data/getDeviceSensorGroups");
GetSensorsGroupsR response;
response.parseResponse(responseJson);
return response.getGroups();
}
QMap<QString, QString> getLocalizedSensorGroups()
{
QJsonObject responseJson = httpClient->get(utils::API_URL + "/data/getDeviceSensorsTree");
QMap<QString, QString> localizedGroupsMap;
if (responseJson.contains("groups") && responseJson["groups"].isObject()) {
QJsonObject groupsObject = responseJson["groups"].toObject();
for (const QString &groupKey : groupsObject.keys()) {
QJsonObject groupInfo = groupsObject[groupKey].toObject();
if (groupInfo.contains("name") && groupInfo["name"].isString()) {
if(groupInfo["name"].toString() == "*SYSTEM") {
continue;
}
QString localizedName = groupInfo["name"].toString();
localizedGroupsMap[localizedName] = groupKey;
}
}
}
return localizedGroupsMap;
}
QMap<QString, QMap<QString, QPair<QString, QString>>> getTranslate()
{
QJsonObject responseJson = httpClient->get(utils::API_URL + "/data/getDeviceSensorsTree");
QMap<QString, QMap<QString, QPair<QString, QString>>> translate;
if (responseJson.contains("groups") && responseJson["groups"].isObject()) {
QJsonObject groupsObject = responseJson["groups"].toObject();
for (const QString &groupKey : groupsObject.keys()) {
QJsonObject groupInfo = groupsObject[groupKey].toObject();
if (groupInfo.contains("sensors") && groupInfo["sensors"].isObject() &&
groupInfo.contains("name") && groupInfo["name"].isString()) {
if(groupInfo["name"].toString() == "*SYSTEM") {
continue;
}
QJsonObject sensors = groupInfo["sensors"].toObject();
QString localizedGroup = groupInfo["name"].toString();
for (auto sensorKey : sensors.keys()) {
if (sensors[sensorKey].isString()) {
translate[groupKey][sensorKey].first = localizedGroup;
translate[groupKey][sensorKey].second = sensors[sensorKey].toString();
}
}
}
}
}
return translate;
}
QMap<QString, QString> getSensorToLocalSensor()
{
QJsonObject responseJson = httpClient->get(utils::API_URL + "/data/getDeviceSensorsTree");
QMap<QString, QString> localizedGroupsMap;
if (responseJson.contains("groups") && responseJson["groups"].isObject()) {
QJsonObject groupsObject = responseJson["groups"].toObject();
for (const QString &groupKey : groupsObject.keys()) {
QJsonObject groupInfo = groupsObject[groupKey].toObject();
if (groupInfo.contains("name") && groupInfo["name"].isString()) {
if(groupInfo["name"].toString() == "*SYSTEM") {
continue;
}
QString localizedName = groupInfo["name"].toString();
localizedGroupsMap[localizedName] = groupKey;
}
}
}
return localizedGroupsMap;
}
sensorGroupTree getSensorGroupsTree()
{
QJsonObject responseJson = httpClient->get(utils::API_URL + "/data/getDeviceSensorsTree");
GetSensorsGroupsR response;
QMap<QString, QString> groupToLocalGroup;
QMap<QString, QMap<QString, QString>> groupToSensorWithLocal;
if (responseJson.contains("groups") && responseJson["groups"].isObject()) {
QJsonObject groups = responseJson["groups"].toObject();
for (auto groupKey : groups.keys()) {
QJsonObject group = groups[groupKey].toObject();
if(group["name"].toString() == "*SYSTEM") {
continue;
}
if (group.contains("name") && group["name"].isString()) {
groupToLocalGroup[groupKey] = group["name"].toString();
}
if (group.contains("sensors") && group["sensors"].isObject()) {
QJsonObject sensors = group["sensors"].toObject();
QMap<QString, QString> sensorsMap;
for (auto sensorKey : sensors.keys()) {
if (sensors[sensorKey].isString()) {
sensorsMap[sensorKey] = sensors[sensorKey].toString();
}
}
groupToSensorWithLocal[groupKey] = sensorsMap;
}
}
}
return sensorGroupTree(groupToLocalGroup, groupToSensorWithLocal);
}
PlotData getDeviceSensorData(const QString &group, const QString &sensorId,
qint64 start,
qint64 end)
{
QJsonObject rootObj;
rootObj["start"] = start;
rootObj["end"] = end;
rootObj["sensor"] = group + '/' + sensorId;
QJsonDocument doc(rootObj);
QByteArray requestData = doc.toJson();
QJsonObject responseJson = httpClient->post(utils::API_URL + "/data/getDeviceSensorData",
QJsonDocument::fromJson(requestData).object());
QList<double> x;
QList<double> y;
if (responseJson.contains("data") && responseJson["data"].isArray() &&
responseJson.contains("timestamp") && responseJson["timestamp"].isArray())
{
QJsonArray dataArray = responseJson["data"].toArray();
QJsonArray timestampArray = responseJson["timestamp"].toArray();
if (dataArray.size() == timestampArray.size()) {
for (int i = 0; i < dataArray.size(); ++i) {
int value = dataArray[i].toInt();
qint64 timestamp = timestampArray[i].toInt();
x.append(timestamp);
y.append(value);
}
} else {
x.append(QTime::currentTime().msecsSinceStartOfDay());
y.append(0);
}
} else {
x.append(QTime::currentTime().msecsSinceStartOfDay());
y.append(0);
}
if(x.empty()) {
x.append(QTime::currentTime().msecsSinceStartOfDay());
y.append(0);
}
return PlotData(x, y);
}
PlotData getDeviceSensorData(const QString &groupWithSensor,
qint64 start,
qint64 end)
{
QJsonObject rootObj;
rootObj["start"] = start;
rootObj["end"] = end;
rootObj["sensor"] = groupWithSensor;
QJsonDocument doc(rootObj);
QByteArray requestData = doc.toJson();
QJsonObject responseJson = httpClient->post(utils::API_URL + "/data/getDeviceSensorData",
QJsonDocument::fromJson(requestData).object());
QList<double> x;
QList<double> y;
if (responseJson.contains("data") && responseJson["data"].isArray() &&
responseJson.contains("timestamp") && responseJson["timestamp"].isArray())
{
QJsonArray dataArray = responseJson["data"].toArray();
QJsonArray timestampArray = responseJson["timestamp"].toArray();
if (dataArray.size() == timestampArray.size()) {
for (int i = 0; i < dataArray.size(); ++i) {
int value = dataArray[i].toInt();
qint64 timestamp = timestampArray[i].toInt();
x.append(timestamp);
y.append(value);
}
} else {
x.append(QTime::currentTime().msecsSinceStartOfDay());
y.append(0);
}
} else {
x.append(QTime::currentTime().msecsSinceStartOfDay());
y.append(0);
}
if(x.empty()) {
x.append(QTime::currentTime().msecsSinceStartOfDay());
y.append(0);
}
return PlotData(x, y);
}
QVariantList getPoints(qint64 start, qint64 end)
{
QJsonObject rootObj;
rootObj["start_time"] = start;
rootObj["end_time"] = end;
QJsonDocument doc(rootObj);
QByteArray requestData = doc.toJson();
QJsonObject responseJson = httpClient->post(utils::API_URL + "/data/geo/getPoints",
QJsonDocument::fromJson(requestData).object());
QVariantList points;
if (responseJson.contains("time") && responseJson["time"].isArray() &&
responseJson.contains("latitude") && responseJson["latitude"].isArray() &&
responseJson.contains("longitude") && responseJson["longitude"].isArray())
{
QJsonArray timeArray = responseJson["time"].toArray();
QJsonArray latitudeArray = responseJson["latitude"].toArray();
QJsonArray longitudeArray = responseJson["longitude"].toArray();
if (timeArray.size() == latitudeArray.size() && timeArray.size() == longitudeArray.size()) {
for (int i = 0; i < timeArray.size(); ++i) {
qint64 timestamp = timeArray[i].toInt();
points.append(QVariant::fromValue(QGeoCoordinate(latitudeArray[i].toDouble(), longitudeArray[i].toDouble())));
}
}
}
return points;
}
private:
HttpClient *httpClient;
};
#endif // SENSORSERVICE_H