1dd62e36eSBrad Bishop #pragma once 2dd62e36eSBrad Bishop 3dd62e36eSBrad Bishop #include "psensor.hpp" 4dd62e36eSBrad Bishop #include "sdbusplus.hpp" 5dd62e36eSBrad Bishop 62d2caa34SMatthew Barth #include <sdbusplus/bus/match.hpp> 72d2caa34SMatthew Barth #include <sdbusplus/message.hpp> 82d2caa34SMatthew Barth 92d2caa34SMatthew Barth #include <string> 102d2caa34SMatthew Barth #include <vector> 112d2caa34SMatthew Barth 12dd62e36eSBrad Bishop namespace phosphor 13dd62e36eSBrad Bishop { 14dd62e36eSBrad Bishop namespace fan 15dd62e36eSBrad Bishop { 16dd62e36eSBrad Bishop namespace presence 17dd62e36eSBrad Bishop { 18dd62e36eSBrad Bishop class RedundancyPolicy; 19dd62e36eSBrad Bishop 20dd62e36eSBrad Bishop /** 21dd62e36eSBrad Bishop * @class Tach 22dd62e36eSBrad Bishop * @brief Fan tach sensor presence implementation. 23dd62e36eSBrad Bishop * 24dd62e36eSBrad Bishop * The Tach class uses one or more tach speed indicators 25dd62e36eSBrad Bishop * to determine presence state. 26dd62e36eSBrad Bishop */ 27dd62e36eSBrad Bishop class Tach : public PresenceSensor 28dd62e36eSBrad Bishop { 29dd62e36eSBrad Bishop public: 30dd62e36eSBrad Bishop /** 31dd62e36eSBrad Bishop * @brief 32dd62e36eSBrad Bishop * 33dd62e36eSBrad Bishop * Cannot move or copy due to this ptr as context 34dd62e36eSBrad Bishop * for sdbus callbacks. 35dd62e36eSBrad Bishop */ 36dd62e36eSBrad Bishop Tach() = delete; 37dd62e36eSBrad Bishop Tach(const Tach&) = delete; 38dd62e36eSBrad Bishop Tach& operator=(const Tach&) = delete; 39dd62e36eSBrad Bishop Tach(Tach&&) = delete; 40dd62e36eSBrad Bishop Tach& operator=(Tach&&) = delete; 41dd62e36eSBrad Bishop ~Tach() = default; 42dd62e36eSBrad Bishop 43dd62e36eSBrad Bishop /** 44dd62e36eSBrad Bishop * @brief ctor 45dd62e36eSBrad Bishop * 46dd62e36eSBrad Bishop * @param[in] sensors - Fan tach sensors for this psensor. 47dd62e36eSBrad Bishop */ 48dd62e36eSBrad Bishop Tach(const std::vector<std::string>& sensors); 49dd62e36eSBrad Bishop 50dd62e36eSBrad Bishop /** 51dd62e36eSBrad Bishop * @brief start 52dd62e36eSBrad Bishop * 53dd62e36eSBrad Bishop * Register for dbus signal callbacks on fan 54dd62e36eSBrad Bishop * tach sensor change. Query initial tach speeds. 55dd62e36eSBrad Bishop * 56dd62e36eSBrad Bishop * @return The current sensor state. 57dd62e36eSBrad Bishop */ 58dd62e36eSBrad Bishop bool start() override; 59dd62e36eSBrad Bishop 60dd62e36eSBrad Bishop /** 61dd62e36eSBrad Bishop * @brief stop 62dd62e36eSBrad Bishop * 63dd62e36eSBrad Bishop * De-register dbus signal callbacks. 64dd62e36eSBrad Bishop */ 65dd62e36eSBrad Bishop void stop() override; 66dd62e36eSBrad Bishop 67dd62e36eSBrad Bishop /** 68dd62e36eSBrad Bishop * @brief Check the sensor. 69dd62e36eSBrad Bishop * 70dd62e36eSBrad Bishop * Query the tach speeds. 71dd62e36eSBrad Bishop */ 72dd62e36eSBrad Bishop bool present() override; 73dd62e36eSBrad Bishop 74c65d91d6SMatt Spinler /** 75c65d91d6SMatt Spinler * @brief Called when this presence sensor doesn't agree with other ones. 76c65d91d6SMatt Spinler * 77c65d91d6SMatt Spinler * @param[in] fanInventoryPath - The fan inventory D-Bus object path. 78c65d91d6SMatt Spinler */ 79c65d91d6SMatt Spinler void logConflict(const std::string& fanInventoryPath) const override; 80c65d91d6SMatt Spinler 81dd62e36eSBrad Bishop private: 82dd62e36eSBrad Bishop /** 83dd62e36eSBrad Bishop * @brief Get the policy associated with this sensor. 84dd62e36eSBrad Bishop */ 85dd62e36eSBrad Bishop virtual RedundancyPolicy& getPolicy() = 0; 86dd62e36eSBrad Bishop 87dd62e36eSBrad Bishop /** 88dd62e36eSBrad Bishop * @brief Properties changed handler for tach sensor updates. 89dd62e36eSBrad Bishop * 90dd62e36eSBrad Bishop * @param[in] sensor - The sensor that changed. 91dd62e36eSBrad Bishop * @param[in] props - The properties that changed. 92dd62e36eSBrad Bishop */ 93*dfddd648SPatrick Williams void propertiesChanged( 94*dfddd648SPatrick Williams size_t sensor, const phosphor::fan::util::Properties<double>& props); 95dd62e36eSBrad Bishop 96dd62e36eSBrad Bishop /** 97dd62e36eSBrad Bishop * @brief Properties changed handler for tach sensor updates. 98dd62e36eSBrad Bishop * 99dd62e36eSBrad Bishop * @param[in] sensor - The sensor that changed. 100dd62e36eSBrad Bishop * @param[in] msg - The sdbusplus signal message. 101dd62e36eSBrad Bishop */ 102cb356d48SPatrick Williams void propertiesChanged(size_t sensor, sdbusplus::message_t& msg); 103dd62e36eSBrad Bishop 104dd62e36eSBrad Bishop /** @brief array of tach sensors dbus matches, and tach values. */ 105cb356d48SPatrick Williams std::vector<std::tuple<std::string, 106cb356d48SPatrick Williams std::unique_ptr<sdbusplus::bus::match_t>, double>> 1072d2caa34SMatthew Barth state; 108dd62e36eSBrad Bishop 109dd62e36eSBrad Bishop /** The current state of the sensor. */ 110dd62e36eSBrad Bishop bool currentState; 111dd62e36eSBrad Bishop }; 112dd62e36eSBrad Bishop 113dd62e36eSBrad Bishop } // namespace presence 114dd62e36eSBrad Bishop } // namespace fan 115dd62e36eSBrad Bishop } // namespace phosphor 116