summaryrefslogtreecommitdiffstats
path: root/sensorhandler.cpp
diff options
context:
space:
mode:
authorSui Chen <suichen@google.com>2019-09-11 10:28:35 -0700
committerVernon Mauery <vernon.mauery@linux.intel.com>2019-10-28 15:49:14 +0000
commit4cc42556be1e69f1210e3a0a0bcff49078e39ec6 (patch)
tree6da7fa0148f67a4cd863dbaf8d6a04b4c3871121 /sensorhandler.cpp
parent4c3feba5ad044190c4d3b7898e02d8a1a4b42f39 (diff)
downloadphosphor-host-ipmid-4cc42556be1e69f1210e3a0a0bcff49078e39ec6.tar.gz
phosphor-host-ipmid-4cc42556be1e69f1210e3a0a0bcff49078e39ec6.zip
Refactor ipmi::sensor::GetSensorResponse away from std::array
This change refactors GetSensorResponse from std::array to struct. This change depends on change #23544. GetSensorResponse is an internal, intermediate structure, an unpacked form of a Get Sensor Reading response, providing direct access to its fields. Its life time is: GetReadingResponse -> GetSensorResponse -> ipmi::RspType. It is written to in 5 functions in the ipmi::sensor::get namespace, by four setter functions (setOffset, setReading, setAssertionBytes, enableScanning). It is currently read from by 1 function (ipmiSensorGetSensorReading) for transforming to an ipmi::RspType. Originally, the setter functions assumed bitwise equivalence between GetSensorResponse and GetReadingResponse, and the setter functions used reinterpret_cast to assign to a GetSensorResponse as if it were a GetReadingResponse. With this change, the reinterpret_cast's are removed, and the set functions now accept GetSensorResponse instead of GetReadingResponse, so the code gets a bit easier to read. Tested: Tested using a server with a BMC; sensor readings obtained through `ipmitool` appear to be correct (the reading might change within a small range): # ipmitool raw 0x04 0x2d 0x16 9B 40 00 00 Signed-off-by: Sui Chen <suichen@google.com> Change-Id: I5d454d6249f5431fb98169e6ef7c585c34024004
Diffstat (limited to 'sensorhandler.cpp')
-rw-r--r--sensorhandler.cpp37
1 files changed, 10 insertions, 27 deletions
diff --git a/sensorhandler.cpp b/sensorhandler.cpp
index a506c82..473f6bc 100644
--- a/sensorhandler.cpp
+++ b/sensorhandler.cpp
@@ -417,8 +417,8 @@ ipmi::RspType<uint8_t, // sensor reading
uint5_t, // reserved
bool, // reading state
- bool, // sensor scanning state disabled
- bool, // all event message state disabled
+ bool, // 0 = sensor scanning state disabled
+ bool, // 0 = all event messages disabled
uint8_t, // threshold levels states
uint8_t // discrete reading sensor states
@@ -443,32 +443,15 @@ ipmi::RspType<uint8_t, // sensor reading
try
{
- ipmi::sensor::GetSensorResponse getResponse{};
- getResponse = iter->second.getFunc(iter->second);
+ ipmi::sensor::GetSensorResponse getResponse =
+ iter->second.getFunc(iter->second);
- constexpr uint8_t senReadingResp = 0;
- constexpr uint8_t senScanStateResp = 1;
- constexpr uint8_t assertionStatesLsbResp = 2;
- constexpr uint8_t assertionStatesMsbResp = 3;
- constexpr uint8_t senReadStateMask = 0x20;
- constexpr uint8_t senScanStateMask = 0x40;
- constexpr uint8_t allEventMessageStateMask = 0x80;
-
- uint8_t senReading = getResponse[senReadingResp];
- constexpr uint5_t reserved{0};
- bool readState =
- static_cast<bool>(getResponse[senScanStateResp] & senReadStateMask);
- bool senScanState =
- static_cast<bool>(getResponse[senScanStateResp] & senScanStateMask);
- bool allEventMessageState = static_cast<bool>(
- getResponse[senScanStateResp] & allEventMessageStateMask);
-
- uint8_t assertionStatesLsb = getResponse[assertionStatesLsbResp];
- uint8_t assertionStatesMsb = getResponse[assertionStatesMsbResp];
-
- return ipmi::responseSuccess(senReading, reserved, readState,
- senScanState, allEventMessageState,
- assertionStatesLsb, assertionStatesMsb);
+ return ipmi::responseSuccess(getResponse.reading, uint5_t(0),
+ getResponse.readingOrStateUnavailable,
+ getResponse.scanningEnabled,
+ getResponse.allEventMessagesEnabled,
+ getResponse.thresholdLevelsStates,
+ getResponse.discreteReadingSensorStates);
}
#ifdef UPDATE_FUNCTIONAL_ON_FAIL
catch (const SensorFunctionalError& e)
OpenPOWER on IntegriCloud