diff options
author | Alex Dolzhenkov <admin@alexx.pw> | 2022-10-29 12:20:44 +1300 |
---|---|---|
committer | JF <JF002@users.noreply.github.com> | 2022-11-19 16:34:03 +0100 |
commit | 7376c02bbfa53b41fab1c49562917d678c24848f (patch) | |
tree | 452e627099746304c1c32afa9eb18da8124c624a /src/components/utility/LinearApproximation.h | |
parent | a67f401b306e1ef62f1824e7126ff8e962fffdb2 (diff) |
Add linear approximation and use it for improving battery percentage
Add linear approximation class and use it to better model the non-linear
discharge curve of the battery.
Changed the minimum voltage level to 3.5V and the maximum to 4.18V. For
reference the maximum observed voltage is 4.21V during charging.
Diffstat (limited to 'src/components/utility/LinearApproximation.h')
-rw-r--r-- | src/components/utility/LinearApproximation.h | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/components/utility/LinearApproximation.h b/src/components/utility/LinearApproximation.h new file mode 100644 index 00000000..f7104ced --- /dev/null +++ b/src/components/utility/LinearApproximation.h @@ -0,0 +1,41 @@ +#pragma once + +#include <cstddef> +#include <array> + +namespace Pinetime { + namespace Utility { + + // based on: https://github.com/SHristov92/LinearApproximation/blob/main/Linear.h + template <typename Key, typename Value, std::size_t Size> class LinearApproximation { + using Point = struct { + Key key; + Value value; + }; + + public: + LinearApproximation(const std::array<Point, Size>&& sorted_points) : points {sorted_points} { + } + + Value GetValue(Key key) const { + if (key <= points[0].key) { + return points[0].value; + } + + for (std::size_t i = 1; i < Size; i++) { + const auto& p = points[i]; + const auto& p_prev = points[i - 1]; + + if (key < p.key) { + return p_prev.value + (key - p_prev.key) * (p.value - p_prev.value) / (p.key - p_prev.key); + } + } + + return points[Size - 1].value; + } + + private: + std::array<Point, Size> points; + }; + } +} |