libpldmresponder: Implement GetStateSensorReadings
Register the getStateSensorReadings method and get the state sensor PDR
structure according to the SensorId property.
Tested with JSON file:
https://gist.github.com/lxwinspur/6a40abea7330c25e4d49826e890c4be9
pldmtool raw -d 0x80 0x02 0x21 0x01 0x00 0x01 0x00
Request Message:
08 01 80 02 21 01 00 01 00
Response Message:
08 01 00 02 21 00 01 03 00 00 00
Signed-off-by: George Liu <liuxiwei@inspur.com>
Change-Id: I4faeb1e85f9fd4a2745f592d37be38c28112f5b9
diff --git a/libpldmresponder/platform.cpp b/libpldmresponder/platform.cpp
index 61d09ad..c017486 100644
--- a/libpldmresponder/platform.cpp
+++ b/libpldmresponder/platform.cpp
@@ -7,8 +7,10 @@
#include "pdr_numeric_effecter.hpp"
#include "pdr_state_effecter.hpp"
#include "pdr_state_sensor.hpp"
+#include "pdr_utils.hpp"
#include "platform_numeric_effecter.hpp"
#include "platform_state_effecter.hpp"
+#include "platform_state_sensor.hpp"
namespace pldm
{
@@ -614,6 +616,56 @@
pdrEntry.size = pdrBuffer.size();
repo.addRecord(pdrEntry);
}
+
+Response Handler::getStateSensorReadings(const pldm_msg* request,
+ size_t payloadLength)
+{
+ uint16_t sensorId{};
+ bitfield8_t sensorRearm{};
+ uint8_t reserved{};
+
+ if (payloadLength != PLDM_GET_SENSOR_READING_REQ_BYTES)
+ {
+ return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
+ }
+
+ int rc = decode_get_state_sensor_readings_req(
+ request, payloadLength, &sensorId, &sensorRearm, &reserved);
+
+ if (rc != PLDM_SUCCESS)
+ {
+ return ccOnlyResponse(request, rc);
+ }
+
+ // 0x01 to 0x08
+ uint8_t sensorRearmCout = getBitfieldCount(sensorRearm);
+ std::vector<get_sensor_state_field> stateField(sensorRearmCout);
+ uint8_t comSensorCnt{};
+ const pldm::utils::DBusHandler dBusIntf;
+ rc = platform_state_sensor::getStateSensorReadingsHandler<
+ pldm::utils::DBusHandler, Handler>(
+ dBusIntf, *this, sensorId, sensorRearmCout, comSensorCnt, stateField);
+
+ if (rc != PLDM_SUCCESS)
+ {
+ return ccOnlyResponse(request, rc);
+ }
+
+ Response response(sizeof(pldm_msg_hdr) +
+ PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
+ sizeof(get_sensor_state_field) * comSensorCnt);
+ auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
+ rc = encode_get_state_sensor_readings_resp(request->hdr.instance_id, rc,
+ comSensorCnt, stateField.data(),
+ responsePtr);
+ if (rc != PLDM_SUCCESS)
+ {
+ return ccOnlyResponse(request, rc);
+ }
+
+ return response;
+}
+
} // namespace platform
} // namespace responder
} // namespace pldm