You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
10 KiB
241 lines
10 KiB
/* |
|
SPDX-FileCopyrightText: 2007-2009 Shawn Starr <shawn.starr@rogers.com> |
|
|
|
SPDX-License-Identifier: LGPL-2.0-or-later |
|
*/ |
|
|
|
#pragma once |
|
|
|
#include <Plasma/DataEngine> |
|
|
|
#include "ion_export.h" |
|
|
|
/** |
|
* @author Shawn Starr |
|
* This is the base class to be used to implement new ions for the WeatherEngine. |
|
* The idea is that you can have multiple ions which provide weather information from different services to the engine from which an applet will request the |
|
* data from. |
|
* |
|
* Basically an ion is a Plasma::DataEngine, which is queried by the WeatherEngine instead of some applet. |
|
* |
|
* |
|
* Find following the currently used entries of the data for a "SOMEION|weather|SOMEPLACE" source. |
|
* Any free text strings should be translated by the dataengine if possible, |
|
* as any dataengine user has less knowledge about the meaning of the strings. |
|
* |
|
* Data about the weather station: |
|
* "Station": string, id of the location of the weather station with the service, required, TODO: ensure it's id |
|
* "Place": string, display name of the location of the weather station, required, TODO: what details here, country? |
|
* "Country": string, display name of country of the weather station, optional |
|
* "Latitude": float, latitude of the weather station in decimal degrees, optional |
|
* "Longitude": float, longitude of the weather station in decimal degrees, optional |
|
* |
|
* Data about last observation: |
|
* "Observation Period": string, free text string for time of observation, optional |
|
* "Observation Timestamp": datetime (with timezone), time of observation, optional |
|
* "Current Conditions": string, free text string for current weather observation, optional |
|
* "Condition Icon": string, xdg icon name for current weather observation, optional |
|
* "Temperature": float, using general temperature unit, optional |
|
* "Windchill": float, felt temperature due to wind, using general temperature unit, optional |
|
* "Heat Index": float, using general temperature unit, optional |
|
* "Humidex": int, humidity index (not to be mixed up with heat index), optional |
|
* "Wind Speed": float, average wind speed, optional TODO: fix "Calm" strings injected on dataengine side, it's a display thing? |
|
* "Wind Speed Unit": int, kunitconversion enum number for the unit with all wind speed values, required if wind speeds are given |
|
* "Wind Gust": float, max wind gust speed, optional |
|
* "Wind Direction": string, wind direction in cardinal directions (up to secondary-intercardinal + VR), optional |
|
* "Visibility": float, visibility in distance, optional |
|
* "Visibility Unit": int, kunitconversion enum number for the unit with all visibility values, required if visibilities are given |
|
* "Pressure": float, air pressure, optional |
|
* "Pressure Tendency": string, "rising", "falling", "steady", optional TODO: turn into enum/string id set, currently passed as string |
|
* "Pressure Unit": int, kunitconversion enum number for the unit with all pressure values, required if pressures are given |
|
* "UV Index": int, value in UV index UN standard, optional |
|
* "UV Rating": string, grouping in which UV index is: "Low"0</"Moderate"3</"High"6</"Very high"8</"Extreme"11<, optional TODO: can be calculated from UV Index, |
|
* so needed? "Humidity": float, humidity of the air, optional "Humidity Unit": int, kunitconversion enum number for the unit with all humidity values, required |
|
* if humidities are given TODO: any other unit than percent expected? "Dewpoint": string, temperature where water condensates given other conditions, optional |
|
* |
|
* Data about current day: |
|
* "Normal High": float, average highest temperature measured at location, optional |
|
* "Normal Low": float, average lowest temperature measured at location, optional |
|
* "Record High Temperature": float, highest temperature ever measured at location, optional |
|
* "Record Low Temperature": float, lowest temperature ever measured at location, optional |
|
* "Record Rainfall": float, highest height of rain (precipitation?) ever measured at location, optional |
|
* "Record Rainfall Unit": int, kunitconversion enum number for the unit with all rainfall values, required if rainfalls are given |
|
* "Record Snowfall": float, highest height of snow ever measured at location, optional |
|
* "Record Snowfall Unit": int, kunitconversion enum number for the unit with Record Snowfall, required if snowfall is given |
|
* |
|
* Data about last day: |
|
* "Yesterday High": float, highest temperature at location, optional |
|
* "Yesterday Low": float, lowest temperature at location, optional |
|
* "Yesterday Precip Total": float, total precipitation over day, optional TODO: "Trace" injected, should be dealt with at display side? |
|
* "Yesterday Precip Unit": int, kunitconversion enum number for the unit with recip, required if precipitation is given |
|
* |
|
* Data about next days: |
|
* "Total Weather Days": int |
|
* "Short Forecast Day %1": string, 6 fields separated by |, %1 number in list, required |
|
* fields are (optional means empty string possible): |
|
* period: time of, required, TODO: have standardized to allow better processing |
|
* condition icon: xdg icon name for current weather observation, optional, |
|
* condition: free text string for weather condition, optional |
|
* temperature high: number of highest temperature (using general unit), optional |
|
* temperature low: number of lowest temperature (using general unit), optional |
|
* probability: chance of conditions to happen, optional |
|
* TODO: this should be rather a QVariantList if possible |
|
* |
|
* Data about warning/watches: |
|
* "Total Warnings Issued": int, number of warnings, there should be matching "Watch * "+number data, TODO: what is a warning exactly? |
|
* "Total Watches Issued": int, number of watches, there should be matching "Watch * "+number data, TODO: what is a watch exactly? |
|
* "Warning Description " + number, string, free text string, optional |
|
* "Warning Info " + number, string, free text string, optional |
|
* "Warning Priority " + number, string, free text string, optional TODO: get standardized enum |
|
* "Warning Timestamp " + number, string, free text string, optional TODO: get standardized datetime |
|
* "Watch Description " + number, string, free text string, optional |
|
* "Watch Info " + number, string, free text string, optional |
|
* "Watch Priority " + number, string, free text string, optional TODO: get standardized enum |
|
* "Watch Timestamp " + number, string, free text string, optional TODO: get standardized datetime |
|
* |
|
* Data about the data: |
|
* "Temperature Unit": int, kunitconversion enum number for the unit with all temperature values, required if temperatures are given |
|
* |
|
* "Credit": string, credit line for the data, required |
|
* "Credit Url": string, url related to the credit for the data (can be also webpage with more forecast), optional |
|
*/ |
|
class ION_EXPORT IonInterface : public Plasma::DataEngine |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
enum ConditionIcons { |
|
ClearDay = 1, |
|
ClearWindyDay, |
|
FewCloudsDay, |
|
FewCloudsWindyDay, |
|
PartlyCloudyDay, |
|
PartlyCloudyWindyDay, |
|
Overcast, |
|
OvercastWindy, |
|
Rain, |
|
LightRain, |
|
Showers, |
|
ChanceShowersDay, |
|
Thunderstorm, |
|
Hail, |
|
Snow, |
|
LightSnow, |
|
Flurries, |
|
FewCloudsNight, |
|
FewCloudsWindyNight, |
|
ChanceShowersNight, |
|
PartlyCloudyNight, |
|
PartlyCloudyWindyNight, |
|
ClearNight, |
|
ClearWindyNight, |
|
Mist, |
|
Haze, |
|
FreezingRain, |
|
RainSnow, |
|
FreezingDrizzle, |
|
ChanceThunderstormDay, |
|
ChanceThunderstormNight, |
|
ChanceSnowDay, |
|
ChanceSnowNight, |
|
NotAvailable, |
|
}; |
|
|
|
enum WindDirections { |
|
N, |
|
NNE, |
|
NE, |
|
ENE, |
|
E, |
|
SSE, |
|
SE, |
|
ESE, |
|
S, |
|
NNW, |
|
NW, |
|
WNW, |
|
W, |
|
SSW, |
|
SW, |
|
WSW, |
|
VR, |
|
}; |
|
|
|
/** |
|
* Constructor for the ion |
|
* @param parent The parent object. |
|
* @Param args The argument list. |
|
*/ |
|
explicit IonInterface(QObject *parent = nullptr, const QVariantList &args = QVariantList()); |
|
/** |
|
* Destructor for the ion |
|
*/ |
|
~IonInterface() override; |
|
|
|
/** |
|
* Returns weather icon filename to display in applet. |
|
* @param condition the current condition being reported. |
|
* @return icon name |
|
*/ |
|
QString getWeatherIcon(ConditionIcons condition) const; |
|
|
|
/** |
|
* Returns weather icon filename to display in applet. |
|
* @param conditionList a QList map pair of icons mapped to a enumeration of conditions. |
|
* @param condition the current condition being reported. |
|
* @return icon name |
|
*/ |
|
QString getWeatherIcon(const QMap<QString, ConditionIcons> &conditionList, const QString &condition) const; |
|
|
|
/** |
|
* Returns wind icon element to display in applet. |
|
* @param windDirList a QList map pair of wind directions mapped to a enumeration of directions. |
|
* @param windDirection the current wind direction. |
|
* @return svg element for wind direction |
|
*/ |
|
QString getWindDirectionIcon(const QMap<QString, WindDirections> &windDirList, const QString &windDirection) const; |
|
|
|
public Q_SLOTS: |
|
|
|
/** |
|
* Reimplemented from Plasma::DataEngine |
|
* @param source the name of the datasource to be updated |
|
*/ |
|
bool updateSourceEvent(const QString &source) override; |
|
|
|
/** |
|
* Reimplement for ion to reload data if network status comes back up |
|
*/ |
|
virtual void reset() = 0; |
|
|
|
Q_SIGNALS: |
|
void forceUpdate(IonInterface *ion, const QString &source); |
|
|
|
protected: |
|
/** |
|
* Call this method to flush waiting source requests that may be pending |
|
* initialization |
|
* |
|
* @arg initialized whether or not the ion is currently ready to fetch data |
|
*/ |
|
void setInitialized(bool initialized); |
|
|
|
/** |
|
* Reimplemented from Plasma::DataEngine |
|
* @param source The datasource being requested |
|
*/ |
|
bool sourceRequestEvent(const QString &source) override; |
|
|
|
/** |
|
* Reimplement to fetch the data from the ion. |
|
* @arg source the name of the datasource. |
|
* @return true if update was successful, false if failed |
|
*/ |
|
virtual bool updateIonSource(const QString &source) = 0; |
|
|
|
friend class WeatherEngine; |
|
|
|
private: |
|
class Private; |
|
Private *const d; |
|
};
|
|
|