From dd4cff135a6436793a13cdff62498a4cccc14320 Mon Sep 17 00:00:00 2001 From: Deepak Kodihalli Date: Tue, 6 Feb 2018 06:48:29 -0600 Subject: dcmi: get sensor info: read config This commit adds the code to read dcmi sensor config, in order to respond to the 'get sensor info' command. Resolves openbmc/openbmc#2623. Change-Id: Id661ec2c1bae214b503308577d7f825a5dfeb629 Signed-off-by: Deepak Kodihalli --- dcmihandler.cpp | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- dcmihandler.hpp | 8 ++++++ 2 files changed, 90 insertions(+), 4 deletions(-) diff --git a/dcmihandler.cpp b/dcmihandler.cpp index 54c8799..fa3b55b 100644 --- a/dcmihandler.cpp +++ b/dcmihandler.cpp @@ -1113,20 +1113,98 @@ namespace dcmi namespace sensor_info { +Response createFromJson(const Json& config) +{ + Response response{}; + uint16_t recordId = config.value("record_id", 0); + response.recordIdLsb = recordId & 0xFF; + response.recordIdMsb = (recordId >> 8) & 0xFF; + return response; +} + std::tuple read(const std::string& type, uint8_t instance, const Json& config) { - Response empty{}; - return std::make_tuple(empty, 0); + Response response{}; + + if (!instance) + { + log("Expected non-zero instance"); + elog(); + } + + static const std::vector empty{}; + std::vector readings = config.value(type, empty); + size_t numInstances = readings.size(); + for (const auto& reading : readings) + { + uint8_t instanceNum = reading.value("instance", 0); + // Not the instance we're interested in + if (instanceNum != instance) + { + continue; + } + + response = createFromJson(reading); + + // Found the instance we're interested in + break; + } + + if (numInstances > maxInstances) + { + log("Trimming IPMI num instances", + entry("NUM_INSTANCES=%d", numInstances)); + numInstances = maxInstances; + } + return std::make_tuple(response, numInstances); } std::tuple readAll(const std::string& type, uint8_t instanceStart, const Json& config) { - ResponseList empty{}; - return std::make_tuple(empty, 0); + ResponseList responses{}; + + size_t numInstances = 0; + static const std::vector empty{}; + std::vector readings = config.value(type, empty); + numInstances = readings.size(); + for (const auto& reading : readings) + { + try + { + // Max of 8 records + if (responses.size() == maxRecords) + { + break; + } + + uint8_t instanceNum = reading.value("instance", 0); + // Not in the instance range we're interested in + if (instanceNum < instanceStart) + { + continue; + } + + Response response = createFromJson(reading); + responses.push_back(response); + } + catch (std::exception& e) + { + log(e.what()); + continue; + } + } + + if (numInstances > maxInstances) + { + log("Trimming IPMI num instances", + entry("NUM_INSTANCES=%d", numInstances)); + numInstances = maxInstances; + } + return std::make_tuple(responses, numInstances); } } // namespace sensor_info diff --git a/dcmihandler.hpp b/dcmihandler.hpp index 09921a0..e2a4c10 100644 --- a/dcmihandler.hpp +++ b/dcmihandler.hpp @@ -449,6 +449,14 @@ namespace temp_readings namespace sensor_info { + /** @brief Create response from JSON config. + * + * @param[in] config - JSON config info about DCMI sensors + * + * @return Sensor info response + */ + Response createFromJson(const Json& config); + /** @brief Read sensor info and fill up DCMI response for the Get * Sensor Info command. This looks at a specific * instance. -- cgit v1.2.1