#include "effect_cycle.h" #include "effects.h" CycleEffect::CycleEffect() { _effects_count = 0; for (uint8_t i=0; i1) { 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); String old_effect_name = String("UNKNOWN"); if (effect) { old_effect_name = effect->get_name(); delete effect; } int16_t diff = 0; 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; LOGln("CycleEffect * Heap usage: #%d,%s,%d,%+d", effect_id, old_effect_name.c_str(), _heap_free, diff); } delay(25); LOGln("CycleEffect * Searching for new effect #%d", new_id); uint8_t count = 0; EffectEntry* e = nullptr; for (uint8_t i=0; icreate(); break; } count++; } } 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 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; }