Mirror of espurna firmware for wireless switches and more
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.2 KiB

  1. // -----------------------------------------------------------------------------
  2. // Moving Average Filter
  3. // Copyright (C) 2017-2019 by Xose Pérez <xose dot perez at gmail dot com>
  4. // -----------------------------------------------------------------------------
  5. #pragma once
  6. #include "BaseFilter.h"
  7. #include <vector>
  8. class MovingAverageFilter : public BaseFilter {
  9. public:
  10. void update(double value) override {
  11. if (_values.size() < _values.capacity()) {
  12. _values.push_back(value);
  13. }
  14. }
  15. bool status() const override {
  16. return _values.capacity() > 0;
  17. }
  18. double value() const override {
  19. double out{ 0. };
  20. for (const auto& value : _values) {
  21. out += value;
  22. }
  23. if (_values.size()) {
  24. out /= _values.size();
  25. }
  26. return out;
  27. }
  28. void resize(size_t size) override {
  29. _values.reserve(size);
  30. _reset();
  31. }
  32. void reset() override {
  33. _reset();
  34. }
  35. private:
  36. void _reset() {
  37. if (_values.size()) {
  38. _values.erase(_values.begin(), _values.end() - 1);
  39. } else {
  40. _values.clear();
  41. }
  42. }
  43. std::vector<double> _values{};
  44. };