Transition.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include <BulbId.h>
  2. #include <ArduinoJson.h>
  3. #include <GroupStateField.h>
  4. #include <stdint.h>
  5. #include <stddef.h>
  6. #include <functional>
  7. #include <memory>
  8. #pragma once
  9. class Transition {
  10. public:
  11. using TransitionFn = std::function<void(const BulbId& bulbId, GroupStateField field, uint16_t value)>;
  12. // transition commands are in seconds, convert to ms.
  13. static const uint16_t DURATION_UNIT_MULTIPLIER = 1000;
  14. class Builder {
  15. public:
  16. Builder(size_t id, const BulbId& bulbId, TransitionFn callback);
  17. Builder& setDuration(float duration);
  18. Builder& setPeriod(size_t period);
  19. Builder& setNumPeriods(size_t numPeriods);
  20. void setDurationRaw(size_t duration);
  21. bool isSetDuration() const;
  22. bool isSetPeriod() const;
  23. bool isSetNumPeriods() const;
  24. size_t getOrComputePeriod() const;
  25. size_t getOrComputeDuration() const;
  26. size_t getOrComputeNumPeriods() const;
  27. size_t getDuration() const;
  28. size_t getPeriod() const;
  29. size_t getNumPeriods() const;
  30. std::shared_ptr<Transition> build();
  31. const size_t id;
  32. const BulbId& bulbId;
  33. const TransitionFn callback;
  34. private:
  35. size_t duration;
  36. size_t period;
  37. size_t numPeriods;
  38. virtual std::shared_ptr<Transition> _build() const = 0;
  39. size_t numSetParams() const;
  40. };
  41. // Default time to wait between steps. Do this rather than having a fixed step size because it's
  42. // more capable of adapting to different situations.
  43. static const size_t DEFAULT_PERIOD = 450;
  44. static const size_t DEFAULT_NUM_PERIODS = 10;
  45. static const size_t DEFAULT_DURATION = DEFAULT_PERIOD*DEFAULT_NUM_PERIODS;
  46. // If period goes lower than this, throttle other parameters up to adjust.
  47. static const size_t MIN_PERIOD = 150;
  48. const size_t id;
  49. const BulbId bulbId;
  50. const TransitionFn callback;
  51. Transition(
  52. size_t id,
  53. const BulbId& bulbId,
  54. size_t period,
  55. TransitionFn callback
  56. );
  57. void tick();
  58. virtual bool isFinished() = 0;
  59. void serialize(JsonObject& doc);
  60. virtual void step() = 0;
  61. virtual void childSerialize(JsonObject& doc) = 0;
  62. static size_t calculatePeriod(int16_t distance, size_t stepSize, size_t duration);
  63. protected:
  64. const size_t period;
  65. unsigned long lastSent;
  66. static void stepValue(int16_t& current, int16_t end, int16_t stepSize);
  67. };