#pragma once #include #include #include #include #include "tools/cabana/streams/abstractstream.h" class LiveStream : public AbstractStream { Q_OBJECT public: LiveStream(QObject *parent); virtual ~LiveStream(); void start() override; void stop(); inline QDateTime beginDateTime() const { return begin_date_time; } inline uint64_t beginMonoTime() const override { return begin_event_ts; } double maxSeconds() const override { return std::max(1.0, (lastest_event_ts - begin_event_ts) / 1e9); } void setSpeed(float speed) override { speed_ = speed; } double getSpeed() override { return speed_; } bool isPaused() const override { return paused_; } void pause(bool pause) override; void seekTo(double sec) override; protected: virtual void streamThread() = 0; void handleEvent(kj::ArrayPtr event); private: void startUpdateTimer(); void timerEvent(QTimerEvent *event) override; void updateEvents(); std::mutex lock; QThread *stream_thread; std::vector received_events_; int timer_id; QBasicTimer update_timer; QDateTime begin_date_time; uint64_t begin_event_ts = 0; uint64_t lastest_event_ts = 0; uint64_t current_event_ts = 0; uint64_t first_event_ts = 0; uint64_t first_update_ts = 0; bool post_last_event = true; double speed_ = 1; bool paused_ = false; struct Logger; std::unique_ptr logger; };