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.
129 lines
5.0 KiB
129 lines
5.0 KiB
#ifndef AIRMAP_TRAFFIC_H_ |
|
#define AIRMAP_TRAFFIC_H_ |
|
|
|
#include <airmap/date_time.h> |
|
#include <airmap/do_not_copy_or_move.h> |
|
#include <airmap/error.h> |
|
#include <airmap/logger.h> |
|
#include <airmap/outcome.h> |
|
|
|
#include <functional> |
|
#include <iosfwd> |
|
#include <stdexcept> |
|
#include <string> |
|
#include <vector> |
|
|
|
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<std::shared_ptr<Monitor>, Error>; |
|
/// Callback describes the function signature of the callback that is |
|
/// invoked when a call to Traffic::monitor finishes. |
|
using Callback = std::function<void(const Result&)>; |
|
|
|
/// 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>& 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<void(Update::Type, const std::vector<Update>&)>& f); |
|
// From subscriber |
|
void handle_update(Update::Type type, const std::vector<Update>& update) override; |
|
|
|
private: |
|
std::function<void(Update::Type, const std::vector<Update>&)> 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>& logger); |
|
|
|
// From Subscriber |
|
void handle_update(Update::Type type, const std::vector<Update>& update) override; |
|
|
|
private: |
|
const char* component_; |
|
std::shared_ptr<Logger> logger_; |
|
}; |
|
|
|
/// subscribe registers 'subscriber' such that subsequent batches of |
|
/// Update instances are delivered to 'subscriber'. |
|
virtual void subscribe(const std::shared_ptr<Subscriber>& subscriber) = 0; |
|
|
|
/// unsubscribe unregisters 'subscriber'. |
|
virtual void unsubscribe(const std::shared_ptr<Subscriber>& 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_
|
|
|