diff options
-rw-r--r-- | control/Makefile.am | 1 | ||||
-rw-r--r-- | control/manager.cpp | 19 | ||||
-rw-r--r-- | control/manager.hpp | 5 | ||||
-rw-r--r-- | control/zone.cpp | 10 | ||||
-rw-r--r-- | control/zone.hpp | 13 |
5 files changed, 43 insertions, 5 deletions
diff --git a/control/Makefile.am b/control/Makefile.am index b6d335f..5546877 100644 --- a/control/Makefile.am +++ b/control/Makefile.am @@ -16,6 +16,7 @@ nodist_phosphor_fan_control_SOURCES = \ fan_zone_defs.cpp phosphor_fan_control_LDADD = \ + -lstdc++fs \ $(SDBUSPLUS_LIBS) \ $(SDEVENTPLUS_LIBS) \ $(PHOSPHOR_LOGGING_LIBS) \ diff --git a/control/manager.cpp b/control/manager.cpp index c99f4a3..360239c 100644 --- a/control/manager.cpp +++ b/control/manager.cpp @@ -14,6 +14,8 @@ * limitations under the License. */ #include <algorithm> +#include <experimental/filesystem> +#include <sdbusplus/bus.hpp> #include <phosphor-logging/log.hpp> #include <phosphor-logging/elog.hpp> #include <phosphor-logging/elog-errors.hpp> @@ -32,6 +34,7 @@ namespace control { using namespace phosphor::logging; +namespace fs = std::experimental::filesystem; constexpr auto SYSTEMD_SERVICE = "org.freedesktop.systemd1"; constexpr auto SYSTEMD_OBJ_PATH = "/org/freedesktop/systemd1"; @@ -78,7 +81,8 @@ bool checkCondition(sdbusplus::bus::bus& bus, const Condition& c) Manager::Manager(sdbusplus::bus::bus& bus, const sdeventplus::Event& event, Mode mode) : - _bus(bus) + _bus(bus), + _objMgr(bus, CONTROL_OBJPATH) { //Create the appropriate Zone objects based on the //actual system configuration. @@ -99,15 +103,24 @@ Manager::Manager(sdbusplus::bus::bus& bus, for (auto& z : zones) { + fs::path path{CONTROL_OBJPATH}; + path /= std::to_string(std::get<zoneNumPos>(z)); _zones.emplace(std::get<zoneNumPos>(z), - std::make_unique<Zone>(mode, _bus, event, z)); + std::make_unique<Zone>(mode, + _bus, + path.string(), + event, + z)); } break; } } - bus.request_name(CONTROL_BUSNAME); + if (mode == Mode::control) + { + bus.request_name(CONTROL_BUSNAME); + } } diff --git a/control/manager.hpp b/control/manager.hpp index 5b748a2..c87d0d8 100644 --- a/control/manager.hpp +++ b/control/manager.hpp @@ -59,6 +59,11 @@ class Manager sdbusplus::bus::bus& _bus; /** + * The sdbusplus object manager + */ + sdbusplus::server::manager::manager _objMgr; + + /** * The fan zones in the system */ ZoneMap _zones; diff --git a/control/zone.cpp b/control/zone.cpp index 293945c..9333daa 100644 --- a/control/zone.cpp +++ b/control/zone.cpp @@ -39,9 +39,12 @@ using InternalFailure = sdbusplus::xyz::openbmc_project::Common:: Zone::Zone(Mode mode, sdbusplus::bus::bus& bus, + const std::string& path, const sdeventplus::Event& event, const ZoneDefinition& def) : + ThermalObject(bus, path.c_str(), true), _bus(bus), + _path(path), _fullSpeed(std::get<fullSpeedPos>(def)), _zoneNum(std::get<zoneNumPos>(def)), _defFloorSpeed(std::get<floorSpeedPos>(def)), @@ -60,8 +63,13 @@ Zone::Zone(Mode mode, } // Do not enable set speed events when in init mode - if (mode != Mode::init) + if (mode == Mode::control) { + // TODO Determine thermal control mode states + + // Emit objects added in control mode only + this->emit_object_added(); + // Update target speed to current zone target speed if (!_fans.empty()) { diff --git a/control/zone.hpp b/control/zone.hpp index 9c85655..ad4d4b4 100644 --- a/control/zone.hpp +++ b/control/zone.hpp @@ -7,6 +7,7 @@ #include <vector> #include "fan.hpp" #include "types.hpp" +#include "xyz/openbmc_project/Control/ThermalMode/server.hpp" namespace phosphor { @@ -15,6 +16,9 @@ namespace fan namespace control { +using ThermalObject = sdbusplus::server::object::object< + sdbusplus::xyz::openbmc_project::Control::server::ThermalMode>; + /** * The mode fan control will run in: * - init - only do the initialization steps @@ -30,7 +34,7 @@ enum class Mode * @class Represents a fan control zone, which is a group of fans * that behave the same. */ -class Zone +class Zone : public ThermalObject { public: @@ -48,11 +52,13 @@ class Zone * * @param[in] mode - mode of fan control * @param[in] bus - the dbus object + * @param[in] path - object instance path * @param[in] event - Event loop reference * @param[in] def - the fan zone definition data */ Zone(Mode mode, sdbusplus::bus::bus& bus, + const std::string& path, const sdeventplus::Event& event, const ZoneDefinition& def); @@ -470,6 +476,11 @@ class Zone sdbusplus::bus::bus& _bus; /** + * Zone object path + */ + const std::string _path; + + /** * Full speed for the zone */ const uint64_t _fullSpeed; |