ROSBridge.cpp 1.99 KB
Newer Older
Valentin Platzgummer's avatar
Valentin Platzgummer committed
1 2
#include "ros_bridge/include/ROSBridge.h"

3
ROSBridge::ROSBridge::ROSBridge(const char *connectionString) :
4
    _stopped(std::make_shared<std::atomic_bool>(true))
5
  ,  _casePacker(&_typeFactory, &_jsonFactory)
6
  , _rbc(connectionString, false /*run*/)
7 8 9
  , _topicPublisher(_casePacker, _rbc)
  , _topicSubscriber(_casePacker, _rbc)
  , _server(_casePacker, _rbc)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
10 11 12
{
}

13 14 15 16 17
ROSBridge::ROSBridge::ROSBridge() :
    ROSBridge::ROSBridge::ROSBridge("localhost:9090")
{
}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
18
void ROSBridge::ROSBridge::publish(ROSBridge::ROSBridge::JsonDocUPtr doc)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
19
{
Valentin Platzgummer's avatar
Valentin Platzgummer committed
20
    _topicPublisher.publish(std::move(doc));
Valentin Platzgummer's avatar
Valentin Platzgummer committed
21 22
}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
23
void ROSBridge::ROSBridge::subscribe(const char *topic, const std::function<void(JsonDocUPtr)> &callBack)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
24
{
Valentin Platzgummer's avatar
Valentin Platzgummer committed
25
    _topicSubscriber.subscribe(topic, callBack);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
26 27
}

28 29 30 31 32 33 34
void ROSBridge::ROSBridge::advertiseService(const std::string &service,
                                            const std::string &type,
                                            const std::function<JsonDocUPtr(JsonDocUPtr)> &callback)
{
    _server.advertiseService(service, type, callback);
}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
35
const ROSBridge::CasePacker *ROSBridge::ROSBridge::casePacker() const
Valentin Platzgummer's avatar
Valentin Platzgummer committed
36
{
Valentin Platzgummer's avatar
Valentin Platzgummer committed
37
    return &_casePacker;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
38 39
}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
40
void ROSBridge::ROSBridge::start()
Valentin Platzgummer's avatar
Valentin Platzgummer committed
41
{
42 43
    _stopped->store(false);
    _rbc.run();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
44 45
    _topicPublisher.start();
    _topicSubscriber.start();
46
    _server.start();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
47 48
}

49
void ROSBridge::ROSBridge::reset()
Valentin Platzgummer's avatar
Valentin Platzgummer committed
50
{
51
    auto start = std::chrono::high_resolution_clock::now();
52
    _stopped->store(true);
53 54
    _topicPublisher.reset();
    _topicSubscriber.reset();
55
    _server.reset();
56
    _rbc.reset();
57 58 59
    auto end = std::chrono::high_resolution_clock::now();
    auto delta = std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count();
    std::cout << "ROSBridge reset duration: " << delta << " ms" << std::endl;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
60 61
}

62
bool ROSBridge::ROSBridge::connected()
63 64 65 66
{
    return _rbc.connected();
}

67 68
bool ROSBridge::ROSBridge::isRunning()
{
69
    return !_stopped->load();
70 71
}

72 73 74 75 76

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