地面站终端 App
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

#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_