Refactor C++ LogReader (#21152)
* refactor logreader * fix include order * apply review * remove typedefs * remove include timing.h * no parent Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>pull/21250/head
parent
4dfdf0e51d
commit
8c202d1bb4
4 changed files with 183 additions and 169 deletions
@ -1,70 +1,87 @@ |
|||||||
#pragma once |
#pragma once |
||||||
|
|
||||||
#include <thread> |
#include <unordered_map> |
||||||
|
#include <vector> |
||||||
|
|
||||||
#include <QElapsedTimer> |
#include <QElapsedTimer> |
||||||
#include <QMultiMap> |
#include <QMultiMap> |
||||||
#include <QNetworkAccessManager> |
#include <QNetworkAccessManager> |
||||||
#include <QReadWriteLock> |
|
||||||
#include <QString> |
#include <QString> |
||||||
#include <QVector> |
#include <QThread> |
||||||
#include <QWidget> |
|
||||||
|
|
||||||
#include <bzlib.h> |
|
||||||
#include <capnp/serialize.h> |
#include <capnp/serialize.h> |
||||||
#include <kj/io.h> |
|
||||||
#include "cereal/gen/cpp/log.capnp.h" |
|
||||||
|
|
||||||
#include "tools/clib/channel.h" |
#include "cereal/gen/cpp/log.capnp.h" |
||||||
|
|
||||||
class FileReader : public QObject { |
class FileReader : public QObject { |
||||||
Q_OBJECT |
Q_OBJECT |
||||||
|
|
||||||
public: |
public: |
||||||
FileReader(const QString& file_); |
FileReader(const QString &fn, QObject *parent = nullptr); |
||||||
void startRequest(const QUrl &url); |
void read(); |
||||||
~FileReader(); |
void abort(); |
||||||
virtual void readyRead(); |
|
||||||
void httpFinished(); |
|
||||||
virtual void done() {}; |
|
||||||
|
|
||||||
public slots: |
signals: |
||||||
void process(); |
void finished(const QByteArray &dat); |
||||||
|
void failed(const QString &err); |
||||||
protected: |
|
||||||
QNetworkReply *reply; |
|
||||||
|
|
||||||
private: |
private: |
||||||
QNetworkAccessManager *qnam; |
void startHttpRequest(); |
||||||
QElapsedTimer timer; |
QNetworkReply *reply_ = nullptr; |
||||||
QString file; |
QUrl url_; |
||||||
}; |
}; |
||||||
|
|
||||||
typedef QMultiMap<uint64_t, cereal::Event::Reader> Events; |
enum CameraType { |
||||||
|
RoadCam = 0, |
||||||
|
DriverCam, |
||||||
|
WideRoadCam |
||||||
|
}; |
||||||
|
const CameraType ALL_CAMERAS[] = {RoadCam, DriverCam, WideRoadCam}; |
||||||
|
const int MAX_CAMERAS = std::size(ALL_CAMERAS); |
||||||
|
|
||||||
class LogReader : public FileReader { |
struct EncodeIdx { |
||||||
Q_OBJECT |
int segmentNum; |
||||||
|
uint32_t frameEncodeId; |
||||||
|
}; |
||||||
|
|
||||||
|
class Event { |
||||||
public: |
public: |
||||||
LogReader(const QString& file, Events *, QReadWriteLock* events_lock_, QMap<int, QPair<int, int> > *eidx_); |
Event(const kj::ArrayPtr<const capnp::word> &amsg) : reader(amsg) { |
||||||
|
words = kj::ArrayPtr<const capnp::word>(amsg.begin(), reader.getEnd()); |
||||||
|
event = reader.getRoot<cereal::Event>(); |
||||||
|
which = event.which(); |
||||||
|
mono_time = event.getLogMonoTime(); |
||||||
|
} |
||||||
|
inline kj::ArrayPtr<const capnp::byte> bytes() const { return words.asBytes(); } |
||||||
|
|
||||||
|
uint64_t mono_time; |
||||||
|
cereal::Event::Which which; |
||||||
|
cereal::Event::Reader event; |
||||||
|
capnp::FlatArrayMessageReader reader; |
||||||
|
kj::ArrayPtr<const capnp::word> words; |
||||||
|
}; |
||||||
|
|
||||||
|
class LogReader : public QObject { |
||||||
|
Q_OBJECT |
||||||
|
|
||||||
|
public: |
||||||
|
LogReader(const QString &file, QObject *parent = nullptr); |
||||||
~LogReader(); |
~LogReader(); |
||||||
|
inline bool valid() const { return valid_; } |
||||||
|
|
||||||
void readyRead(); |
QMultiMap<uint64_t, Event*> events; |
||||||
void done() { is_done = true; }; |
std::unordered_map<uint32_t, EncodeIdx> eidx[MAX_CAMERAS] = {}; |
||||||
bool is_done = false; |
|
||||||
|
|
||||||
private: |
signals: |
||||||
bz_stream bStream; |
void finished(bool success); |
||||||
|
|
||||||
// backing store
|
private: |
||||||
QByteArray raw; |
void parseEvents(const QByteArray &dat); |
||||||
|
|
||||||
std::thread *parser; |
std::atomic<bool> exit_ = false; |
||||||
int event_offset; |
std::atomic<bool> valid_ = false; |
||||||
channel<int> cdled; |
std::vector<uint8_t> raw_; |
||||||
|
|
||||||
// global
|
FileReader *file_reader_ = nullptr; |
||||||
void mergeEvents(int dled); |
QThread thread_; |
||||||
Events *events; |
|
||||||
QReadWriteLock* events_lock; |
|
||||||
QMap<int, QPair<int, int> > *eidx; |
|
||||||
}; |
}; |
||||||
|
Loading…
Reference in new issue