// @filter: (memory is large)

/// @file    Blur2d.ino
/// @brief   Demonstrates 2D blur effects on LED matrix
/// @example Blur2d.ino
///
/// This sketch is fully compatible with the FastLED web compiler. To use it do the following:
/// 1. Install Fastled: `pip install fastled`
/// 2. cd into this examples page.
/// 3. Run the FastLED web compiler at root: `fastled`
/// 4. When the compiler is done a web page will open.

// UIDescription: This example shows how to blur a strip of LEDs in 2d.

#include <Arduino.h>
#include <FastLED.h>

#include "fl/ui/ui.h"
#include "fl/math/xymap.h"


#define WIDTH 22
#define HEIGHT 22

#define NUM_LEDS (WIDTH * HEIGHT)
#define BLUR_AMOUNT 172
#define DATA_PIN 2 // Change this to match your LED strip's data pin
#define BRIGHTNESS 255
#define SERPENTINE true

fl::CRGB leds[NUM_LEDS];
uint8_t pos = 0;
bool toggle = false;
fl::XYMap xymap(WIDTH, HEIGHT, SERPENTINE);

void setup() {
    FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS)
      .setScreenMap(xymap);  // Necessary when using the FastLED web compiler to display properly on a web page.
    FastLED.setBrightness(BRIGHTNESS);
    Serial.println("setup");
}

void loop() {
    static int x = random(WIDTH);
    static int y = random(HEIGHT);
    static fl::CRGB c = fl::CRGB(0, 0, 0);
    blur2d(leds, WIDTH, HEIGHT, BLUR_AMOUNT, xymap);
    EVERY_N_MILLISECONDS(1000) {
        x = random(WIDTH);
        y = random(HEIGHT);
        uint8_t r = random(255);
        uint8_t g = random(255);
        uint8_t b = random(255);
        c = fl::CRGB(r, g, b);
    }
    leds[xymap(x, y)] = c;
    FastLED.show();
    delay(20);
}
