diff options
author | Matthew Barth <msbarth@us.ibm.com> | 2018-01-26 12:53:15 -0600 |
---|---|---|
committer | Matthew Barth <msbarth@linux.vnet.ibm.com> | 2018-01-30 15:29:43 +0000 |
commit | 0a9fe160d600ece0c5797741042d0e6f975ab101 (patch) | |
tree | 37e1948ae086507bb06db636487151e20c87cac5 | |
parent | 9a5b6994c745480a78ef658148cfd96dd3e12bdb (diff) | |
download | phosphor-fan-presence-0a9fe160d600ece0c5797741042d0e6f975ab101.tar.gz phosphor-fan-presence-0a9fe160d600ece0c5797741042d0e6f975ab101.zip |
Set tach sensor to functional on start
With the addition of a functional state for each fan rotor tach sensor,
these should be set to functional on each power on. This is done during
fan monitor init mode when no monitor is done and then again once
monitoring mode begins.
Change-Id: I3c73c1be5f912c7cee8499f47cc799ac3c20983b
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
-rw-r--r-- | monitor/fan.cpp | 48 | ||||
-rw-r--r-- | monitor/fan.hpp | 11 | ||||
-rw-r--r-- | monitor/tach_sensor.cpp | 75 | ||||
-rw-r--r-- | monitor/tach_sensor.hpp | 15 |
4 files changed, 78 insertions, 71 deletions
diff --git a/monitor/fan.cpp b/monitor/fan.cpp index 9d2593f..b1aa233 100644 --- a/monitor/fan.cpp +++ b/monitor/fan.cpp @@ -40,34 +40,36 @@ Fan::Fan(Mode mode, _numSensorFailsForNonFunc(std::get<numSensorFailsForNonfuncField>(def)), _trustManager(trust) { + // Setup tach sensors for monitoring + auto& sensors = std::get<sensorListField>(def); + for (auto& s : sensors) + { + try + { + _sensors.emplace_back( + std::make_unique<TachSensor>( + mode, + bus, + *this, + std::get<sensorNameField>(s), + std::get<hasTargetField>(s), + std::get<timeoutField>(def), + events)); + + _trustManager->registerSensor(_sensors.back()); + } + catch (InvalidSensorError& e) + { + + } + } + //Start from a known state of functional updateInventory(true); - // Setup tach sensors for monitoring when in monitor mode + // Check current tach state when entering monitor mode if (mode != Mode::init) { - auto& sensors = std::get<sensorListField>(def); - for (auto& s : sensors) - { - try - { - _sensors.emplace_back( - std::make_unique<TachSensor>( - bus, - *this, - std::get<sensorNameField>(s), - std::get<hasTargetField>(s), - std::get<timeoutField>(def), - events)); - - _trustManager->registerSensor(_sensors.back()); - } - catch (InvalidSensorError& e) - { - - } - } - //The TachSensors will now have already read the input //and target values, so check them. tachChanged(); diff --git a/monitor/fan.hpp b/monitor/fan.hpp index bd8179f..0b0c047 100644 --- a/monitor/fan.hpp +++ b/monitor/fan.hpp @@ -16,17 +16,6 @@ namespace monitor { /** - * The mode fan monitor will run in: - * - init - only do the initialization steps - * - monitor - run normal monitoring algorithm - */ -enum class Mode -{ - init, - monitor -}; - -/** * @class InvalidSensorError * * An exception type for sensors that don't exist or diff --git a/monitor/tach_sensor.cpp b/monitor/tach_sensor.cpp index 2aa1609..22875a2 100644 --- a/monitor/tach_sensor.cpp +++ b/monitor/tach_sensor.cpp @@ -64,7 +64,8 @@ static void readProperty(const std::string& interface, } -TachSensor::TachSensor(sdbusplus::bus::bus& bus, +TachSensor::TachSensor(Mode mode, + sdbusplus::bus::bus& bus, Fan& fan, const std::string& id, bool hasTarget, @@ -81,48 +82,50 @@ TachSensor::TachSensor(sdbusplus::bus::bus& bus, // Start from a known state of functional setFunctional(true); - // Load in starting Target and Input values - try - { - // Use getProperty directly to allow a missing sensor object - // to abort construction. - _tachInput = util::SDBusPlus::getProperty<decltype(_tachInput)>( - _bus, - _name, - FAN_SENSOR_VALUE_INTF, - FAN_VALUE_PROPERTY); - } - catch (std::exception& e) + // Load in current Target and Input values when entering monitor mode + if (mode != Mode::init) { - throw InvalidSensorError(); - } + try + { + // Use getProperty directly to allow a missing sensor object + // to abort construction. + _tachInput = util::SDBusPlus::getProperty<decltype(_tachInput)>( + _bus, + _name, + FAN_SENSOR_VALUE_INTF, + FAN_VALUE_PROPERTY); + } + catch (std::exception& e) + { + throw InvalidSensorError(); + } - if (_hasTarget) - { - readProperty(FAN_SENSOR_CONTROL_INTF, - FAN_TARGET_PROPERTY, - _name, - _bus, - _tachTarget); - } + if (_hasTarget) + { + readProperty(FAN_SENSOR_CONTROL_INTF, + FAN_TARGET_PROPERTY, + _name, + _bus, + _tachTarget); + } - auto match = getMatchString(FAN_SENSOR_VALUE_INTF); + auto match = getMatchString(FAN_SENSOR_VALUE_INTF); - tachSignal = std::make_unique<sdbusplus::server::match::match>( - _bus, - match.c_str(), - [this](auto& msg){ this->handleTachChange(msg); }); + tachSignal = std::make_unique<sdbusplus::server::match::match>( + _bus, + match.c_str(), + [this](auto& msg){ this->handleTachChange(msg); }); - if (_hasTarget) - { - match = getMatchString(FAN_SENSOR_CONTROL_INTF); + if (_hasTarget) + { + match = getMatchString(FAN_SENSOR_CONTROL_INTF); - targetSignal = std::make_unique<sdbusplus::server::match::match>( - _bus, - match.c_str(), - [this](auto& msg){ this->handleTargetChange(msg); }); + targetSignal = std::make_unique<sdbusplus::server::match::match>( + _bus, + match.c_str(), + [this](auto& msg){ this->handleTargetChange(msg); }); + } } - } std::string TachSensor::getMatchString(const std::string& interface) diff --git a/monitor/tach_sensor.hpp b/monitor/tach_sensor.hpp index 4e57ef5..dd89bbf 100644 --- a/monitor/tach_sensor.hpp +++ b/monitor/tach_sensor.hpp @@ -18,6 +18,17 @@ class Fan; constexpr auto FAN_SENSOR_PATH = "/xyz/openbmc_project/sensors/fan_tach/"; /** + * The mode fan monitor will run in: + * - init - only do the initialization steps + * - monitor - run normal monitoring algorithm + */ +enum class Mode +{ + init, + monitor +}; + +/** * @class TachSensor * * This class represents the sensor that reads a tach value. @@ -45,6 +56,7 @@ class TachSensor /** * @brief Constructor * + * @param[in] mode - mode of fan monitor * @param[in] bus - the dbus object * @param[in] fan - the parent fan object * @param[in] id - the id of the sensor @@ -53,7 +65,8 @@ class TachSensor * @param[in] timeout - Normal timeout value to use * @param[in] events - sd_event pointer */ - TachSensor(sdbusplus::bus::bus& bus, + TachSensor(Mode mode, + sdbusplus::bus::bus& bus, Fan& fan, const std::string& id, bool hasTarget, |