Program Listing for File animationcuehandler.cpp

Return to documentation for file (src/cue/animationcuehandler.cpp)

#include "../animation/fireanimation.h"
#include "../animation/lightninganimation.h"
#include "../animation/plasmaanimation.h"
#include "../animation/radialanimation.h"
#include "../animation/sparkleanimation.h"
#include "../animation/waveanimation.h"
#include "animationcuehandler.h"

namespace PixelMaestro {

    // Animation-specific Cues
    uint8_t* AnimationCueHandler::set_fire_options(uint8_t section_num, uint8_t layer_num, uint8_t multiplier) {
        uint32_t index = start_cue(
            (uint8_t)CueController::Handler::AnimationCueHandler,
            (uint8_t)Action::SetFireOptions,
            section_num,
            layer_num
        );
        controller_.get_buffer()[++index] = multiplier;

        return controller_.assemble(++index);
    }

    uint8_t* AnimationCueHandler::set_lightning_options(uint8_t section_num, uint8_t layer_num, uint8_t num_bolts, int8_t drift, uint8_t fork_chance) {
        uint32_t index = start_cue(
            (uint8_t)CueController::Handler::AnimationCueHandler,
            (uint8_t)Action::SetLightningOptions,
            section_num,
            layer_num
        );
        controller_.get_buffer()[++index] = num_bolts;
        controller_.get_buffer()[++index] = (uint8_t)drift;
        controller_.get_buffer()[++index] = fork_chance;

        return controller_.assemble(++index);
    }

    uint8_t* AnimationCueHandler::set_plasma_options(uint8_t section_num, uint8_t layer_num, float size, float resolution) {
        uint32_t index = start_cue(
            (uint8_t)CueController::Handler::AnimationCueHandler,
            (uint8_t)Action::SetPlasmaOptions,
            section_num,
            layer_num
        );

        add_float_to_cue(index, size);
        add_float_to_cue(index, resolution);

        return controller_.assemble(++index);
    }

    uint8_t* AnimationCueHandler::set_radial_options(uint8_t section_num, uint8_t layer_num, uint8_t resolution) {
        uint32_t index = start_cue(
            (uint8_t)CueController::Handler::AnimationCueHandler,
            (uint8_t)Action::SetRadialOptions,
            section_num,
            layer_num
        );
        controller_.get_buffer()[++index] = resolution;

        return controller_.assemble(++index);
    }

    uint8_t* AnimationCueHandler::set_sparkle_options(uint8_t section_num, uint8_t layer_num, uint8_t threshold) {
        uint32_t index = start_cue(
            (uint8_t)CueController::Handler::AnimationCueHandler,
            (uint8_t)Action::SetSparkleOptions,
            section_num,
            layer_num
        );
        controller_.get_buffer()[++index] = threshold;

        return controller_.assemble(++index);
    }

    uint8_t* AnimationCueHandler::set_wave_options(uint8_t section_num, uint8_t layer_num, int8_t skew) {
        uint32_t index = start_cue(
            (uint8_t)CueController::Handler::AnimationCueHandler,
            (uint8_t)Action::SetWaveOptions,
            section_num,
            layer_num
        );
        controller_.get_buffer()[++index] = (uint8_t)skew;

        return controller_.assemble(++index);
    }

    // General-purpose Cues
    uint8_t* AnimationCueHandler::set_center(uint8_t section_num, uint8_t layer_num, uint16_t x, uint16_t y) {
        uint32_t index = start_cue(
            (uint8_t)CueController::Handler::AnimationCueHandler,
            (uint8_t)Action::SetCenter,
            section_num,
            layer_num
        );

        add_uint16_to_cue(index, x);
        add_uint16_to_cue(index, y);

        return controller_.assemble(++index);
    }

    uint8_t* AnimationCueHandler::set_cycle_index(uint8_t section_num, uint8_t layer_num, uint8_t cycle_index) {
        uint32_t index = start_cue(
            (uint8_t)CueController::Handler::AnimationCueHandler,
            (uint8_t)Action::SetCycleIndex,
            section_num,
            layer_num
        );
        controller_.get_buffer()[++index] = cycle_index;

        return controller_.assemble(++index);
    }

    uint8_t* AnimationCueHandler::set_fade(uint8_t section_num, uint8_t layer_num, bool fade) {
        uint32_t index = start_cue(
            (uint8_t)CueController::Handler::AnimationCueHandler,
            (uint8_t)Action::SetFade,
            section_num,
            layer_num
        );
        controller_.get_buffer()[++index] = (uint8_t)fade;

        return controller_.assemble(++index);
    }

    uint8_t* AnimationCueHandler::set_orientation(uint8_t section_num, uint8_t layer_num, Animation::Orientation orientation) {
        uint32_t index = start_cue(
            (uint8_t)CueController::Handler::AnimationCueHandler,
            (uint8_t)Action::SetOrientation,
            section_num,
            layer_num
        );
        controller_.get_buffer()[++index] = (uint8_t)orientation;

        return controller_.assemble(++index);
    }

    uint8_t* AnimationCueHandler::set_palette(uint8_t section_num, uint8_t layer_num, const Palette& palette) {
        uint32_t index = start_cue(
            (uint8_t)CueController::Handler::AnimationCueHandler,
            (uint8_t)Action::SetPalette,
            section_num,
            layer_num
        );
        controller_.get_buffer()[++index] = palette.get_num_colors();

        uint16_t palette_size= serialize_palette(&controller_.get_buffer()[++index], palette);

        return controller_.assemble(index + palette_size);
    }

    uint8_t* AnimationCueHandler::set_reverse(uint8_t section_num, uint8_t layer_num, bool reverse) {
        uint32_t index = start_cue(
            (uint8_t)CueController::Handler::AnimationCueHandler,
            (uint8_t)Action::SetReverse,
            section_num,
            layer_num
        );
        controller_.get_buffer()[++index] = (uint8_t)reverse;

        return controller_.assemble(++index);
    }

    uint8_t* AnimationCueHandler::set_timer(uint8_t section_num, uint8_t layer_num, uint16_t interval, uint16_t delay) {
        uint32_t index = start_cue(
            (uint8_t)CueController::Handler::AnimationCueHandler,
            (uint8_t)Action::SetTimer,
            section_num,
            layer_num
        );

        add_uint16_to_cue(index, interval);
        add_uint16_to_cue(index, delay);

        return controller_.assemble(++index);
    }

    uint8_t* AnimationCueHandler::start(uint8_t section_num, uint8_t layer_num) {
        uint32_t index = start_cue(
            (uint8_t)CueController::Handler::AnimationCueHandler,
            (uint8_t)Action::Start,
            section_num,
            layer_num
        );

        return controller_.assemble(++index);
    }

    uint8_t* AnimationCueHandler::stop(uint8_t section_num, uint8_t layer_num) {
        uint32_t index = start_cue(
            (uint8_t)CueController::Handler::AnimationCueHandler,
            (uint8_t)Action::Stop,
            section_num,
            layer_num
        );

        return controller_.assemble(++index);
    }

    void AnimationCueHandler::run(uint8_t *cue) {

        Section* section = get_section(cue[(uint8_t)Byte::SectionByte], cue[(uint8_t)Byte::LayerByte]);
        if (section == nullptr) return;

        Animation* animation = section->get_animation();
        if (animation == nullptr) return;

        switch((Action)cue[(uint8_t)Byte::ActionByte]) {
            case Action::SetCenter:
                animation->set_center(IntByteConvert::byte_to_uint16(&cue[(uint8_t)Byte::OptionsByte]),
                        IntByteConvert::byte_to_uint16(&cue[(uint8_t)Byte::OptionsByte + 2]));
                break;
            case Action::SetCycleIndex:
                animation->set_cycle_index(cue[(uint8_t)Byte::OptionsByte]);
                break;
            case Action::SetFade:
                animation->set_fade(cue[(uint8_t)Byte::OptionsByte]);
                break;
            case Action::SetFireOptions:
                {
                    FireAnimation* fa = static_cast<FireAnimation*>(animation);
                    fa->set_multiplier(cue[(uint8_t)Byte::OptionsByte]);
                }
                break;
            case Action::SetLightningOptions:
                {
                    LightningAnimation* la = static_cast<LightningAnimation*>(animation);
                    la->set_bolt_count(cue[(uint8_t)Byte::OptionsByte]);
                    la->set_drift((int8_t)cue[(uint8_t)Byte::OptionsByte + 1]);
                    la->set_fork_chance(cue[(uint8_t)Byte::OptionsByte + 2]);
                }
                break;
            case Action::SetOrientation:
                animation->set_orientation((Animation::Orientation)cue[(uint8_t)Byte::OptionsByte]);
                break;
            case Action::SetPalette:
                {
                    uint8_t num_colors = cue[(uint8_t)Byte::OptionsByte];

                    // Delete the old palette after setting the new one.
                    Palette* old_palette = animation->get_palette();
                    animation->set_palette(*deserialize_palette(&cue[(uint8_t)Byte::OptionsByte + 1], num_colors));
                    delete old_palette;
                }
                break;
            case Action::SetPlasmaOptions:
                {
                    PlasmaAnimation* pa = static_cast<PlasmaAnimation*>(animation);
                    pa->set_size(FloatByteConvert::byte_to_float(&cue[(uint8_t)Byte::OptionsByte]));
                    pa->set_resolution(FloatByteConvert::byte_to_float(&cue[(uint8_t)Byte::OptionsByte + 4]));
                }
                break;
            case Action::SetRadialOptions:
                static_cast<RadialAnimation*>(animation)->set_resolution(cue[(uint8_t)Byte::OptionsByte]);
                break;
            case Action::SetReverse:
                animation->set_reverse(cue[(uint8_t)Byte::OptionsByte]);
                break;
            case Action::SetSparkleOptions:
                static_cast<SparkleAnimation*>(animation)->set_threshold(cue[(uint8_t)Byte::OptionsByte]);
                break;
            case Action::SetTimer:
                animation->set_timer(
                    IntByteConvert::byte_to_uint16(&cue[(uint8_t)Byte::OptionsByte]),
                    IntByteConvert::byte_to_uint16(&cue[(uint8_t)Byte::OptionsByte + 2]));
                break;
            case Action::SetWaveOptions:
                static_cast<WaveAnimation*>(animation)->set_skew((int8_t)cue[(uint8_t)Byte::OptionsByte]);
                break;
            case Action::Start:
                if (animation->get_timer()) {
                    animation->get_timer()->start();
                }
                break;
            case Action::Stop:
                if (animation->get_timer()) {
                    animation->get_timer()->stop();
                }
                break;
        }
    }
}