blob: 06c301d9580694cabaed6d71b54a4c26bce0f6b5 [file] [log] [blame]
/**
* Copyright © 2022 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 "config_base.hpp"
#include <nlohmann/json.hpp>
#include <sdbusplus/bus.hpp>
#include <map>
namespace phosphor::fan::control::json
{
using json = nlohmann::json;
/**
* @class Fan - Represents a configured fan control fan object
*
* A fan object contains the configured attributes for a fan within the system
* that will be controlled by the fan control application. These configuration
* attributes include, but are not limited to, the cooling zone in which the
* fan is included, what sensors make up the fan, the target interface to be
* used in setting a target, and any profiles(OPTIONAL) the fan should be
* included in.
*
* (When no profile for a fan is given, the fan defaults to always be included)
*
*/
class Fan : public ConfigBase
{
friend class Zone;
public:
/* JSON file name for fans */
static constexpr auto confFileName = "fans.json";
Fan() = delete;
Fan(const Fan&) = delete;
Fan(Fan&&) = delete;
Fan& operator=(const Fan&) = delete;
Fan& operator=(Fan&&) = delete;
~Fan() = default;
/**
* Constructor
* Parses and populates a zone fan from JSON object data
*
* @param[in] jsonObj - JSON object
*/
explicit Fan(const json& jsonObj);
/**
* @brief Get the zone
*
* @return Zone this fan belongs in
*/
inline const auto& getZone() const
{
return _zone;
}
/**
* @brief Get the list of sensors
*
* @return List of sensors with `Target` property
*/
inline const auto& getSensors() const
{
return _sensors;
}
/**
* @brief Get the sensors' interface
*
* @return Interface containing `Target` to use on sensors
*/
inline const auto& getInterface() const
{
return _interface;
}
/**
* @brief Get the current fan target
*
* @return - The current target of the fan
*/
inline auto getTarget() const
{
return _target;
}
/**
* Sets the target value on all contained sensors
*
* @param[in] target - The value to set
*/
void setTarget(uint64_t target);
/**
* @brief Returns the fan's locked targets.
*
* @return - vector of locked targets
*/
const std::vector<uint64_t>& getLockedTargets() const
{
return _lockedTargets;
}
private:
/**
* Forces all contained sensors to the target (if this target is the
* highest. May be overridden by existing or subsequent higher values),
* ignoring subsequent setTarget() commands
*
* @param[in] target - The target lock to set/add
*/
void lockTarget(uint64_t target);
/**
* Removes the provided target lock from the list of locks. Fan will unlock
* (become eligible for setTarget()) when all locks are removed from the
* list.
*/
void unlockTarget(uint64_t target);
/* The sdbusplus bus object */
sdbusplus::bus_t& _bus;
/**
* Interface containing the `Target` property
* to use in controlling the fan's target
*/
std::string _interface;
/* Target for this fan */
uint64_t _target;
/* list of locked targets active on this fan */
std::vector<uint64_t> _lockedTargets;
/**
* Map of sensors containing the `Target` property on
* dbus to the service providing them that make up the fan
*/
std::map<std::string, std::string> _sensors;
/* The zone this fan belongs to */
std::string _zone;
/**
* @brief Parse and set the fan's sensor interface
*
* @param[in] jsonObj - JSON object for the fan
*
* Sets the sensor interface to use when setting the `Target` property
*/
void setInterface(const json& jsonObj);
/**
* @brief Parse and set the fan's sensor list
*
* @param[in] jsonObj - JSON object for the fan
*
* Sets the list of sensors that contain a `Target` property on dbus
* that make up this fan.
*/
void setSensors(const json& jsonObj);
/**
* @brief Parse and set the fan's zone
*
* @param[in] jsonObj - JSON object for the fan
*
* Sets the zone this fan is included in.
*/
void setZone(const json& jsonObj);
};
} // namespace phosphor::fan::control::json