This document introduces the FastLED source tree housed under src/, first by mapping the major directories and public headers, then providing a practical guide for two audiences:
- First‑time FastLED users who want to know which headers to include and how to use common features
- Experienced C++ developers exploring subsystems and how the library is organized
The src/ directory contains the classic FastLED public API (FastLED.h), the cross‑platform fl:: foundation, effect/graphics utilities, platform backends, sensors, fonts/assets, and selected third‑party shims.
- Overview and Quick Start
- Directory Map (7 major areas)
- Quick Usage Examples
- Deep Dives by Area
- Guidance for New Users
- Guidance for C++ Developers
FastLED.hand classic public headers for sketchesfl/: cross‑platform foundation (containers, math, graphics primitives, async, JSON)fx/: effect/graphics utilities and 1D/2D composition helpersplatforms/: hardware abstraction layers (AVR, ARM, ESP, POSIX, STUB, WASM, etc.)sensors/: basic input components (buttons, digital pins)fonts/: built‑in bitmap fonts for overlaysthird_party/: vendored minimal headers and compatibility glue
If you are writing Arduino‑style sketches, include FastLED.h. For advanced/host builds or portable C++, prefer including only what you use from fl/ and related subsystems.
- Sketches:
#include <FastLED.h>for the canonical API - Advanced C++ (host, tests, platforms): include targeted headers (e.g.,
"fl/vector.h","fl/downscale.h","fx/frame.h") - Prefer
fl::facilities to keep portability across compilers and embedded targets. Seesrc/fl/README.mdfor the fullfl::guide.
- Entry points:
FastLED.h, color types, core utilities, and historical compatibility headers - Glue to bridge classic APIs to modern subsystems (e.g.,
fl::drawing/mapping)
- Embedded‑aware STL‑like utilities, geometry/graphics primitives, color/math, async, JSON, I/O
- Start here for containers, views, memory, rasterization, XY mapping, resampling, and UI glue
- See
src/fl/README.mdfor a comprehensive breakdown
- Composition engine pieces: frames, layers, blenders, interpolators, and specialized effect helpers
- 1D/2D utilities and video helpers for higher‑level effect construction
- Target backends and shims for AVR, ARM, ESP, POSIX, STUB (for tests), WASM, etc.
- Shared code for JSON UI, timing, and platform integrations
- Minimal input primitives (e.g.,
button,digital_pin) intended for demos and portable logic
- Small bitmap fonts (e.g.,
console_font_4x6) to draw text overlays in demos/tests
- Small vendored components such as
arduinojsonheaders and platform shims kept intentionally minimal
The following examples show how to use common capabilities reachable from src/.
#include <FastLED.h>
constexpr uint16_t NUM_LEDS = 144;
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812B, 5, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(160);
}
void loop() {
fill_rainbow(leds, NUM_LEDS);
FastLED.show();
}#include <FastLED.h>
#include "fl/leds.h"
#include "fl/xymap.h"
constexpr uint16_t WIDTH = 16;
constexpr uint16_t HEIGHT = 16;
constexpr uint16_t NUM_LEDS = WIDTH * HEIGHT;
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812B, 5, GRB>(leds, NUM_LEDS);
}
void loop() {
auto map = fl::XYMap::constructSerpentine(WIDTH, HEIGHT);
fl::Leds s = fl::Leds(leds, map);
for (uint16_t y = 0; y < HEIGHT; ++y) {
for (uint16_t x = 0; x < WIDTH; ++x) {
uint8_t hue = uint8_t((x * 255u) / (WIDTH ? WIDTH : 1));
s(x, y) = CHSV(hue, 255, 255);
}
}
FastLED.show();
}#include "fl/downscale.h"
#include "fl/upscale.h"
#include "fl/grid.h"
// High‑def buffer drawn elsewhere
fl::Grid<CRGB> srcHD(64, 64);
// Downscale into your physical panel resolution
fl::Grid<CRGB> panel(16, 16);
void render_frame() {
fl::downscale(srcHD, srcHD.size_xy(), panel, panel.size_xy());
}#include <FastLED.h>
#include "fl/ui.h"
UISlider brightness("Brightness", 128, 0, 255);
UICheckbox enabled("Enabled", true);
void setup() {
brightness.onChanged([](UISlider& s){ FastLED.setBrightness((uint8_t)s); });
}
void loop() {
FastLED.show();
}See src/fl/README.md and platforms/shared/ui/json/readme.md for JSON UI lifecycle and platform bridges.
- Sketch entry point:
FastLED.h - Classic helpers: color conversions, dithering, palettes, HSV/CRGB utilities
- Bridge to newer subsystems (e.g., treat
CRGB*as anfl::Ledssurface for 2D rendering)
- The
fl::namespace offers:- Containers and views (
vector,span,slice) - Graphics/rasterization (
raster,xymap,rectangular_draw_buffer) - Resampling (
downscale,upscale,supersample) - Color/math (
hsv,hsv16,gamma,gradient,sin32,random) - Async/functional (
task,promise,function_list) - JSON and I/O (
json,ostream,printf)
- Containers and views (
- Detailed documentation:
src/fl/README.md
fx/contains an effect pipeline with frames, layers, and video helpers- Typical usage: assemble layers, blend or interpolate frames, and map output to LEDs via
fl::Leds - Headers to look for:
fx/frame.h,fx/detail/*,fx/video/*(exact APIs evolve; see headers)
platforms/stub/: host/test builds without hardware; ideal for CI and examplesplatforms/wasm/: web builds with JSON UI, Asyncify integration, and JS glueplatforms/arm/,platforms/esp/,platforms/avr/,platforms/posix/: target‑specific shims- Compile‑time gates and helpers: see
platforms/*/*.handplatforms/ui_defs.h
- JSON UI is enabled by default on WASM (
FASTLED_USE_JSON_UI=1) - Browser UI is driven via platform glue (
src/platforms/wasm/ui.cpp, JS modules) - Async patterns rely on the
fl::task/engine events integration; see examples inexamples/underwasm/topics
- The source tree includes a rich test suite under
tests/and CI utilities underci/ - For portability, prefer
fl::primitives and compile‑time guards (compiler_control.h,warn.h,assert.h) - Many platform backends provide “fake” or stubbed facilities for host validation
- If you are writing sketches: include
FastLED.hand follow examples inexamples/ - For 2D matrices or layouts: wrap your
CRGB*withfl::Ledsand anfl::XYMap - For high‑quality rendering: consider
supersample+downscaleto preserve detail - On WASM: explore the JSON UI to add sliders/buttons without platform‑specific code
- Treat
fl::as an embedded‑friendly STL and graphics/math foundation; preferfl::span<T>for parameters - Use compiler‑portable control macros from
fl/headers rather than raw pragmas - Keep platform dependencies behind
platforms/shims and use the STUB backend for host tests - Prefer
fl::memfillovermemsetwhere applicable to match codebase idioms
This README will evolve alongside the codebase. For subsystem details, jump into the directories listed above and consult header comments and src/fl/README.md for the foundation layer.