123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- #pragma once
- #include <AP_HAL/AP_HAL.h>
- #include <AP_Common/Location.h>
- #include <GCS_MAVLink/GCS_MAVLink.h>
- #if !HAL_MINIMIZE_FEATURES
- #include <AP_Param/AP_Param.h>
- class AP_OADatabase {
- public:
- AP_OADatabase();
-
- AP_OADatabase(const AP_OADatabase &other) = delete;
- AP_OADatabase &operator=(const AP_OADatabase&) = delete;
-
- static AP_OADatabase *get_singleton() {
- return _singleton;
- }
- enum OA_DbItemImportance {
- Low, Normal, High
- };
- struct OA_DbItem {
- Location loc;
- uint32_t timestamp_ms;
- float radius;
- uint8_t send_to_gcs;
- OA_DbItemImportance importance;
- };
- void init();
- void update();
-
- void queue_push(const Location &loc, const uint32_t timestamp_ms, const float distance, const float angle);
-
- bool healthy() const { return (_queue.items != nullptr) && (_database.items != nullptr); }
-
- const OA_DbItem& get_item(uint32_t i) const { return _database.items[i]; }
-
- float get_accuracy() const { return _database.filter_m; }
-
- uint16_t database_count() const { return _database.count; }
-
- bool process_queue();
-
- void send_adsb_vehicle(mavlink_channel_t chan, uint16_t interval_ms);
- static const struct AP_Param::GroupInfo var_info[];
- private:
-
- void init_queue();
- void init_database();
-
- void optimize_db_filter();
-
- void database_item_add(const OA_DbItem &item);
- void database_item_refresh(const uint16_t index, const uint32_t timestamp_ms, const float radius);
- void database_item_remove(const uint16_t index);
- void database_items_remove_all_expired();
-
-
- uint8_t get_send_to_gcs_flags(const OA_DbItemImportance importance);
-
- float get_radius(const OA_DbItemImportance importance);
-
- bool is_close_to_item_in_database(const uint16_t index, const OA_DbItem &item) const;
-
- enum class OA_DbOutputLevel {
- OUTPUT_LEVEL_DISABLED = 0,
- OUTPUT_LEVEL_SEND_HIGH = 1,
- OUTPUT_LEVEL_SEND_HIGH_AND_NORMAL = 2,
- OUTPUT_LEVEL_SEND_ALL = 3
- };
-
- AP_Int16 _queue_size_param;
- AP_Int16 _database_size_param;
- AP_Int8 _database_expiry_seconds;
- AP_Int8 _output_level;
- struct {
- ObjectBuffer<OA_DbItem> *items;
- uint16_t size;
- HAL_Semaphore sem;
- } _queue;
- struct {
- OA_DbItem *items;
- float filter_m = 0.2f;
- const float filter_max_m = 10.0f;
- const float filter_min_m = 0.011f;
- const float filter_grow_rate = 1.03f;
- const float filter_shrink_rate = 0.99f;
- const float radius_grow_rate = 1.10f;
- uint16_t count;
- uint16_t size;
- } _database;
- uint16_t _next_index_to_send[MAVLINK_COMM_NUM_BUFFERS];
- uint16_t _highest_index_sent[MAVLINK_COMM_NUM_BUFFERS];
- uint32_t _last_send_to_gcs_ms[MAVLINK_COMM_NUM_BUFFERS];
- float _radius_importance_low = _database.filter_m;
- float _radius_importance_normal = _database.filter_m;
- float _radius_importance_high = _database.filter_m;
- static AP_OADatabase *_singleton;
- };
- #else
- class AP_OADatabase {
- public:
- static AP_OADatabase *get_singleton() { return nullptr; }
- void init() {};
- void queue_push(const Location &loc, const uint32_t timestamp_ms, const float distance, const float angle) {};
- bool healthy() const { return false; }
- void send_adsb_vehicle(mavlink_channel_t chan, uint16_t interval_ms) {};
- };
- #endif
- namespace AP {
- AP_OADatabase *oadatabase();
- };
|