xref: /openbmc/dbus-sensors/src/PSUSensor.hpp (revision e73bd0a1)
1*e73bd0a1SAndrew Jeffery #pragma once
2*e73bd0a1SAndrew Jeffery 
3*e73bd0a1SAndrew Jeffery #include "PwmSensor.hpp"
4*e73bd0a1SAndrew Jeffery #include "Thresholds.hpp"
5*e73bd0a1SAndrew Jeffery #include "sensor.hpp"
6*e73bd0a1SAndrew Jeffery 
7*e73bd0a1SAndrew Jeffery #include <boost/asio/random_access_file.hpp>
8*e73bd0a1SAndrew Jeffery #include <sdbusplus/asio/object_server.hpp>
9*e73bd0a1SAndrew Jeffery 
10*e73bd0a1SAndrew Jeffery #include <array>
11*e73bd0a1SAndrew Jeffery #include <memory>
12*e73bd0a1SAndrew Jeffery #include <string>
13*e73bd0a1SAndrew Jeffery #include <utility>
14*e73bd0a1SAndrew Jeffery 
15*e73bd0a1SAndrew Jeffery class PSUSensor : public Sensor, public std::enable_shared_from_this<PSUSensor>
16*e73bd0a1SAndrew Jeffery {
17*e73bd0a1SAndrew Jeffery   public:
18*e73bd0a1SAndrew Jeffery     PSUSensor(const std::string& path, const std::string& objectType,
19*e73bd0a1SAndrew Jeffery               sdbusplus::asio::object_server& objectServer,
20*e73bd0a1SAndrew Jeffery               std::shared_ptr<sdbusplus::asio::connection>& conn,
21*e73bd0a1SAndrew Jeffery               boost::asio::io_service& io, const std::string& sensorName,
22*e73bd0a1SAndrew Jeffery               std::vector<thresholds::Threshold>&& thresholds,
23*e73bd0a1SAndrew Jeffery               const std::string& sensorConfiguration,
24*e73bd0a1SAndrew Jeffery               const PowerState& powerState, const std::string& sensorUnits,
25*e73bd0a1SAndrew Jeffery               unsigned int factor, double max, double min, double offset,
26*e73bd0a1SAndrew Jeffery               const std::string& label, size_t tSize, double pollRate);
27*e73bd0a1SAndrew Jeffery     ~PSUSensor() override;
28*e73bd0a1SAndrew Jeffery     void setupRead(void);
29*e73bd0a1SAndrew Jeffery 
30*e73bd0a1SAndrew Jeffery   private:
31*e73bd0a1SAndrew Jeffery     // Note, this buffer is a shared_ptr because during a read, its lifetime
32*e73bd0a1SAndrew Jeffery     // might have to outlive the PSUSensor class if the object gets destroyed
33*e73bd0a1SAndrew Jeffery     // while in the middle of a read operation
34*e73bd0a1SAndrew Jeffery     std::shared_ptr<std::array<char, 128>> buffer;
35*e73bd0a1SAndrew Jeffery     sdbusplus::asio::object_server& objServer;
36*e73bd0a1SAndrew Jeffery     boost::asio::random_access_file inputDev;
37*e73bd0a1SAndrew Jeffery     boost::asio::steady_timer waitTimer;
38*e73bd0a1SAndrew Jeffery     std::string path;
39*e73bd0a1SAndrew Jeffery     unsigned int sensorFactor;
40*e73bd0a1SAndrew Jeffery     double sensorOffset;
41*e73bd0a1SAndrew Jeffery     thresholds::ThresholdTimer thresholdTimer;
42*e73bd0a1SAndrew Jeffery     void restartRead();
43*e73bd0a1SAndrew Jeffery     void handleResponse(const boost::system::error_code& err, size_t bytesRead);
44*e73bd0a1SAndrew Jeffery     void checkThresholds(void) override;
45*e73bd0a1SAndrew Jeffery     unsigned int sensorPollMs = defaultSensorPollMs;
46*e73bd0a1SAndrew Jeffery 
47*e73bd0a1SAndrew Jeffery     static constexpr size_t warnAfterErrorCount = 10;
48*e73bd0a1SAndrew Jeffery 
49*e73bd0a1SAndrew Jeffery   public:
50*e73bd0a1SAndrew Jeffery     static constexpr double defaultSensorPoll = 1.0;
51*e73bd0a1SAndrew Jeffery     static constexpr unsigned int defaultSensorPollMs =
52*e73bd0a1SAndrew Jeffery         static_cast<unsigned int>(defaultSensorPoll * 1000);
53*e73bd0a1SAndrew Jeffery };
54*e73bd0a1SAndrew Jeffery 
55*e73bd0a1SAndrew Jeffery class PSUProperty
56*e73bd0a1SAndrew Jeffery {
57*e73bd0a1SAndrew Jeffery   public:
58*e73bd0a1SAndrew Jeffery     PSUProperty(std::string name, double max, double min, unsigned int factor,
59*e73bd0a1SAndrew Jeffery                 double offset) :
60*e73bd0a1SAndrew Jeffery         labelTypeName(std::move(name)),
61*e73bd0a1SAndrew Jeffery         maxReading(max), minReading(min), sensorScaleFactor(factor),
62*e73bd0a1SAndrew Jeffery         sensorOffset(offset)
63*e73bd0a1SAndrew Jeffery     {}
64*e73bd0a1SAndrew Jeffery     ~PSUProperty() = default;
65*e73bd0a1SAndrew Jeffery 
66*e73bd0a1SAndrew Jeffery     std::string labelTypeName;
67*e73bd0a1SAndrew Jeffery     double maxReading;
68*e73bd0a1SAndrew Jeffery     double minReading;
69*e73bd0a1SAndrew Jeffery     unsigned int sensorScaleFactor;
70*e73bd0a1SAndrew Jeffery     double sensorOffset;
71*e73bd0a1SAndrew Jeffery };
72