esp32-sk6812/src/Fader.cpp

153 lines
3.6 KiB
C++

#include "Fader.h"
Fader::Fader(std::size_t nstrips, std::size_t nmodules_per_strip, uint8_t fadestep, uint32_t flip_strips_mask)
: m_strips(nstrips),
m_modulesPerStrip(nmodules_per_strip),
m_fadestep(fadestep),
m_flipStripsMask(flip_strips_mask),
m_curColor(nstrips * nmodules_per_strip),
m_targetColor(nstrips * nmodules_per_strip)
{}
void Fader::set_color(uint32_t strip, uint32_t module, const Fader::Color &color)
{
uint32_t idx = make_module_idx(strip, module);
set_color(idx, color);
}
void Fader::set_color(uint32_t pos, const Fader::Color &color)
{
m_targetColor[pos] = m_curColor[pos] = color;
m_somethingChanged = true;
}
void Fader::add_color(uint32_t strip, uint32_t module, const Fader::Color &color)
{
uint32_t idx = make_module_idx(strip, module);
add_color(idx, color);
}
void Fader::add_color(uint32_t pos, const Fader::Color &color)
{
m_curColor[pos] += color;
m_curColor[pos].normalize();
m_targetColor[pos] += color;
m_targetColor[pos].normalize();
m_somethingChanged = true;
}
void Fader::fade_color(uint32_t strip, uint32_t module, const Fader::Color &color)
{
uint32_t idx = make_module_idx(strip, module);
fade_color(idx, color);
}
void Fader::fade_color(uint32_t pos, const Fader::Color &color)
{
m_targetColor[pos] = color;
m_somethingChanged = true;
}
void Fader::set_color(const Fader::Color &color)
{
for(std::size_t module = 0; module < m_curColor.size(); module++) {
m_targetColor[module] = m_curColor[module] = color;
}
m_somethingChanged = true;
}
void Fader::add_color(const Fader::Color &color)
{
for (std::size_t module = 0; module < m_curColor.size(); module++) {
m_curColor[module] += color;
m_curColor[module].normalize();
m_targetColor[module] += color;
m_targetColor[module].normalize();
}
m_somethingChanged = true;
}
void Fader::fade_color(const Fader::Color &color)
{
for (std::size_t module = 0; module < m_curColor.size(); module++) {
m_targetColor[module] = color;
}
}
void Fader::set_fadestep(uint8_t newFadestep)
{
m_fadestep = newFadestep;
}
/* internal function */
bool Fader::update_fade(int16_t *cur, const int16_t *target)
{
int16_t diff;
if(*cur > *target) {
diff = *cur - *target;
if(diff < m_fadestep) {
*cur = *target;
} else {
*cur -= m_fadestep;
}
return true;
} else if(*cur < *target) {
diff = *target - *cur;
if(diff < m_fadestep) {
*cur = *target;
} else {
*cur += m_fadestep;
}
return true;
}
return false;
}
void Fader::update(void)
{
for(std::size_t i = 0; i < m_curColor.size(); i++) {
m_somethingChanged = update_fade(&(m_curColor[i].r), &(m_targetColor[i].r)) || m_somethingChanged;
m_somethingChanged = update_fade(&(m_curColor[i].g), &(m_targetColor[i].g)) || m_somethingChanged;
m_somethingChanged = update_fade(&(m_curColor[i].b), &(m_targetColor[i].b)) || m_somethingChanged;
m_somethingChanged = update_fade(&(m_curColor[i].w), &(m_targetColor[i].w)) || m_somethingChanged;
}
}
uint32_t Fader::make_module_idx(uint32_t strip, uint32_t module) const
{
strip = (strip + STRIP_OFFSET) % m_strips;
bool flip = m_flipStripsMask & (1 << strip);
if(flip) {
module = m_modulesPerStrip - module - 1;
}
return strip * m_modulesPerStrip + module;
}
uint32_t Fader::get_strip_idx(uint32_t module_pos) const
{
return ((module_pos / m_strips) + m_strips - STRIP_OFFSET) % m_strips;
}
uint32_t Fader::get_led_idx(uint32_t module_pos) const
{
uint32_t strip = get_strip_idx(module_pos);
uint32_t led = module_pos % m_modulesPerStrip;
bool flip = m_flipStripsMask & (1 << strip);
if(flip) {
led = m_modulesPerStrip - led - 1;
}
return led;
}