ratemeter.h 727 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #ifndef RATEMETER_H
  2. #define RATEMETER_H
  3. #include <cstdint>
  4. #include "debouncer.h"
  5. class RateMeter {
  6. public:
  7. RateMeter();
  8. void onInterrupt();
  9. void tick(millis_t delta);
  10. void expire();
  11. uint16_t delta() const;
  12. // Hall sensor edges per seconds.
  13. // stopped: 0
  14. // really slow => ~3
  15. // medium => ~30
  16. // fast => < 300
  17. // max => 1000
  18. float rate() const;
  19. private:
  20. uint32_t lastTime;
  21. // really Range, emperically:
  22. // fast => < 5_000 us,
  23. // medium => 20_000 - 40_000 us
  24. // really slow => 250_000 us
  25. uint32_t averageDelta;
  26. static const uint16_t CUTOFF_MS = 1000;
  27. // Cut off after some seconds to prevent multiple timestamp overflow (~70 mins)
  28. Timeout<uint16_t, CUTOFF_MS> cutoff;
  29. };
  30. #endif