#pragma once #include #include #include #include #include #include #include #include #include "cereal/gen/cpp/log.capnp.h" class FileReader : public QObject { Q_OBJECT public: FileReader(const QString &fn, QObject *parent = nullptr); void read(); void abort(); signals: void finished(const QByteArray &dat); void failed(const QString &err); private: void startHttpRequest(); QNetworkReply *reply_ = nullptr; QUrl url_; }; enum CameraType { RoadCam = 0, DriverCam, WideRoadCam }; const CameraType ALL_CAMERAS[] = {RoadCam, DriverCam, WideRoadCam}; const int MAX_CAMERAS = std::size(ALL_CAMERAS); struct EncodeIdx { int segmentNum; uint32_t frameEncodeId; }; class Event { public: Event(const kj::ArrayPtr &amsg) : reader(amsg) { words = kj::ArrayPtr(amsg.begin(), reader.getEnd()); event = reader.getRoot(); which = event.which(); mono_time = event.getLogMonoTime(); } inline kj::ArrayPtr bytes() const { return words.asBytes(); } uint64_t mono_time; cereal::Event::Which which; cereal::Event::Reader event; capnp::FlatArrayMessageReader reader; kj::ArrayPtr words; }; class LogReader : public QObject { Q_OBJECT public: LogReader(const QString &file, QObject *parent = nullptr); ~LogReader(); inline bool valid() const { return valid_; } QMultiMap events; std::unordered_map eidx[MAX_CAMERAS] = {}; signals: void finished(bool success); private: void parseEvents(const QByteArray &dat); std::atomic exit_ = false; std::atomic valid_ = false; std::vector raw_; FileReader *file_reader_ = nullptr; QThread thread_; };