Skip to content

Commit

Permalink
replay/cabana : support segment range (commaai#32026)
Browse files Browse the repository at this point in the history
* support segment range

* include <QRegularExpression>
  • Loading branch information
deanlee authored Mar 27, 2024
1 parent 89f1483 commit 0a2a3df
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 18 deletions.
2 changes: 1 addition & 1 deletion tools/replay/replay.cc
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ bool Replay::load() {
}

void Replay::start(int seconds) {
seekTo(route_->identifier().segment_id * 60 + seconds, false);
seekTo(route_->identifier().begin_segment * 60 + seconds, false);
}

void Replay::updateEvents(const std::function<bool()> &lambda) {
Expand Down
55 changes: 39 additions & 16 deletions tools/replay/route.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#include <QEventLoop>
#include <QJsonArray>
#include <QJsonDocument>
#include <QRegExp>
#include <QRegularExpression>
#include <QtConcurrent>
#include <array>

Expand All @@ -18,11 +18,24 @@ Route::Route(const QString &route, const QString &data_dir) : data_dir_(data_dir
}

RouteIdentifier Route::parseRoute(const QString &str) {
QRegExp rx(R"(^(?:([a-z0-9]{16})([|_/]))?(.{20})(?:(--|/)(\d*))?$)");
if (rx.indexIn(str) == -1) return {};

const QStringList list = rx.capturedTexts();
return {.dongle_id = list[1], .timestamp = list[3], .segment_id = list[5].toInt(), .str = list[1] + "|" + list[3]};
RouteIdentifier identifier = {};
QRegularExpression rx(R"(^((?<dongle_id>[a-z0-9]{16})[|_/])?(?<timestamp>.{20})((?<separator>--|/)(?<range>((-?\d+(:(-?\d+)?)?)|(:-?\d+))))?$)");
if (auto match = rx.match(str); match.hasMatch()) {
identifier.dongle_id = match.captured("dongle_id");
identifier.timestamp = match.captured("timestamp");
identifier.str = identifier.dongle_id + "|" + identifier.timestamp;
auto range_str = match.captured("range");
if (auto separator = match.captured("separator"); separator == "/" && !range_str.isEmpty()) {
auto range = range_str.split(":");
identifier.begin_segment = identifier.end_segment = range[0].toInt();
if (range.size() == 2) {
identifier.end_segment = range[1].isEmpty() ? -1 : range[1].toInt();
}
} else if (separator == "--") {
identifier.begin_segment = range_str.toInt();
}
}
return identifier;
}

bool Route::load() {
Expand All @@ -31,7 +44,19 @@ bool Route::load() {
return false;
}
date_time_ = QDateTime::fromString(route_.timestamp, "yyyy-MM-dd--HH-mm-ss");
return data_dir_.isEmpty() ? loadFromServer() : loadFromLocal();
bool ret = data_dir_.isEmpty() ? loadFromServer() : loadFromLocal();
if (ret) {
if (route_.begin_segment == -1) route_.begin_segment = segments_.rbegin()->first;
if (route_.end_segment == -1) route_.end_segment = segments_.rbegin()->first;
for (auto it = segments_.begin(); it != segments_.end(); /**/) {
if (it->first < route_.begin_segment || it->first > route_.end_segment) {
it = segments_.erase(it);
} else {
++it;
}
}
}
return !segments_.empty();
}

bool Route::loadFromServer() {
Expand Down Expand Up @@ -62,15 +87,13 @@ bool Route::loadFromJson(const QString &json) {
}

bool Route::loadFromLocal() {
QDir log_dir(data_dir_);
for (const auto &folder : log_dir.entryList(QDir::Dirs | QDir::NoDot | QDir::NoDotDot, QDir::NoSort)) {
int pos = folder.lastIndexOf("--");
if (pos != -1 && folder.left(pos) == route_.timestamp) {
const int seg_num = folder.mid(pos + 2).toInt();
QDir segment_dir(log_dir.filePath(folder));
for (const auto &f : segment_dir.entryList(QDir::Files)) {
addFileToSegment(seg_num, segment_dir.absoluteFilePath(f));
}
QDirIterator it(data_dir_, {QString("%1--*").arg(route_.timestamp)}, QDir::Dirs | QDir::NoDotAndDotDot);
while (it.hasNext()) {
QString segment = it.next();
const int seg_num = segment.mid(segment.lastIndexOf("--") + 2).toInt();
QDir segment_dir(segment);
for (const auto &f : segment_dir.entryList(QDir::Files)) {
addFileToSegment(seg_num, segment_dir.absoluteFilePath(f));
}
}
return !segments_.empty();
Expand Down
3 changes: 2 additions & 1 deletion tools/replay/route.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
struct RouteIdentifier {
QString dongle_id;
QString timestamp;
int segment_id;
int begin_segment = 0;
int end_segment = -1;
QString str;
};

Expand Down

0 comments on commit 0a2a3df

Please sign in to comment.