From ec67d2b8f5da60fca04eab7a65404e2ca922f103 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 20 Sep 2021 05:47:17 +0800 Subject: [PATCH] replay: pause/resume using spacebar (#22278) * pause/resume using spacebar * Update selfdrive/ui/replay/replay.cc Co-authored-by: Adeeb Shihadeh --- selfdrive/ui/replay/main.cc | 2 ++ selfdrive/ui/replay/replay.cc | 10 ++++++++++ selfdrive/ui/replay/replay.h | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/selfdrive/ui/replay/main.cc b/selfdrive/ui/replay/main.cc index 94323b29dc..3450056827 100644 --- a/selfdrive/ui/replay/main.cc +++ b/selfdrive/ui/replay/main.cc @@ -55,6 +55,8 @@ void keyboardThread(Replay *replay) { replay->relativeSeek(-10); } else if (c == 'G') { replay->relativeSeek(0); + } else if (c == ' ') { + replay->pause(!replay->isPaused()); } } } diff --git a/selfdrive/ui/replay/replay.cc b/selfdrive/ui/replay/replay.cc index 931a711812..50dcecf114 100644 --- a/selfdrive/ui/replay/replay.cc +++ b/selfdrive/ui/replay/replay.cc @@ -66,6 +66,15 @@ void Replay::relativeSeek(int seconds) { seekTo(current_ts + seconds); } +void Replay::pause(bool pause) { + updating_events = true; + std::unique_lock lk(lock); + qDebug() << (pause ? "paused..." : "resuming"); + paused_ = pause; + updating_events = false; + stream_cv_.notify_one(); +} + void Replay::setCurrentSegment(int n) { if (current_segment.exchange(n) != n) { emit segmentChanged(n); @@ -160,6 +169,7 @@ void Replay::stream() { while (true) { std::unique_lock lk(lock); + stream_cv_.wait(lk, [=]() { return paused_ == false; }); uint64_t evt_start_ts = seek_ts != -1 ? route_start_ts + (seek_ts * 1e9) : cur_mono_time; Event cur_event(cur_which, evt_start_ts); diff --git a/selfdrive/ui/replay/replay.h b/selfdrive/ui/replay/replay.h index be54152319..f9aa549f49 100644 --- a/selfdrive/ui/replay/replay.h +++ b/selfdrive/ui/replay/replay.h @@ -20,6 +20,8 @@ public: void start(int seconds = 0); void relativeSeek(int seconds); void seekTo(int seconds); + void pause(bool pause); + bool isPaused() const { return paused_; } signals: void segmentChanged(int); @@ -42,6 +44,8 @@ protected: // logs std::mutex lock; + bool paused_ = false; + std::condition_variable stream_cv_; std::atomic updating_events = false; std::vector *events = nullptr; std::unordered_map *eidx = nullptr;