diff --git a/include/Animation/AnimationController.h b/include/Animation/AnimationController.h new file mode 100644 index 0000000..a77482e --- /dev/null +++ b/include/Animation/AnimationController.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +#include "Animation.h" + +class AnimationController +{ + public: + AnimationController(Fader *fader); + + void setAnimation(std::unique_ptr anim, bool transition = true); + void loop(void); + + private: + Fader *m_fader; + std::unique_ptr m_animation; + + uint32_t m_transitionTime; + uint64_t m_frame; +}; diff --git a/src/Animation/AnimationController.cpp b/src/Animation/AnimationController.cpp new file mode 100644 index 0000000..962ce13 --- /dev/null +++ b/src/Animation/AnimationController.cpp @@ -0,0 +1,30 @@ +#include "Animation/AnimationController.h" + +AnimationController::AnimationController(Fader *fader) + : m_fader(fader), m_transitionTime(0), m_frame(0) +{} + +void AnimationController::setAnimation(std::unique_ptr anim, bool transition) +{ + m_frame = 0; + + m_animation = std::move(anim); + + if(transition) { + m_transitionTime = 256/8; + + m_fader->set_fadestep(8); + m_fader->fade_color(Fader::Color{0, 0, 0, 0}); + } +} + +void AnimationController::loop(void) +{ + if(m_transitionTime > 0) { + m_transitionTime--; + } else if(m_animation) { + m_animation->loop(m_frame); + } + + m_frame++; +} diff --git a/src/main.cpp b/src/main.cpp index 9aecfc7..fd57135 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,6 +13,7 @@ #include "Config.h" #include "Animation/AllAnimations.h" +#include "Animation/AnimationController.h" #include #include @@ -35,7 +36,7 @@ Fader ledFader(NUM_STRIPS, NUM_LEDS, 1, FLIP_STRIPS_MASK); UDPProto udpProto(&ledFader); UpdateServer *updateServer; -std::unique_ptr currentAnimation = nullptr; +AnimationController animController(&ledFader); bool initLEDs() { @@ -93,9 +94,7 @@ static void ledTask( void * parameter ) uint32_t start_time = micros(); - if(currentAnimation) { - currentAnimation->loop(frame); - } + animController.loop(); if((WiFi.status() == WL_CONNECTED) || (WiFi.getMode() == WIFI_MODE_AP)) { udpProto.loop(); @@ -210,7 +209,7 @@ void setup() Serial.println(); Serial.println(); - currentAnimation = std::unique_ptr(new ConnectingAnimation(&ledFader)); + animController.setAnimation(std::unique_ptr(new ConnectingAnimation(&ledFader))); xTaskCreate( ledTask, /* Task function. */