|
|
|
@ -31,10 +31,6 @@ Replay::Replay(QString route, QStringList allow, QStringList block, SubMaster *s |
|
|
|
|
route_ = std::make_unique<Route>(route, data_dir); |
|
|
|
|
events_ = std::make_unique<std::vector<Event *>>(); |
|
|
|
|
new_events_ = std::make_unique<std::vector<Event *>>(); |
|
|
|
|
|
|
|
|
|
qRegisterMetaType<FindFlag>("FindFlag"); |
|
|
|
|
connect(this, &Replay::seekTo, this, &Replay::doSeek); |
|
|
|
|
connect(this, &Replay::segmentChanged, this, &Replay::queueSegment); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Replay::~Replay() { |
|
|
|
@ -94,13 +90,9 @@ void Replay::updateEvents(const std::function<bool()> &lambda) { |
|
|
|
|
stream_cv_.notify_one(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Replay::doSeek(int seconds, bool relative) { |
|
|
|
|
if (segments_.empty()) return; |
|
|
|
|
|
|
|
|
|
void Replay::seekTo(int seconds, bool relative) { |
|
|
|
|
seconds = relative ? seconds + currentSeconds() : seconds; |
|
|
|
|
updateEvents([&]() { |
|
|
|
|
if (relative) { |
|
|
|
|
seconds += currentSeconds(); |
|
|
|
|
} |
|
|
|
|
seconds = std::max(0, seconds); |
|
|
|
|
int seg = seconds / 60; |
|
|
|
|
if (segments_.find(seg) == segments_.end()) { |
|
|
|
@ -108,7 +100,7 @@ void Replay::doSeek(int seconds, bool relative) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
rWarning("seeking to %d s, segment %d", seconds, seg); |
|
|
|
|
rInfo("seeking to %d s, segment %d", seconds, seg); |
|
|
|
|
current_segment_ = seg; |
|
|
|
|
cur_mono_time_ = route_start_ts_ + seconds * 1e9; |
|
|
|
|
return isSegmentMerged(seg); |
|
|
|
@ -117,23 +109,9 @@ void Replay::doSeek(int seconds, bool relative) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Replay::seekToFlag(FindFlag flag) { |
|
|
|
|
if (flag == FindFlag::nextEngagement) { |
|
|
|
|
rWarning("seeking to the next engagement..."); |
|
|
|
|
} else if (flag == FindFlag::nextDisEngagement) { |
|
|
|
|
rWarning("seeking to the disengagement..."); |
|
|
|
|
if (auto next = find(flag)) { |
|
|
|
|
seekTo(*next - 2, false); // seek to 2 seconds before next
|
|
|
|
|
} |
|
|
|
|
updateEvents([&]() { |
|
|
|
|
if (auto next = find(flag)) { |
|
|
|
|
int tm = *next - 2; // seek to 2 seconds before next
|
|
|
|
|
cur_mono_time_ = (route_start_ts_ + tm * 1e9); |
|
|
|
|
current_segment_ = currentSeconds() / 60; |
|
|
|
|
} else { |
|
|
|
|
rWarning("seeking failed"); |
|
|
|
|
} |
|
|
|
|
return isSegmentMerged(current_segment_); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
queueSegment(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Replay::buildTimeline() { |
|
|
|
@ -199,7 +177,7 @@ void Replay::pause(bool pause) { |
|
|
|
|
|
|
|
|
|
void Replay::setCurrentSegment(int n) { |
|
|
|
|
if (current_segment_.exchange(n) != n) { |
|
|
|
|
emit segmentChanged(); |
|
|
|
|
QMetaObject::invokeMethod(this, &Replay::queueSegment, Qt::QueuedConnection); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -419,7 +397,7 @@ void Replay::stream() { |
|
|
|
|
int last_segment = segments_.rbegin()->first; |
|
|
|
|
if (current_segment_ >= last_segment && isSegmentMerged(last_segment)) { |
|
|
|
|
rInfo("reaches the end of route, restart from beginning"); |
|
|
|
|
emit seekTo(0, false); |
|
|
|
|
QMetaObject::invokeMethod(this, std::bind(&Replay::seekTo, this, 0, false), Qt::QueuedConnection); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|