/** * 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 "sensors.hpp" #include #include #include 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 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(SensorType type, uint8_t command, pmbus_utils::SensorDataFormat format, std::optional exponent) : type{type}, command{command}, format{format}, exponent{exponent} {} /** * Executes this action. * * Reads one sensor using the I2C interface. * * The sensor type is specified in the constructor. * * The PMBus command code is specified in the constructor. * It is the register to read on the device. * * The sensor data format is specified in the constructor. Currently * the linear_11 and linear_16 formats are supported. * * The linear_16 data format requires an exponent value. * If an exponent value was specified in the constructor, that * value will be used. Otherwise the exponent value will be obtained from * the VOUT_MODE command. * * The device is obtained from the ActionEnvironment. * * Throws an exception if an error occurs. * * @param environment Action execution environment. * @return true */ virtual bool execute(ActionEnvironment& environment) override; /** * 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 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 type. * * @return sensor type. */ SensorType getType() const { return type; } /** * Returns a string description of this action. * * @return description of action */ virtual std::string toString() const override; private: /** * Gets the exponent value to use to convert a linear_16 format value to a * decimal volts value. * * If an exponent value is defined for this action, that value is returned. * Otherwise VOUT_MODE is read from the current device to obtain the * exponent value. * * Throws an exception if an error occurs. * * @param environment action execution environment * @param interface I2C interface to the current device * @return exponent value */ int8_t getExponentValue(ActionEnvironment& environment, i2c::I2CInterface& interface); /** * Sensor type. */ const SensorType 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 exponent{}; }; } // namespace phosphor::power::regulators