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/src/ADCSensorMain.cpp b/src/ADCSensorMain.cpp
index 188aad9..8a88244 100644
--- a/src/ADCSensorMain.cpp
+++ b/src/ADCSensorMain.cpp
@@ -230,21 +230,41 @@
             }
         }
 
-        auto findBridgeGpio = baseConfiguration->second.find("BridgeGpio");
-        std::optional<int> gpioNum;
-
-        if (findBridgeGpio != baseConfiguration->second.end())
+        std::optional<BridgeGpio> bridgeGpio;
+        for (const SensorBaseConfiguration& suppConfig : *sensorData)
         {
-            int gpioPin =
-                std::visit(VariantToIntVisitor(), findBridgeGpio->second);
-            gpioNum = static_cast<std::optional<int>>(gpioPin);
+            if (suppConfig.first.find("BridgeGpio") != std::string::npos)
+            {
+                auto findName = suppConfig.second.find("Name");
+                if (findName != suppConfig.second.end())
+                {
+                    std::string gpioName =
+                        std::visit(VariantToStringVisitor(), findName->second);
+
+                    int polarity = gpiod::line::ACTIVE_HIGH;
+                    auto findPolarity = suppConfig.second.find("Polarity");
+                    if (findPolarity != suppConfig.second.end())
+                    {
+                        if (std::string("Low") ==
+                            std::visit(VariantToStringVisitor(),
+                                       findPolarity->second))
+                        {
+                            polarity = gpiod::line::ACTIVE_LOW;
+                        }
+                    }
+                    bridgeGpio = BridgeGpio(gpioName, polarity);
+                }
+
+                break;
+            }
         }
+
         auto& sensor = sensors[sensorName];
         sensor = nullptr;
         sensor = std::make_unique<ADCSensor>(
             path.string(), objectServer, dbusConnection, io, sensorName,
             std::move(sensorThresholds), scaleFactor, readState, *interfacePath,
-            gpioNum);
+            bridgeGpio);
     }
 }