blob: 003763ce8e9e7ecff416f6423f15d6f75a65b6a5 [file] [log] [blame]
Matt Spinlerabf8da32017-04-27 14:08:45 -05001#pragma once
2
3#include <chrono>
4#include <sdbusplus/bus.hpp>
5#include <sdbusplus/server.hpp>
6
7namespace phosphor
8{
9namespace fan
10{
11namespace monitor
12{
13
14class Fan;
15
16
17/**
18 * @class TachSensor
19 *
20 * This class represents the sensor that reads a tach value.
21 * It may also support a Target, which is the property used to
22 * set a speed. Since it doesn't necessarily have a Target, it
23 * won't for sure know if it is running too slow, so it leaves
24 * that determination to other code.
25 *
26 * This class has a parent Fan object that knows about all
27 * sensors for that fan.
28 */
29class TachSensor
30{
31 public:
32
33 TachSensor() = delete;
34 TachSensor(const TachSensor&) = delete;
35 TachSensor(TachSensor&&) = default;
36 TachSensor& operator=(const TachSensor&) = delete;
37 TachSensor& operator=(TachSensor&&) = default;
38 ~TachSensor() = default;
39
40 /**
41 * @brief Constructor
42 *
43 * @param[in] bus - the dbus object
44 * @param[in] fan - the parent fan object
45 * @param[in] id - the id of the sensor
46 * @param[in] hasTarget - if the sensor supports
47 * setting the speed
48 * @param[in] timeout - Normal timeout value to use
49 */
50 TachSensor(sdbusplus::bus::bus& bus,
51 Fan& fan,
52 const std::string& id,
53 bool hasTarget,
54 size_t timeout);
55
56 /**
57 * @brief Returns the target speed value
58 */
59 inline uint64_t getTarget() const
60 {
61 return _tachTarget;
62 }
63
64 /**
65 * @brief Returns the input speed value
66 */
67 inline int64_t getInput() const
68 {
69 return _tachInput;
70 }
71
72 /**
73 * @brief Returns true if sensor has a target
74 */
75 inline bool hasTarget() const
76 {
77 return _hasTarget;
78 }
79
80 /**
81 * Returns true if the hardware behind this
82 * sensor is considered working OK/functional.
83 */
84 inline bool functional() const
85 {
86 return _functional;
87 }
88
89 /**
90 * Sets functional status
91 */
92 inline void setFunctional(bool functional)
93 {
94 _functional = functional;
95 }
96
97 private:
98
99 /**
Matt Spinlerebaae612017-04-27 14:21:48 -0500100 * @brief Returns the service name for reading the sensor
101 */
102 std::string getService();
103
104 /**
105 * @brief Returns the match string to use for matching
106 * on a properties changed signal.
107 */
108 std::string getMatchString(const std::string& interface);
109
110 /**
111 * @brief Callback function for a tach input properties
112 * changed signal
113 *
114 * @param[in] msg - the dbus message
115 * @param[in] data - user data
116 * @param[in] err - dbus error
117 */
118 static int handleTachChangeSignal(sd_bus_message* msg,
119 void* data,
120 sd_bus_error* err);
121
122 /**
123 * @brief Callback function for a Target properties
124 * changed signal
125 *
126 * @param[in] msg - the dbus message
127 * @param[in] data - user data
128 * @param[in] err - dbus error
129 */
130 static int handleTargetChangeSignal(sd_bus_message* msg,
131 void* data,
132 sd_bus_error* err);
133
134 /**
135 * @brief Reads the Target property and stores in _tachTarget.
136 * Also calls Fan::tachChanged().
137 *
138 * @param[in] msg - the dbus message
139 * @param[in] err - dbus error
140 */
141 void handleTargetChange(sdbusplus::message::message& msg,
142 sd_bus_error* err);
143
144 /**
145 * @brief Reads the Value property and stores in _tachInput.
146 * Also calls Fan::tachChanged().
147 *
148 * @param[in] msg - the dbus message
149 * @param[in] err - dbus error
150 */
151 void handleTachChange(sdbusplus::message::message& msg,
152 sd_bus_error* err);
153
154
155 /**
Matt Spinlerabf8da32017-04-27 14:08:45 -0500156 * @brief the dbus object
157 */
158 sdbusplus::bus::bus& _bus;
159
160 /**
161 * @brief Reference to the parent Fan object
162 */
163 Fan& _fan;
164
165 /**
166 * @brief The name of the sensor, including the full path
167 *
168 * For example /xyz/openbmc_project/sensors/fan_tach/fan0
169 */
170 const std::string _name;
171
172 /**
173 * @brief If functional (not too slow). The parent
174 * fan object sets this.
175 */
176 bool _functional = true;
177
178 /**
179 * @brief If the sensor has a Target property (can set speed)
180 */
181 const bool _hasTarget;
182
183 /**
184 * @brief The input speed, from the Value dbus property
185 */
186 int64_t _tachInput = 0;
187
188 /**
189 * @brief The current target speed, from the Target dbus property
190 * (if applicable)
191 */
192 uint64_t _tachTarget = 0;
193
194 /**
195 * @brief The timeout value to use
196 */
197 const size_t _timeout;
Matt Spinlerebaae612017-04-27 14:21:48 -0500198
199 /**
200 * @brief The match object for the Value properties changed signal
201 */
202 std::unique_ptr<sdbusplus::server::match::match> tachSignal;
203
204 /**
205 * @brief The match object for the Target properties changed signal
206 */
207 std::unique_ptr<sdbusplus::server::match::match> targetSignal;
Matt Spinlerabf8da32017-04-27 14:08:45 -0500208};
209
210}
211}
212}