ratemeter.ino 850 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include <Arduino.h>
  2. #include <cstdint>
  3. #include "ratemeter.h"
  4. #include "math.h"
  5. RateMeter::RateMeter()
  6. : lastTime(0)
  7. {}
  8. void RateMeter::onInterrupt() {
  9. const auto now = millis();
  10. if (cutoff.get()) {
  11. averageDelta = CUTOFF_MS;
  12. } else {
  13. const auto delta = getDelta(lastTime, now, CUTOFF_MS);
  14. averageDelta = (averageDelta + delta) / 2;
  15. }
  16. lastTime = now;
  17. cutoff.reset();
  18. }
  19. void RateMeter::tick(millis_t delta) {
  20. cutoff.updateTime(delta);
  21. if (!cutoff.get()) {
  22. averageDelta += delta;
  23. }
  24. }
  25. void RateMeter::expire() {
  26. cutoff.expire();
  27. }
  28. uint16_t RateMeter::delta() const {
  29. return averageDelta;
  30. }
  31. float RateMeter::rate() const {
  32. if (cutoff.get()) {
  33. return 0.0f;
  34. } else if (averageDelta == 0) {
  35. // to ensure range 0 ~ 1000.0
  36. return 1000.0f;
  37. } else {
  38. return 1000.0f / (float)averageDelta;
  39. }
  40. }