ros_bridge.cpp 1.83 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 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 60 61 62 63 64 65 66 67 68 69 70 71
#include "ros_bridge/include/ros_bridge.h"


ros_bridge::ROSBridge::ROSBridge(const char *connectionString) :
    _stopped(std::make_shared<std::atomic_bool>(true))
  , _rbc(connectionString, false /*run*/)
  , _topicPublisher(_rbc)
  , _topicSubscriber(_rbc)
  , _server(_rbc)
{
}

ros_bridge::ROSBridge::ROSBridge() :
    ros_bridge::ROSBridge::ROSBridge("localhost:9090")
{
}

void ros_bridge::ROSBridge::publish(ros_bridge::ROSBridge::JsonDocUPtr doc, const char* topic)
{
    _topicPublisher.publish(std::move(doc), topic);
}

void ros_bridge::ROSBridge::subscribe(const char *topic, const std::function<void(JsonDocUPtr)> &callBack)
{
    _topicSubscriber.subscribe(topic, callBack);
}

void ros_bridge::ROSBridge::advertiseService(const char *service,
                                             const char *type,
                                             const std::function<JsonDocUPtr(JsonDocUPtr)> &callback)
{
    _server.advertiseService(service, type, callback);
}

void ros_bridge::ROSBridge::start()
{
    _stopped->store(false);
    _rbc.run();
    _topicPublisher.start();
    _topicSubscriber.start();
    _server.start();
}

void ros_bridge::ROSBridge::reset()
{
    auto start = std::chrono::high_resolution_clock::now();
    _stopped->store(true);
    _topicPublisher.reset();
    _topicSubscriber.reset();
    _server.reset();
    _rbc.reset();
    auto end = std::chrono::high_resolution_clock::now();
    auto delta = std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count();
    std::cout << "ros_bridge reset duration: " << delta << " ms" << std::endl;
}

bool ros_bridge::ROSBridge::connected()
{
    return _rbc.connected();
}

bool ros_bridge::ROSBridge::isRunning()
{
    return !_stopped->load();
}


bool ros_bridge::isValidConnectionString(const char *connectionString)
{
    return is_valid_port_path(connectionString);
}