tile.h 2.96 KB
Newer Older
Valentin Platzgummer's avatar
Valentin Platzgummer committed
1 2 3 4 5 6
#pragma once

#include "ros_bridge/include/messages/geographic_msgs/geopoint.h"

#include <vector>

7 8 9
#include <QJsonArray>
#include <QString>

Valentin Platzgummer's avatar
Valentin Platzgummer committed
10 11 12 13 14 15 16 17
namespace ros_bridge {
//! @brief Namespace containing classes and methodes ros message generation.
namespace messages {
//! @brief Namespace containing classes and methodes for nemo_msgs
//! generation.
namespace nemo_msgs {
//! @brief Namespace containing methodes for nemo_msgs/tile message
//! generation.
Valentin Platzgummer's avatar
Valentin Platzgummer committed
18
namespace tile {
Valentin Platzgummer's avatar
Valentin Platzgummer committed
19

20
QString messageType();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
21 22 23 24 25 26 27 28

namespace {
const char *progressKey = "progress";
const char *idKey = "id";
const char *tileKey = "tile";
} // namespace

//! @brief C++ representation of nemo_msgs/tile message
Valentin Platzgummer's avatar
Valentin Platzgummer committed
29 30
template <class GeoPoint = geographic_msgs::geo_point::GeoPoint,
          template <class, class...> class Container = std::vector>
Valentin Platzgummer's avatar
Valentin Platzgummer committed
31 32 33 34
class GenericTile {
public:
  typedef Container<GeoPoint> GeoContainer;
  GenericTile() {}
35
  GenericTile(const GeoContainer &tile, double progress, const QString &id)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
36 37
      : _tile(tile), _id(id), _progress(progress) {}

38 39
  QString id() const { return _id; }
  void setId(const QString &id) { _id = id; }
Valentin Platzgummer's avatar
Valentin Platzgummer committed
40 41 42 43 44 45 46 47 48

  double progress() const { return _progress; }
  void setProgress(double progress) { _progress = progress; }

  const GeoContainer &tile() const { return _tile; }
  GeoContainer &tile() { return _tile; }
  void setTile(const GeoContainer &tile) { _tile = tile; }

protected:
Valentin Platzgummer's avatar
Valentin Platzgummer committed
49
  GeoContainer _tile;
50
  QString _id;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
51 52 53 54 55
  double _progress;
};
typedef GenericTile<> Tile;

template <class TileType>
56
bool toJson(const TileType &tile, QJsonObject &value) {
Valentin Platzgummer's avatar
Valentin Platzgummer committed
57

58 59
  value[idKey] = tile.id();
  value[progressKey] = tile.progress();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
60 61

  using namespace messages::geographic_msgs;
62
  QJsonArray geoPoints;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
63
  for (unsigned long i = 0; i < std::uint64_t(tile.tile().size()); ++i) {
64 65
    QJsonObject geoPoint;
    if (!geo_point::toJson(tile.tile()[i], geoPoint)) {
Valentin Platzgummer's avatar
Valentin Platzgummer committed
66 67
      return false;
    }
68
    geoPoints.append(std::move(geoPoint));
Valentin Platzgummer's avatar
Valentin Platzgummer committed
69
  }
Valentin Platzgummer's avatar
Valentin Platzgummer committed
70

71
  value[tileKey] = std::move(geoPoints);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
72 73 74 75

  return true;
}

76 77
template <class TileType> bool fromJson(const QJsonObject &value, TileType &p) {
  if (!value.contains(progressKey) || !value[progressKey].isDouble()) {
Valentin Platzgummer's avatar
Valentin Platzgummer committed
78 79 80
    return false;
  }

81
  if (!value.contains(idKey) || !value[idKey].isString()) {
Valentin Platzgummer's avatar
Valentin Platzgummer committed
82 83 84
    return false;
  }

85
  if (!value.contains(tileKey) || !value[tileKey].isArray()) {
Valentin Platzgummer's avatar
Valentin Platzgummer committed
86 87 88
    return false;
  }

89 90
  p.setId(value[idKey].toString());
  p.setProgress(value[progressKey].toDouble());
Valentin Platzgummer's avatar
Valentin Platzgummer committed
91

Valentin Platzgummer's avatar
Valentin Platzgummer committed
92 93
  using namespace geographic_msgs;

94
  const auto jsonArray = value[tileKey].toArray();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
95
  p.tile().clear();
96
  p.tile().reserve(jsonArray.size());
Valentin Platzgummer's avatar
Valentin Platzgummer committed
97 98 99 100
  typedef decltype(p.tile()[0]) PointTypeCVR;
  typedef
      typename std::remove_cv_t<typename std::remove_reference_t<PointTypeCVR>>
          PointType;
101
  for (long i = 0; i < jsonArray.size(); ++i) {
Valentin Platzgummer's avatar
Valentin Platzgummer committed
102
    PointType pt;
103
    if (!geo_point::fromJson(jsonArray[i].toObject(), pt)) {
Valentin Platzgummer's avatar
Valentin Platzgummer committed
104 105 106 107 108
      return false;
    }
    p.tile().push_back(std::move(pt));
  }

Valentin Platzgummer's avatar
Valentin Platzgummer committed
109 110 111
  return true;
}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
112
} // namespace tile
Valentin Platzgummer's avatar
Valentin Platzgummer committed
113 114 115
} // namespace nemo_msgs
} // namespace messages
} // namespace ros_bridge