#pragma once #include "Entities/Movement.hpp" #include "SimCore/Messages/GroundThruthTrack.hpp" #include "SimCore/Messages/Track.hpp" #include "SimCore/Orientation.hpp" #include "SimCore/SafeMap.hpp" #include "SimCore/SimCore.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Entities { struct SensorClientData { std::string SensorName; bool isActive; SimCore::Identifier SensorID; std::shared_ptr SensorSender; }; struct EffectorClientData { std::string EffectorName; bool isActive; SimCore::Identifier EffectorID; std::shared_ptr EffectorSender; }; class Entity { public: Entity(const SimCore::Identifier OwnID, std::string EnttityName, WHISPER::SourceType OwnType, SimCore::Identifier ParentID, SimCore::EntityKind EntityKind, std::uint32_t GroundTruthPort, std::uint32_t CommandPort, std::string CommandIPAddress); ~Entity(); void start(); void stop(); protected: std::shared_ptr> incommingCommandMessages = nullptr; std::shared_ptr> outgoingCommandMessages = nullptr; virtual void specificPhysicsCalculations(std::chrono::milliseconds::rep duration) = 0; virtual void specificReloadCharacteristicts() = 0; std::unique_ptr Movement_ = nullptr; protected: std::string EntityName_; SimCore::GroundTruthTrack ownTrack_; SimCore::Identifier ParentID_; SimCore::EntityKind EntityKind_; std::uint32_t GroundTruthPort_; std::uint32_t CommandPort_; std::string CommandIPAddress_; private: std::vector threads; std::atomic stopCommandWorker = false; std::atomic stopSensorWorker = false; std::atomic stopTrackWorker = false; std::atomic stopPhysicsWorker = false; std::atomic physicsIsRunning = false; void CommandWorker(); void SensorWorker(); void TrackWorker(); void physicsWorker(); void startSensor(); std::shared_ptr GroundTruthUDPSender_ = nullptr; std::shared_ptr> SensorStore_; std::shared_ptr>> Trackstore_; }; }