From 490f0c962002bcaa08cda44ac0c5077fdc0fa7d3 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Mon, 11 Jun 2018 23:41:36 +0200 Subject: [PATCH] Store timer period in TimerRemaining. --- Firmware/Timer.h | 2 ++ Firmware/TimerRemaining.h | 35 +++++++++++++++++++++++++++++------ Tests/Timer_test.cpp | 4 ++++ 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/Firmware/Timer.h b/Firmware/Timer.h index 3d929fa1c..e2e84eff9 100644 --- a/Firmware/Timer.h +++ b/Firmware/Timer.h @@ -23,6 +23,8 @@ public: bool running(){return m_isRunning;} bool expired(T msPeriod); protected: + T started(){return m_started;} +private: bool m_isRunning; T m_started; }; diff --git a/Firmware/TimerRemaining.h b/Firmware/TimerRemaining.h index 1e684dea3..1b2eef925 100644 --- a/Firmware/TimerRemaining.h +++ b/Firmware/TimerRemaining.h @@ -13,6 +13,18 @@ class TimerRemaining : public LongTimer { public: + TimerRemaining() : m_period(){} + void start() = delete; + bool expired(unsigned long msPeriod) = delete; + /** + * @brief Start timer + * @param msPeriod Time to expire in milliseconds + */ + void start(unsigned long msPeriod) + { + m_period = msPeriod; + LongTimer::start(); + } /** * @brief Time remaining to expiration * @@ -20,20 +32,31 @@ public: * @return time remaining to expiration in milliseconds * @retval 0 Timer has expired, or was not even started. */ - unsigned long remaining(unsigned long msPeriod) + unsigned long remaining() { - if (!m_isRunning) return 0; - if (expired(msPeriod)) return 0; + if (!running()) return 0; + if (expired()) return 0; const unsigned long now = millis(); - if ((m_started <= m_started + msPeriod) || (now < m_started)) + if ((started() <= started() + m_period) || (now < started())) { - return (m_started + msPeriod - now); + return (started() + m_period - now); } else //(now >= m_started) { - return ULONG_MAX - now + (m_started + msPeriod); + return ULONG_MAX - now + (started() + m_period); } } + /** + * @brief Timer has expired. + * @retval true Timer has expired. + * @retval false Timer has not expired. + */ + bool expired() + { + return LongTimer::expired(m_period); + } +private: + unsigned long m_period; //!< Timer period in milliseconds. }; #endif // ifndef TIMERREMAINING_H diff --git a/Tests/Timer_test.cpp b/Tests/Timer_test.cpp index 9bcf1f998..6936ec899 100644 --- a/Tests/Timer_test.cpp +++ b/Tests/Timer_test.cpp @@ -6,6 +6,7 @@ #include "catch.hpp" #include "../Firmware/Timer.h" +#include "../Firmware/TimerRemaining.h" unsigned long millis() { @@ -31,4 +32,7 @@ TEST_CASE( "LongTimer tested.", "[timer]" ) timer.start(); REQUIRE( timer.expired(1) == false ); REQUIRE( timer.running() == true); + + TimerRemaining otherTimer; + otherTimer.start(100); }