rosbridgeimpl.h 2.19 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
#ifndef ROSBRIDGEIMPL_H
#define ROSBRIDGEIMPL_H

#include "rosbridge.h"

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

#include <deque>
#include <memory>
#include <set>

struct ServiceCall;

class RosbridgeImpl : public QObject {
  Q_OBJECT
public:
  enum class STATE { STOPPED, STOPPING, STARTING, CONNECTED, TIMEOUT };

  RosbridgeImpl(const QUrl &url, QObject *parent = nullptr);
  ~RosbridgeImpl();

  STATE state(); // thread safe
public slots:
  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,
                      const Rosbridge::CallBack &callback);

  void unsubscribeTopic(const QString &topic);

  void unsubscribeAllTopics();

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

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

  void unadvertiseService(const QString &service);

  void unadvertiseAllServices();

signals:
  void stateChanged();

private slots:
  void _onConnected();
  void _onDisconnected();
61
  void _onError(QAbstractSocket::SocketError e);
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
  void _doAction();
  void _onTextMessageReceived(const QString &message);

private:
  void _processTopic(const QJsonObject &o);
  void _processServiceResponse(const QJsonObject &o);
  void _processServiceCall(const QJsonObject &o);
  void _setState(STATE newState);
  int _getMessageId();
  void _serviceResponse(const QString &service, const QString &id, bool result,
                        const QJsonObject &values);
  void _clearAllPendingServiceCalls();

  QWebSocket _webSocket;
  QUrl _url;
  std::set<QString> _advertisedTopics;
  std::map<QString, Rosbridge::CallBack> _subscribedTopics;
  std::map<QString, Rosbridge::CallBackWReturn> _advertisedServices;
  std::map<QString, std::deque<std::unique_ptr<ServiceCall>>>
      _pendingServiceCalls;
  std::atomic<STATE> _state;
};

#endif // ROSBRIDGEIMPL_H