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