figments: renderer: move power management directly into the renderer

This commit is contained in:
Torrie Fischer
2023-12-20 09:17:10 +01:00
parent 6e138175be
commit 6797889b4c
7 changed files with 80 additions and 121 deletions

View File

@ -18,7 +18,12 @@ Renderer::lastFigmentName()
void
Renderer::loop()
{
m_powerState.update();
m_brightness.update();
uint16_t totalPower = 0;
for(Display* dpy : m_displays) {
totalPower += calculate_unscaled_power_mW(dpy->pixelBacking(), dpy->pixelCount());
for(Figment* figment : m_figments) {
if (figment->state == Task::Running) {
#if defined(BOARD_ESP32) or defined(BOARD_ESP8266)
@ -38,10 +43,42 @@ Renderer::loop()
}
};
}
FastLED.show();
const uint8_t videoBrightness = brighten8_video(m_powerState);
FastLED.show(powerScale(videoBrightness, totalPower));
FastLED.countFPS();
}
void
Renderer::handleEvent(const InputEvent& evt)
{
switch (evt.intent) {
case InputEvent::PowerToggle:
m_powerState = m_powerState.value() <= 128 ? 255 : 0;
Log.notice("Power toggled to %t", m_powerState);
break;
case InputEvent::SetPower:
m_powerState = evt.asInt() == 0 ? 0 : 255;
Log.notice("Power state is now %t", m_powerState);
break;
case InputEvent::SetBrightness:
m_brightness = evt.asInt();
break;
}
}
uint8_t
Renderer::powerScale(uint8_t target, uint32_t totalPower) const
{
if (m_powerManaged) {
uint32_t requested = ((uint32_t)totalPower * target) / 256;
if (requested > totalPower) {
return (uint32_t)((uint8_t)(target) * (uint32_t)(totalPower)) / ((uint32_t)(requested));
}
}
return target;
}
void
Renderer::onStart()
{
@ -50,3 +87,27 @@ Renderer::onStart()
}
FastLED.show();
}
void
Renderer::doOn(Args& args, Print& print)
{}
void
Renderer::doOff(Args& args, Print& print)
{}
void
Renderer::doBrightness(Args& args, Print& print)
{}
const std::vector<Command>&
Renderer::commands() const
{
static const std::vector<Command> _commands = {
Command{"brightness", &Renderer::doBrightness},
Command{"on", &Renderer::doOn},
Command{"off", &Renderer::doOff}
};
return _commands;
}

View File

@ -1,4 +1,6 @@
#include "./Figment.h"
#include "./Animation.h"
#include "./Input.h"
#include <vector>
class Display;
@ -9,10 +11,26 @@ public:
void loop() override;
void onStart() override;
void handleEvent(const InputEvent& evt) override;
static const char* lastFigmentName();
const std::vector<Command>& commands() const override;
private:
const std::vector<Figment*> m_figments;
const std::vector<Display*> m_displays;
AnimatedNumber m_powerState = 255;
AnimatedNumber m_brightness = 255;
bool m_powerManaged = true;
uint8_t m_voltage;
uint8_t m_milliamps;
uint8_t powerScale(uint8_t target, uint32_t totalPower) const;
void doBrightness(Args& args, Print& print);
void doOn(Args& args, Print& print);
void doOff(Args& args, Print& print);
};