diff --git a/Firmware/TimerRemaining.h b/Firmware/TimerRemaining.h index 1b2eef92..6d5136de 100644 --- a/Firmware/TimerRemaining.h +++ b/Firmware/TimerRemaining.h @@ -37,14 +37,7 @@ public: if (!running()) return 0; if (expired()) return 0; const unsigned long now = millis(); - if ((started() <= started() + m_period) || (now < started())) - { - return (started() + m_period - now); - } - else //(now >= m_started) - { - return ULONG_MAX - now + (started() + m_period); - } + return (started() + m_period - now); } /** * @brief Timer has expired. diff --git a/Tests/Timer_test.cpp b/Tests/Timer_test.cpp index 6936ec89..91c37e32 100644 --- a/Tests/Timer_test.cpp +++ b/Tests/Timer_test.cpp @@ -8,31 +8,164 @@ #include "../Firmware/Timer.h" #include "../Firmware/TimerRemaining.h" +static unsigned long now = 0; + unsigned long millis() { - return 1; + return now; } -TEST_CASE( "LongTimer tested.", "[timer]" ) +static void basicTimer() { LongTimer timer; - REQUIRE( timer.running() == false); + CHECK( timer.running() == false); timer.start(); - REQUIRE( timer.running() == true); + CHECK( timer.running() == true); timer.stop(); - REQUIRE( timer.running() == false); + CHECK( timer.running() == false); timer.start(); - REQUIRE( timer.expired(0) == true ); - REQUIRE( timer.expired(0) == false ); - REQUIRE( timer.running() == false); + CHECK( timer.expired(0) == true); + CHECK( timer.expired(0) == false); + CHECK( timer.running() == false); timer.start(); - REQUIRE( timer.expired(1) == false ); - REQUIRE( timer.running() == true); + CHECK( timer.expired(1) == false); + CHECK( timer.running() == true); + ++now; + CHECK( timer.expired(1) == true); + CHECK( timer.running() == false); + --now; + + timer.start(); + CHECK( timer.expired(ULONG_MAX - 1) == false); + now+= ULONG_MAX - 2; + CHECK( timer.expired(ULONG_MAX - 1) == false); + now++; + CHECK( timer.expired(ULONG_MAX - 1) == true); + CHECK( timer.running() == false); + now-= ULONG_MAX - 1; + + timer.start(); + CHECK( timer.expired(ULONG_MAX) == false); + now+= ULONG_MAX - 1; + CHECK( timer.expired(ULONG_MAX) == false); + now++; + CHECK( timer.expired(ULONG_MAX) == true); + CHECK( timer.running() == false); + now-= ULONG_MAX; + + timer.start(); + CHECK( timer.running() == true); + CHECK( timer.expired(12*3600000ul + 38*60000ul + 15000) == false); + now+= 12*3600000ul + 38*60000ul + 14999; + CHECK( timer.expired(12*3600000ul + 38*60000ul + 15000) == false); + ++now; + CHECK( timer.expired(12*3600000ul + 38*60000ul + 15000) == true); + CHECK( timer.running() == false); + now-= 12*3600000ul + 38*60000ul + 15000; + +} + +TEST_CASE( "LongTimer test.", "[timer]" ) +{ + now = 0; + basicTimer(); + now = 1; + basicTimer(); + now = ULONG_MAX; + basicTimer(); + now = ULONG_MAX - 1; + basicTimer(); + now = 12*3600000ul + 38*60000ul + 15000; + basicTimer(); +} + +static void basicRemaining() +{ + TimerRemaining timer; + CHECK( timer.running() == false); + CHECK( timer.remaining() == 0); + + timer.start(100); + CHECK( timer.running() == true); + CHECK( timer.remaining() == 100); + now += 99; + CHECK( timer.running() == true); + CHECK( timer.remaining() == 1); + + ++now; + CHECK( timer.running() == true); + CHECK( timer.remaining() == 0); + CHECK( timer.running() == false); + now -=100; + + timer.start(1); + timer.stop(); + CHECK( timer.remaining() == 0); + CHECK( timer.running() == false); + + timer.start(0); + CHECK( timer.remaining() == 0); + CHECK( timer.running() == false); + + timer.start(1); + CHECK( timer.remaining() == 1); + CHECK( timer.running() == true); + + ++now; + CHECK( timer.running() == true); + CHECK( timer.remaining() == 0); + CHECK( timer.running() == false); + --now; + + timer.start(ULONG_MAX - 1); + CHECK( timer.running() == true); + CHECK( timer.remaining() == ULONG_MAX - 1); + now+= ULONG_MAX - 2; + CHECK( timer.running() == true); + CHECK( timer.remaining() == 1); + CHECK( timer.running() == true); + ++now; + CHECK( timer.remaining() == 0); + CHECK( timer.running() == false); + now-= ULONG_MAX - 1; + + timer.start(ULONG_MAX); + CHECK( timer.running() == true); + CHECK( timer.remaining() == ULONG_MAX); + now+= ULONG_MAX - 1; + CHECK( timer.remaining() == 1); + CHECK( timer.running() == true); + ++now; + CHECK( timer.remaining() == 0); + CHECK( timer.running() == false); + + timer.start(12*3600000ul + 38*60000ul + 15000); + CHECK( timer.running() == true); + CHECK( timer.remaining() == 12*3600000ul + 38*60000ul + 15000); + now+= 12*3600000ul + 38*60000ul + 14999; + CHECK( timer.remaining() == 1); + ++now; + CHECK( timer.remaining() == 0); + CHECK( timer.running() == false); + now-= 12*3600000ul + 38*60000ul + 15000; +} + +TEST_CASE( "TimerRemaining test.", "[timer]" ) +{ + now = 0; + basicRemaining(); + now = 1; + basicRemaining(); + now = ULONG_MAX; + basicRemaining(); + now = ULONG_MAX - 1; + basicRemaining(); + + now = 12*3600000ul + 38*60000ul + 15000; + basicRemaining(); - TimerRemaining otherTimer; - otherTimer.start(100); }