blob: 8737ebacda05918b3c256e2b6ab79a24d25c0ea2 [file] [log] [blame]
/**
* Copyright © 2020 IBM Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "action_environment.hpp"
#include "i2c_action.hpp"
#include "i2c_interface.hpp"
#include "pmbus_utils.hpp"
#include <cstdint>
#include <optional>
#include <stdexcept>
#include <string>
namespace phosphor::power::regulators
{
/**
* @class PMBusReadSensorAction
*
* Reads one sensor for a PMBus regulator rail. Communicates with the device
* directly using the I2C interface.
*
* Implements the pmbus_read_sensor action in the JSON config file.
*
* Currently supports the linear_11 and linear_16 sensor data formats.
*
* The linear_16 data format requires an exponent value. The exponent value
* can be specified in the constructor. Otherwise the exponent value will be
* obtained from the PMBus VOUT_MODE command. Note that some PMBus devices do
* not support the VOUT_MODE command. The exponent value for a device is often
* found in the device documentation (data sheet).
*/
class PMBusReadSensorAction : public I2CAction
{
public:
// Specify which compiler-generated methods we want
PMBusReadSensorAction() = delete;
PMBusReadSensorAction(const PMBusReadSensorAction&) = delete;
PMBusReadSensorAction(PMBusReadSensorAction&&) = delete;
PMBusReadSensorAction& operator=(const PMBusReadSensorAction&) = delete;
PMBusReadSensorAction& operator=(PMBusReadSensorAction&&) = delete;
virtual ~PMBusReadSensorAction() = default;
/**
* Constructor.
*
* @param type Sensor value type.
* @param command PMBus command code.
* @param format Data format of the sensor value returned by the device.
* @param exponent Exponent value for linear_16 data format.
* Can be positive or negative. If not specified, the
* exponent value will be read from VOUT_MODE.
* Should not be specified if the data format is linear_11.
*/
explicit PMBusReadSensorAction(pmbus_utils::SensorValueType type,
uint8_t command,
pmbus_utils::SensorDataFormat format,
std::optional<int8_t> exponent) :
type{type},
command{command}, format{format}, exponent{exponent}
{
}
/**
* Executes this action.
*
* TODO: Not implemented yet
*
* @param environment Action execution environment.
* @return true
*/
virtual bool execute(ActionEnvironment& /* environment */) override
{
// TODO: Not implemented yet
return true;
}
/**
* Returns the PMBus command code.
*
* @return command
*/
uint8_t getCommand() const
{
return command;
}
/**
* Returns the optional exponent value for linear_16 data format.
*
* @return optional exponent value
*/
std::optional<int8_t> getExponent() const
{
return exponent;
}
/**
* Returns the data format of the sensor value returned by the device.
*
* @return data format
*/
pmbus_utils::SensorDataFormat getFormat() const
{
return format;
}
/**
* Returns the sensor value type.
*
* @return sensor value type.
*/
pmbus_utils::SensorValueType getType() const
{
return type;
}
/**
* Returns a string description of this action.
*
* @return description of action
*/
virtual std::string toString() const override
{
std::ostringstream ss;
ss << "pmbus_read_sensor: { ";
ss << "type: " << pmbus_utils::toString(type) << ", " << std::hex
<< std::uppercase;
ss << "command: 0x" << static_cast<uint16_t>(command) << ", "
<< std::dec << std::nouppercase;
ss << "format: " << pmbus_utils::toString(format);
if (exponent.has_value())
{
ss << ", exponent: " << static_cast<int16_t>(exponent.value());
}
ss << " }";
return ss.str();
}
private:
/**
* Sensor value type.
*/
const pmbus_utils::SensorValueType type{};
/**
* PMBus command code.
*/
const uint8_t command{};
/**
* Data format of the sensor value returned by the device.
*/
const pmbus_utils::SensorDataFormat format{};
/**
* Optional exponent value for linear_16 data format.
*/
const std::optional<int8_t> exponent{};
};
} // namespace phosphor::power::regulators