| /** |
| * Copyright © 2020 IBM Corporation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| #pragma once |
| |
| #include "json_config.hpp" |
| #include "types.hpp" |
| |
| #include <nlohmann/json.hpp> |
| #include <sdbusplus/bus.hpp> |
| |
| #include <map> |
| #include <memory> |
| #include <utility> |
| #include <vector> |
| |
| namespace phosphor::fan::control |
| { |
| |
| /* Application name to be appended to the path for loading a JSON config file */ |
| constexpr auto confAppName = "control"; |
| |
| /** |
| * Configuration object key to uniquely map to the configuration object |
| * Pair constructed of: |
| * std::string = Configuration object's name |
| * std::vector<std::string> = List of profiles the configuration object |
| * is included in |
| */ |
| using configKey = std::pair<std::string, std::vector<std::string>>; |
| |
| /** |
| * @brief Load the configuration of a given JSON class object type |
| * |
| * @param[in] bus - The dbus bus object |
| * @param[in] isOptional - JSON configuration file is optional or not |
| * Defaults to false |
| * |
| * @return Map of configuration entries |
| * Map of configuration keys to their corresponding configuration object |
| */ |
| template <typename T> |
| std::map<configKey, std::unique_ptr<T>> getConfig(sdbusplus::bus::bus& bus, |
| bool isOptional = false) |
| { |
| std::map<configKey, std::unique_ptr<T>> config; |
| |
| auto confFile = fan::JsonConfig::getConfFile(bus, confAppName, |
| T::confFileName, isOptional); |
| if (!confFile.empty()) |
| { |
| for (const auto& entry : fan::JsonConfig::load(confFile)) |
| { |
| auto obj = std::make_unique<T>(bus, entry); |
| config.emplace(std::make_pair(obj->getName(), obj->getProfiles()), |
| std::move(obj)); |
| } |
| } |
| return config; |
| } |
| |
| /** |
| * @brief Helper function to determine when a configuration entry is included |
| * based on the list of active profiles and its list of profiles |
| * |
| * A configuration entry may include a list of profiles that when any one of |
| * the profiles are active, the entry should be included. When the list of |
| * profiles for a configuration entry is empty, that results in always |
| * including the entry. An empty list of active profiles results in including |
| * only those entries configured without a list of profiles. |
| * |
| * i.e.) No profiles configured results in always being included, whereas |
| * providing a list of profiles on an entry results only in that entry being |
| * included when a profile in the list is active. |
| * |
| * @param[in] activeProfiles - List of active system profiles |
| * @param[in] entryProfiles - List of the configuration entry's profiles |
| * |
| * @return Whether the configuration entry should be included or not |
| */ |
| bool checkEntry(const std::vector<std::string>& activeProfiles, |
| const std::vector<std::string>& entryProfiles); |
| |
| /** |
| * @brief Get the configuration definitions for zone groups |
| * |
| * @param[in] bus - The dbus bus object |
| * |
| * @return List of zone group objects |
| * Generated list of zone groups including their control configurations |
| */ |
| const std::vector<ZoneGroup> getZoneGroups(sdbusplus::bus::bus& bus); |
| |
| /** |
| * @brief Get the delay(in seconds) to allow the fans to ramp up to the defined |
| * power on speed |
| * |
| * @param[in] bus - The dbus bus object |
| * |
| * @return Time to delay in seconds |
| * Amount of time to delay in seconds after a power on |
| */ |
| const unsigned int getPowerOnDelay(sdbusplus::bus::bus& bus); |
| |
| } // namespace phosphor::fan::control |