1 /**
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 <string>
23 
24 namespace phosphor::power::regulators
25 {
26 
27 /**
28  * @class I2CCompareByteAction
29  *
30  * Compares a device register to a byte value.  Communicates with the device
31  * directly using the I2C interface.
32  *
33  * Implements the i2c_compare_byte action in the JSON config file.
34  */
35 class I2CCompareByteAction : public I2CAction
36 {
37   public:
38     // Specify which compiler-generated methods we want
39     I2CCompareByteAction() = delete;
40     I2CCompareByteAction(const I2CCompareByteAction&) = delete;
41     I2CCompareByteAction(I2CCompareByteAction&&) = delete;
42     I2CCompareByteAction& operator=(const I2CCompareByteAction&) = delete;
43     I2CCompareByteAction& operator=(I2CCompareByteAction&&) = delete;
44     virtual ~I2CCompareByteAction() = default;
45 
46     /**
47      * Constructor.
48      *
49      * @param reg Device register address.  Note: named 'reg' because 'register'
50      *            is a reserved keyword.
51      * @param value Expected byte value.
52      * @param mask Bit mask.  Specifies which bits should be compared within the
53      *             byte value.  Only the bits with a value of 1 in the mask will
54      *             be compared.  If not specified, defaults to 0xFF which means
55      *             that all bits will be compared.
56      */
57     explicit I2CCompareByteAction(uint8_t reg, uint8_t value,
58                                   uint8_t mask = 0xFF) :
59         reg{reg},
60         value{value}, mask{mask}
61     {}
62 
63     /**
64      * Executes this action.
65      *
66      * Compares a device register to a byte value using the I2C interface.
67      *
68      * The device register, byte value, and mask (if any) were specified in the
69      * constructor.
70      *
71      * The device is obtained from the specified action environment.
72      *
73      * Throws an exception if an error occurs.
74      *
75      * @param environment action execution environment
76      * @return true if the register contained the expected value, otherwise
77      *         returns false.
78      */
79     virtual bool execute(ActionEnvironment& environment) override;
80 
81     /**
82      * Returns the device register address.
83      *
84      * @return register address
85      */
86     uint8_t getRegister() const
87     {
88         return reg;
89     }
90 
91     /**
92      * Returns the expected byte value.
93      *
94      * @return expected value
95      */
96     uint8_t getValue() const
97     {
98         return value;
99     }
100 
101     /**
102      * Returns the bit mask.
103      *
104      * Specifies which bits should be compared within the byte value.  Only the
105      * bits with a value of 1 in the mask will be compared.
106      *
107      * @return bit mask
108      */
109     uint8_t getMask() const
110     {
111         return mask;
112     }
113 
114     /**
115      * Returns a string description of this action.
116      *
117      * @return description of action
118      */
119     virtual std::string toString() const override;
120 
121   private:
122     /**
123      * Device register address.  Note: named 'reg' because 'register' is a
124      * reserved keyword.
125      */
126     const uint8_t reg{0x00};
127 
128     /**
129      * Expected byte value.
130      */
131     const uint8_t value{0x00};
132 
133     /**
134      * Bit mask.  Specifies which bits should be compared within the byte value.
135      * Only the bits with a value of 1 in the mask will be compared.
136      */
137     const uint8_t mask{0xFF};
138 };
139 
140 } // namespace phosphor::power::regulators
141