You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.5 KiB
62 lines
1.5 KiB
#pragma once
|
|
|
|
#include <deque>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include <QBasicTimer>
|
|
|
|
#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<Event *> receivedEvents;
|
|
std::deque<Msg> 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> logger;
|
|
};
|
|
|