#pragma once #include "ros_bridge/include/TypeFactory.h" #include "ros_bridge/include/CasePacker.h" #include "ros_bridge/include/ComPrivateInclude.h" #include "ros_bridge/include/RosBridgeClient.h" #include #include #include #include namespace ROSBridge { namespace ComPrivate { class TopicPublisher { typedef std::unique_ptr ThreadPtr; public: TopicPublisher() = delete; TopicPublisher(CasePacker *casePacker, RosbridgeWsClient *rbc); ~TopicPublisher(); void start(); void stop(); template void publish(const T &msg, const std::string &topic){ JsonDocUPtr docPtr(_casePacker->pack(msg, topic)); publish(std::move(docPtr)); } void publish(JsonDocUPtr docPtr){ std::lock_guard lock(_queueMutex); _queue.push_back(std::move(docPtr)); } private: static const char *_topicAdvertiserKey; JsonQueue _queue; std::mutex _queueMutex; std::atomic _stopFlag; CasePacker *_casePacker; ThreadPtr _pThread; RosbridgeWsClient *_rbc; }; void transmittLoop(const ROSBridge::CasePacker &casePacker, RosbridgeWsClient &rbc, ROSBridge::ComPrivate::JsonQueue &queue, std::mutex &queueMutex, const std::atomic &stopFlag); } // namespace CommunicatorDetail } // namespace ROSBridge