blob: d8f3fe4455470e2c2fa4532400f88189d515757d [file] [log] [blame]
#pragma once
#include <vector>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/server.hpp>
#include "fan.hpp"
#include "types.hpp"
namespace phosphor
{
namespace fan
{
namespace control
{
/**
* @class Represents a fan control zone, which is a group of fans
* that behave the same.
*/
class Zone
{
public:
Zone() = delete;
Zone(const Zone&) = delete;
Zone(Zone&&) = default;
Zone& operator=(const Zone&) = delete;
Zone& operator=(Zone&&) = delete;
~Zone() = default;
/**
* Constructor
* Creates the appropriate fan objects based on
* the zone definition data passed in.
*
* @param[in] bus - the dbus object
* @param[in] def - the fan zone definition data
*/
Zone(sdbusplus::bus::bus& bus,
const ZoneDefinition& def);
/**
* Sets all fans in the zone to the speed
* passed in
*
* @param[in] speed - the fan speed
*/
void setSpeed(uint64_t speed);
/**
* Sets the zone to full speed
*/
inline void setFullSpeed()
{
if (_fullSpeed != 0)
{
setSpeed(_fullSpeed);
}
}
/**
* @brief Sets a given object's property value
*
* @param[in] object - Name of the object containing the property
* @param[in] property - Property name
* @param[in] value - Property value
*/
void setPropertyValue(const char* object,
const char* property,
bool value)
{
_properties[object][property] = value;
};
/**
* @brief Get the value of an object's property
*
* @param[in] object - Name of the object containing the property
* @param[in] property - Property name
*
* @return - The property value
*/
inline auto getPropertyValue(const std::string& object,
const std::string& property)
{
return _properties[object][property];
};
private:
/**
* The dbus object
*/
sdbusplus::bus::bus& _bus;
/**
* Full speed for the zone
*/
const uint64_t _fullSpeed;
/**
* The zone number
*/
const size_t _zoneNum;
/**
* The vector of fans in this zone
*/
std::vector<std::unique_ptr<Fan>> _fans;
/**
* @brief Map of object property values
*/
std::map<std::string, std::map<std::string, bool>> _properties;
/**
* @brief List of signal event arguments
*/
std::vector<std::unique_ptr<SignalEvent>> _signalEvents;
/**
* @brief list of Dbus matches for callbacks
*/
std::vector<sdbusplus::server::match::match> _matches;
/**
* @brief Dbus signal change handler
*
* @param[in] msg - Data associated with the subscribed signal
* @param[in] data - Pointer to the event sensor's data
* @param[in] err - Contains any sdbus error reference if occurred
*/
static int signalHandler(sd_bus_message* msg,
void* data,
sd_bus_error* err);
/**
* @brief Envokes the assigned handler and action
*
* @param[in] msg - Expanded sdbusplus message data
* @param[in] eventData - The event's data
*/
void handleEvent(sdbusplus::message::message& msg,
const EventData& eventData);
};
}
}
}