#ifndef AIRMAP_ADVISORY_H_ #define AIRMAP_ADVISORY_H_ #include <airmap/airspace.h> #include <airmap/date_time.h> #include <airmap/do_not_copy_or_move.h> #include <airmap/error.h> #include <airmap/flight_plan.h> #include <airmap/geometry.h> #include <airmap/optional.h> #include <airmap/outcome.h> #include <airmap/ruleset.h> #include <airmap/status.h> #include <cstdint> #include <functional> #include <iosfwd> #include <string> #include <vector> namespace airmap { /// Advisory provides functionality to query airspace and weather information about /// a geographic area. class Advisory : DoNotCopyOrMove { public: /// Advisory bundles together airspace information and its evaluation in terms /// good to fly/needs information or feedback/conflict. struct AirspaceAdvisory { Status::Advisory advisory; /// Airspace information. Status::Color color; /// The evaluation of the airspace. std::uint32_t rule_id; /// The id of the ruleset. std::string ruleset_id; /// The id of the rule. }; /// Wind bundles up attributes describing a wind conditions. struct Wind { std::uint32_t heading = 0; ///< The heading in [°]. float speed = 0.0; ///< The speed in [°]. std::uint32_t gusting = 0; }; /// Weather bundles up attributes describing a weather condition. struct Weather { std::string condition; ///< The overall weather condition. std::string icon; ///< The icon or class of icon that should be used for display purposes. Wind wind; ///< The details about the current wind conditions. float temperature = 0.0; ///< The temperature in [°C]. float humidity = 0.0; float visibility = 0.0; ///< Visibility in [m]. float precipitation = 0.0; ///< The probability of precipitation in [%]. std::string timezone; ///< The timezone of the weather location. DateTime time; ///< Timestamp of the weather report. float dew_point = 0.0; ///< The current dew point. float mslp = 0.0; ///< The Median Sea Level Pressure in [mbar]. }; /// ForId bundles up types to ease interaction /// with Advisory::for_id. struct ForId { /// Parameters bundles up input parameters. struct Parameters { Optional<DateTime> start; ///< Search for advisories before this time. Optional<DateTime> end; ///< Search for advisories after this time. FlightPlan::Id id; ///< Search for advisories relating to this flight plan. }; /// Result models the outcome of calling Advisory::for_id. using Result = Outcome<std::vector<AirspaceAdvisory>, Error>; /// Callback describes the function signature of the callback that is /// invoked when a call to Advisory::for_id finishes. using Callback = std::function<void(const Result&)>; }; /// Search bundles up types to ease interaction /// with Advisory::search. struct Search { /// Parameters bundles up input parameters. struct Parameters { Required<Geometry> geometry; ///< Evaluate rulesets intersecting this geometry. Required<std::string> rulesets; ///< Evaluate these rulesets. Optional<DateTime> start; ///< Search for advisories after this time. Optional<DateTime> end; ///< Search for advisories before this time. }; /// Result models the outcome of calling Advisory::search. using Result = Outcome<std::vector<AirspaceAdvisory>, Error>; /// Callback describes the function signature of the callback that is /// invoked when a call to Advisory::_search finishes. using Callback = std::function<void(const Result&)>; }; /// ReportWeather bundles up types to ease interaction /// with Advisory::report_weather. struct ReportWeather { /// Parameters bundles up input parameters. struct Parameters { float latitude; ///< The latitude component of the takeoff point in [°]. float longitude; ///< The longitude component of the takeoff point in [°]. Optional<DateTime> start; ///< Search for weather data after this time. Optional<DateTime> end; ///< Search for weather data before this time. }; /// Result models the outcome of calling Advisory::report_weather. using Result = Outcome<Weather, Error>; /// Callback describes the function signature of the callback that is /// invoked when a call to Advisory::report_weather finishes. using Callback = std::function<void(const Result&)>; }; /// for_id searches flight advisories for a flight plan and reports /// results back to 'cb'. virtual void for_id(const ForId::Parameters& parameters, const ForId::Callback& cb) = 0; /// search searches flight advisories for 'parameters' and reports /// results back to 'cb'. virtual void search(const Search::Parameters& parameters, const Search::Callback& cb) = 0; /// report_weather gets the current weather conditions and reports /// results back to 'cb'. virtual void report_weather(const ReportWeather::Parameters& parameters, const ReportWeather::Callback& cb) = 0; protected: /// @cond Advisory() = default; /// @endcond }; } // namespace airmap #endif // AIRMAP_ADVISORY_H_