summaryrefslogtreecommitdiffstats
path: root/control/actions.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'control/actions.hpp')
-rw-r--r--control/actions.hpp193
1 files changed, 27 insertions, 166 deletions
diff --git a/control/actions.hpp b/control/actions.hpp
index ecf900e..3061814 100644
--- a/control/actions.hpp
+++ b/control/actions.hpp
@@ -2,6 +2,8 @@
#include <algorithm>
#include <numeric>
+#include "types.hpp"
+#include "zone.hpp"
namespace phosphor
{
@@ -13,6 +15,19 @@ namespace action
{
/**
+ * @brief An action to set the request speed base
+ * @details A new target speed is determined using a speed delta being added
+ * or subtracted, for increases or decrease respectively, from a base speed.
+ * This base speed defaults to be the current target speed or is set to a
+ * different base speed(i.e. the fans' tach feedback speed) to request a new
+ * target from.
+ *
+ * @param[in] zone - Zone containing fans
+ * @param[in] group - Group of sensors to determine base from
+ */
+void set_request_speed_base_with_max(Zone& zone, const Group& group);
+
+/**
* @brief An action to set the speed on a zone
* @details The zone is held at the given speed when a defined number of
* properties in the group are set to the given state
@@ -67,183 +82,29 @@ auto count_state_before_speed(size_t count, T&& state, uint64_t speed)
*
* @param[in] val_to_speed - Ordered map of sensor value-to-speed
*
- * @return Lambda function
- * A lambda function to set the zone's floor speed when the average of
+ * @return Action lambda function
+ * An Action function to set the zone's floor speed when the average of
* property values within the group is below the lowest sensor value given
*/
-auto set_floor_from_average_sensor_value(
- std::map<int64_t, uint64_t>&& val_to_speed)
-{
- return [val_to_speed = std::move(val_to_speed)](auto& zone, auto& group)
- {
- auto speed = zone.getDefFloor();
- if (group.size() != 0)
- {
- auto count = 0;
- auto sumValue = std::accumulate(
- group.begin(),
- group.end(),
- 0,
- [&zone, &count](int64_t sum, auto const& entry)
- {
- try
- {
- return sum +
- zone.template getPropertyValue<int64_t>(
- entry.first,
- std::get<intfPos>(entry.second),
- std::get<propPos>(entry.second));
- }
- catch (const std::out_of_range& oore)
- {
- count++;
- return sum;
- }
- });
- if ((group.size() - count) > 0)
- {
- auto avgValue = sumValue / (group.size() - count);
- auto it = std::find_if(
- val_to_speed.begin(),
- val_to_speed.end(),
- [&avgValue](auto const& entry)
- {
- return avgValue < entry.first;
- }
- );
- if (it != std::end(val_to_speed))
- {
- speed = (*it).second;
- }
- }
- }
- zone.setFloor(speed);
- };
-}
+Action set_floor_from_average_sensor_value(
+ std::map<int64_t, uint64_t>&& val_to_speed);
/**
* @brief An action to set the ceiling speed on a zone
- * @details Based on the average of the defined sensor group values, the ceiling
- * speed is selected from the map key transition point that the average sensor
- * value falls within depending on the key values direction from what was
- * previously read.
+ * @details Based on the average of the defined sensor group values, the
+ * ceiling speed is selected from the map key transition point that the average
+ * sensor value falls within depending on the key values direction from what
+ * was previously read.
*
* @param[in] val_to_speed - Ordered map of sensor value-to-speed transitions
*
- * @return Lambda function
- * A lambda function to set the zone's ceiling speed when the average of
+ * @return Action lambda function
+ * An Action function to set the zone's ceiling speed when the average of
* property values within the group is above(increasing) or
* below(decreasing) the key transition point
*/
-auto set_ceiling_from_average_sensor_value(
- std::map<int64_t, uint64_t>&& val_to_speed)
-{
- return [val_to_speed = std::move(val_to_speed)](auto& zone, auto& group)
- {
- auto speed = zone.getCeiling();
- if (group.size() != 0)
- {
- auto count = 0;
- auto sumValue = std::accumulate(
- group.begin(),
- group.end(),
- 0,
- [&zone, &count](int64_t sum, auto const& entry)
- {
- try
- {
- return sum +
- zone.template getPropertyValue<int64_t>(
- entry.first,
- std::get<intfPos>(entry.second),
- std::get<propPos>(entry.second));
- }
- catch (const std::out_of_range& oore)
- {
- count++;
- return sum;
- }
- });
- if ((group.size() - count) > 0)
- {
- auto avgValue = sumValue / (group.size() - count);
- auto prevValue = zone.swapCeilingKeyValue(avgValue);
- if (avgValue != prevValue)
- {// Only check if previous and new values differ
- if (avgValue < prevValue)
- {// Value is decreasing from previous
- for (auto it = val_to_speed.rbegin();
- it != val_to_speed.rend();
- ++it)
- {
- if (it == val_to_speed.rbegin() &&
- avgValue >= it->first)
- {
- // Value is at/above last map key, set
- // ceiling speed to the last map key's value
- speed = it->second;
- break;
- }
- else if (std::next(it, 1) == val_to_speed.rend() &&
- avgValue <= it->first)
- {
- // Value is at/below first map key, set
- // ceiling speed to the first map key's value
- speed = it->second;
- break;
- }
- if (avgValue < it->first &&
- it->first <= prevValue)
- {
- // Value decreased & transitioned across
- // a map key, update ceiling speed to this
- // map key's value when new value is below
- // map's key and the key is at/below the
- // previous value
- speed = it->second;
- }
- }
- }
- else
- {// Value is increasing from previous
- for (auto it = val_to_speed.begin();
- it != val_to_speed.end();
- ++it)
- {
- if (it == val_to_speed.begin() &&
- avgValue <= it->first)
- {
- // Value is at/below first map key, set
- // ceiling speed to the first map key's value
- speed = it->second;
- break;
- }
- else if (std::next(it, 1) == val_to_speed.end() &&
- avgValue >= it->first)
- {
- // Value is at/above last map key, set
- // ceiling speed to the last map key's value
- speed = it->second;
- break;
- }
- if (avgValue > it->first &&
- it->first >= prevValue)
- {
- // Value increased & transitioned across
- // a map key, update ceiling speed to this
- // map key's value when new value is above
- // map's key and the key is at/above the
- // previous value
- speed = it->second;
- }
- }
- }
- }
- }
- }
- zone.setCeiling(speed);
- };
-}
+Action set_ceiling_from_average_sensor_value(
+ std::map<int64_t, uint64_t>&& val_to_speed);
/**
* @brief An action to set the speed increase delta and request speed change
OpenPOWER on IntegriCloud