ColorTransition.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include <Transition.h>
  2. #include <ParsedColor.h>
  3. #pragma once
  4. class ColorTransition : public Transition {
  5. public:
  6. struct RgbColor {
  7. RgbColor();
  8. RgbColor(const ParsedColor& color);
  9. RgbColor(int16_t r, int16_t g, int16_t b);
  10. bool operator==(const RgbColor& other);
  11. int16_t r, g, b;
  12. };
  13. class Builder : public Transition::Builder {
  14. public:
  15. Builder(size_t id, const BulbId& bulbId, TransitionFn callback, const ParsedColor& start, const ParsedColor& end);
  16. virtual std::shared_ptr<Transition> _build() const override;
  17. private:
  18. const ParsedColor& start;
  19. const ParsedColor& end;
  20. RgbColor stepSizes;
  21. };
  22. ColorTransition(
  23. size_t id,
  24. const BulbId& bulbId,
  25. const ParsedColor& startColor,
  26. const ParsedColor& endColor,
  27. RgbColor stepSizes,
  28. size_t duration,
  29. size_t period,
  30. size_t numPeriods,
  31. TransitionFn callback
  32. );
  33. static size_t calculateColorPeriod(ColorTransition* t, const ParsedColor& start, const ParsedColor& end, size_t stepSize, size_t duration);
  34. inline static size_t calculateMaxDistance(const ParsedColor& start, const ParsedColor& end);
  35. inline static int16_t calculateStepSizePart(int16_t distance, size_t duration, size_t period);
  36. virtual bool isFinished() override;
  37. protected:
  38. const RgbColor endColor;
  39. RgbColor currentColor;
  40. RgbColor stepSizes;
  41. // Store these to avoid wasted packets
  42. uint16_t lastHue;
  43. uint16_t lastSaturation;
  44. bool finished;
  45. virtual void step() override;
  46. virtual void childSerialize(JsonObject& json) override;
  47. static inline void stepPart(uint16_t& current, uint16_t end, int16_t step);
  48. };