Support numeric effecters in dbus-to-host-effecter
Adds support of the numeric effecter PDR (section `28.11 Numeric
Effecter PDR` DSP0248 V1.3.0) type in dbus-to-host-effecter handler.
This handler will be applied for all PLDM termini but not only host.
The setting for one numeric effecter of one device can be:
{
"mctp_eid": 20,
"effecter_info": {
"effecterPdrType": 9,
"effecterID": 2,
"entityType": 32903,
"entityInstance": 2,
"containerID": 2,
"compositeEffecterCount": 1,
"checkHostState": false
},
"effecters": [
{
"dbus_info": {
"object_path": "/xyz/openbmc_project/sensors/power/A",
"interface": "xyz.openbmc_project.Sensor.Value",
"property_name": "Value",
"property_type": "double"
},
"effecterDataSize": 5,
"resolution": 1,
"offset": 0,
"unitModifier": 0
}
]
}
Where:
+ effecterPdrType to difference state/numeric effecter type. Default
is state effecter.
+ effecterID should be effecter ID and should not empty.
+ checkHostState can be set to false to bypass checking host state.
+ effecterDataSize, resolution, offset, unitModifier are from numeric
effecter PDR (section `28.11 Numeric Effecter PDR` DSP0248 V1.3.0)
Signed-off-by: Thu Nguyen <thu@os.amperecomputing.com>
Change-Id: I438d7f204643edd4066e8a6ba28d53a97503fc4b
diff --git a/common/utils.cpp b/common/utils.cpp
index e652021..6f39321 100644
--- a/common/utils.cpp
+++ b/common/utils.cpp
@@ -677,5 +677,66 @@
}
return name;
}
+
+bool dbusPropValuesToDouble(const std::string_view& type,
+ const pldm::utils::PropertyValue& value,
+ double* doubleValue)
+{
+ if (!dbusValueNumericTypeNames.contains(type))
+ {
+ return false;
+ }
+
+ if (!doubleValue)
+ {
+ return false;
+ }
+
+ try
+ {
+ if (type == "uint8_t")
+ {
+ *doubleValue = static_cast<double>(std::get<uint8_t>(value));
+ }
+ else if (type == "int16_t")
+ {
+ *doubleValue = static_cast<double>(std::get<int16_t>(value));
+ }
+ else if (type == "uint16_t")
+ {
+ *doubleValue = static_cast<double>(std::get<uint16_t>(value));
+ }
+ else if (type == "int32_t")
+ {
+ *doubleValue = static_cast<double>(std::get<int32_t>(value));
+ }
+ else if (type == "uint32_t")
+ {
+ *doubleValue = static_cast<double>(std::get<uint32_t>(value));
+ }
+ else if (type == "int64_t")
+ {
+ *doubleValue = static_cast<double>(std::get<int64_t>(value));
+ }
+ else if (type == "uint64_t")
+ {
+ *doubleValue = static_cast<double>(std::get<uint64_t>(value));
+ }
+ else if (type == "double")
+ {
+ *doubleValue = static_cast<double>(std::get<double>(value));
+ }
+ else
+ {
+ return false;
+ }
+ }
+ catch (const std::exception& e)
+ {
+ return false;
+ }
+
+ return true;
+}
} // namespace utils
} // namespace pldm