Files
pilotclient/src/xswiftbus/weather.cpp
Lars Toenning bcc4bdd31e Add SPDX identifiers for REUSE compliance
Co-authored-by: Mat Sutcliffe <oktal3700@gmail.com>
2023-10-03 09:29:49 +02:00

234 lines
8.7 KiB
C++

// SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
//! \cond PRIVATE
#include "weather.h"
#include "utils.h"
namespace XSwiftBus
{
CWeather::CWeather(CSettingsProvider *settingsProvider) : CDBusObject(settingsProvider)
{
// void
}
//! Set cloud layer
template <class T>
void setCloudLayerImpl(T &layer, int base, int tops, int type, int coverage)
{
layer.base.setAsInt(base);
layer.tops.setAsInt(tops);
layer.type.set(type);
layer.coverage.setAsInt(coverage);
}
void CWeather::setCloudLayer(int layer, int baseM, int topsM, int type, int coverage)
{
switch (layer)
{
case 0: setCloudLayerImpl(m_cloudLayer0, baseM, topsM, type, coverage); break;
case 1: setCloudLayerImpl(m_cloudLayer1, baseM, topsM, type, coverage); break;
case 2: setCloudLayerImpl(m_cloudLayer2, baseM, topsM, type, coverage); break;
default: DEBUG_LOG("Invalid cloud layer"); break;
}
}
//! Set wind layer
template <class T>
void setWindLayerImpl(T &layer, int altitude, double direction, int speed, int shearDirection, int shearSpeed, int turbulence)
{
layer.altitude.setAsInt(altitude);
layer.direction.set(static_cast<float>(direction));
layer.speed.setAsInt(speed);
layer.shearDirection.setAsInt(shearDirection);
layer.shearSpeed.setAsInt(shearSpeed);
layer.turbulence.setAsInt(turbulence);
}
void CWeather::setWindLayer(int layer, int altitudeM, double directionDeg, int speedKt, int shearDirectionDeg, int shearSpeedKt, int turbulence)
{
switch (layer)
{
case 0: setWindLayerImpl(m_windLayer0, altitudeM, directionDeg, speedKt, shearDirectionDeg, shearSpeedKt, turbulence); break;
case 1: setWindLayerImpl(m_windLayer1, altitudeM, directionDeg, speedKt, shearDirectionDeg, shearSpeedKt, turbulence); break;
case 2: setWindLayerImpl(m_windLayer2, altitudeM, directionDeg, speedKt, shearDirectionDeg, shearSpeedKt, turbulence); break;
default: DEBUG_LOG("Invalid wind layer"); break;
}
}
static const char *introspection_weather =
DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE
#include "org.swift_project.xswiftbus.weather.xml"
;
DBusHandlerResult CWeather::dbusMessageHandler(const CDBusMessage &message_)
{
CDBusMessage message(message_);
const std::string sender = message.getSender();
const dbus_uint32_t serial = message.getSerial();
const bool wantsReply = message.wantsReply();
if (message.getInterfaceName() == DBUS_INTERFACE_INTROSPECTABLE)
{
if (message.getMethodName() == "Introspect")
{
sendDBusReply(sender, serial, introspection_weather);
}
}
else if (message.getInterfaceName() == XSWIFTBUS_WEATHER_INTERFACENAME)
{
if (message.getMethodName() == "isUsingRealWeather")
{
queueDBusCall([=]() {
sendDBusReply(sender, serial, isUsingRealWeather());
});
}
else if (message.getMethodName() == "setUseRealWeather")
{
maybeSendEmptyDBusReply(wantsReply, sender, serial);
bool enable = false;
message.beginArgumentRead();
message.getArgument(enable);
queueDBusCall([=]() {
setUseRealWeather(enable);
});
}
else if (message.getMethodName() == "setVisibility")
{
maybeSendEmptyDBusReply(wantsReply, sender, serial);
double visibilityM = 10.0;
message.beginArgumentRead();
message.getArgument(visibilityM);
queueDBusCall([=]() {
setVisibility(visibilityM);
});
}
else if (message.getMethodName() == "setTemperature")
{
maybeSendEmptyDBusReply(wantsReply, sender, serial);
int degreesC = 10;
message.beginArgumentRead();
message.getArgument(degreesC);
queueDBusCall([=]() {
setTemperature(degreesC);
});
}
else if (message.getMethodName() == "setDewPoint")
{
maybeSendEmptyDBusReply(wantsReply, sender, serial);
int degreesC = 10;
message.beginArgumentRead();
message.getArgument(degreesC);
queueDBusCall([=]() {
setDewPoint(degreesC);
});
}
else if (message.getMethodName() == "setQNH")
{
maybeSendEmptyDBusReply(wantsReply, sender, serial);
double inHg = 29.92;
message.beginArgumentRead();
message.getArgument(inHg);
queueDBusCall([=]() {
setQNH(inHg);
});
}
else if (message.getMethodName() == "setPrecipitationRatio")
{
maybeSendEmptyDBusReply(wantsReply, sender, serial);
double precipRatio = 0.0;
message.beginArgumentRead();
message.getArgument(precipRatio);
queueDBusCall([=]() {
setPrecipitationRatio(precipRatio);
});
}
else if (message.getMethodName() == "setThunderstormRatio")
{
maybeSendEmptyDBusReply(wantsReply, sender, serial);
double cbRatio = 0.0;
message.beginArgumentRead();
message.getArgument(cbRatio);
queueDBusCall([=]() {
setThunderstormRatio(cbRatio);
});
}
else if (message.getMethodName() == "setTurbulenceRatio")
{
maybeSendEmptyDBusReply(wantsReply, sender, serial);
double turbulenceRatio = 0.0;
message.beginArgumentRead();
message.getArgument(turbulenceRatio);
queueDBusCall([=]() {
setTurbulenceRatio(turbulenceRatio);
});
}
else if (message.getMethodName() == "setRunwayFriction")
{
maybeSendEmptyDBusReply(wantsReply, sender, serial);
int friction = 10;
message.beginArgumentRead();
message.getArgument(friction);
queueDBusCall([=]() {
setRunwayFriction(friction);
});
}
else if (message.getMethodName() == "setCloudLayer")
{
maybeSendEmptyDBusReply(wantsReply, sender, serial);
int layer = 0;
int base = 0;
int tops = 0;
int type = 0;
int coverage = 0;
message.beginArgumentRead();
message.getArgument(layer);
message.getArgument(base);
message.getArgument(tops);
message.getArgument(type);
message.getArgument(coverage);
queueDBusCall([=]() {
setCloudLayer(layer, base, tops, type, coverage);
});
}
else if (message.getMethodName() == "setWindLayer")
{
maybeSendEmptyDBusReply(wantsReply, sender, serial);
int layer = 0;
int altitudeM = 0;
double directionDeg = 0;
int speedKt = 0;
int shearDirectionDeg = 0;
int shearSpeedKt = 0;
int turbulence = 0;
message.beginArgumentRead();
message.getArgument(layer);
message.getArgument(altitudeM);
message.getArgument(directionDeg);
message.getArgument(speedKt);
message.getArgument(shearDirectionDeg);
message.getArgument(shearSpeedKt);
message.getArgument(turbulence);
queueDBusCall([=]() {
setWindLayer(layer, altitudeM, directionDeg, speedKt, shearDirectionDeg, shearSpeedKt, turbulence);
});
}
else
{
// Unknown message. Tell DBus that we cannot handle it
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
}
return DBUS_HANDLER_RESULT_HANDLED;
}
int CWeather::process()
{
invokeQueuedDBusCalls();
return 1;
}
}
//! \endcond