FastLED 3.10.8
Loading...
Searching...
No Matches

◆ getEstimatedPowerInMilliWatts()

fl::u32 CFastLED::getEstimatedPowerInMilliWatts ( bool apply_limiter = true) const

Get estimated power consumption in milliwatts.

Calculates the estimated power consumption based on current LED buffer contents, brightness setting, and configured power model. This provides visibility into power usage for monitoring and debugging.

Parameters
apply_limiterIf true (default), applies power limiting to calculate actual power. If false, returns requested power before limiting.
Returns
Estimated LED power consumption in milliwatts:
  • apply_limiter=true: Power AFTER applying max-power cap (actual power)
  • apply_limiter=false: Power BEFORE limiting (requested power)
Note
Usage examples:
fl::u32 actual = FastLED.getEstimatedPowerInMilliWatts(); // With limiting (default)
fl::u32 requested = FastLED.getEstimatedPowerInMilliWatts(false); // Without limiting
CFastLED FastLED
Global LED strip management instance.
When apply_limiter=true:
  • If power limiting is NOT enabled, returns unrestricted power
  • If power limiting IS enabled, returns power after brightness reduction
MCU power consumption is NOT included in this calculation. Add your platform-specific MCU power separately:
fl::u32 mcu_power_mW = 25 * 5; // 25mA @ 5V = 125mW (Arduino Uno example)
fl::u32 total_power = FastLED.getEstimatedPowerInMilliWatts() + mcu_power_mW;
Uses the configured power-scaling response. Default is linear scaling; use model.exponent via setPowerModel() or the setPowerScalingExponent() convenience wrapper to enable a non-linear model.
See also
setMaxPowerInMilliWatts()
setPowerModel()
setPowerScalingExponent()

Definition at line 570 of file FastLED.cpp.hpp.

570 {
571#if FL_COLOR_PIPELINE_SHARED
572 if (apply_limiter && mPPowerFunc && fl::activeFramePowerDispatch()) {
573 bool managed = false;
574 for (CLEDController* p = CLEDController::head(); p; p = p->next()) {
575 if (p->getEnabled() && fl::channelColorPipeline(*p)) {
576 managed = true;
577 break;
578 }
579 }
580 if (managed) {
581 const fl::FramePowerPlan plan =
582 fl::activeFramePowerDispatch()->calculate(mScale, mNPowerData);
583 if (plan.modeled_mW == 0xFFFFFFFFu) return plan.modeled_mW;
584 const fl::u32 mcu_mW = plan.mcu_mW;
585 return plan.modeled_mW > mcu_mW ? plan.modeled_mW - mcu_mW : 0;
586 }
587 }
588#endif
589 fl::u32 fixed_power_mW = 0;
590 fl::u32 controllable_power_mW = 0;
591 fl::u32 dither_reserve_power_mW = 0;
592
593 // Sum unscaled power from all LED controllers using visitor pattern.
594 // The dark-current baseline is kept apart from the part brightness scales,
595 // because it is drawn at every brightness including zero (#4156 R4).
596 const fl::u32 dark_mW_per_led = get_power_model().dark_mW;
597 CLEDController::visitControllers([&](const CLEDController* controller, fl::span<const CRGB> leds) {
598 if (!leds.empty()) {
599 // The controller's own estimate: its RGBW setting, so an RGBW strip
600 // is charged for the diode it actually lights, and for a bound
601 // colour profile the solved drives rather than the source (#4344).
602 const fl::u32 unscaled_mW = controller_unscaled_power_mW(*controller);
603 const fl::u32 dark_mW = dark_mW_per_led * static_cast<fl::u32>(leds.size());
604 fixed_power_mW += dark_mW;
605 controllable_power_mW += unscaled_mW > dark_mW ? unscaled_mW - dark_mW : 0;
606 // What dithering can add on top, at any non-zero brightness (#4342).
607 // Not on TINY, where the bound costs more flash than the tier has
608 // to spare (#4478); controller_dither_reserve_mW is 0 there.
609#if !FL_PLATFORM_HAS_TINY_MEMORY
610 dither_reserve_power_mW += controller_dither_reserve_mW(*controller);
611#endif
612 }
613 });
614
615 // Determine effective brightness
616 fl::u8 effective_brightness = mScale;
617
618 if (apply_limiter && mPPowerFunc) {
619 // Power limiting is enabled and user wants limited power - calculate brightness after limiting
620 // This calls calculate_max_brightness_for_power_mW(mScale, mNPowerData)
621 effective_brightness = (*mPPowerFunc)(mScale, mNPowerData);
622 }
623
624 // Scale only the emitter share by the configured power-brightness response
625 // and add the baseline back, so the estimate matches what the limiter now
626 // budgets against.
627 // Note: MCU power consumption is NOT included - caller should add platform-specific MCU power if needed
628 // The dither reserve only at a non-zero brightness: nothing dithers at 0,
629 // the same as the limiter, whose answer of 0 needs no reserve either.
630 if (effective_brightness != 0) {
631 fixed_power_mW += dither_reserve_power_mW;
632 }
633 return fixed_power_mW +
634 scale_power_for_brightness(controllable_power_mW, effective_brightness);
635}
CLEDController * controller
power_func mPPowerFunc
function for overriding brightness when using FastLED.show();
Definition FastLED.h:731
fl::u8 mScale
the current global brightness scale setting
Definition FastLED.h:727
CRGB * leds() FL_NO_EXCEPT
Get a pointer to led data for the first controller.
fl::u32 mNPowerData
max power use parameter
Definition FastLED.h:730
static void visitControllers(Visitor &&visitor) FL_NO_EXCEPT
Visit all controllers in the linked list with a visitor The visitor must be a callable that accepts (...
static CLEDController * head() FL_NO_EXCEPT
Get the first LED controller in the linked list of controllers.
fl::CLEDController CLEDController
fl::u32 scale_power_for_brightness(fl::u32 total_mW, fl::u8 brightness) FL_NO_EXCEPT
Applies the configured power-scaling response to a total power value.
fl::u32 controller_dither_reserve_mW(const fl::CLEDController &controller) FL_NO_EXCEPT
dither_reserve_mW() for a controller that dithers, and zero for one that does not: a mode other than ...
fl::u32 controller_unscaled_power_mW(const fl::CLEDController &controller) FL_NO_EXCEPT
One controller's demand at full brightness, in mW, including idle draw – the quantity the limiter sum...
PowerModelRGB get_power_model() FL_NO_EXCEPT
Get current RGB power model.
unsigned char u8
Definition stdint.h:131
static fl::u32 fixed_power_mW(fl::u32 led_count) FL_NO_EXCEPT
fl::u8 dark_mW
Dark LED baseline power consumption, in milliwatts.
Definition power_mgt.h:34

References controller, controller_dither_reserve_mW(), controller_unscaled_power_mW(), PowerModelRGB::dark_mW, fixed_power_mW(), FL_NO_EXCEPT, get_power_model(), fl::CLEDController::head(), leds(), fl::FramePowerPlan::mcu_mW, mNPowerData, fl::FramePowerPlan::modeled_mW, mPPowerFunc, mScale, scale_power_for_brightness(), and fl::CLEDController::visitControllers().

+ Here is the call graph for this function: