#pragma once #include #include "tools/cabana/streams/abstractstream.h" class LiveStream : public AbstractStream { Q_OBJECT public: LiveStream(QObject *parent, QString address = {}); virtual ~LiveStream(); inline QString routeName() const override { return QString("Live Streaming From %1").arg(zmq_address.isEmpty() ? "127.0.0.1" : zmq_address); } inline double routeStartTime() const override { return start_ts / (double)1e9; } inline double currentSec() const override { return (current_ts - start_ts) / (double)1e9; } void setSpeed(float speed) override { speed_ = std::min(1.0, speed); } bool isPaused() const override { return pause_; } void pause(bool pause) override; const std::vector *events() const override; protected: virtual void handleEvent(Event *evt); virtual void streamThread(); virtual void removeExpiredEvents(); mutable std::mutex lock; mutable std::vector events_vector; std::deque can_events; std::deque messages; std::atomic start_ts = 0; std::atomic current_ts = 0; std::atomic speed_ = 1; std::atomic pause_ = false; uint64_t last_update_event_ts = 0; uint64_t last_update_ts = 0; const QString zmq_address; QThread *stream_thread; QTimer *timer; };