2019-05-29 22:49:54 +00:00
|
|
|
#include "effect_cycle.h"
|
2019-06-18 16:14:59 +00:00
|
|
|
#include "effects.h"
|
|
|
|
|
|
|
|
CycleEffect::CycleEffect() {
|
2019-10-02 04:16:07 +00:00
|
|
|
_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);
|
2019-06-18 16:14:59 +00:00
|
|
|
changeEffect();
|
|
|
|
}
|
|
|
|
|
|
|
|
CycleEffect::~CycleEffect() {
|
|
|
|
delete effect;
|
|
|
|
}
|
2019-05-29 22:49:54 +00:00
|
|
|
|
|
|
|
void CycleEffect::changeEffect() {
|
2019-10-02 04:13:55 +00:00
|
|
|
uint8_t new_id;
|
|
|
|
if (settings.effects.cycle.random && _effects_count>1) {
|
2019-06-07 04:24:16 +00:00
|
|
|
do {
|
2019-10-02 04:16:07 +00:00
|
|
|
new_id = random8(_effects_count);
|
2019-06-07 04:24:16 +00:00
|
|
|
} while (new_id == effect_id);
|
|
|
|
} else {
|
2019-10-02 04:16:07 +00:00
|
|
|
new_id = (effect_id + 1) % _effects_count;
|
2019-06-07 04:24:16 +00:00
|
|
|
}
|
2019-06-18 16:14:59 +00:00
|
|
|
LOGln("CycleEffect * Changing effect from #%d to #%d", effect_id, new_id);
|
|
|
|
delay(25);
|
2019-10-02 04:16:07 +00:00
|
|
|
|
2020-04-29 18:24:59 +00:00
|
|
|
String old_effect_name = String("UNKNOWN");
|
|
|
|
if (effect) {
|
|
|
|
old_effect_name = effect->get_name();
|
|
|
|
delete effect;
|
|
|
|
}
|
2019-10-02 04:16:07 +00:00
|
|
|
|
2020-04-29 18:24:59 +00:00
|
|
|
int16_t diff = 0;
|
2019-10-04 10:03:03 +00:00
|
|
|
uint16_t old_heap = _heap_free;
|
|
|
|
_heap_free = ESP.getFreeHeap();
|
|
|
|
if (old_heap) {
|
|
|
|
// diff positive = More heap used (baad)
|
|
|
|
// diff negative = Less heap used (good-ish)
|
|
|
|
diff = old_heap - _heap_free;
|
2020-04-29 18:24:59 +00:00
|
|
|
LOGln("CycleEffect * Heap usage: #%d,%s,%d,%+d", effect_id, old_effect_name.c_str(), _heap_free, diff);
|
2019-10-04 10:03:03 +00:00
|
|
|
}
|
|
|
|
|
2019-06-18 16:14:59 +00:00
|
|
|
delay(25);
|
2019-10-02 04:16:07 +00:00
|
|
|
LOGln("CycleEffect * Searching for new effect #%d", new_id);
|
2019-10-04 10:03:03 +00:00
|
|
|
uint8_t count = 0;
|
2020-04-29 18:24:59 +00:00
|
|
|
EffectEntry* e = nullptr;
|
2019-10-02 04:16:07 +00:00
|
|
|
for (uint8_t i=0; i<effects_size; i++) {
|
|
|
|
if (effects[i].use_in_cycle) {
|
2019-10-04 10:03:03 +00:00
|
|
|
if (count == new_id) {
|
2020-04-29 18:24:59 +00:00
|
|
|
e = &effects[i];
|
|
|
|
effect = e->create();
|
2019-10-02 04:16:07 +00:00
|
|
|
break;
|
|
|
|
}
|
2019-10-04 10:03:03 +00:00
|
|
|
count++;
|
2019-10-02 04:16:07 +00:00
|
|
|
}
|
|
|
|
}
|
2020-04-29 18:24:59 +00:00
|
|
|
if (e) {
|
|
|
|
#ifdef MQTT_REPORT_METRICS
|
|
|
|
e->heap_change_sum += diff;
|
|
|
|
e->run_count++;
|
|
|
|
LOGln("CycleEffect * Last effect stats: name:%s, runs:%d, total_change:%d", old_effect_name.c_str(), e->run_count, e->heap_change_sum);
|
|
|
|
String topic = "metrics/effects/";
|
|
|
|
topic.concat(old_effect_name);
|
|
|
|
String message = String("runs:") + e->run_count + ", total_heap_change:" + e->heap_change_sum;
|
|
|
|
mqtt_publish(topic.c_str(), message.c_str(), true);
|
|
|
|
#endif
|
2019-09-25 16:13:39 +00:00
|
|
|
effect_id = new_id;
|
|
|
|
effectSince = millis();
|
|
|
|
LOGln("CycleEffect * Effect %s found", effect->get_name().c_str());
|
|
|
|
} else {
|
|
|
|
LOGln("CycleEffect * Effect NOT found");
|
|
|
|
}
|
2019-05-29 22:49:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
boolean CycleEffect::can_be_shown_with_clock() {
|
2019-06-07 04:24:16 +00:00
|
|
|
return effect->can_be_shown_with_clock();
|
2019-05-29 22:49:54 +00:00
|
|
|
};
|
|
|
|
boolean CycleEffect::clock_as_mask() {
|
2019-06-07 04:24:16 +00:00
|
|
|
return effect->clock_as_mask();
|
2019-05-29 22:49:54 +00:00
|
|
|
};
|
|
|
|
|
2019-10-01 04:29:32 +00:00
|
|
|
void CycleEffect::loop(uint16_t ms) {
|
2019-06-07 04:24:16 +00:00
|
|
|
if (!effect) changeEffect(); // If this is the first run, we have to select an effect first!
|
2019-10-01 04:29:32 +00:00
|
|
|
effect->loop(ms);
|
2019-06-07 04:24:16 +00:00
|
|
|
// 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) {
|
2019-10-02 04:16:07 +00:00
|
|
|
if (effectSince + settings.effects.cycle.time*1000 < millis()) {
|
2019-06-07 04:24:16 +00:00
|
|
|
changeEffect();
|
|
|
|
}
|
2019-05-29 22:49:54 +00:00
|
|
|
}
|
|
|
|
}
|
2019-09-25 16:11:03 +00:00
|
|
|
|
|
|
|
String CycleEffect::get_name() {
|
|
|
|
String s = "cycle/";
|
|
|
|
s += effect->get_name();
|
|
|
|
return s;
|
|
|
|
}
|