rosbridge.h 2.85 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
#ifndef ROSBRIDGE_H
#define ROSBRIDGE_H

#include <QJsonObject>
#include <QObject>
#include <QtWebSockets/QWebSocket>

#include <deque>
#include <functional>
#include <future>
#include <map>
#include <memory>

class RosbridgeImpl;
class QThread;

class Rosbridge : public QObject {
  Q_OBJECT
public:
  enum class STATE {
    STOPPED,
    STARTED,
    CONNECTED,
    TIMEOUT,
  };

  typedef std::function<void(const QJsonObject &)> CallBack;
  typedef std::function<QJsonObject(const QJsonObject &)> CallBackWReturn;

  Rosbridge(QUrl _url, QObject *parent = nullptr);
  ~Rosbridge();

  void start();
  void stop();
  STATE state();
  //!
  //! \brief wait Waits for connection.
  //! Waits for connection. This function can be called after start() to wait
  //! for the state() to change to STATE::CONNECTED.
  //!
  void waitConnected();

  // Topics.
  void advertiseTopic(const QString &topic, const QString &type);

  void publish(const QString &topic, const QJsonObject &msg);
  void unadvertiseTopic(const QString &topic);
  void unadvertiseAllTopics();

  void subscribeTopic(const QString &topic, Rosbridge::CallBack callback);

  std::future<bool> topicAvailable(const QString &topic);

  std::future<QJsonObject> getAdvertisedTopics();

  void unsubscribeTopic(const QString &topic);

  void unsubscribeAllTopics();

  void waitForTopic(const QString &topic);

  // Services.
  void advertiseService(const QString &service, const QString &type,
                        Rosbridge::CallBackWReturn callback);

  void unadvertiseService(const QString &service);

  void unadvertiseAllServices();

  void callService(const QString &service, Rosbridge::CallBack callback,
                   const QJsonObject &args = QJsonObject());

  std::future<bool> serviceAvailable(const QString &service);

  std::future<QJsonObject> getAdvertisedServices();

  void waitForService(const QString &service);

signals:
  void stateChanged();

private:
signals:
  void _start();
  void _stop();
  // Topics
  void _advertiseTopic(const QString &topic, const QString &type);
  void _publish(const QString &topic, const QJsonObject &msg);
  void _unadvertiseTopic(const QString &topic);
  void _unadvertiseAllTopics();
  void _subscribeTopic(const QString &topic, Rosbridge::CallBack callback);
  void _unsubscribeTopic(const QString &topic);
  void _unsubscribeAllTopics();

  // Services.
  void _advertiseService(const QString &service, const QString &type,
                         Rosbridge::CallBackWReturn callback);
  void _callService(const QString &service, Rosbridge::CallBack callback,
                    const QJsonObject &args = QJsonObject());
  void _unadvertiseService(const QString &service);
  void _unadvertiseAllServices();

private:
104 105 106
  void _onImplStateChanged();

  std::atomic<STATE> _state;
107 108 109 110 111 112 113
  RosbridgeImpl *_impl;
  QThread *_t;
  QUrl _url;
  std::atomic_bool _running;
};

#endif // ROSBRIDGE_H