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);
}
}