summaryrefslogtreecommitdiffstats
path: root/monitor/tach_sensor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'monitor/tach_sensor.cpp')
-rw-r--r--monitor/tach_sensor.cpp41
1 files changed, 39 insertions, 2 deletions
diff --git a/monitor/tach_sensor.cpp b/monitor/tach_sensor.cpp
index 03c34e2..5e985d0 100644
--- a/monitor/tach_sensor.cpp
+++ b/monitor/tach_sensor.cpp
@@ -15,6 +15,7 @@
*/
#include <experimental/filesystem>
#include <phosphor-logging/log.hpp>
+#include <phosphor-logging/elog.hpp>
#include "fan.hpp"
#include "sdbusplus.hpp"
#include "tach_sensor.hpp"
@@ -32,6 +33,8 @@ constexpr auto FAN_TARGET_PROPERTY = "Target";
constexpr auto FAN_VALUE_PROPERTY = "Value";
using namespace std::experimental::filesystem;
+using InternalFailure = sdbusplus::xyz::openbmc_project::Common::
+ Error::InternalFailure;
/**
* @brief Helper function to read a property
@@ -84,6 +87,7 @@ TachSensor::TachSensor(Mode mode,
_factor(factor),
_offset(offset),
_timeout(timeout),
+ _timerMode(TimerMode::func),
_timer(events, [this, &fan](){ fan.timerExpired(*this); })
{
// Start from a known state of functional
@@ -212,12 +216,45 @@ void TachSensor::handleTachChange(sdbusplus::message::message& msg)
_fan.tachChanged(*this);
}
+void TachSensor::startTimer(TimerMode mode)
+{
+ if (!timerRunning())
+ {
+ _timer.start(
+ getDelay(mode),
+ util::Timer::TimerType::oneshot);
+ _timerMode = mode;
+ }
+ else
+ {
+ if (mode != _timerMode)
+ {
+ _timer.stop();
+ _timer.start(
+ getDelay(mode),
+ util::Timer::TimerType::oneshot);
+ _timerMode = mode;
+ }
+ }
+}
-std::chrono::microseconds TachSensor::getTimeout()
+std::chrono::microseconds TachSensor::getDelay(TimerMode mode)
{
using namespace std::chrono;
- return duration_cast<microseconds>(seconds(_timeout));
+ switch(mode)
+ {
+ case TimerMode::nonfunc :
+ return duration_cast<microseconds>(seconds(_timeout));
+ case TimerMode::func :
+ return duration_cast<microseconds>(seconds(_funcDelay));
+ default :
+ // Log an internal error for undefined timer mode
+ log<level::ERR>("Undefined timer mode",
+ entry("TIMER_MODE=%u", mode));
+ elog<InternalFailure>();
+ return duration_cast<microseconds>(seconds(0));
+ }
}
void TachSensor::updateInventory(bool functional)
OpenPOWER on IntegriCloud