adcsensor: improve bridge gpio handling

This commit improves bridge gpio handling using name based gpio line
access and polarity setting support.

Tested: P3VBAT sensor reading worked correctly.

Change-Id: Iff174c52dba90cc068f4b5e527d4ab1c381817d0
Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>
diff --git a/include/ADCSensor.hpp b/include/ADCSensor.hpp
index b5a9e9a..e061138 100644
--- a/include/ADCSensor.hpp
+++ b/include/ADCSensor.hpp
@@ -1,10 +1,50 @@
 #pragma once
 
 #include <Thresholds.hpp>
+#include <gpiod.hpp>
 #include <optional>
 #include <sdbusplus/asio/object_server.hpp>
 #include <sensor.hpp>
 
+class BridgeGpio
+{
+  public:
+    BridgeGpio(const std::string& name, const int polarity)
+    {
+        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 (std::system_error&)
+            {
+                std::cerr << "Error requesting gpio: " << name << "\n";
+            }
+        }
+    }
+
+    void set(int value)
+    {
+        if (line)
+        {
+            line.set_value(value);
+        }
+    }
+
+  private:
+    gpiod::line line;
+};
+
 class ADCSensor : public Sensor
 {
   public:
@@ -15,7 +55,7 @@
               std::vector<thresholds::Threshold>&& thresholds,
               const double scaleFactor, PowerState readState,
               const std::string& sensorConfiguration,
-              std::optional<int> bridgeGpio);
+              std::optional<BridgeGpio> bridgeGpio);
     ~ADCSensor();
 
   private:
@@ -26,7 +66,7 @@
     std::string path;
     int errCount;
     double scaleFactor;
-    std::optional<int> bridgeGpio;
+    std::optional<BridgeGpio> bridgeGpio;
     PowerState readState;
     thresholds::ThresholdTimer thresholdTimer;
     void setupRead(void);