diff options
Diffstat (limited to 'softoff/timer.cpp')
-rw-r--r-- | softoff/timer.cpp | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/softoff/timer.cpp b/softoff/timer.cpp index 9e722f1..c626536 100644 --- a/softoff/timer.cpp +++ b/softoff/timer.cpp @@ -1,3 +1,4 @@ +#include <chrono> #include <phosphor-logging/log.hpp> #include "timer.hpp" namespace phosphor @@ -19,7 +20,7 @@ void Timer::initialize() // Add infinite expiration time auto r = sd_event_add_time(timeEvent, &eventSource, CLOCK_MONOTONIC, // Time base - UINT64_MAX, // Expire time - way long enough time + UINT64_MAX, // Expire time - way long time 0, // Use default event accuracy timeoutHandler, // Callback handler on timeout this); // User data @@ -32,13 +33,13 @@ void Timer::initialize() } // Disable the timer for now - r = sd_event_source_set_enabled(eventSource, SD_EVENT_OFF); + r = setTimer(SD_EVENT_OFF); if (r < 0) { log<level::ERR>("Failure to disable timer", entry("ERROR=%s", strerror(-r))); - throw std::runtime_error("Setting initial timer value failed"); + throw std::runtime_error("Disabling the timer failed"); } return; } @@ -54,5 +55,48 @@ int Timer::timeoutHandler(sd_event_source* eventSource, return 0; } +// Gets the time from steady_clock +std::chrono::microseconds Timer::getTime() +{ + using namespace std::chrono; + auto usec = steady_clock::now().time_since_epoch(); + return duration_cast<microseconds>(usec); +} + +// Enables or disables the timer +int Timer::setTimer(int action) +{ + return sd_event_source_set_enabled(eventSource, action); +} + +// Sets the time and arms the timer +int Timer::startTimer(std::chrono::microseconds timeValue) +{ + // Disable the timer + setTimer(SD_EVENT_OFF); + + // Get the current MONOTONIC time and add the delta + auto expireTime = getTime() + timeValue; + + // Set the time + auto r = sd_event_source_set_time(eventSource, expireTime.count()); + if (r < 0) + { + log<level::ERR>("Failure to set timer", + entry("ERROR=%s", strerror(-r))); + return r; + } + + // A ONESHOT timer means that when the timer goes off, + // its moves to disabled state. + r = setTimer(SD_EVENT_ONESHOT); + if (r < 0) + { + log<level::ERR>("Failure to start timer", + entry("ERROR=%s", strerror(-r))); + } + return r; +} + } // namespace ipmi } // namespace phosphor |