summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dmitri Plotnikov <dplotnikov@google.com> 2021-12-10 15:38:17 -0800
committer Dmitri Plotnikov <dplotnikov@google.com> 2021-12-10 18:52:30 -0800
commit40dcce273ff440b169149ee029e019f7fc9b4e66 (patch)
treef7d2ad8ee1da2fa63c74056241fb713b173373f0
parentfe9e3a2fe7194cac1fa88f32a01a0f7a0b3295e8 (diff)
Add incrementValue method
Bug: 191921016 Test: atest libbattery Change-Id: Ia10999854eef99d47b7968d23881a39d9976be24
-rw-r--r--libs/battery/MultiStateCounter.h26
-rw-r--r--libs/battery/MultiStateCounterTest.cpp20
2 files changed, 42 insertions, 4 deletions
diff --git a/libs/battery/MultiStateCounter.h b/libs/battery/MultiStateCounter.h
index a2b59a877f..0caf005a9a 100644
--- a/libs/battery/MultiStateCounter.h
+++ b/libs/battery/MultiStateCounter.h
@@ -63,12 +63,24 @@ public:
void setValue(state_t state, const T& value);
/**
- * Updates the value for the current state and returns the delta from the previously
- * set value.
+ * Updates the value by distributing the delta from the previously set value
+ * among states according to their respective time-in-state.
+ * Returns the delta from the previously set value.
*/
const T& updateValue(const T& value, time_t timestamp);
- void addValue(const T& value);
+ /**
+ * Updates the value by distributing the specified increment among states according
+ * to their respective time-in-state.
+ */
+ void incrementValue(const T& increment, time_t timestamp);
+
+ /**
+ * Adds the specified increment to the value for the current state, without affecting
+ * the last updated value or timestamp. Ignores partial time-in-state: the entirety of
+ * the increment is given to the current state.
+ */
+ void addValue(const T& increment);
void reset();
@@ -216,11 +228,17 @@ const T& MultiStateCounter<T>::updateValue(const T& value, time_t timestamp) {
}
template <class T>
+void MultiStateCounter<T>::incrementValue(const T& increment, time_t timestamp) {
+ T newValue = lastValue;
+ add(&newValue, increment, 1 /* numerator */, 1 /* denominator */);
+ updateValue(newValue, timestamp);
+}
+
+template <class T>
void MultiStateCounter<T>::addValue(const T& value) {
if (!isEnabled) {
return;
}
-
add(&states[currentState].counter, value, 1 /* numerator */, 1 /* denominator */);
}
diff --git a/libs/battery/MultiStateCounterTest.cpp b/libs/battery/MultiStateCounterTest.cpp
index 876bf745a8..cb11a5444d 100644
--- a/libs/battery/MultiStateCounterTest.cpp
+++ b/libs/battery/MultiStateCounterTest.cpp
@@ -210,6 +210,26 @@ TEST_F(MultiStateCounterTest, updateValue_nonmonotonic) {
EXPECT_DOUBLE_EQ(3.0, delta);
}
+TEST_F(MultiStateCounterTest, incrementValue) {
+ DoubleMultiStateCounter testCounter(2, 0);
+ testCounter.updateValue(0, 0);
+ testCounter.setState(0, 0);
+ testCounter.updateValue(6.0, 2000);
+
+ testCounter.setState(1, 3000);
+
+ testCounter.incrementValue(8.0, 6000);
+
+ // The total accumulated count is:
+ // 6.0 // For the period 0-2000
+ // +(8.0 * 0.25) // For the period 3000-4000
+ EXPECT_DOUBLE_EQ(8.0, testCounter.getCount(0));
+
+ // 0 // For the period 0-3000
+ // +(8.0 * 0.75) // For the period 3000-4000
+ EXPECT_DOUBLE_EQ(6.0, testCounter.getCount(1));
+}
+
TEST_F(MultiStateCounterTest, addValue) {
DoubleMultiStateCounter testCounter(1, 0);
testCounter.updateValue(0, 0);