#ifndef AIRMAP_TRAFFIC_H_ #define AIRMAP_TRAFFIC_H_ #include #include #include #include #include #include #include #include #include #include namespace airmap { /// Traffic provides access to the AirMap situational awareness /// and traffic alerts. class Traffic : DoNotCopyOrMove { public: /// Update bundles together information about aerial traffic /// relevant to a UAV flight. struct Update { /// Type enumerates all known types of Traffic::Update. enum class Type { unknown, ///< Marks the unknown type. situational_awareness, ///< Marks updates that provide planning information to operators and vehicles. alert ///< Marks updates about aircrafts that are likely to collide with the current aircraft. }; std::string id; ///< The unique id of the underlying track in the context of AirMap. std::string aircraft_id; ///< The 'other' aircraft's id. double latitude; ///< The latitude of the other aircraft in [°]. double longitude; ///< The longitude of the other aircraft in [°]. double altitude; ///< The altitude of the other aircraft in [m]. double ground_speed; ///< The speed over ground of the other aircraft in [m/s]. double heading; ///< The heading of the other aircraft in [°]. double direction; ///< The direction of the other aircraft in relation to the current aircraft in [°]. DateTime recorded; ///< The time when the datum triggering the udpate was recorded. DateTime timestamp; ///< The time when the update was generated. }; /// Monitor models handling of individual subscribers /// to per-flight alerts and awareness notices. class Monitor : DoNotCopyOrMove { public: /// Parameters bundles up input parameters. struct Params { std::string flight_id; ///< The id of the flight for which traffic udpates should be started. std::string authorization; ///< The authorization token. }; /// Result models the outcome of calling Traffic::monitor. using Result = Outcome, Error>; /// Callback describes the function signature of the callback that is /// invoked when a call to Traffic::monitor finishes. using Callback = std::function; /// Subscriber abstracts handling of batches of Update instances. class Subscriber { public: virtual ~Subscriber() = default; /// handle_update is invoked when a new batch of Update instances /// is available. virtual void handle_update(Update::Type type, const std::vector& update) = 0; protected: Subscriber() = default; }; /// FunctionalSubscriber is a convenience class that dispatches /// to a function 'f' for handling batches of Update instances. class FunctionalSubscriber : public Subscriber { public: /// FunctionalSubscriber initializes a new instance with 'f'. explicit FunctionalSubscriber(const std::function&)>& f); // From subscriber void handle_update(Update::Type type, const std::vector& update) override; private: std::function&)> f_; }; /// LoggingSubscriber is a convenience class that logs incoming batches /// of Update instances. class LoggingSubscriber : public Subscriber { public: /// LoggingSubscriber initializes an instance with 'component', feeding /// log entries to 'logger'. Please note that no change of ownership takes /// place for 'component' and the lifetime of component has to exceed the /// lifetime of a LoggingSubscriber instance. explicit LoggingSubscriber(const char* component, const std::shared_ptr& logger); // From Subscriber void handle_update(Update::Type type, const std::vector& update) override; private: const char* component_; std::shared_ptr logger_; }; /// subscribe registers 'subscriber' such that subsequent batches of /// Update instances are delivered to 'subscriber'. virtual void subscribe(const std::shared_ptr& subscriber) = 0; /// unsubscribe unregisters 'subscriber'. virtual void unsubscribe(const std::shared_ptr& subscriber) = 0; protected: Monitor() = default; }; /// monitor subscribes the user and flight described in 'params' to /// the AirMap traffic services and reports the result to 'cb'. virtual void monitor(const Monitor::Params& params, const Monitor::Callback& cb) = 0; protected: /// @cond Traffic() = default; /// @endcond }; /// operator<< inserts a textual representation of type into out. std::ostream& operator<<(std::ostream& out, Traffic::Update::Type type); } // namespace airmap #endif // AIRMAP_TRAFFIC_H_