From ff894bdfe40289d60416f7daa9ac330d7c2ac1ab Mon Sep 17 00:00:00 2001 From: Henry Winkel Date: Tue, 15 Aug 2023 15:03:11 +0200 Subject: [PATCH] ADD: added controlmessage --- CMakeLists.txt | 4 +- include/SimCore/Messages/Control.hpp | 46 ++++++++++++ include/SimCore/Messages/Protos/Control.proto | 9 +++ include/SimCore/SimCore.hpp | 10 +++ src/SimCore/Messages/Control.cpp | 71 +++++++++++++++++++ 5 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 include/SimCore/Messages/Control.hpp create mode 100644 include/SimCore/Messages/Protos/Control.proto create mode 100644 src/SimCore/Messages/Control.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 17f9119..8384310 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,9 @@ add_library(SimCore STATIC include/SimCore/Messages/Emission.hpp src/SimCore/Messages/Emission.cpp - + include/SimCore/Messages/Control.hpp + src/SimCore/Messages/Control.cpp + include/SimCore/Messages/Protos/Control.pb.cc include/SimCore/Messages/Protos/GeocentricPosition.pb.cc include/SimCore/Messages/Protos/Identifier.pb.cc diff --git a/include/SimCore/Messages/Control.hpp b/include/SimCore/Messages/Control.hpp new file mode 100644 index 0000000..e641fdd --- /dev/null +++ b/include/SimCore/Messages/Control.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace SimCore +{ + class Control + { + public: + Control(const SimCore::Identifier SenderID,ControlType type,std::string data); + + const ControlType Type; + + std::string Data; + + uint64_t Timestamp; + + + + + /// @brief return a WHISPER Message out of a simtrack object + /// @param parentID + /// @return WHISPER::Message + WHISPER::Message buildMessage(); + + /// @brief creates a SimTrack out of a whisper message + /// @param msg + /// @return SimTrack Oject + static std::unique_ptr unpack(WHISPER::Message msg); + + /// @brief creates a SimTrack out of a string message + /// @param msg + /// @return SimTrack Oject + static std::unique_ptr unpack(std::string msgString); + + private: + const SimCore::Identifier ID_; + + }; + +} \ No newline at end of file diff --git a/include/SimCore/Messages/Protos/Control.proto b/include/SimCore/Messages/Protos/Control.proto new file mode 100644 index 0000000..32c15ac --- /dev/null +++ b/include/SimCore/Messages/Protos/Control.proto @@ -0,0 +1,9 @@ + syntax = "proto3"; + +package messages.control; + + message control{ + uint32 type = 1; + string data = 2; + optional uint64 timestamp = 3; + } \ No newline at end of file diff --git a/include/SimCore/SimCore.hpp b/include/SimCore/SimCore.hpp index 1d558a4..162a7fd 100644 --- a/include/SimCore/SimCore.hpp +++ b/include/SimCore/SimCore.hpp @@ -78,6 +78,16 @@ enum TrackKind : std::uint8_t { }; +enum ControlType : std::uint32_t +{ + IDENTIFY, + START, + STOP, + CREATE_ENTITY, + DELETE_ENTITY, + GET_CONTROL +}; + diff --git a/src/SimCore/Messages/Control.cpp b/src/SimCore/Messages/Control.cpp new file mode 100644 index 0000000..0565522 --- /dev/null +++ b/src/SimCore/Messages/Control.cpp @@ -0,0 +1,71 @@ +#include "SimCore/Identifier.hpp" +#include "SimCore/Messages/Protos/Control.pb.h" +#include "SimCore/SimCore.hpp" +#include +#include + +namespace SimCore +{ + + Control::Control(const SimCore::Identifier SenderID,ControlType type,std::string data):ID_(SenderID),Type(type),Data(data) + { + + } + + WHISPER::Message Control::buildMessage() + { + WHISPER::Message msg(ID_.getUUID(),WHISPER::MsgTopics::MANAGEMENT , WHISPER::MsgType::COMMAND); + + + messages::control::control control; + control.set_type(Type); + control.set_data(Data); + control.set_timestamp(Timestamp); + + auto any = std::make_shared(); + + any->PackFrom(control); + msg.addPayLoad(any); + + return msg; + } + + + std::unique_ptr Control::unpack(WHISPER::Message msg) + { + auto m = msg.getProtoMessage(); + + auto controlMsg = messages::control::control(); + if(m.payload().Is()) + { + m.payload().UnpackTo(&controlMsg); + + SimCore::Identifier id(msg.senderUUID_); + + ControlType kind = (SimCore::ControlType)controlMsg.type(); + std::string data = controlMsg.data(); + + auto control = std::make_unique(id,kind,data); + if (controlMsg.has_timestamp()) control->Timestamp = controlMsg.timestamp(); + + // SimCore::Control control(id,kind,data); + return control; + + } + return nullptr; + + } + + + std::unique_ptr Control::unpack(std::string msgString) + { + if (std::empty(msgString) == false && msgString != "NULL") + { + WHISPER::Message whisperMessage(msgString); + return std::move(unpack(whisperMessage)); + } + + return nullptr; + } + +}