xref: /openbmc/phosphor-fan-presence/presence/tach.hpp (revision dfddd648cb81b27492afead4e2346f5fcd1397cb)
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