diff options
author | 2021-12-10 15:38:17 -0800 | |
---|---|---|
committer | 2021-12-10 18:52:30 -0800 | |
commit | 40dcce273ff440b169149ee029e019f7fc9b4e66 (patch) | |
tree | f7d2ad8ee1da2fa63c74056241fb713b173373f0 | |
parent | fe9e3a2fe7194cac1fa88f32a01a0f7a0b3295e8 (diff) |
Add incrementValue method
Bug: 191921016
Test: atest libbattery
Change-Id: Ia10999854eef99d47b7968d23881a39d9976be24
-rw-r--r-- | libs/battery/MultiStateCounter.h | 26 | ||||
-rw-r--r-- | libs/battery/MultiStateCounterTest.cpp | 20 |
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); |