#pragma once #include #include #include #include #include #include "tools/cabana/dbcmanager.h" #include "tools/cabana/settings.h" #include "tools/cabana/util.h" #include "tools/replay/replay.h" struct CanData { double ts = 0.; uint32_t count = 0; uint32_t freq = 0; QByteArray dat; QVector colors; QVector last_change_t; QVector> bit_change_counts; }; struct CanEvent { uint64_t mono_time; uint8_t size; uint8_t dat[64]; inline bool operator<(const CanEvent &r) const { return mono_time < r.mono_time; } inline bool operator>(const CanEvent &r) const { return mono_time > r.mono_time; } }; class AbstractStream : public QObject { Q_OBJECT public: AbstractStream(QObject *parent, bool is_live_streaming); virtual ~AbstractStream() {}; inline bool liveStreaming() const { return is_live_streaming; } inline double lastEventSecond() const { return last_event_ts / 1e9 - routeStartTime(); } virtual void seekTo(double ts) {} virtual QString routeName() const = 0; virtual QString carFingerprint() const { return ""; } virtual double totalSeconds() const { return 0; } virtual double routeStartTime() const { return 0; } virtual double currentSec() const = 0; virtual QDateTime currentDateTime() const { return {}; } virtual const CanData &lastMessage(const MessageId &id); virtual VisionStreamType visionStreamType() const { return VISION_STREAM_ROAD; } virtual const Route *route() const { return nullptr; } virtual void setSpeed(float speed) {} virtual bool isPaused() const { return false; } virtual void pause(bool pause) {} virtual const std::vector *rawEvents() const { return nullptr; } const std::unordered_map> &events() const { return events_; } virtual const std::vector> getTimeline() { return {}; } void mergeEvents(std::vector::const_iterator first, std::vector::const_iterator last, bool append); signals: void paused(); void resume(); void seekedTo(double sec); void streamStarted(); void eventsMerged(); void updated(); void msgsReceived(const QHash *); void received(QHash *); void sourcesUpdated(const QSet &s); public: QHash last_msgs; QSet sources; protected: virtual void process(QHash *); bool updateEvent(const Event *event); void updateLastMsgsTo(double sec); void parseEvents(std::unordered_map> &msgs, std::vector::const_iterator first, std::vector::const_iterator last); bool is_live_streaming = false; std::atomic processing = false; QHash counters; std::unique_ptr> new_msgs; QHash change_trackers; std::unordered_map> events_; uint64_t last_event_ts = 0; }; // A global pointer referring to the unique AbstractStream object extern AbstractStream *can;