From a03a694f7b88a50295010b3287236dff920419f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Svoboda?= Date: Thu, 23 Nov 2023 14:03:19 +0100 Subject: [PATCH] simplesim: Add session id to GET_INFO messages --- softwareComponents/rofiHalSim/CMakeLists.txt | 6 ++- .../rofiHalSim/publish_worker.hpp | 2 + softwareComponents/rofiHalSim/rofi_hal.cpp | 50 +------------------ softwareComponents/rofiHalSim/session_id.cpp | 16 ++++++ softwareComponents/rofiHalSim/session_id.hpp | 49 ++++++++++++++++++ .../include/simplesim/distributor.hpp | 2 +- .../simplesimLib/src/distributor.cpp | 5 +- 7 files changed, 77 insertions(+), 53 deletions(-) create mode 100644 softwareComponents/rofiHalSim/session_id.cpp create mode 100644 softwareComponents/rofiHalSim/session_id.hpp diff --git a/softwareComponents/rofiHalSim/CMakeLists.txt b/softwareComponents/rofiHalSim/CMakeLists.txt index aeb32e4b3..715adb707 100644 --- a/softwareComponents/rofiHalSim/CMakeLists.txt +++ b/softwareComponents/rofiHalSim/CMakeLists.txt @@ -1,8 +1,12 @@ cmake_minimum_required(VERSION 3.11) +set(SRC + rofi_hal.cpp + session_id.cpp +) -add_library(rofi_hal_sim SHARED rofi_hal.cpp) +add_library(rofi_hal_sim SHARED ${SRC}) target_link_libraries(rofi_hal_sim PRIVATE ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES} rofisimMessages atoms) target_link_libraries(rofi_hal_sim PUBLIC rofi::hal::inc) target_include_directories(rofi_hal_sim SYSTEM PRIVATE ${GAZEBO_INCLUDE_DIRS}) diff --git a/softwareComponents/rofiHalSim/publish_worker.hpp b/softwareComponents/rofiHalSim/publish_worker.hpp index 9d6cb126d..e1e22de98 100644 --- a/softwareComponents/rofiHalSim/publish_worker.hpp +++ b/softwareComponents/rofiHalSim/publish_worker.hpp @@ -15,6 +15,7 @@ #include "gazebo_node_handler.hpp" #include "message_logger.hpp" +#include "session_id.hpp" #include "subscriber_wrapper.hpp" #include @@ -110,6 +111,7 @@ class PublishWorker { rofi::messages::DistributorReq req; req.set_reqtype( rofi::messages::DistributorReq::GET_INFO ); + req.set_sessionid( SessionId::get().bytes() ); publish( std::move( req ) ); _onRofiTopicsUpdate.wait( lock, [ this, rofiId ] { diff --git a/softwareComponents/rofiHalSim/rofi_hal.cpp b/softwareComponents/rofiHalSim/rofi_hal.cpp index b84d83903..0d1d4895a 100644 --- a/softwareComponents/rofiHalSim/rofi_hal.cpp +++ b/softwareComponents/rofiHalSim/rofi_hal.cpp @@ -13,11 +13,10 @@ #include #include -#include - #include "connector_worker.hpp" #include "joint_worker.hpp" #include "publish_worker.hpp" +#include "session_id.hpp" #include "wait_worker.hpp" #include @@ -25,59 +24,12 @@ #include #include -#ifndef SESSION_ID -#define SESSION_ID boost::uuids::random_generator()() -#endif - namespace { using namespace rofi::hal; namespace msgs = rofi::messages; -class SessionId { -public: - static const SessionId & get() - { - static SessionId instance = SessionId( SESSION_ID ); - return instance; - } - - const std::string & bytes() const - { - return _bytes; - } - -private: - template < typename T, std::enable_if_t< std::is_integral_v< T >, int > = 0 > - constexpr SessionId( T id ) - { - _bytes.reserve( sizeof( T ) ); - - for ( size_t i = 0; i < sizeof( T ); i++ ) { - _bytes.push_back( *( reinterpret_cast< char * >( &id ) + i ) ); - } - } - - template < typename T, - std::enable_if_t< sizeof( typename T::value_type ) == sizeof( char ), int > = 0 > - constexpr SessionId( T id ) - { - _bytes.reserve( id.size() ); - - for ( auto & c : id ) { - static_assert( sizeof( decltype( c ) ) == sizeof( char ) ); - _bytes.push_back( reinterpret_cast< char & >( c ) ); - } - } - - SessionId( const SessionId & other ) = delete; - SessionId & operator=( const SessionId & other ) = delete; - -private: - std::string _bytes; -}; - class ConnectorSim; class JointSim; diff --git a/softwareComponents/rofiHalSim/session_id.cpp b/softwareComponents/rofiHalSim/session_id.cpp new file mode 100644 index 000000000..d2f890b36 --- /dev/null +++ b/softwareComponents/rofiHalSim/session_id.cpp @@ -0,0 +1,16 @@ +#include "session_id.hpp" + +#include + + +#ifndef SESSION_ID + #define SESSION_ID boost::uuids::random_generator()() +#endif + +using rofi::hal::SessionId; + +const SessionId & SessionId::get() +{ + static SessionId instance = SessionId( SESSION_ID ); + return instance; +} diff --git a/softwareComponents/rofiHalSim/session_id.hpp b/softwareComponents/rofiHalSim/session_id.hpp new file mode 100644 index 000000000..ff5d0ff52 --- /dev/null +++ b/softwareComponents/rofiHalSim/session_id.hpp @@ -0,0 +1,49 @@ +#pragma once + +#include +#include + + +namespace rofi::hal +{ + +class SessionId { +public: + static const SessionId & get(); + + const std::string & bytes() const + { + return _bytes; + } + +private: + template < typename T, std::enable_if_t< std::is_integral_v< T >, int > = 0 > + constexpr SessionId( T id ) + { + _bytes.reserve( sizeof( T ) ); + + for ( size_t i = 0; i < sizeof( T ); i++ ) { + _bytes.push_back( *( reinterpret_cast< char * >( &id ) + i ) ); + } + } + + template < typename T, + std::enable_if_t< sizeof( typename T::value_type ) == sizeof( char ), int > = 0 > + constexpr SessionId( T id ) + { + _bytes.reserve( id.size() ); + + for ( auto & c : id ) { + static_assert( sizeof( decltype( c ) ) == sizeof( char ) ); + _bytes.push_back( reinterpret_cast< char & >( c ) ); + } + } + + SessionId( const SessionId & other ) = delete; + SessionId & operator=( const SessionId & other ) = delete; + +private: + std::string _bytes; +}; + +} // namespace rofi::hal diff --git a/softwareComponents/simplesimLib/include/simplesim/distributor.hpp b/softwareComponents/simplesimLib/include/simplesim/distributor.hpp index 5440953ff..f092a5835 100644 --- a/softwareComponents/simplesimLib/include/simplesim/distributor.hpp +++ b/softwareComponents/simplesimLib/include/simplesim/distributor.hpp @@ -66,7 +66,7 @@ class Distributor { onRequest( *reqCopy ); } - rofi::messages::DistributorResp onGetInfoReq(); + rofi::messages::DistributorResp onGetInfoReq( SessionId sessionId ); rofi::messages::DistributorResp onLockOneReq( SessionId sessionId ); rofi::messages::DistributorResp onTryLockReq( ModuleId moduleId, SessionId sessionId ); rofi::messages::DistributorResp onUnlockReq( ModuleId moduleId, SessionId sessionId ); diff --git a/softwareComponents/simplesimLib/src/distributor.cpp b/softwareComponents/simplesimLib/src/distributor.cpp index 4aa9bf870..1c391cbe4 100644 --- a/softwareComponents/simplesimLib/src/distributor.cpp +++ b/softwareComponents/simplesimLib/src/distributor.cpp @@ -34,7 +34,7 @@ void Distributor::onRequest( const rofi::messages::DistributorReq & req ) if ( req.rofiid() != 0 ) { std::cerr << "Got GET_INFO distributor request with non-zero id\n"; } - sendResponse( onGetInfoReq() ); + sendResponse( onGetInfoReq( req.sessionid() ) ); break; } case DistributorReq::LOCK_ONE: @@ -64,10 +64,11 @@ void Distributor::onRequest( const rofi::messages::DistributorReq & req ) } } -rofi::messages::DistributorResp Distributor::onGetInfoReq() +rofi::messages::DistributorResp Distributor::onGetInfoReq( SessionId sessionId ) { rofi::messages::DistributorResp resp; resp.set_resptype( rofi::messages::DistributorReq::GET_INFO ); + resp.set_sessionid( sessionId ); _modulesCommunication.forEachLockedModule( [ &resp ]( ModuleId moduleId, const std::string & topic ) {