blob: 73f86e02527e523f4725b53279eb9fb8fe355dc9 [file] [log] [blame]
Brandon Wyman3f1242f2020-01-28 13:11:25 -06001#include "util.hpp"
2
B. J. Wyman681b2a32021-04-20 22:31:22 +00003#include <gpiod.hpp>
4
Brandon Wyman3f1242f2020-01-28 13:11:25 -06005namespace phosphor::power::psu
6{
7
8const UtilBase& getUtils()
9{
10 static Util util;
11 return util;
12}
13
B. J. Wyman681b2a32021-04-20 22:31:22 +000014GPIOReader::GPIOReader(const std::string& namedGpio)
15{
16 try
17 {
18 line = gpiod::find_line(namedGpio);
Adriana Kobylaka588eaf2021-09-20 20:05:25 +000019 if (!line)
20 {
21 throw std::runtime_error("Line does not exist: " + namedGpio);
22 }
B. J. Wyman681b2a32021-04-20 22:31:22 +000023 }
24 catch (std::exception& e)
25 {
26 phosphor::logging::log<phosphor::logging::level::ERR>(
27 fmt::format("Failed to find line: {}", e.what()).c_str());
28 throw;
29 }
30}
31
32std::unique_ptr<GPIOInterface>
33 GPIOReader::createGPIO(const std::string& namedGpio)
34{
35 return std::make_unique<GPIOReader>(namedGpio);
36}
37
B. J. Wymand8b8cb12021-07-15 22:03:34 +000038std::string GPIOReader::getName() const
39{
40 return line.name();
41}
42
B. J. Wyman681b2a32021-04-20 22:31:22 +000043int GPIOReader::read()
44{
45 using namespace phosphor::logging;
46
47 int value = -1;
48
49 if (!line)
50 {
51 log<level::ERR>("Failed line");
52 throw std::runtime_error{std::string{"Failed to find line"}};
53 }
54
55 try
56 {
57 line.request({__FUNCTION__, gpiod::line_request::DIRECTION_INPUT,
58 gpiod::line_request::FLAG_ACTIVE_LOW});
59 try
60 {
61 value = line.get_value();
62 }
63 catch (std::exception& e)
64 {
65 log<level::ERR>(
66 fmt::format("Failed to get_value of GPIO line: {}", e.what())
67 .c_str());
68 line.release();
69 throw;
70 }
71
B. J. Wyman681b2a32021-04-20 22:31:22 +000072 line.release();
73 }
74 catch (std::exception& e)
75 {
76 log<level::ERR>("Failed to request GPIO line",
77 entry("MSG=%s", e.what()));
78 throw;
79 }
80
81 return value;
82}
83
84std::unique_ptr<GPIOInterface> createGPIO(const std::string& namedGpio)
85{
86 return GPIOReader::createGPIO(namedGpio);
87}
88
Brandon Wyman3f1242f2020-01-28 13:11:25 -060089} // namespace phosphor::power::psu