|  | #pragma once | 
|  |  | 
|  | #include "tach_sensor.hpp" | 
|  | #include "trust_group.hpp" | 
|  | #include "types.hpp" | 
|  |  | 
|  | #include <memory> | 
|  | #include <vector> | 
|  |  | 
|  | namespace phosphor | 
|  | { | 
|  | namespace fan | 
|  | { | 
|  | namespace trust | 
|  | { | 
|  |  | 
|  | /** | 
|  | * @class Manager | 
|  | * | 
|  | * The sensor trust manager class.  It can be asked if a tach sensor's | 
|  | * reading can be trusted or not, based on the trust groups the sensor | 
|  | * is in. | 
|  | * | 
|  | * When it finds a group's trust status changing, it will either stop or | 
|  | * start the tach error timers for the group's sensors accordingly. | 
|  | * | 
|  | * See the trust::Group documentation for more details on sensor trust. | 
|  | */ | 
|  | class Manager | 
|  | { | 
|  | public: | 
|  | Manager() = delete; | 
|  | Manager(const Manager&) = delete; | 
|  | Manager& operator=(const Manager&) = delete; | 
|  | Manager(Manager&&) = default; | 
|  | Manager& operator=(Manager&&) = default; | 
|  | ~Manager() = default; | 
|  |  | 
|  | /** | 
|  | * Constructor | 
|  | * | 
|  | * @param[in] functions - trust group creation function vector | 
|  | */ | 
|  | explicit Manager(const std::vector<monitor::CreateGroupFunction>& functions) | 
|  | { | 
|  | for (auto& create : functions) | 
|  | { | 
|  | groups.emplace_back(create()); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Says if trust groups have been created and | 
|  | * need to be checked. | 
|  | * | 
|  | * @return bool - If there are any trust groups | 
|  | */ | 
|  | inline bool active() const | 
|  | { | 
|  | return !groups.empty(); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Checks if a sensor value can be trusted | 
|  | * | 
|  | * Checks if the sensor is trusted in each group | 
|  | * it belongs to.  Only considered trusted if it is | 
|  | * trusted in all groups it belongs to. | 
|  | * | 
|  | * While checking group trust, the code will also check | 
|  | * if the trust status has just changed.  If the status | 
|  | * just changed to false, it will cancel the tach error | 
|  | * method for that group so these untrusted sensors won't | 
|  | * cause errors. | 
|  | * | 
|  | * Note this means groups should be designed such that | 
|  | * in the same call to this function a sensor shouldn't | 
|  | * make one group change to trusted and another to untrusted. | 
|  | * | 
|  | * @param[in] sensor - the sensor to check | 
|  | * | 
|  | * @return bool - if sensor is trusted in all groups or not | 
|  | */ | 
|  | bool checkTrust(const monitor::TachSensor& sensor) | 
|  | { | 
|  | auto trusted = true; | 
|  |  | 
|  | for (auto& group : groups) | 
|  | { | 
|  | if (group->inGroup(sensor)) | 
|  | { | 
|  | bool trust, changed; | 
|  | std::tie(trust, changed) = group->checkTrust(sensor); | 
|  |  | 
|  | if (!trust) | 
|  | { | 
|  | trusted = false; | 
|  |  | 
|  | if (changed) | 
|  | { | 
|  | group->cancelMonitoring(); | 
|  | } | 
|  | } | 
|  | else | 
|  | { | 
|  | if (changed) | 
|  | { | 
|  | group->startMonitoring(); | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | return trusted; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Registers a sensor with any trust groups that are interested | 
|  | * | 
|  | * @param[in] sensor - the sensor to register | 
|  | */ | 
|  | void registerSensor(std::shared_ptr<monitor::TachSensor>& sensor) | 
|  | { | 
|  | std::for_each(groups.begin(), groups.end(), [&sensor](auto& group) { | 
|  | group->registerSensor(sensor); | 
|  | }); | 
|  | } | 
|  |  | 
|  | private: | 
|  | /** | 
|  | * The list of sensor trust groups | 
|  | */ | 
|  | std::vector<std::unique_ptr<Group>> groups; | 
|  | }; | 
|  |  | 
|  | } // namespace trust | 
|  | } // namespace fan | 
|  | } // namespace phosphor |