blob: f8069f3151dee66a8a4c5e70f44ea5f2ed9fc12b [file] [log] [blame]
Matthew Barth35819382018-04-18 14:53:01 -05001#pragma once
2
Matthew Barth9c431062018-05-07 13:55:29 -05003#include "hwmonio.hpp"
Patrick Venture043d3232018-08-31 10:10:53 -07004#include "sensorset.hpp"
5#include "types.hpp"
6
Patrick Ventureb28f4322018-09-14 10:19:14 -07007#include <chrono>
8#include <gpioplus/handle.hpp>
Patrick Venture2864b062018-12-19 08:13:41 -08009#include <memory>
Patrick Venture043d3232018-08-31 10:10:53 -070010#include <unordered_set>
Matthew Barth35819382018-04-18 14:53:01 -050011
12namespace sensor
13{
14
Matthew Barthcb3daaf2018-05-07 15:03:16 -050015struct valueAdjust
16{
17 double gain = 1.0;
18 int offset = 0;
19 std::unordered_set<int> rmRCs;
20};
21
Matthew Barth9c431062018-05-07 13:55:29 -050022/** @class Sensor
23 * @brief Sensor object based on a SensorSet container's key type
24 * @details Sensor object to create and modify an associated device's sensor
25 * attributes based on the key type of each sensor in the set provided by the
26 * device.
27 */
28class Sensor
29{
Patrick Venture043d3232018-08-31 10:10:53 -070030 public:
31 Sensor() = delete;
32 Sensor(const Sensor&) = delete;
33 Sensor(Sensor&&) = default;
34 Sensor& operator=(const Sensor&) = delete;
35 Sensor& operator=(Sensor&&) = default;
36 ~Sensor() = default;
Matthew Barth9c431062018-05-07 13:55:29 -050037
Patrick Venture043d3232018-08-31 10:10:53 -070038 /**
39 * @brief Constructs Sensor object
40 *
41 * @param[in] sensor - A pair of sensor indentifiers
42 * @param[in] ioAccess - Hwmon sysfs access
43 * @param[in] devPath - Device sysfs path
44 */
45 explicit Sensor(const SensorSet::key_type& sensor,
Patrick Venture2864b062018-12-19 08:13:41 -080046 const hwmonio::HwmonIOInterface* ioAccess,
Patrick Venture043d3232018-08-31 10:10:53 -070047 const std::string& devPath);
Matthew Barth2e41b132018-05-07 14:15:45 -050048
Patrick Venture043d3232018-08-31 10:10:53 -070049 /**
50 * @brief Adds any sensor removal return codes for the sensor
51 * @details Add all return codes defined within a device's config file
52 * for the entire device or for the specific sensor.
53 *
54 * @param[in] rcList - List of return codes found for the sensor
55 */
56 void addRemoveRCs(const std::string& rcList);
Matthew Barthcb3daaf2018-05-07 15:03:16 -050057
Patrick Venture043d3232018-08-31 10:10:53 -070058 /**
59 * @brief Get the adjustments struct for the sensor
60 *
61 * @return - Sensor adjustment struct
62 */
63 inline const valueAdjust& getAdjusts()
64 {
Patrick Venture12659aa2018-12-19 13:58:43 -080065 return _sensorAdjusts;
Patrick Venture043d3232018-08-31 10:10:53 -070066 }
Matthew Barthac473092018-05-07 14:41:46 -050067
Patrick Venture043d3232018-08-31 10:10:53 -070068 /**
69 * @brief Adjusts a sensor value
70 * @details Adjusts the value given by any gain and/or offset defined
71 * for this sensor object and returns that adjusted value.
72 *
73 * @param[in] value - Value to be adjusted
74 *
75 * @return - Adjusted sensor value
76 */
James Feistee73f5b2018-08-01 16:31:42 -070077 SensorValueType adjustValue(SensorValueType value);
Matthew Barthcb3daaf2018-05-07 15:03:16 -050078
Patrick Venture043d3232018-08-31 10:10:53 -070079 /**
80 * @brief Add value interface and value property for sensor
81 * @details When a sensor has an associated input file, the Sensor.Value
82 * interface is added along with setting the Value property to the
83 * corresponding value found in the input file.
84 *
85 * @param[in] retryIO - Hwmon sysfs file retry constraints
86 * (number of and delay between)
87 * @param[in] info - Sensor object information
88 *
89 * @return - Shared pointer to the value object
90 */
91 std::shared_ptr<ValueObject> addValue(const RetryIO& retryIO,
92 ObjectInfo& info);
Matthew Barthcb3daaf2018-05-07 15:03:16 -050093
Patrick Venture043d3232018-08-31 10:10:53 -070094 /**
95 * @brief Add status interface and functional property for sensor
96 * @details When a sensor has an associated fault file, the
97 * OperationalStatus interface is added along with setting the
98 * Functional property to the corresponding value found in the
99 * fault file.
100 *
101 * @param[in] info - Sensor object information
102 *
103 * @return - Shared pointer to the status object
104 */
105 std::shared_ptr<StatusObject> addStatus(ObjectInfo& info);
Matthew Barth9c431062018-05-07 13:55:29 -0500106
Patrick Ventureb28f4322018-09-14 10:19:14 -0700107 /**
108 * @brief Unlock the gpio, set to high if relevant.
109 */
110 void unlockGpio();
111
112 /**
113 * @brief Lock the gpio, set to low if relevant.
114 */
115 void lockGpio();
116
James Feistee73f5b2018-08-01 16:31:42 -0700117 /**
118 * @brief Get the scale from the sensor.
119 *
120 * @return - Scale value
121 */
122 inline int64_t getScale(void)
123 {
Patrick Venture12659aa2018-12-19 13:58:43 -0800124 return _scale;
James Feistee73f5b2018-08-01 16:31:42 -0700125 }
126
Patrick Venture043d3232018-08-31 10:10:53 -0700127 private:
128 /** @brief Sensor object's identifiers */
Patrick Venture12659aa2018-12-19 13:58:43 -0800129 SensorSet::key_type _sensor;
Matthew Barth9c431062018-05-07 13:55:29 -0500130
Patrick Venture043d3232018-08-31 10:10:53 -0700131 /** @brief Hwmon sysfs access. */
Patrick Venture12659aa2018-12-19 13:58:43 -0800132 const hwmonio::HwmonIOInterface* _ioAccess;
Matthew Barth2e41b132018-05-07 14:15:45 -0500133
Patrick Venture043d3232018-08-31 10:10:53 -0700134 /** @brief Physical device sysfs path. */
Patrick Venture12659aa2018-12-19 13:58:43 -0800135 const std::string& _devPath;
Matthew Barthcb3daaf2018-05-07 15:03:16 -0500136
Patrick Venture043d3232018-08-31 10:10:53 -0700137 /** @brief Structure for storing sensor adjustments */
Patrick Venture12659aa2018-12-19 13:58:43 -0800138 valueAdjust _sensorAdjusts;
Patrick Ventureb28f4322018-09-14 10:19:14 -0700139
140 /** @brief Optional pointer to GPIO handle. */
Patrick Venture12659aa2018-12-19 13:58:43 -0800141 std::unique_ptr<gpioplus::HandleInterface> _handle;
Patrick Ventureb28f4322018-09-14 10:19:14 -0700142
143 /** @brief default pause after unlocking gpio. */
Patrick Venture12659aa2018-12-19 13:58:43 -0800144 static constexpr std::chrono::milliseconds _pause{500};
James Feistee73f5b2018-08-01 16:31:42 -0700145
146 /** @brief sensor scale from configuration. */
Patrick Venture12659aa2018-12-19 13:58:43 -0800147 int64_t _scale;
Matthew Barth2e41b132018-05-07 14:15:45 -0500148};
Matthew Barth35819382018-04-18 14:53:01 -0500149
150} // namespace sensor