agents/examples.md
For comprehensive guidelines, read these files:
| Topic | Read |
|---|---|
| C++ coding standards | agents/docs/cpp-standards.md |
| Build commands | agents/docs/build-system.md |
| Testing commands | agents/docs/testing-commands.md |
| Debugging strategies | agents/docs/debugging.md |
| LLDB debugging guide | agents/docs/lldb-debugging.md |
This file contains only example-directory-specific guidelines.
.ino files should be created SPARINGLY and ONLY when truly justified.
Use Pattern: temp_<feature>.ino or test_<api>.ino
// temp_json_api.ino - Testing new JSON fetch functionality
// test_networking.ino - Validating network stack changes
Use Pattern: examples/<FeatureName>/<FeatureName>.ino
// examples/JsonFetchApi/JsonFetchApi.ino - Comprehensive JSON API example
// examples/NetworkStack/NetworkStack.ino - Major networking features
Before creating ANY .ino file, ask:
๐ค Is this testing a new API?
temp_<name>.ino, delete after testing๐ค Is this a significant new feature that users will commonly use?
examples/<FeatureName>/<FeatureName>.ino๐ค Can I modify an existing example instead?
๐ค Is this just for debugging/validation?
For Feature Examples (.ino files that stay):
For Temporary Testing (.ino files that get deleted):
test_basic_led.ino - Use existing Blink exampledebug_colors.ino - Use existing ColorPalette examplequick_brightness.ino - Use unit tests or modify existing examplevalidate_pins.ino - Use PinTest example or unit teststemp_new_wifi_api.ino - Testing major new WiFi functionality (temporary)examples/MachineLearning/MachineLearning.ino - New ML integration feature (permanent)temp_performance_test.ino - Validating optimization changes (temporary)Remember: The examples directory is user-facing documentation. Every .ino file should provide clear value to FastLED users.
NO emoticons or emoji characters are allowed in C++ source files. This ensures professional, maintainable code that works correctly across all platforms and development environments.
Examples of what NOT to do in .ino files:
// โ BAD - Emoticons in comments
// ๐ฏ This function handles user input
// โ BAD - Emoticons in log messages
FL_WARN("โ
Operation successful!");
FL_WARN("โ Error occurred: " << error_msg);
// โ BAD - Emoticons in string literals
const char* status = "๐ Processing...";
Examples of correct alternatives:
// โ
GOOD - Clear text in comments
// TUTORIAL: This function handles user input
// โ
GOOD - Text prefixes in log messages
FL_WARN("SUCCESS: Operation completed successfully!");
FL_WARN("ERROR: Failed to process request: " << error_msg);
// โ
GOOD - Descriptive text in string literals
const char* status = "PROCESSING: Request in progress...";
๐ฏ PREFERRED: Use the modern fl::json class for all JSON operations. FastLED provides an ideal JSON API that prioritizes type safety, ergonomics, and crash-proof operation.
โ IDIOMATIC JSON USAGE:
// NEW: Clean, safe, idiomatic API
fl::json json = fl::json::parse(jsonStr);
int brightness = json["config"]["brightness"] | 128; // Gets value or 128 default
string name = json["device"]["name"] | string("default"); // Type-safe with default
bool enabled = json["features"]["networking"] | false; // Never crashes
// Array operations
if (json["effects"].contains("rainbow")) {
// Safe array checking
}
โ DISCOURAGED: Verbose legacy API:
// OLD: Verbose, error-prone API (still works, but not recommended)
fl::JsonDocument doc;
fl::string error;
fl::parseJson(jsonStr, &doc, &error);
int brightness = doc["config"]["brightness"].as<int>(); // Can crash if missing
๐ Reference Example: See examples/Json/Json.ino for comprehensive usage patterns and API comparison.
DO NOT use try-catch blocks or C++ exception handling in examples. FastLED is designed to work on embedded systems like Arduino where exception handling may not be available or desired due to memory and performance constraints.
Use Error Handling Alternatives:
bool function() { return false; } or custom error enumsfl::optional<T> for functions that may not return a valueFL_ASSERT(condition) for debug-time validationif (!valid) return false; for error conditionsExamples of proper error handling:
// Good: Using return codes
bool initializeHardware() {
if (!setupPins()) {
FL_WARN("Failed to setup pins");
return false;
}
return true;
}
// Good: Using fl::optional
fl::optional<float> calculateValue(int input) {
if (input < 0) {
return fl::nullopt; // No value, indicates error
}
return fl::make_optional(sqrt(input));
}
// Good: Using early returns
void processData(const uint8_t* data, size_t len) {
if (!data || len == 0) {
FL_WARN("Invalid input data");
return; // Early return on error
}
// Process data...
}
ALWAYS use the FastLED compiler control macros from fl/stl/compiler_control.h for warning suppression. This ensures consistent cross-compiler support and proper handling of platform differences.
Correct Warning Suppression Pattern:
#include "fl/stl/compiler_control.h"
// Suppress specific warning around problematic code
FL_DISABLE_WARNING_PUSH
FL_DISABLE_FORMAT_TRUNCATION // Use specific warning macros
// ... code that triggers warnings ...
FL_DISABLE_WARNING_POP
Available Warning Suppression Macros:
FL_DISABLE_WARNING_PUSH / FL_DISABLE_WARNING_POP - Standard push/pop patternFL_DISABLE_WARNING(warning_name) - Generic warning suppression (use sparingly)FL_DISABLE_WARNING_GLOBAL_CONSTRUCTORS - Clang global constructor warningsFL_DISABLE_WARNING_SELF_ASSIGN_OVERLOADED - Clang self-assignment warningsFL_DISABLE_FORMAT_TRUNCATION - GCC format truncation warningsWhat NOT to do:
#pragma directives - they don't handle compiler differences#ifdef __clang__ / #ifdef __GNUC__ blocks - use the macros๐จ MANDATORY: Always test WASM compilation after platform file changes
Platform Testing Commands:
# Test WASM platform changes (for platform developers)
uv run ci/wasm_compile.py examples/wasm --just-compile
# Quick compile test for any sketch (compile only, no browser)
uv run ci/wasm_compile.py examples/Blink --just-compile
# Quick compile test for NetTest example
uv run ci/wasm_compile.py examples/NetTest --just-compile
# Quick test without full build
uv run ci/wasm_compile.py examples/wasm --quick
Watch For These Error Patterns:
error: conflicting types for 'function_name'error: redefinition of 'function_name'warning: attribute declaration must precede definitionRuntimeError: unreachable (often async-related)MANDATORY RULES:
uv run ci/wasm_compile.py for validation๐จ ALL AGENTS: Read agents/docs/cpp-standards.md and relevant agents/docs/*.md files before concluding example work to refresh memory about .ino file creation rules and example coding standards.