#pragma once #include #include Q_FORWARD_DECLARE_OBJC_CLASS(QWebSocket); Q_FORWARD_DECLARE_OBJC_CLASS(QTimer); using json = nlohmann::json; class Web_socket_wrapper : public QObject { Q_OBJECT public: enum class Command { get_UI_element, get_UI_elements, switch_simulator, get_active_simulator_name, get_simulators, end, begin = 0 }; enum class Event { clicked, value_changed, text_changed, selected, can_send, clear, ui_changed, end, begin = 0 }; public: explicit Web_socket_wrapper(const QUrl &url, QObject *parent = nullptr); ~Web_socket_wrapper(); void send_command(Command c, size_t id = 0); void send_command(Command c, QString val); void send_event(Event e, size_t id); void send_event(Event e, size_t id, size_t val); void send_event(Event e, size_t id, double val); void send_event(Event e, size_t id, QString val); void send_event(Event e, size_t id, uint32_t sid, uint8_t dlc, std::array payload); void close(); void inhibit_events(bool inhibit); Q_SIGNALS: void on_connected(); void on_closed(); void on_command_cb(json &data); void on_event_cb(json &data); private Q_SLOTS: void m_on_connected(); void m_on_received(QString message); void m_on_pong(quint64 elapsedTime); void m_on_pong_timeout(); private: bool m_connected = false; bool m_inhibit_events = false; QWebSocket *m_web_socket; QTimer *m_ping_timer; QTimer *m_pong_timer; };