File indexing completed on 2024-07-21 06:28:24

0001 /*
0002     SPDX-FileCopyrightText: 2015 Jasem Mutlaq <mutlaqja@ikarustech.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "indiweather.h"
0008 #include "weatheradaptor.h"
0009 
0010 #include <basedevice.h>
0011 #include <QJsonObject>
0012 #include <qdbusmetatype.h>
0013 
0014 namespace ISD
0015 {
0016 
0017 Weather::Weather(GenericDevice *parent) : ConcreteDevice(parent)
0018 {
0019     qRegisterMetaType<ISD::Weather::Status>("ISD::Weather::Status");
0020     qDBusRegisterMetaType<ISD::Weather::Status>();
0021 
0022     new WeatherAdaptor(this);
0023     m_DBusObjectPath = QString("/KStars/INDI/Weather/%1").arg(getID());
0024     QDBusConnection::sessionBus().registerObject(m_DBusObjectPath, this);
0025 }
0026 
0027 void Weather::processLight(INDI::Property prop)
0028 {
0029     auto lvp = prop.getLight();
0030     if (lvp->isNameMatch("WEATHER_STATUS"))
0031     {
0032         Status currentStatus = static_cast<Status>(lvp->s);
0033         if (currentStatus != m_WeatherStatus)
0034         {
0035             m_WeatherStatus = currentStatus;
0036             emit newStatus(m_WeatherStatus);
0037         }
0038     }
0039 }
0040 
0041 void Weather::processNumber(INDI::Property prop)
0042 {
0043     auto nvp = prop.getNumber();
0044 
0045     if (nvp->isNameMatch("WEATHER_PARAMETERS"))
0046     {
0047         m_Data = QJsonArray();
0048 
0049         // read all sensor values received
0050         for (int i = 0; i < nvp->nnp; i++)
0051         {
0052             auto number = nvp->at(i);
0053             QJsonObject sensor =
0054             {
0055                 {"name", number->getName()},
0056                 {"label", number->getLabel()},
0057                 {"value", number->getValue()}
0058             };
0059             m_Data.push_back(sensor);
0060         }
0061         emit newData(m_Data);
0062         emit newJSONData(QJsonDocument(m_Data).toJson());
0063     }
0064 }
0065 
0066 Weather::Status Weather::status()
0067 {
0068     auto weatherLP = getLight("WEATHER_STATUS");
0069 
0070     if (!weatherLP)
0071         return WEATHER_IDLE;
0072 
0073     m_WeatherStatus = static_cast<Status>(weatherLP->getState());
0074 
0075     return static_cast<Status>(weatherLP->getState());
0076 }
0077 
0078 int Weather::refreshPeriod()
0079 {
0080     auto updateNP = getNumber("WEATHER_UPDATE");
0081 
0082     if (!updateNP)
0083         return 0;
0084 
0085     return static_cast<int>(updateNP->at(0)->getValue());
0086 }
0087 
0088 void Weather::setRefreshPeriod(int value)
0089 {
0090     auto updateNP = getNumber("WEATHER_UPDATE");
0091 
0092     if (!updateNP)
0093         return;
0094 
0095     updateNP->at(0)->setValue(value);
0096     sendNewProperty(updateNP);
0097 }
0098 
0099 bool Weather::refresh()
0100 {
0101     auto refreshSP = getSwitch("WEATHER_REFRESH");
0102 
0103     if (refreshSP == nullptr)
0104         return false;
0105 
0106     auto refreshSW = refreshSP->findWidgetByName("REFRESH");
0107 
0108     if (refreshSW == nullptr)
0109         return false;
0110 
0111     refreshSP->reset();
0112     refreshSW->setState(ISS_ON);
0113     sendNewProperty(refreshSP);
0114 
0115     return true;
0116 
0117 }
0118 }
0119 
0120 #ifndef KSTARS_LITE
0121 QDBusArgument &operator<<(QDBusArgument &argument, const ISD::Weather::Status &source)
0122 {
0123     argument.beginStructure();
0124     argument << static_cast<int>(source);
0125     argument.endStructure();
0126     return argument;
0127 }
0128 
0129 const QDBusArgument &operator>>(const QDBusArgument &argument, ISD::Weather::Status &dest)
0130 {
0131     int a;
0132     argument.beginStructure();
0133     argument >> a;
0134     argument.endStructure();
0135     dest = static_cast<ISD::Weather::Status>(a);
0136     return argument;
0137 }
0138 #endif