blob: ac28898b3b31fa12af0ad6e49e53f72d2b9e4f55 [file] [log] [blame]
Shawn McCarney8215be32020-02-19 10:00:57 -06001/**
2 * Copyright © 2020 IBM Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#pragma once
17
18#include "action_environment.hpp"
19#include "i2c_action.hpp"
20
21#include <cstdint>
22#include <stdexcept>
23#include <string>
24
25namespace phosphor::power::regulators
26{
27
28/**
29 * @class I2CCompareBitAction
30 *
31 * Compares a bit in a device register to a value. Communicates with the device
32 * directly using the I2C interface.
33 *
34 * Implements the i2c_compare_bit action in the JSON config file.
35 */
36class I2CCompareBitAction : public I2CAction
37{
38 public:
39 // Specify which compiler-generated methods we want
40 I2CCompareBitAction() = delete;
41 I2CCompareBitAction(const I2CCompareBitAction&) = delete;
42 I2CCompareBitAction(I2CCompareBitAction&&) = delete;
43 I2CCompareBitAction& operator=(const I2CCompareBitAction&) = delete;
44 I2CCompareBitAction& operator=(I2CCompareBitAction&&) = delete;
45 virtual ~I2CCompareBitAction() = default;
46
47 /**
48 * Constructor.
49 *
50 * Throws an exception if any of the input parameters are invalid.
51 *
52 * @param reg Device register address. Note: named 'reg' because 'register'
53 * is a reserved keyword.
54 * @param position Bit position. Must be in the range 0-7. Bit 0 is the
55 * least significant bit.
56 * @param value Expected bit value. Must be 0 or 1.
57 */
58 explicit I2CCompareBitAction(uint8_t reg, uint8_t position, uint8_t value) :
59 reg{reg}, position{position}, value{value}
60 {
61 if (position > 7)
62 {
63 throw std::invalid_argument{
64 "Invalid bit position: " +
65 std::to_string(static_cast<unsigned>(position))};
66 }
67
68 if (value > 1)
69 {
70 throw std::invalid_argument{
71 "Invalid bit value: " +
72 std::to_string(static_cast<unsigned>(value))};
73 }
74 }
75
76 /**
77 * Executes this action.
78 *
79 * Compares a bit in a device register to a value using the I2C interface.
80 *
81 * The device register, bit position, and bit value were specified in the
82 * constructor.
83 *
84 * The device is obtained from the specified action environment.
85 *
86 * Throws an exception if an error occurs.
87 *
88 * @param environment action execution environment
89 * @return true if the register bit contained the expected value, otherwise
90 * returns false.
91 */
92 virtual bool execute(ActionEnvironment& environment) override;
93
94 /**
95 * Returns the device register address.
96 *
97 * @return register address
98 */
99 uint8_t getRegister() const
100 {
101 return reg;
102 }
103
104 /**
105 * Returns the bit position.
106 *
107 * Value is in the range 0-7. Bit 0 is the least significant bit.
108 *
109 * @return bit position
110 */
111 uint8_t getPosition() const
112 {
113 return position;
114 }
115
116 /**
117 * Returns the expected bit value.
118 *
119 * Value is 0 or 1.
120 *
121 * @return expected bit value
122 */
123 uint8_t getValue() const
124 {
125 return value;
126 }
127
128 /**
129 * Returns a string description of this action.
130 *
131 * @return description of action
132 */
133 virtual std::string toString() const override;
134
135 private:
136 /**
137 * Device register address. Note: named 'reg' because 'register' is a
138 * reserved keyword.
139 */
140 const uint8_t reg{0x00};
141
142 /**
143 * Bit position. Must be in the range 0-7. Bit 0 is the least significant
144 * bit.
145 */
146 const uint8_t position{0};
147
148 /**
149 * Expected bit value. Must be 0 or 1.
150 */
151 const uint8_t value{0};
152};
153
154} // namespace phosphor::power::regulators