LCOV - code coverage report
Current view: top level - src - RssObjectResultListAnalyzer.cpp (source / functions) Hit Total Coverage
Test: ad_rss_map_integration Lines: 0 110 0.0 %
Date: 2025-07-22 06:56:19 Functions: 0 8 0.0 %
Branches: 0 110 0.0 %

           Branch data     Line data    Source code
       1                 :            : // ----------------- BEGIN LICENSE BLOCK ---------------------------------
       2                 :            : //
       3                 :            : // Copyright (C) 2021 Intel Corporation
       4                 :            : //
       5                 :            : // SPDX-License-Identifier: LGPL-2.1-only
       6                 :            : //
       7                 :            : // ----------------- END LICENSE BLOCK -----------------------------------
       8                 :            : #include "ad/rss/map/RssObjectResultListAnalyzer.hpp"
       9                 :            : #include "ad/rss/map/Logging.hpp"
      10                 :            : 
      11                 :            : namespace ad {
      12                 :            : namespace rss {
      13                 :            : namespace map {
      14                 :            : 
      15                 :          0 : std::set<ad::rss::world::ObjectId> RssObjectResultListAnalyzer::getAvailableObjects() const
      16                 :            : {
      17                 :          0 :   return available_objects_;
      18                 :            : }
      19                 :            : 
      20                 :            : ad::rss::map::RssObjectData::ConstPtr
      21                 :          0 : RssObjectResultListAnalyzer::getObjectData(ad::rss::world::ObjectId const &object_id) const
      22                 :            : {
      23         [ #  # ]:          0 :   auto find_result = object_data_map_.find(object_id);
      24         [ #  # ]:          0 :   if (find_result != object_data_map_.end())
      25                 :            :   {
      26                 :          0 :     return find_result->second;
      27                 :            :   }
      28                 :          0 :   return nullptr;
      29                 :            : }
      30                 :            : 
      31                 :          0 : std::set<ad::rss::world::ObjectId> RssObjectResultListAnalyzer::getAvailableEgoObjects() const
      32                 :            : {
      33                 :          0 :   return available_ego_objects_;
      34                 :            : }
      35                 :            : 
      36                 :            : ad::rss::map::RssRouteCheckResult::ConstPtr
      37                 :          0 : RssObjectResultListAnalyzer::getSelectedRouteCheckResult(ad::rss::world::ObjectId const &ego_object_id) const
      38                 :            : {
      39         [ #  # ]:          0 :   auto find_result = selected_route_map_.find(ego_object_id);
      40         [ #  # ]:          0 :   if (find_result != selected_route_map_.end())
      41                 :            :   {
      42                 :          0 :     return find_result->second;
      43                 :            :   }
      44                 :          0 :   return nullptr;
      45                 :            : }
      46                 :            : 
      47                 :            : ad::rss::map::RssRouteId
      48                 :          0 : RssObjectResultListAnalyzer::getCurrentRouteId(ad::rss::world::ObjectId const &ego_object_id) const
      49                 :            : {
      50         [ #  # ]:          0 :   auto route_check_result = getSelectedRouteCheckResult(ego_object_id);
      51         [ #  # ]:          0 :   if (route_check_result)
      52                 :            :   {
      53                 :          0 :     return route_check_result->rss_route.route_id;
      54                 :            :   }
      55                 :          0 :   return 0;
      56                 :          0 : }
      57                 :            : 
      58                 :            : std::set<ad::rss::map::RssRouteId>
      59                 :          0 : RssObjectResultListAnalyzer::getAvailableRoutes(ad::rss::world::ObjectId const &ego_object_id) const
      60                 :            : {
      61                 :          0 :   std::set<ad::rss::map::RssRouteId> route_ids;
      62         [ #  # ]:          0 :   auto find_result = is_safe_map_.find(ego_object_id);
      63         [ #  # ]:          0 :   if (find_result != is_safe_map_.end())
      64                 :            :   {
      65         [ #  # ]:          0 :     for (auto const &route_safe_pair : find_result->second)
      66                 :            :     {
      67         [ #  # ]:          0 :       route_ids.insert(route_safe_pair.first);
      68                 :            :     }
      69                 :            :   }
      70                 :          0 :   return route_ids;
      71                 :          0 : }
      72                 :            : 
      73                 :          0 : bool RssObjectResultListAnalyzer::isRouteAvailable(ad::rss::world::ObjectId const &ego_object_id,
      74                 :            :                                                    ad::rss::map::RssRouteId const &route_id) const
      75                 :            : {
      76         [ #  # ]:          0 :   auto find_result = is_safe_map_.find(ego_object_id);
      77         [ #  # ]:          0 :   if (find_result != is_safe_map_.end())
      78                 :            :   {
      79         [ #  # ]:          0 :     auto find_route_result = find_result->second.find(route_id);
      80                 :          0 :     return find_route_result != find_result->second.end();
      81                 :            :   }
      82                 :          0 :   return false;
      83                 :            : }
      84                 :            : 
      85                 :          0 : void RssObjectResultListAnalyzer::updateRssObjectResultList(
      86                 :            :   std::shared_ptr<ad::rss::map::RssObjectResultList> rss_object_result_list)
      87                 :            : {
      88                 :          0 :   rss_object_result_list_ = rss_object_result_list;
      89                 :            : 
      90                 :          0 :   std::map<ad::rss::world::ObjectId, std::map<ad::rss::map::RssRouteId, bool>> new_is_safe_map;
      91                 :          0 :   std::map<ad::rss::world::ObjectId, ad::rss::map::RssRouteCheckResult::ConstPtr> new_selected_route_map;
      92                 :          0 :   std::map<ad::rss::world::ObjectId, ad::rss::map::RssObjectData::ConstPtr> new_object_data_map;
      93                 :          0 :   std::set<ad::rss::world::ObjectId> new_available_objects;
      94                 :          0 :   std::set<ad::rss::world::ObjectId> new_available_ego_objects;
      95                 :            : 
      96         [ #  # ]:          0 :   if (bool(rss_object_result_list_))
      97                 :            :   {
      98         [ #  # ]:          0 :     for (auto const &object_check_result : *rss_object_result_list_)
      99                 :            :     {
     100                 :          0 :       auto const object_id = object_check_result.object_data.id;
     101         [ #  # ]:          0 :       new_available_objects.insert(object_id);
     102         [ #  # ]:          0 :       new_object_data_map[object_id]
     103                 :          0 :         = ad::rss::map::RssObjectData::ConstPtr(rss_object_result_list_, &object_check_result.object_data);
     104                 :            : 
     105         [ #  # ]:          0 :       if (object_check_result.situation_check_results.size() > 0u)
     106                 :            :       {
     107         [ #  # ]:          0 :         new_available_ego_objects.insert(object_id);
     108         [ #  # ]:          0 :         ad::rss::map::RssRouteId last_selected_route = getCurrentRouteId(object_id);
     109                 :          0 :         ad::rss::map::RssRouteCheckResult const *selected_route = nullptr;
     110                 :          0 :         ad::rss::map::RssRouteId selected_route_id = 0;
     111                 :          0 :         bool first_unsafe_route_found = false;
     112                 :          0 :         bool first_safe_route_found = false;
     113         [ #  # ]:          0 :         for (auto const &route_check_result : object_check_result.situation_check_results)
     114                 :            :         {
     115                 :          0 :           auto const route_id = route_check_result.rss_route.route_id;
     116         [ #  # ]:          0 :           if (route_id == last_selected_route)
     117                 :            :           {
     118                 :          0 :             selected_route = &route_check_result;
     119                 :          0 :             selected_route_id = route_id;
     120                 :            :           }
     121   [ #  #  #  # ]:          0 :           new_is_safe_map[object_id][route_id] = route_check_result.proper_response.is_safe;
     122                 :            : 
     123   [ #  #  #  # ]:          0 :           if ((!first_unsafe_route_found) && (!route_check_result.proper_response.is_safe))
     124                 :            :           {
     125                 :          0 :             first_unsafe_route_found = true;
     126         [ #  # ]:          0 :             if (route_selection_mode_ == RouteSelectionMode::FirstUnsafeRoute)
     127                 :            :             {
     128                 :          0 :               selected_route = &route_check_result;
     129                 :          0 :               selected_route_id = route_id;
     130                 :          0 :               last_selected_route = selected_route_id;
     131                 :            :             }
     132                 :            :           }
     133   [ #  #  #  # ]:          0 :           if ((!first_safe_route_found) && (route_check_result.proper_response.is_safe))
     134                 :            :           {
     135                 :          0 :             first_safe_route_found = true;
     136         [ #  # ]:          0 :             if (route_selection_mode_ == RouteSelectionMode::LastUnsafeRoute)
     137                 :            :             {
     138                 :          0 :               selected_route = &route_check_result;
     139                 :          0 :               selected_route_id = route_id;
     140                 :          0 :               last_selected_route = selected_route_id;
     141                 :            :             }
     142                 :            :           }
     143                 :            : 
     144                 :          0 :           bool route_id_is_new = false;
     145   [ #  #  #  # ]:          0 :           auto find_result = is_safe_map_[object_id].find(route_id);
     146   [ #  #  #  # ]:          0 :           if (find_result == is_safe_map_[object_id].end())
     147                 :            :           {
     148                 :            :             // route not in previous results, try parent route
     149   [ #  #  #  # ]:          0 :             find_result = is_safe_map_[object_id].find(route_check_result.rss_route.parent_route_id);
     150                 :          0 :             route_id_is_new = true;
     151                 :            :           }
     152   [ #  #  #  # ]:          0 :           if (find_result != is_safe_map_[object_id].end())
     153                 :            :           {
     154         [ #  # ]:          0 :             if (route_check_result.proper_response.is_safe != find_result->second)
     155                 :            :             {
     156   [ #  #  #  # ]:          0 :               getLogger()->info("rss_check_result[{}:{}]{} rss safe CHANGED {} -> {}",
     157                 :            :                                 object_id,
     158                 :            :                                 route_id,
     159         [ #  # ]:          0 :                                 route_id_is_new ? "EXT ROUTE" : "",
     160         [ #  # ]:          0 :                                 find_result->second,
     161                 :          0 :                                 route_check_result.proper_response.is_safe);
     162                 :            :             }
     163                 :            :             else
     164                 :            :             {
     165                 :            :               /*
     166                 :            :                 getLogger()->info("rss_check_result[{}:{}]{} rss safe: {}", object_id, route_id,
     167                 :            :                 route_id_is_new?"EXT ROUTE":"", route_check_result.proper_response.is_safe);
     168                 :            :               */
     169                 :            :             }
     170                 :            :           }
     171                 :            :           else
     172                 :            :           {
     173   [ #  #  #  # ]:          0 :             getLogger()->info("rss_check_result[{}:{}] NEW ROUTE: rss safe: {}",
     174                 :            :                               object_id,
     175                 :            :                               route_id,
     176         [ #  # ]:          0 :                               route_check_result.proper_response.is_safe);
     177                 :            :           }
     178                 :            :         }
     179                 :            : 
     180   [ #  #  #  # ]:          0 :         if ((!first_unsafe_route_found) && (route_selection_mode_ == RouteSelectionMode::FirstUnsafeRoute))
     181                 :            :         {
     182         [ #  # ]:          0 :           if (!object_check_result.situation_check_results.empty())
     183                 :            :           {
     184                 :          0 :             selected_route = &object_check_result.situation_check_results[0];
     185                 :          0 :             selected_route_id = object_check_result.situation_check_results[0].rss_route.route_id;
     186                 :          0 :             last_selected_route = selected_route_id;
     187                 :            :           }
     188                 :            :         }
     189                 :            : 
     190         [ #  # ]:          0 :         if (last_selected_route != selected_route_id)
     191                 :            :         {
     192                 :            :           // search if a child route to follow is available
     193         [ #  # ]:          0 :           for (auto const &route_check_result : object_check_result.situation_check_results)
     194                 :            :           {
     195         [ #  # ]:          0 :             if (route_check_result.rss_route.parent_route_id == last_selected_route)
     196                 :            :             {
     197                 :          0 :               selected_route = &route_check_result;
     198                 :          0 :               selected_route_id = route_check_result.rss_route.route_id;
     199                 :          0 :               last_selected_route = selected_route_id;
     200                 :          0 :               break;
     201                 :            :             }
     202                 :            :           }
     203         [ #  # ]:          0 :           if (last_selected_route != selected_route_id)
     204                 :            :           {
     205                 :            :             // fallback to the first route
     206         [ #  # ]:          0 :             if (!object_check_result.situation_check_results.empty())
     207                 :            :             {
     208                 :          0 :               selected_route = &object_check_result.situation_check_results[0];
     209                 :          0 :               selected_route_id = object_check_result.situation_check_results[0].rss_route.route_id;
     210                 :          0 :               last_selected_route = selected_route_id;
     211                 :            :             }
     212                 :            :           }
     213                 :            :         }
     214         [ #  # ]:          0 :         new_selected_route_map[object_id]
     215                 :          0 :           = ad::rss::map::RssRouteCheckResult::ConstPtr(rss_object_result_list_, selected_route);
     216                 :            : 
     217                 :            :         /*
     218                 :            :           RCLCPP_INFO(get_logger(), "rss_check_result[{}] selected route: {}", object_id, selected_route_id);
     219                 :            :         */
     220                 :            :       }
     221                 :            :     }
     222                 :            :   }
     223                 :            : 
     224                 :          0 :   available_ego_objects_.swap(new_available_ego_objects);
     225                 :          0 :   available_objects_.swap(new_available_objects);
     226                 :          0 :   selected_route_map_.swap(new_selected_route_map);
     227                 :          0 :   object_data_map_.swap(new_object_data_map);
     228                 :          0 :   is_safe_map_.swap(new_is_safe_map);
     229                 :          0 : }
     230                 :            : 
     231                 :            : } // namespace map
     232                 :            : } // namespace rss
     233                 :            : } // namespace ad

Generated by: LCOV version 1.14