blob: d23a2b798322896ec2380cba6a58e6d7f5a9108c [file] [log] [blame]
Shawn McCarney0a450192021-04-12 16:13:24 -05001/**
2 * Copyright © 2021 IBM Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#pragma once
17
18#include "services.hpp"
19
20#include <string>
21
22namespace phosphor::power::regulators
23{
24
25/**
26 * Voltage regulator sensor type.
27 */
28enum class SensorType
29{
30 /**
31 * Output current.
32 */
33 iout,
34
35 /**
36 * Highest output current.
37 */
38 iout_peak,
39
40 /**
41 * Lowest output current.
42 */
43 iout_valley,
44
45 /**
46 * Output power.
47 */
48 pout,
49
50 /**
51 * Temperature.
52 */
53 temperature,
54
55 /**
56 * Highest temperature.
57 */
58 temperature_peak,
59
60 /**
61 * Output voltage.
62 */
63 vout,
64
65 /**
66 * Highest output voltage.
67 */
68 vout_peak,
69
70 /**
71 * Lowest output voltage.
72 */
73 vout_valley
74};
75
76/**
77 * @namespace sensors
78 *
79 * Contains utility functions related to voltage regulator sensors.
80 */
81namespace sensors
82{
83
84/**
85 * Returns the name of the specified SensorType.
86 *
87 * The returned string will exactly match the enumerator name, such as
88 * "temperature_peak".
89 *
90 * @param type sensor type
91 * @return sensor type name
92 */
93std::string toString(SensorType type)
94{
95 std::string name{};
96 switch (type)
97 {
98 case SensorType::iout:
99 name = "iout";
100 break;
101 case SensorType::iout_peak:
102 name = "iout_peak";
103 break;
104 case SensorType::iout_valley:
105 name = "iout_valley";
106 break;
107 case SensorType::pout:
108 name = "pout";
109 break;
110 case SensorType::temperature:
111 name = "temperature";
112 break;
113 case SensorType::temperature_peak:
114 name = "temperature_peak";
115 break;
116 case SensorType::vout:
117 name = "vout";
118 break;
119 case SensorType::vout_peak:
120 name = "vout_peak";
121 break;
122 case SensorType::vout_valley:
123 name = "vout_valley";
124 break;
125 }
126 return name;
127}
128
129} // namespace sensors
130
131/**
132 * @class Sensors
133 *
134 * Abstract base class for a service that maintains a list of voltage regulator
135 * sensors.
136 *
137 * This service makes the voltage regulator sensors available to other BMC
138 * applications. For example, the Redfish support obtains sensor data from this
139 * service.
140 *
141 * Each voltage rail in the system may provide multiple types of sensor data,
142 * such as temperature, output voltage, and output current (see SensorType). A
143 * sensor tracks one of these data types for a voltage rail.
144 *
145 * Voltage regulator sensors are typically read frequently based on a timer.
146 * Reading all the sensors once is called a monitoring cycle. The application
147 * will loop through all voltage rails, reading all supported sensor types for
148 * each rail. During a monitoring cycle, the following sensor service methods
149 * should be called in the specified order:
150 * - startCycle() // At the start of a sensor monitoring cycle
151 * - startRail() // Before reading all the sensors for one rail
152 * - setValue() // To set the value of one sensor for the current rail
153 * - endRail() // After reading all the sensors for one rail
154 * - endCycle() // At the end of a sensor monitoring cycle
155 *
156 * This service can be enabled or disabled. It is typically enabled when the
157 * system is powered on and voltage regulators begin producing output. It is
158 * typically disabled when the system is powered off. It can also be
159 * temporarily disabled if other BMC applications need to communicate with the
160 * voltage regulator devices. When the service is disabled, the sensors still
161 * exist but are in an inactive state since their values are not being updated.
162 */
163class Sensors
164{
165 public:
166 // Specify which compiler-generated methods we want
167 Sensors() = default;
168 Sensors(const Sensors&) = delete;
169 Sensors(Sensors&&) = delete;
170 Sensors& operator=(const Sensors&) = delete;
171 Sensors& operator=(Sensors&&) = delete;
172 virtual ~Sensors() = default;
173
174 /**
175 * Enable the sensors service.
176 *
177 * While the service is enabled, the sensors that it provides will be in an
178 * active state. This indicates that their value is being updated
179 * periodically.
180 *
181 * @param services system services
182 */
183 virtual void enable(Services& services) = 0;
184
185 /**
186 * Notify the sensors service that the current sensor monitoring cycle has
187 * ended.
188 *
189 * @param services system services
190 */
191 virtual void endCycle(Services& services) = 0;
192
193 /**
194 * Notify the sensors service that sensor monitoring has ended for the
195 * current voltage rail.
196 *
197 * @param errorOccurred specifies whether an error occurred while trying to
198 * read all the sensors for the current rail
199 * @param services system services
200 */
201 virtual void endRail(bool errorOccurred, Services& services) = 0;
202
203 /**
204 * Disable the sensors service.
205 *
206 * While the service is disabled, the sensors that it provides will be in an
207 * inactive state. This indicates that their value is not being updated.
208 *
209 * @param services system services
210 */
211 virtual void disable(Services& services) = 0;
212
213 /**
214 * Sets the value of one sensor for the current voltage rail.
215 *
216 * @param type sensor type
217 * @param value sensor value
218 * @param services system services
219 */
220 virtual void setValue(SensorType type, double value,
221 Services& services) = 0;
222
223 /**
224 * Notify the sensors service that a sensor monitoring cycle is starting.
225 *
226 * @param services system services
227 */
228 virtual void startCycle(Services& services) = 0;
229
230 /**
231 * Notify the sensors service that sensor monitoring is starting for the
232 * specified voltage rail.
233 *
234 * Calls to setValue() will update sensors for this rail.
235 *
236 * @param rail unique rail ID
237 * @param deviceInventoryPath D-Bus inventory path of the voltage regulator
238 * device that produces the rail
239 * @param chassisInventoryPath D-Bus inventory path of the chassis that
240 * contains the voltage regulator device
241 * @param services system services
242 */
243 virtual void startRail(const std::string& rail,
244 const std::string& deviceInventoryPath,
245 const std::string& chassisInventoryPath,
246 Services& services) = 0;
247};
248
249} // namespace phosphor::power::regulators