blob: 973b012f6a4a3084dec0de2c9a0291522177e3da [file] [log] [blame]
#include <chrono>
#include <system_error>
#include <string.h>
#include "timer.hpp"
namespace phosphor
{
namespace hwmon
{
static std::chrono::microseconds getTime()
{
using namespace std::chrono;
auto usec = steady_clock::now().time_since_epoch();
return duration_cast<microseconds>(usec);
}
Timer::Timer(sd_event* event,
std::function<void()> callback,
std::chrono::microseconds usec,
timer::Action action):
event(event),
callback(callback),
duration(usec),
action(action)
{
auto r = sd_event_add_time(event, &eventSource,
CLOCK_MONOTONIC, // Time base
(getTime() + usec).count(), // When to fire
0, // Use default event accuracy
timeoutHandler, // Callback handler on timeout
this); // User data
if (r < 0)
{
throw std::system_error(r, std::generic_category(), strerror(-r));
}
}
int Timer::timeoutHandler(sd_event_source* eventSource,
uint64_t usec, void* userData)
{
auto timer = static_cast<Timer*>(userData);
if (timer->getAction() == timer::ON)
{
auto r = sd_event_source_set_time(
eventSource, (getTime() + timer->getDuration()).count());
if (r < 0)
{
throw std::system_error(r, std::generic_category(), strerror(-r));
}
r = sd_event_source_set_enabled(eventSource, timer::ON);
if (r < 0)
{
throw std::system_error(r, std::generic_category(), strerror(-r));
}
}
if(timer->callback)
{
timer->callback();
}
return 0;
}
} // namespace hwmon
} // namespace phosphor