Skip to content

File evamAdaptiveSmoothDecor.h

File List > src > evamAdaptiveSmoothDecor.h

Go to the documentation of this file

#pragma once

#include <evafAdaptiveAverage.h>
#include "evaStdReaders.h"

namespace evam
{
    struct AdaptiveSmoothConfig
    {
        unsigned short minTimeConstantTicks;
        unsigned short maxTimeConstantTicks;

        AdaptiveSmoothConfig(unsigned short minTimeConstantTicks,
                             unsigned short maxTimeConstantTicks)
            : minTimeConstantTicks(minTimeConstantTicks),
              maxTimeConstantTicks(maxTimeConstantTicks) {}
    };

    template <class TMotor,
              unsigned short tMinTimeConstantTicks = evaf::kDefaultMinTimeConstantTicks,
              unsigned short tMaxTimeConstantTicks = evaf::kDefaultMaxTimeConstantTicks>
    class AdaptiveSmoothDecor
        : public TMotor
    {
    private:
        using Filter = evaf::AdaptiveAverage<eva::ValueReader,
                                            tMinTimeConstantTicks,
                                            tMaxTimeConstantTicks>;

        Filter mFilter;

    public:
        AdaptiveSmoothDecor() : TMotor() {}

        template <typename... Args>
        AdaptiveSmoothDecor(AdaptiveSmoothConfig config, Args... args)
            : TMotor(args...),
              mFilter(config.minTimeConstantTicks,
                      config.maxTimeConstantTicks) {}

        void Go(signed short value)
        {
            mFilter.setValue(constrain(value, -1000, 1000));
            TMotor::Go(mFilter.getValue());
        }

        void SetMinTimeConstantTicks(unsigned short value)
        {
            mFilter.setMinTimeConstantTicks(value);
        }

        unsigned short GetMinTimeConstantTicks() const
        {
            return mFilter.getMinTimeConstantTicks();
        }

        void SetMaxTimeConstantTicks(unsigned short value)
        {
            mFilter.setMaxTimeConstantTicks(value);
        }

        unsigned short GetMaxTimeConstantTicks() const
        {
            return mFilter.getMaxTimeConstantTicks();
        }
    };
}