summaryrefslogtreecommitdiffstats
path: root/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'main.cpp')
-rw-r--r--main.cpp113
1 files changed, 62 insertions, 51 deletions
diff --git a/main.cpp b/main.cpp
index 8c99154..db355ab 100644
--- a/main.cpp
+++ b/main.cpp
@@ -48,47 +48,43 @@
#include "dbus/dbusconfiguration.hpp"
#endif
-/* The YAML converted sensor list. */
+/* The configuration converted sensor list. */
std::map<std::string, struct conf::SensorConfig> sensorConfig = {};
-/* The YAML converted PID list. */
+/* The configuration converted PID list. */
std::map<int64_t, conf::PIDConf> zoneConfig = {};
-/* The YAML converted Zone configuration. */
+/* The configuration converted Zone configuration. */
std::map<int64_t, struct conf::ZoneConfig> zoneDetailsConfig = {};
/** the swampd daemon will check for the existence of this file. */
constexpr auto jsonConfigurationPath = "/usr/share/swampd/config.json";
+std::string configPath = "";
-int main(int argc, char* argv[])
-{
- int rc = 0;
- std::string configPath = "";
- loggingPath = "";
- loggingEnabled = false;
- tuningEnabled = false;
-
- CLI::App app{"OpenBMC Fan Control Daemon"};
-
- app.add_option("-c,--conf", configPath,
- "Optional parameter to specify configuration at run-time")
- ->check(CLI::ExistingFile);
- app.add_option("-l,--log", loggingPath,
- "Optional parameter to specify logging folder")
- ->check(CLI::ExistingDirectory);
- app.add_flag("-t,--tuning", tuningEnabled, "Enable or disable tuning");
+/* async io context for operation */
+boost::asio::io_context io;
- loggingEnabled = (!loggingPath.empty());
+/* buses for system control */
+static sdbusplus::asio::connection modeControlBus(io);
+static sdbusplus::asio::connection
+ hostBus(io, sdbusplus::bus::new_system().release());
+static sdbusplus::asio::connection
+ passiveBus(io, sdbusplus::bus::new_system().release());
- CLI11_PARSE(app, argc, argv);
+void restartControlLoops()
+{
+ static SensorManager mgmr;
+ static std::unordered_map<int64_t, std::unique_ptr<PIDZone>> zones;
+ static std::list<boost::asio::steady_timer> timers;
- auto modeControlBus = sdbusplus::bus::new_system();
- static constexpr auto modeRoot = "/xyz/openbmc_project/settings/fanctrl";
- // Create a manager for the ModeBus because we own it.
- sdbusplus::server::manager::manager(modeControlBus, modeRoot);
+ timers.clear();
#if CONFIGURE_DBUS
+
+ static boost::asio::steady_timer reloadTimer(io);
+ if (!dbus_configuration::init(modeControlBus, reloadTimer))
{
- dbus_configuration::init(modeControlBus);
+ return; // configuration not ready
}
+
#else
const std::string& path =
(configPath.length() > 0) ? configPath : jsonConfigurationPath;
@@ -110,42 +106,57 @@ int main(int argc, char* argv[])
}
#endif
- SensorManager mgmr = buildSensors(sensorConfig);
- std::unordered_map<int64_t, std::unique_ptr<PIDZone>> zones =
- buildZones(zoneConfig, zoneDetailsConfig, mgmr, modeControlBus);
+ mgmr = buildSensors(sensorConfig, passiveBus, hostBus);
+ zones = buildZones(zoneConfig, zoneDetailsConfig, mgmr, modeControlBus);
if (0 == zones.size())
{
std::cerr << "No zones defined, exiting.\n";
- return rc;
+ std::exit(EXIT_FAILURE);
}
- /*
- * All sensors are managed by one manager, but each zone has a pointer to
- * it.
- */
+ for (const auto& i : zones)
+ {
+ auto& timer = timers.emplace_back(io);
+ std::cerr << "pushing zone " << i.first << "\n";
+ pidControlLoop(i.second.get(), timer);
+ }
+}
- auto& hostSensorBus = mgmr.getHostBus();
- auto& passiveListeningBus = mgmr.getPassiveBus();
+int main(int argc, char* argv[])
+{
+ loggingPath = "";
+ loggingEnabled = false;
+ tuningEnabled = false;
- boost::asio::io_context io;
- sdbusplus::asio::connection passiveBus(io, passiveListeningBus.release());
+ CLI::App app{"OpenBMC Fan Control Daemon"};
- sdbusplus::asio::connection hostBus(io, hostSensorBus.release());
- hostBus.request_name("xyz.openbmc_project.Hwmon.external");
+ app.add_option("-c,--conf", configPath,
+ "Optional parameter to specify configuration at run-time")
+ ->check(CLI::ExistingFile);
+ app.add_option("-l,--log", loggingPath,
+ "Optional parameter to specify logging folder")
+ ->check(CLI::ExistingDirectory);
+ app.add_flag("-t,--tuning", tuningEnabled, "Enable or disable tuning");
- sdbusplus::asio::connection modeBus(io, modeControlBus.release());
- modeBus.request_name("xyz.openbmc_project.State.FanCtrl");
+ loggingEnabled = (!loggingPath.empty());
- std::list<boost::asio::steady_timer> timers;
+ CLI11_PARSE(app, argc, argv);
- for (const auto& i : zones)
- {
- auto& timer = timers.emplace_back(io);
- std::cerr << "pushing zone" << std::endl;
- pidControlLoop(i.second.get(), timer);
- }
+ static constexpr auto modeRoot = "/xyz/openbmc_project/settings/fanctrl";
+ // Create a manager for the ModeBus because we own it.
+ sdbusplus::server::manager::manager(
+ static_cast<sdbusplus::bus::bus&>(modeControlBus), modeRoot);
+ hostBus.request_name("xyz.openbmc_project.Hwmon.external");
+ modeControlBus.request_name("xyz.openbmc_project.State.FanCtrl");
+
+ /*
+ * All sensors are managed by one manager, but each zone has a pointer to
+ * it.
+ */
+
+ restartControlLoops();
io.run();
- return rc;
+ return 0;
}
OpenPOWER on IntegriCloud