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>
old-commit-hash: 8c202d1bb4
commatwo_master
parent
e07f1a1ee4
commit
d852c98d52
4 changed files with 183 additions and 169 deletions
@ -1,70 +1,87 @@ |
||||
#pragma once |
||||
|
||||
#include <thread> |
||||
#include <unordered_map> |
||||
#include <vector> |
||||
|
||||
#include <QElapsedTimer> |
||||
#include <QMultiMap> |
||||
#include <QNetworkAccessManager> |
||||
#include <QReadWriteLock> |
||||
#include <QString> |
||||
#include <QVector> |
||||
#include <QWidget> |
||||
#include <QThread> |
||||
|
||||
#include <bzlib.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 { |
||||
Q_OBJECT |
||||
|
||||
public: |
||||
FileReader(const QString& file_); |
||||
void startRequest(const QUrl &url); |
||||
~FileReader(); |
||||
virtual void readyRead(); |
||||
void httpFinished(); |
||||
virtual void done() {}; |
||||
|
||||
public slots: |
||||
void process(); |
||||
FileReader(const QString &fn, QObject *parent = nullptr); |
||||
void read(); |
||||
void abort(); |
||||
|
||||
protected: |
||||
QNetworkReply *reply; |
||||
signals: |
||||
void finished(const QByteArray &dat); |
||||
void failed(const QString &err); |
||||
|
||||
private: |
||||
QNetworkAccessManager *qnam; |
||||
QElapsedTimer timer; |
||||
QString file; |
||||
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; |
||||
}; |
||||
|
||||
typedef QMultiMap<uint64_t, cereal::Event::Reader> Events; |
||||
class Event { |
||||
public: |
||||
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 FileReader { |
||||
class LogReader : public QObject { |
||||
Q_OBJECT |
||||
|
||||
public: |
||||
LogReader(const QString& file, Events *, QReadWriteLock* events_lock_, QMap<int, QPair<int, int> > *eidx_); |
||||
LogReader(const QString &file, QObject *parent = nullptr); |
||||
~LogReader(); |
||||
inline bool valid() const { return valid_; } |
||||
|
||||
void readyRead(); |
||||
void done() { is_done = true; }; |
||||
bool is_done = false; |
||||
QMultiMap<uint64_t, Event*> events; |
||||
std::unordered_map<uint32_t, EncodeIdx> eidx[MAX_CAMERAS] = {}; |
||||
|
||||
private: |
||||
bz_stream bStream; |
||||
signals: |
||||
void finished(bool success); |
||||
|
||||
// backing store
|
||||
QByteArray raw; |
||||
private: |
||||
void parseEvents(const QByteArray &dat); |
||||
|
||||
std::thread *parser; |
||||
int event_offset; |
||||
channel<int> cdled; |
||||
std::atomic<bool> exit_ = false; |
||||
std::atomic<bool> valid_ = false; |
||||
std::vector<uint8_t> raw_; |
||||
|
||||
// global
|
||||
void mergeEvents(int dled); |
||||
Events *events; |
||||
QReadWriteLock* events_lock; |
||||
QMap<int, QPair<int, int> > *eidx; |
||||
FileReader *file_reader_ = nullptr; |
||||
QThread thread_; |
||||
}; |
||||
|
Loading…
Reference in new issue