#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; inline double routeStartTime() const override { return begin_event_ts / 1e9; } inline double currentSec() const override { return (current_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(const char *data, const size_t size); private: void startUpdateTimer(); void timerEvent(QTimerEvent *event) override; void updateEvents(); struct Msg { Msg(const char *data, const size_t size) { event = ::new Event(aligned_buf.align(data, size)); } ~Msg() { ::delete event; } Event *event; AlignedBuffer aligned_buf; }; std::mutex lock; QThread *stream_thread; std::vector receivedEvents; std::deque receivedMessages; int timer_id; QBasicTimer update_timer; uint64_t begin_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; };