diff --git a/include/MantleAPI/Execution/i_environment.h b/include/MantleAPI/Execution/i_environment.h index 9e9279f0baa89adbb12f2b0cc37fe0f642418421..7618dbd1f007c04c36aa41ee6a456bb7c3e249b1 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 0000000000000000000000000000000000000000..f6089f8ef706fda3635cf0f47ab5767fda70c0e8 --- /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 309dfacbb955a8d4bad38403c63ec16a0372ea8d..414eef247c40af99c6d3f259cdc432298d1c7668 --- 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