#pragma once #include template class Power: public Figment { public: Power() : Figment("Power") {} void handleEvent(const InputEvent& evt) override { switch (evt.intent) { case InputEvent::PowerToggle: m_powerState = m_powerState.value() <= 128 ? 255 : 0; //Log.info("POWER TOGGLE %d", m_powerState.value()); break; case InputEvent::SetPower: m_powerState = evt.asInt() == 0 ? 0 : 255; Log.notice("Power is now %d", m_powerState); break; case InputEvent::SetBrightness: m_brightness = evt.asInt(); m_brightness = 255; break; case InputEvent::Beat: m_beatDecay.set(0, 255); break; default: return; } } void loop() override { m_powerState.update(); m_brightness.update(); EVERY_N_MILLISECONDS(20) { m_beatDecay.update(13); } } void render(Display* dpy) const override { const uint8_t decayedBrightness = scale8((uint8_t)m_brightness, ease8InOutCubic((uint8_t)m_beatDecay)); const uint8_t clippedBrightness = std::min(decayedBrightness, MaxBrightness); const uint8_t scaledBrightness = scale8(m_powerState, clippedBrightness); const uint8_t videoBrightness = brighten8_video(scaledBrightness); const uint8_t powerBrightness = calculate_max_brightness_for_power_mW(videoBrightness, Watts); FastLED.setBrightness(powerBrightness); } static constexpr uint32_t Watts = Voltage * MaxMilliAmps; private: AnimatedNumber m_powerState = 255; AnimatedNumber m_brightness = MaxBrightness; AnimatedNumber m_beatDecay = 255; };