blob: 9a9050e320a939a2eb63d12df09af332b841e493 [file] [log] [blame]
James Feist6714a252018-09-10 15:26:18 -07001#pragma once
2
Andrew Jefferye73bd0a2023-01-25 10:39:57 +10303#include "Thresholds.hpp"
Ed Tanous18b61862025-01-30 10:56:28 -08004#include "Utils.hpp"
Andrew Jefferye73bd0a2023-01-25 10:39:57 +10305#include "sensor.hpp"
6
Ed Tanous18b61862025-01-30 10:56:28 -08007#include <boost/asio/io_context.hpp>
8#include <boost/asio/posix/stream_descriptor.hpp>
9#include <boost/asio/steady_timer.hpp>
James Feist8086aba2020-08-25 16:00:59 -070010#include <boost/asio/streambuf.hpp>
Jae Hyun Yoo12bbae02019-07-22 17:24:09 -070011#include <gpiod.hpp>
Ed Tanous18b61862025-01-30 10:56:28 -080012#include <sdbusplus/asio/connection.hpp>
James Feist38fb5982020-05-28 10:09:54 -070013#include <sdbusplus/asio/object_server.hpp>
14
Ed Tanous18b61862025-01-30 10:56:28 -080015#include <iostream>
Patrick Venturefd6ba732019-10-31 14:27:39 -070016#include <memory>
Zhu, Yungea5b1bbc2019-04-09 19:49:36 -040017#include <optional>
Patrick Venturefd6ba732019-10-31 14:27:39 -070018#include <string>
Ed Tanous18b61862025-01-30 10:56:28 -080019#include <system_error>
Patrick Venturefd6ba732019-10-31 14:27:39 -070020#include <vector>
James Feist6714a252018-09-10 15:26:18 -070021
Jae Hyun Yoo12bbae02019-07-22 17:24:09 -070022class BridgeGpio
23{
24 public:
Zev Weissf72eb832021-06-25 05:55:08 +000025 BridgeGpio(const std::string& name, const int polarity,
26 const float setupTime) :
27 setupTimeMs(static_cast<unsigned int>(setupTime * 1000))
Jae Hyun Yoo12bbae02019-07-22 17:24:09 -070028 {
29 line = gpiod::find_line(name);
30 if (!line)
31 {
32 std::cerr << "Error finding gpio: " << name << "\n";
33 }
34 else
35 {
36 try
37 {
Patrick Williams2aaf7172024-08-16 15:20:40 -040038 line.request(
39 {"adcsensor", gpiod::line_request::DIRECTION_OUTPUT,
40 polarity == gpiod::line::ACTIVE_HIGH
41 ? 0
42 : gpiod::line_request::FLAG_ACTIVE_LOW});
Jae Hyun Yoo12bbae02019-07-22 17:24:09 -070043 }
Patrick Williams26601e82021-10-06 12:43:25 -050044 catch (const std::system_error&)
Jae Hyun Yoo12bbae02019-07-22 17:24:09 -070045 {
46 std::cerr << "Error requesting gpio: " << name << "\n";
47 }
48 }
49 }
50
51 void set(int value)
52 {
53 if (line)
54 {
Yong Li17aba772020-04-09 15:48:46 +080055 try
56 {
57 line.set_value(value);
58 }
Patrick Williams26601e82021-10-06 12:43:25 -050059 catch (const std::system_error& exc)
Yong Li17aba772020-04-09 15:48:46 +080060 {
61 std::cerr << "Error set_value: " << exc.what() << "\n";
62 }
Jae Hyun Yoo12bbae02019-07-22 17:24:09 -070063 }
64 }
65
Zev Weissf72eb832021-06-25 05:55:08 +000066 unsigned int setupTimeMs;
67
Jae Hyun Yoo12bbae02019-07-22 17:24:09 -070068 private:
69 gpiod::line line;
70};
71
Yong Li1afda6b2020-04-09 19:24:13 +080072class ADCSensor : public Sensor, public std::enable_shared_from_this<ADCSensor>
James Feist6714a252018-09-10 15:26:18 -070073{
74 public:
James Feistd8705872019-02-08 13:26:09 -080075 ADCSensor(const std::string& path,
76 sdbusplus::asio::object_server& objectServer,
77 std::shared_ptr<sdbusplus::asio::connection>& conn,
Ed Tanous1f978632023-02-28 18:16:39 -080078 boost::asio::io_context& io, const std::string& sensorName,
James Feistd8705872019-02-08 13:26:09 -080079 std::vector<thresholds::Threshold>&& thresholds,
Ed Tanous2049bd22022-07-09 07:20:26 -070080 double scaleFactor, float pollRate, PowerState readState,
81 const std::string& sensorConfiguration,
Jae Hyun Yoo1cbd1c62019-07-29 15:02:43 -070082 std::optional<BridgeGpio>&& bridgeGpio);
Ed Tanous8a57ec02020-10-09 12:46:52 -070083 ~ADCSensor() override;
Ed Tanous201a1012024-04-03 18:07:28 -070084 void setupRead();
James Feist6714a252018-09-10 15:26:18 -070085
86 private:
James Feistd8705872019-02-08 13:26:09 -080087 sdbusplus::asio::object_server& objServer;
Jae Hyun Yoo9ced0a32018-10-25 10:42:39 -070088 boost::asio::posix::stream_descriptor inputDev;
Ed Tanous9b4a20e2022-09-06 08:47:11 -070089 boost::asio::steady_timer waitTimer;
Yong Li1afda6b2020-04-09 19:24:13 +080090 std::shared_ptr<boost::asio::streambuf> readBuf;
James Feist930fcde2019-05-28 12:58:43 -070091 std::string path;
Jae Hyun Yoo9ced0a32018-10-25 10:42:39 -070092 double scaleFactor;
Jeff Lind9cd7042020-11-20 15:49:28 +080093 unsigned int sensorPollMs;
Jae Hyun Yoo12bbae02019-07-22 17:24:09 -070094 std::optional<BridgeGpio> bridgeGpio;
James Feist46342ec2019-03-06 14:03:41 -080095 thresholds::ThresholdTimer thresholdTimer;
James Feistd8705872019-02-08 13:26:09 -080096 void handleResponse(const boost::system::error_code& err);
Ed Tanous201a1012024-04-03 18:07:28 -070097 void checkThresholds() override;
Thang Tranaf1724b2024-12-09 13:37:01 +070098 void restartRead();
Jae Hyun Yoo9ced0a32018-10-25 10:42:39 -070099};