#pragma once #include "DirectCommunicationServer.hpp" #include "Entities/Movement.hpp" #include "SimCore/Messages/SimTrack.hpp" #include "SimCore/Orientation.hpp" #include "SimCore/SafeMap.hpp" #include "SimCore/SimCore.hpp" #include "kubecontrol/PodController.hpp" #include #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::EntityKind EntityKind, std::uint32_t GroundTruthPort, ushort CommandPort, bool online); ~Entity(); void start(); void stop(); void setPosition(SimCore::Position); void setSpeed(double speed); void setCourse(double course); void setPitch( double pitch); protected: virtual void specificPhysicsCalculations(std::chrono::milliseconds::rep duration) = 0; virtual void specificReloadCharacteristicts() = 0; protected: std::shared_ptr OwnShipTrack = nullptr; std::string EntityName_; SimCore::EntityKind EntityKind_; ushort MovemntWorkerPort_; private: bool online_; std::vector threads; std::atomic stopMainLoop = false; void MainLoop(); void startMovementWorker(); std::atomic MovementWorkerStarted = false; std::shared_ptr MovemtServer_ = nullptr; void handleMovement(); std::shared_ptr CommandCommsServer_ = nullptr; void handleExternalComms(std::string msg); void startSensor(); std::unique_ptr PodController_; std::shared_ptr> SensorStore_; std::shared_ptr>> Trackstore_; }; }