header.h 3.2 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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
#pragma once

#include "ros_bridge/rapidjson/include/rapidjson/document.h"
#include "ros_bridge/include/messages/std_msgs/time.h"

#include <string>

namespace ros_bridge {
//! @brief Namespace containing classes and methodes ros message generation.
namespace messages {
//! @brief Namespace containing classes and methodes for std_msgs generation.
namespace std_msgs {
//! @brief Namespace containing classes and methodes for std_msgs/Header message generation.
namespace header {


std::string messageType(){
    return "std_msgs/Header";
}

//! @brief C++ representation of std_msgs/Header
class Header{
public:
    using Time = std_msgs::time::Time;
    Header() : _seq(_defaultSeq++), _stamp(Time()), _frameId("") {}
    Header(uint32_t seq, const Time &stamp, const std::string &frame_id) :
        _seq(seq)
      , _stamp(stamp)
      , _frameId(frame_id) {}

    Header(const Header &header) :
        _seq(header.seq())
      , _stamp(header.stamp())
      , _frameId(header.frameId()) {}

    uint32_t            seq()       const {return _seq;}
    const Time          &stamp()     const {return _stamp;}
    const std::string   &frameId()   const {return _frameId;}

    Time            &stamp()         {return _stamp;}
    std::string     &frameId()       {return _frameId;}

    void setSeq     (uint32_t seq)                  {_seq = seq;}
    void setStamp   (const Time &stamp)             {_stamp = stamp;}
    void setFrameId (const std::string  &frameId)   {_frameId = frameId;}
private:
    static uint32_t _defaultSeq = 0;
    uint32_t    _seq;
    Time        _stamp;
    std::string _frameId;
};

template <class HeaderType>
bool toJson(const HeaderType &header,
            rapidjson::Value &value,
            rapidjson::Document::AllocatorType &allocator)     {
    value.AddMember("seq", rapidjson::Value().SetUint(uint32_t(header.seq())), allocator);

    rapidjson::Value stamp(rapidjson::kObjectType);
    if (!Time::toJson(header.stamp(), stamp, allocator)){
        assert(false);
        return false;
    }
    value.AddMember("stamp", stamp, allocator);

    value.AddMember("frame_id",
                  rapidjson::Value().SetString(header.frameId().data(),
                                               header.frameId().length(),
                                               allocator),
                  allocator);
    value.AddMember("type", rapidjson::Value().SetString(messageType().c_str()), allocator);

    return true;
}

template <class HeaderType>
bool fromJson(const rapidjson::Value &value,
              HeaderType &header)     {
    if (!value.HasMember("seq")|| !value["seq"].IsUint()){
        assert(false);
        return false;
    }
    if (!value.HasMember("stamp")){
        assert(false);
        return false;
    }
    if (!value.HasMember("frame_id")|| !value["frame_id"].IsString()){
        assert(false);
        return false;
    }
    header.setSeq(value["seq"].GetUint());
    decltype(header.stamp()) time;
    if (!Time::fromJson(value["stamp"], time)){
        assert(false);
        return false;
    }
    header.setStamp(time);
    header.setFrameId(value["frame_id"].GetString());

    return true;
}

} // namespace time
} // namespace std_msgs
} // namespace messages
} // namespace ros_bridge