From 8d6748dc4ff3cd8fb70ecfd1017dd48610e3639c Mon Sep 17 00:00:00 2001 From: Tom Pittenger Date: Sun, 17 Feb 2019 07:44:28 -0800 Subject: [PATCH] AP_ADSB: add special vehicle that ignores range filters --- libraries/AP_ADSB/AP_ADSB.cpp | 13 +++++++++++-- libraries/AP_ADSB/AP_ADSB.h | 9 +++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/libraries/AP_ADSB/AP_ADSB.cpp b/libraries/AP_ADSB/AP_ADSB.cpp index 9bedd77163..ac87ee8c59 100644 --- a/libraries/AP_ADSB/AP_ADSB.cpp +++ b/libraries/AP_ADSB/AP_ADSB.cpp @@ -138,6 +138,11 @@ const AP_Param::GroupInfo AP_ADSB::var_info[] = { // @Units: m AP_GROUPINFO("LIST_ALT", 12, AP_ADSB, in_state.list_altitude, 0), + // @Param: ICAO_SPECL + // @DisplayName: ICAO_ID of special vehicle + // @Description: ICAO_ID of special vehicle that ignores ADSB_LIST_RADIUS and ADSB_LIST_ALT. The vehicle is always tracked. Use 0 to disable. + // @User: Advanced + AP_GROUPINFO("ICAO_SPECL", 13, AP_ADSB, _special_ICAO_target, 0), AP_GROUPEND }; @@ -295,6 +300,9 @@ void AP_ADSB::determine_furthest_aircraft(void) uint16_t max_distance_index = 0; for (uint16_t index = 0; index < in_state.vehicle_count; index++) { + if (is_special_vehicle(in_state.vehicle_list[index].info.ICAO_address)) { + continue; + } const float distance = _my_loc.get_distance(get_location(in_state.vehicle_list[index])); if (max_distance < distance || index == 0) { max_distance = distance; @@ -377,8 +385,9 @@ void AP_ADSB::handle_vehicle(const mavlink_message_t* packet) const Location vehicle_loc = AP_ADSB::get_location(vehicle); const bool my_loc_is_zero = _my_loc.is_zero(); const float my_loc_distance_to_vehicle = _my_loc.get_distance(vehicle_loc); - const bool out_of_range = in_state.list_radius > 0 && !my_loc_is_zero && my_loc_distance_to_vehicle > in_state.list_radius; - const bool out_of_range_alt = in_state.list_altitude > 0 && !my_loc_is_zero && abs(vehicle_loc.alt - _my_loc.alt) > in_state.list_altitude*100; + const bool is_special = is_special_vehicle(vehicle.info.ICAO_address); + const bool out_of_range = in_state.list_radius > 0 && !my_loc_is_zero && my_loc_distance_to_vehicle > in_state.list_radius && !is_special; + const bool out_of_range_alt = in_state.list_altitude > 0 && !my_loc_is_zero && abs(vehicle_loc.alt - _my_loc.alt) > in_state.list_altitude*100 && !is_special; const bool is_tracked_in_list = find_index(vehicle, &index); const uint32_t now = AP_HAL::millis(); diff --git a/libraries/AP_ADSB/AP_ADSB.h b/libraries/AP_ADSB/AP_ADSB.h index 6cfe01d0f0..ee779b77f9 100644 --- a/libraries/AP_ADSB/AP_ADSB.h +++ b/libraries/AP_ADSB/AP_ADSB.h @@ -83,6 +83,11 @@ public: // when true, a vehicle with that ICAO was found in database and the vehicle is populated. bool get_vehicle_by_ICAO(const uint32_t icao, adsb_vehicle_t &vehicle) const; + uint32_t get_special_ICAO_target() const { return (uint32_t)_special_ICAO_target; }; + void set_special_ICAO_target(const uint32_t new_icao_target) { _special_ICAO_target = (int32_t)new_icao_target; }; + bool is_special_vehicle(uint32_t icao) const { return _special_ICAO_target != 0 && (_special_ICAO_target == (int32_t)icao); } + + private: // initialize _vehicle_list void init(); @@ -180,6 +185,10 @@ private: uint16_t furthest_vehicle_index; float furthest_vehicle_distance; + + // special ICAO of interest that ignored filters when != 0 + AP_Int32 _special_ICAO_target; + static const uint8_t max_samples = 30; AP_Buffer samples;