#ifndef ROSBRIDGEIMPL_H #define ROSBRIDGEIMPL_H #include "rosbridge.h" #include #include #include #include #include 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(); void _onError(QAbstractSocket::SocketError e); 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 _advertisedTopics; std::map _subscribedTopics; std::map _advertisedServices; std::map>> _pendingServiceCalls; std::atomic _state; }; #endif // ROSBRIDGEIMPL_H