From 84ee2634f5776bdf174aabbea09eacaaad6a1aef Mon Sep 17 00:00:00 2001 From: Etienne Pellan <etienne.pellan@external.crf.it> Date: Mon, 10 Jul 2023 11:09:14 +0000 Subject: [PATCH] feat: Implement new objects for XOSC TrafficSwarmAction --- include/MantleAPI/Execution/i_environment.h | 9 ++++ .../Traffic/i_traffic_swarm_service.h | 48 +++++++++++++++++++ test/MantleAPI/Test/test_utils.h | 38 ++++++++++++++- 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 include/MantleAPI/Traffic/i_traffic_swarm_service.h mode change 100644 => 100755 test/MantleAPI/Test/test_utils.h diff --git a/include/MantleAPI/Execution/i_environment.h b/include/MantleAPI/Execution/i_environment.h index 9e9279f0..7618dbd1 100644 --- a/include/MantleAPI/Execution/i_environment.h +++ b/include/MantleAPI/Execution/i_environment.h @@ -26,6 +26,7 @@ #include <MantleAPI/Traffic/default_routing_behavior.h> #include <MantleAPI/Traffic/i_controller_repository.h> #include <MantleAPI/Traffic/i_entity_repository.h> +#include <MantleAPI/Traffic/i_traffic_swarm_service.h> #include <optional> #include <string> @@ -119,6 +120,14 @@ public: /// @param entity_id specifies the entity /// @param route_definition specifies how the route shall be constructed virtual void AssignRoute(mantle_api::UniqueId entity_id, mantle_api::RouteDefinition route_definition) = 0; + + /// @brief Initializes the traffic swarm service with the scenario parameters + /// + /// @param parameters The traffic swarm parameters + virtual void InitTrafficSwarmService(const TrafficSwarmParameters& parameters) = 0; + + /// @brief Returns the traffic swarm service + [[nodiscard]] virtual ITrafficSwarmService& GetTrafficSwarmService() = 0; }; } // namespace mantle_api diff --git a/include/MantleAPI/Traffic/i_traffic_swarm_service.h b/include/MantleAPI/Traffic/i_traffic_swarm_service.h new file mode 100644 index 00000000..f6089f8e --- /dev/null +++ b/include/MantleAPI/Traffic/i_traffic_swarm_service.h @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (c) 2023, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file i_traffic_swarm_service.h */ +//----------------------------------------------------------------------------- + +#ifndef MANTLEAPI_TRAFFIC_I_TRAFFIC_SWARM_CONTROLLER_H +#define MANTLEAPI_TRAFFIC_I_TRAFFIC_SWARM_CONTROLLER_H + +#include <vector> +#include <MantleAPI/Common/vector.h> +#include <MantleAPI/Common/pose.h> +#include <units.h> + +namespace mantle_api +{ + +struct TrafficSwarmParameters +{ + std::string central_entity_name; + size_t maximum_number_of_vehicles; + units::velocity::meters_per_second_t vehicle_velocity; + units::length::meter_t exclusion_radius; + units::length::meter_t semi_minor_spawning_radius; + units::length::meter_t semi_major_spawning_radius; + units::length::meter_t spawning_area_longitudinal_offset; +}; + +class ITrafficSwarmService +{ +public: + virtual std::vector<mantle_api::Pose> GetAvailableSpawningPoses() const = 0; + virtual mantle_api::VehicleProperties GetVehicleProperties(mantle_api::VehicleClass vehicle_class) const = 0; + virtual void UpdateControllerParameters(std::unique_ptr<mantle_api::ExternalControllerConfig>& config) = 0; + virtual void SetSwarmEntitiesCount(size_t count) = 0; +}; + +} // namespace mantle_api + +#endif // MANTLEAPI_TRAFFIC_I_TRAFFIC_SWARM_CONTROLLER_H diff --git a/test/MantleAPI/Test/test_utils.h b/test/MantleAPI/Test/test_utils.h old mode 100644 new mode 100755 index 309dfacb..414eef24 --- a/test/MantleAPI/Test/test_utils.h +++ b/test/MantleAPI/Test/test_utils.h @@ -28,6 +28,7 @@ #include <MantleAPI/Traffic/i_controller_repository.h> #include <MantleAPI/Traffic/i_entity.h> #include <MantleAPI/Traffic/i_entity_repository.h> +#include <MantleAPI/Traffic/i_traffic_swarm_service.h> #include <gmock/gmock.h> #include <gtest/gtest.h> @@ -384,7 +385,10 @@ public: mantle_api::IVehicle& GetHost() override { return test_vehicle_; } - const std::vector<std::unique_ptr<mantle_api::IEntity>>& GetEntities() const override { return entities_; } + MOCK_METHOD(std::vector<std::unique_ptr<mantle_api::IEntity>>&, + GetEntities, + (), + (const, override)); bool Contains(UniqueId id) const override { @@ -474,6 +478,30 @@ public: (override)); }; +class MockTrafficSwarmService : public mantle_api::ITrafficSwarmService +{ + public: + MOCK_METHOD(std::vector<mantle_api::Pose>, + GetAvailableSpawningPoses, + (), + (const, override)); + + MOCK_METHOD(mantle_api::VehicleProperties, + GetVehicleProperties, + (mantle_api::VehicleClass), + (const, override)); + + MOCK_METHOD(void, + UpdateControllerParameters, + (std::unique_ptr<mantle_api::ExternalControllerConfig>&), + (override)); + + MOCK_METHOD(void, + SetSwarmEntitiesCount, + (size_t), + (override)); +}; + class MockEnvironment : public mantle_api::IEnvironment { public: @@ -561,12 +589,20 @@ public: (mantle_api::UniqueId entity_id, mantle_api::RouteDefinition route_definition), (override)); + MOCK_METHOD(void, + InitTrafficSwarmService, + (const mantle_api::TrafficSwarmParameters& parameters), + (override)); + + MockTrafficSwarmService& GetTrafficSwarmService() override { return traffic_swarm_service_; } + private: MockQueryService query_service_{}; MockEntityRepository entity_repository_{}; MockControllerRepository controller_repository_{}; MockConverter converter_{}; MockGeometryHelper geometry_helper_{}; + MockTrafficSwarmService traffic_swarm_service_{}; }; } // namespace mantle_api -- GitLab