summaryrefslogtreecommitdiffstats
path: root/monitor/fan.cpp
diff options
context:
space:
mode:
authorMatt Spinler <spinler@us.ibm.com>2017-04-27 14:42:33 -0500
committerMatt Spinler <spinler@us.ibm.com>2017-05-11 13:52:50 -0500
commitb1e185141bdd6b25cea10627045d80e457105baf (patch)
tree67117d0117f402ff1fd2873ce68a02fa11669639 /monitor/fan.cpp
parenta4c8f1f5143573c267dd9b0391daa47345276632 (diff)
downloadphosphor-fan-presence-b1e185141bdd6b25cea10627045d80e457105baf.tar.gz
phosphor-fan-presence-b1e185141bdd6b25cea10627045d80e457105baf.zip
Add inventory update support
Set a fan's Functional property to false when it has been out of spec for too long. When it is back in spec, set it back to functional. Change-Id: I264129479c58fd296df7c3a1d3d42f5d7aa7b60b Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Diffstat (limited to 'monitor/fan.cpp')
-rw-r--r--monitor/fan.cpp71
1 files changed, 69 insertions, 2 deletions
diff --git a/monitor/fan.cpp b/monitor/fan.cpp
index d1101b9..639d88e 100644
--- a/monitor/fan.cpp
+++ b/monitor/fan.cpp
@@ -17,6 +17,7 @@
#include <phosphor-logging/log.hpp>
#include "fan.hpp"
#include "types.hpp"
+#include "utility.hpp"
namespace phosphor
{
@@ -28,6 +29,14 @@ namespace monitor
using namespace phosphor::logging;
using TimerType = phosphor::fan::util::Timer::TimerType;
+constexpr auto INVENTORY_PATH = "/xyz/openbmc_project/inventory";
+constexpr auto INVENTORY_INTF = "xyz.openbmc_project.Inventory.Manager";
+
+constexpr auto FUNCTIONAL_PROPERTY = "Functional";
+constexpr auto OPERATIONAL_STATUS_INTF =
+ "xyz.openbmc_project.State.Decorator.OperationalStatus";
+
+
Fan::Fan(sdbusplus::bus::bus& bus,
std::shared_ptr<sd_event>& events,
const FanDefinition& def) :
@@ -49,6 +58,9 @@ Fan::Fan(sdbusplus::bus::bus& bus,
events));
}
+ //Start from a known state of functional
+ updateInventory(true);
+
//The TachSensors will now have already read the input
//and target values, so check them.
tachChanged();
@@ -101,7 +113,7 @@ void Fan::tachChanged(TachSensor& sensor)
log<level::INFO>("Setting a fan back to functional",
entry("FAN=%s", _name.c_str()));
- //TODO: actually update inventory
+ updateInventory(true);
}
}
}
@@ -171,9 +183,64 @@ void Fan::timerExpired(TachSensor& sensor)
//If the fan is currently functional, but too many
//contained sensors are now nonfunctional, update
//the whole fan nonfunctional.
- //TODO
+
+ if (_functional && tooManySensorsNonfunctional())
+ {
+ log<level::ERR>("Setting a fan to nonfunctional",
+ entry("FAN=%s", _name.c_str()));
+
+ updateInventory(false);
+ }
}
+
+void Fan::updateInventory(bool functional)
+{
+ ObjectMap objectMap = getObjectMap(functional);
+ std::string service;
+
+ try
+ {
+ service = phosphor::fan::util::getInvService(_bus);
+ }
+ catch (const std::runtime_error& err)
+ {
+ log<level::ERR>(err.what());
+ return;
+ }
+
+ auto msg = _bus.new_method_call(service.c_str(),
+ INVENTORY_PATH,
+ INVENTORY_INTF,
+ "Notify");
+
+ msg.append(std::move(objectMap));
+ auto response = _bus.call(msg);
+ if (response.is_method_error())
+ {
+ log<level::ERR>("Error in Notify call to update inventory");
+ return;
+ }
+
+ //This will always track the current state of the inventory.
+ _functional = functional;
+}
+
+
+Fan::ObjectMap Fan::getObjectMap(bool functional)
+{
+ ObjectMap objectMap;
+ InterfaceMap interfaceMap;
+ PropertyMap propertyMap;
+
+ propertyMap.emplace(FUNCTIONAL_PROPERTY, functional);
+ interfaceMap.emplace(OPERATIONAL_STATUS_INTF, std::move(propertyMap));
+ objectMap.emplace(_name, std::move(interfaceMap));
+
+ return objectMap;
+}
+
+
}
}
}
OpenPOWER on IntegriCloud