#pragma once #include namespace phosphor { namespace fan { namespace control { namespace precondition { /** * @brief A precondition to compare a group of property values and * subscribe/unsubscribe a set speed event group * @details Compares each entry within the precondition group to a given value * that when each entry's property value matches the given value, the set speed * event is then initialized. At any point a precondition entry's value no * longer matches, the set speed event is removed from being active and fans * are set to full speed. * * @param[in] pg - Precondition property group of property values * @param[in] sse - Set speed event definition * * @return Lambda function * A lambda function to compare precondition property value states * and either subscribe or unsubscribe a set speed event group. */ auto property_states_match(std::vector&& pg, std::vector&& sse) { return [pg = std::move(pg), sse = std::move(sse)](auto& zone, auto& group) { // Compare given precondition entries size_t precondState = std::count_if( pg.begin(), pg.end(), [&zone](auto const& entry) { try { return zone.getPropValueVariant( std::get(entry), std::get(entry), std::get(entry)) == std::get(entry); } catch (const std::out_of_range& oore) { // Default to property variants not equal when not found return false; } }); if (precondState == pg.size()) { // Init the events when all the precondition(s) are true std::for_each( sse.begin(), sse.end(), [&zone](auto const& entry) { zone.initEvent(entry); }); } else { // Unsubscribe the events' signals when any precondition is false std::for_each( sse.begin(), sse.end(), [&zone](auto const& entry) { zone.removeEvent(entry); }); zone.setFullSpeed(); } // Update group's fan control active allowed zone.setActiveAllow(&group, (precondState == pg.size())); }; } } // namespace precondition } // namespace control } // namespace fan } // namespace phosphor