TopicPublisher.h 1.46 KB
Newer Older
Valentin Platzgummer's avatar
Valentin Platzgummer committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#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 <thread>
#include <deque>
#include <atomic>
#include <mutex>

namespace ROSBridge {
namespace ComPrivate {

Valentin Platzgummer's avatar
Valentin Platzgummer committed
16
class TopicPublisher
Valentin Platzgummer's avatar
Valentin Platzgummer committed
17 18 19 20
{
    typedef std::unique_ptr<std::thread> ThreadPtr;
public:

Valentin Platzgummer's avatar
Valentin Platzgummer committed
21 22 23 24 25
    TopicPublisher() = delete;
    TopicPublisher(CasePacker *casePacker,
                   RosbridgeWsClient *rbc);

    ~TopicPublisher();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
26 27 28 29

    void start();
    void stop();
    template<class T>
Valentin Platzgummer's avatar
Valentin Platzgummer committed
30
    void publish(const T &msg, const std::string &topic){
Valentin Platzgummer's avatar
Valentin Platzgummer committed
31
        JsonDocUPtr docPtr(_casePacker->pack(msg, topic));
Valentin Platzgummer's avatar
Valentin Platzgummer committed
32
        publish(std::move(docPtr));
Valentin Platzgummer's avatar
Valentin Platzgummer committed
33
    }
Valentin Platzgummer's avatar
Valentin Platzgummer committed
34
    void publish(JsonDocUPtr docPtr){
Valentin Platzgummer's avatar
Valentin Platzgummer committed
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
        std::lock_guard<std::mutex> lock(_queueMutex);
        _queue.push_back(std::move(docPtr));
    }

private:
    static const char *_topicAdvertiserKey;

    JsonQueue           _queue;
    std::mutex          _queueMutex;
    std::atomic<bool>   _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<bool> &stopFlag);


} // namespace CommunicatorDetail
} // namespace ROSBridge