xref: /openbmc/dbus-sensors/src/adc/ADCSensor.hpp (revision d7be555e)
1*d7be555eSGeorge Liu #pragma once
2*d7be555eSGeorge Liu 
3*d7be555eSGeorge Liu #include "Thresholds.hpp"
4*d7be555eSGeorge Liu #include "sensor.hpp"
5*d7be555eSGeorge Liu 
6*d7be555eSGeorge Liu #include <boost/asio/streambuf.hpp>
7*d7be555eSGeorge Liu #include <gpiod.hpp>
8*d7be555eSGeorge Liu #include <sdbusplus/asio/object_server.hpp>
9*d7be555eSGeorge Liu 
10*d7be555eSGeorge Liu #include <memory>
11*d7be555eSGeorge Liu #include <optional>
12*d7be555eSGeorge Liu #include <stdexcept>
13*d7be555eSGeorge Liu #include <string>
14*d7be555eSGeorge Liu #include <vector>
15*d7be555eSGeorge Liu 
16*d7be555eSGeorge Liu class BridgeGpio
17*d7be555eSGeorge Liu {
18*d7be555eSGeorge Liu   public:
BridgeGpio(const std::string & name,const int polarity,const float setupTime)19*d7be555eSGeorge Liu     BridgeGpio(const std::string& name, const int polarity,
20*d7be555eSGeorge Liu                const float setupTime) :
21*d7be555eSGeorge Liu         setupTimeMs(static_cast<unsigned int>(setupTime * 1000))
22*d7be555eSGeorge Liu     {
23*d7be555eSGeorge Liu         line = gpiod::find_line(name);
24*d7be555eSGeorge Liu         if (!line)
25*d7be555eSGeorge Liu         {
26*d7be555eSGeorge Liu             std::cerr << "Error finding gpio: " << name << "\n";
27*d7be555eSGeorge Liu         }
28*d7be555eSGeorge Liu         else
29*d7be555eSGeorge Liu         {
30*d7be555eSGeorge Liu             try
31*d7be555eSGeorge Liu             {
32*d7be555eSGeorge Liu                 line.request(
33*d7be555eSGeorge Liu                     {"adcsensor", gpiod::line_request::DIRECTION_OUTPUT,
34*d7be555eSGeorge Liu                      polarity == gpiod::line::ACTIVE_HIGH
35*d7be555eSGeorge Liu                          ? 0
36*d7be555eSGeorge Liu                          : gpiod::line_request::FLAG_ACTIVE_LOW});
37*d7be555eSGeorge Liu             }
38*d7be555eSGeorge Liu             catch (const std::system_error&)
39*d7be555eSGeorge Liu             {
40*d7be555eSGeorge Liu                 std::cerr << "Error requesting gpio: " << name << "\n";
41*d7be555eSGeorge Liu             }
42*d7be555eSGeorge Liu         }
43*d7be555eSGeorge Liu     }
44*d7be555eSGeorge Liu 
set(int value)45*d7be555eSGeorge Liu     void set(int value)
46*d7be555eSGeorge Liu     {
47*d7be555eSGeorge Liu         if (line)
48*d7be555eSGeorge Liu         {
49*d7be555eSGeorge Liu             try
50*d7be555eSGeorge Liu             {
51*d7be555eSGeorge Liu                 line.set_value(value);
52*d7be555eSGeorge Liu             }
53*d7be555eSGeorge Liu             catch (const std::system_error& exc)
54*d7be555eSGeorge Liu             {
55*d7be555eSGeorge Liu                 std::cerr << "Error set_value: " << exc.what() << "\n";
56*d7be555eSGeorge Liu             }
57*d7be555eSGeorge Liu         }
58*d7be555eSGeorge Liu     }
59*d7be555eSGeorge Liu 
60*d7be555eSGeorge Liu     unsigned int setupTimeMs;
61*d7be555eSGeorge Liu 
62*d7be555eSGeorge Liu   private:
63*d7be555eSGeorge Liu     gpiod::line line;
64*d7be555eSGeorge Liu };
65*d7be555eSGeorge Liu 
66*d7be555eSGeorge Liu class ADCSensor : public Sensor, public std::enable_shared_from_this<ADCSensor>
67*d7be555eSGeorge Liu {
68*d7be555eSGeorge Liu   public:
69*d7be555eSGeorge Liu     ADCSensor(const std::string& path,
70*d7be555eSGeorge Liu               sdbusplus::asio::object_server& objectServer,
71*d7be555eSGeorge Liu               std::shared_ptr<sdbusplus::asio::connection>& conn,
72*d7be555eSGeorge Liu               boost::asio::io_context& io, const std::string& sensorName,
73*d7be555eSGeorge Liu               std::vector<thresholds::Threshold>&& thresholds,
74*d7be555eSGeorge Liu               double scaleFactor, float pollRate, PowerState readState,
75*d7be555eSGeorge Liu               const std::string& sensorConfiguration,
76*d7be555eSGeorge Liu               std::optional<BridgeGpio>&& bridgeGpio);
77*d7be555eSGeorge Liu     ~ADCSensor() override;
78*d7be555eSGeorge Liu     void setupRead();
79*d7be555eSGeorge Liu 
80*d7be555eSGeorge Liu   private:
81*d7be555eSGeorge Liu     sdbusplus::asio::object_server& objServer;
82*d7be555eSGeorge Liu     boost::asio::posix::stream_descriptor inputDev;
83*d7be555eSGeorge Liu     boost::asio::steady_timer waitTimer;
84*d7be555eSGeorge Liu     std::shared_ptr<boost::asio::streambuf> readBuf;
85*d7be555eSGeorge Liu     std::string path;
86*d7be555eSGeorge Liu     double scaleFactor;
87*d7be555eSGeorge Liu     unsigned int sensorPollMs;
88*d7be555eSGeorge Liu     std::optional<BridgeGpio> bridgeGpio;
89*d7be555eSGeorge Liu     thresholds::ThresholdTimer thresholdTimer;
90*d7be555eSGeorge Liu     void handleResponse(const boost::system::error_code& err);
91*d7be555eSGeorge Liu     void checkThresholds() override;
92*d7be555eSGeorge Liu };
93