diff options
-rw-r--r-- | include/libcamera/timer.h | 1 | ||||
-rw-r--r-- | src/libcamera/timer.cpp | 22 |
2 files changed, 20 insertions, 3 deletions
diff --git a/include/libcamera/timer.h b/include/libcamera/timer.h index 3540efb4..34e7b8ac 100644 --- a/include/libcamera/timer.h +++ b/include/libcamera/timer.h @@ -25,6 +25,7 @@ public: void start(unsigned int msec) { start(std::chrono::milliseconds(msec)); } void start(std::chrono::milliseconds duration); + void start(std::chrono::steady_clock::time_point deadline); void stop(); bool isRunning() const; diff --git a/src/libcamera/timer.cpp b/src/libcamera/timer.cpp index 8749d66c..ddb20954 100644 --- a/src/libcamera/timer.cpp +++ b/src/libcamera/timer.cpp @@ -37,6 +37,11 @@ LOG_DEFINE_CATEGORY(Timer) * stop(), and once it times out or is stopped, can be started again with * start(). * + * The timer deadline is specified as either a duration in milliseconds or an + * absolute time point. If the deadline is set to the current time or to the + * past, the timer will time out immediately when execution returns to the + * event loop of the timer's thread. + * * Timers run in the thread they belong to, and thus emit the \a ref timeout * signal from that thread. To avoid race conditions they must not be started * or stopped from a different thread, attempts to do so will be rejected and @@ -75,16 +80,27 @@ Timer::~Timer() */ void Timer::start(std::chrono::milliseconds duration) { + start(utils::clock::now() + duration); +} + +/** + * \brief Start or restart the timer with a \a deadline + * \param[in] deadline The timer deadline + * + * This method shall be called from the thread the timer is associated with. If + * the timer is already running it will be stopped and restarted. + */ +void Timer::start(std::chrono::steady_clock::time_point deadline) +{ if (Thread::current() != thread()) { LOG(Timer, Error) << "Timer can't be started from another thread"; return; } - deadline_ = utils::clock::now() + duration; + deadline_ = deadline; LOG(Timer, Debug) - << "Starting timer " << this << " with duration " - << duration.count() << ": deadline " + << "Starting timer " << this << ": deadline " << utils::time_point_to_string(deadline_); if (isRunning()) |