pitrix/src/effect_cycle.cpp

77 lines
1.9 KiB
C++

#include "effect_cycle.h"
#include "effects.h"
#include <ErriezCRC32.h>
CycleEffect::CycleEffect() {
_effects_count = 0;
for (uint8_t i=0; i<effects_size; i++) {
if (effects[i].use_in_cycle) _effects_count++;
}
LOGln("Cycle * Found %d effects to use in cycle.", _effects_count);
changeEffect();
}
CycleEffect::~CycleEffect() {
delete effect;
}
void CycleEffect::changeEffect() {
uint8_t new_id;
if (settings.effects.cycle.random && _effects_count>1) {
do {
new_id = random8(_effects_count);
} while (new_id == effect_id);
} else {
new_id = (effect_id + 1) % _effects_count;
}
LOGln("CycleEffect * Changing effect from #%d to #%d", effect_id, new_id);
delay(25);
if (effect) delete effect;
delay(25);
LOGln("CycleEffect * Searching for new effect #%d", new_id);
for (uint8_t i=0; i<effects_size; i++) {
if (effects[i].use_in_cycle) {
if (new_id == 0) {
effect = effects[i].create();
break;
} else {
new_id--;
}
}
}
if (effect) {
effect_id = new_id;
effectSince = millis();
LOGln("CycleEffect * Effect %s found", effect->get_name().c_str());
} else {
LOGln("CycleEffect * Effect NOT found");
}
}
boolean CycleEffect::can_be_shown_with_clock() {
return effect->can_be_shown_with_clock();
};
boolean CycleEffect::clock_as_mask() {
return effect->clock_as_mask();
};
void CycleEffect::loop(uint16_t ms) {
if (!effect) changeEffect(); // If this is the first run, we have to select an effect first!
effect->loop(ms);
// Don't use EVERY_N_SECONDS(config_effect_cycle_time) here because that function isn't relly made
// to be used with changing values.
EVERY_N_SECONDS(1) {
if (effectSince + settings.effects.cycle.time*1000 < millis()) {
changeEffect();
}
}
}
String CycleEffect::get_name() {
String s = "cycle/";
s += effect->get_name();
return s;
}