| #pragma once | |
| #include "Thresholds.hpp" | |
| #include "sensor.hpp" | |
| #include <boost/asio/streambuf.hpp> | |
| #include <gpiod.hpp> | |
| #include <sdbusplus/asio/object_server.hpp> | |
| #include <memory> | |
| #include <optional> | |
| #include <stdexcept> | |
| #include <string> | |
| #include <vector> | |
| class BridgeGpio | |
| { | |
| public: | |
| BridgeGpio(const std::string& name, const int polarity, | |
| const float setupTime) : | |
| setupTimeMs(static_cast<unsigned int>(setupTime * 1000)) | |
| { | |
| line = gpiod::find_line(name); | |
| if (!line) | |
| { | |
| std::cerr << "Error finding gpio: " << name << "\n"; | |
| } | |
| else | |
| { | |
| try | |
| { | |
| line.request({"adcsensor", | |
| gpiod::line_request::DIRECTION_OUTPUT, | |
| polarity == gpiod::line::ACTIVE_HIGH | |
| ? 0 | |
| : gpiod::line_request::FLAG_ACTIVE_LOW}); | |
| } | |
| catch (const std::system_error&) | |
| { | |
| std::cerr << "Error requesting gpio: " << name << "\n"; | |
| } | |
| } | |
| } | |
| void set(int value) | |
| { | |
| if (line) | |
| { | |
| try | |
| { | |
| line.set_value(value); | |
| } | |
| catch (const std::system_error& exc) | |
| { | |
| std::cerr << "Error set_value: " << exc.what() << "\n"; | |
| } | |
| } | |
| } | |
| unsigned int setupTimeMs; | |
| private: | |
| gpiod::line line; | |
| }; | |
| class ADCSensor : public Sensor, public std::enable_shared_from_this<ADCSensor> | |
| { | |
| public: | |
| ADCSensor(const std::string& path, | |
| sdbusplus::asio::object_server& objectServer, | |
| std::shared_ptr<sdbusplus::asio::connection>& conn, | |
| boost::asio::io_context& io, const std::string& sensorName, | |
| std::vector<thresholds::Threshold>&& thresholds, | |
| double scaleFactor, float pollRate, PowerState readState, | |
| const std::string& sensorConfiguration, | |
| std::optional<BridgeGpio>&& bridgeGpio); | |
| ~ADCSensor() override; | |
| void setupRead(); | |
| private: | |
| sdbusplus::asio::object_server& objServer; | |
| boost::asio::posix::stream_descriptor inputDev; | |
| boost::asio::steady_timer waitTimer; | |
| std::shared_ptr<boost::asio::streambuf> readBuf; | |
| std::string path; | |
| double scaleFactor; | |
| unsigned int sensorPollMs; | |
| std::optional<BridgeGpio> bridgeGpio; | |
| thresholds::ThresholdTimer thresholdTimer; | |
| void handleResponse(const boost::system::error_code& err); | |
| void checkThresholds() override; | |
| }; |