//Drop implementation for fibonacci 256 
//fastled fibonacci 256 leds  demo
//Stepko

//https://wokwi.com/arduino/projects/283705656027906572

#include "FastLED.h"
#define WIDTH 20
#define HEIGHT 20
// LEDs pin
#define DATA_PIN 3
// LED brightness
#define BRIGHTNESS 255
#define NUM_LEDS HEIGHT * WIDTH
// Define the array of leds
CRGB leds[257];

static const uint16_t FibonPlanarTable[] PROGMEM ={
  256,256,256,256,256,256,256,256,36,39,38,37,256,256,256,256,256,256,256,256,256,256,256,256,256,13,34,35,40,
  256,58,59,60,61,256,256,256,256,256,256,256,256,256,256,14,33,256,41,56,57,68,67,66,65,64,63,256,256,256,256,
  256,256,256,12,15,32,42,55,256,69,256,79,80,81,82,83,62,256,256,256,256,256,11,16,31,256,43,54,70,77,78,94,
  93,92,91,90,84,85,256,256,256,255,10,17,30,44,53,71,76,256,95,256,101,102,103,104,89,88,256,256,256,254,9,18,
  29,45,52,72,75,96,256,100,120,119,118,117,105,106,87,256,256,253,8,19,28,46,256,51,73,97,99,121,124,125,126,
  256,116,256,107,86,232,252,7,20,256,27,47,256,50,74,122,123,145,144,256,127,256,115,256,108,233,251,6,256,21,
  256,26,48,49,256,98,146,147,148,143,256,128,256,114,109,231,234,250,5,256,22,23,25,24,0,195,171,170,169,149,
  142,256,129,113,110,230,235,256,249,4,3,2,1,244,243,256,194,172,256,168,150,141,130,112,256,256,229,236,256,
  248,247,246,245,242,220,219,196,193,173,167,151,140,131,111,256,256,208,228,237,238,239,240,241,256,221,218,
  197,192,174,166,152,139,132,256,256,256,256,209,227,226,256,256,256,222,256,217,198,191,175,165,153,138,133,
  256,256,256,256,207,210,211,225,224,223,215,216,199,256,190,176,164,154,137,134,256,256,256,256,256,206,205,
  212,213,214,201,200,256,189,177,163,256,155,136,256,256,256,256,256,256,256,256,204,203,202,256,187,188,178,
  162,256,156,135,256,256,256,256,256,256,256,256,256,183,184,185,186,180,179,161,256,157,256,256,256,256,256,
  256,256,256,256,256,256,256,256,182,181,159,160,256,158,256,256,256,256,256,256,256 
};  

void setup() {
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
}


//Drop
//@stepko
#define Sat (255)
#define Hue (150)



void fillAll(CRGB color) {
  for (int i = 0; i < 257; i++) {
    leds[i] = color;
  }
}


void drawPixelXY(uint8_t x, uint8_t y, CRGB color)
{
  if (x < 0 || x > (WIDTH - 1) || y < 0 || y > (HEIGHT - 1)) return;
    leds[XY(x,y)] = color;}
    
void drawCircle(int x0, int y0, int radius, const CRGB &color){
  int a = radius, b = 0;
  int radiusError = 1 - a;

  if (radius == 0) {
    drawPixelXY(x0, y0, color);
    return;
  }
  while (a >= b)  {
    drawPixelXY(a + x0, b + y0, color);
    drawPixelXY(b + x0, a + y0, color);
    drawPixelXY(-a + x0, b + y0, color);
    drawPixelXY(-b + x0, a + y0, color);
    drawPixelXY(-a + x0, -b + y0, color);
    drawPixelXY(-b + x0, -a + y0, color);
    drawPixelXY(a + x0, -b + y0, color);
    drawPixelXY(b + x0, -a + y0, color);
    b++;
    if (radiusError < 0)
      radiusError += 2 * b + 1;
    else
    {
      a--;
      radiusError += 2 * (b - a + 1);
    }
  }
  }


bool loadingFlag = true;

CRGBPalette16 currentPalette(PartyColors_p);
uint8_t hue;

int rad[(HEIGHT+WIDTH)/8];
byte posx[(HEIGHT+WIDTH)/8],posy[(HEIGHT+WIDTH)/8];

void draw() {
  if (loadingFlag)
  {loadingFlag = false;
    hue = Hue;
      for (int i = 0; i < ((HEIGHT+WIDTH)/8)-1; i++)
  {
    posx[i]=random(WIDTH-1);
    posy[i]=random(HEIGHT-1);
    rad[i] = random(-1,(HEIGHT+WIDTH)/2);
    }
  }
    fill_solid( currentPalette, 16, CHSV(hue,Sat,230));
    currentPalette[10] = CHSV(hue,Sat-60,255);
    currentPalette[9] = CHSV(hue,255-Sat,210);
    currentPalette[8] = CHSV(hue,255-Sat,210);
    currentPalette[7] = CHSV(hue,Sat-60,255);
    fillAll(ColorFromPalette(currentPalette,1));
     for (uint8_t i = ((HEIGHT+WIDTH)/8)-1; i > 0 ; i--){
    drawCircle(posx[i],posy[i], rad[i],ColorFromPalette(currentPalette,(256/16)*8.5-rad[i]));
    drawCircle(posx[i],posy[i], rad[i]-1,ColorFromPalette(currentPalette,(256/16)*7.5-rad[i]));
    if(rad[i] >= (HEIGHT+WIDTH)/2){
    rad[i]=-1;
    posx[i]=random(WIDTH-1);
    posy[i]=random(HEIGHT-1);}
    else
    rad[i]++;
}
if(Hue == 0)
hue++;}
void loop() {draw();FastLED.show();
} //loop


uint16_t XY(byte x, byte y) { 
uint16_t ledsindex = pgm_read_word (FibonPlanarTable+y*WIDTH+x);
return (ledsindex);
}
uno:SCL
uno:SDA
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:14
uno:15
uno:16
uno:17
uno:18
uno:19
uno:20
uno:21
uno:5V.1
uno:5V.2
uno:22
uno:23
uno:24
uno:25
uno:26
uno:27
uno:28
uno:29
uno:30
uno:31
uno:32
uno:33
uno:34
uno:35
uno:36
uno:37
uno:38
uno:39
uno:40
uno:41
uno:42
uno:43
uno:44
uno:45
uno:46
uno:47
uno:48
uno:49
uno:50
uno:51
uno:52
uno:53
uno:GND.4
uno:GND.5
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
uno:A6
uno:A7
uno:A8
uno:A9
uno:A10
uno:A11
uno:A12
uno:A13
uno:A14
uno:A15
FPS: 0
Power: 0.00W
neopixels:DOUT
neopixels:VDD
neopixels:DIN
neopixels:VSS