// --> include libraries

#include <FastLED.h>

// --> defines and constants and global variables

#define NUM_LEDS 384      // number of LEDS
CRGB leds[NUM_LEDS];     // Define led strip

int brightness = 250;          // LED brightness
int t = 2;                     // Travel before turning
int c = 1;                     // Colour
int i = 4;                     // LED
int NS[] = {-8, 8};
int EW[] = {-1, 1};
//int NESW[] = {-8, 1, 8, -1};
int d = 1;                     // Direction select
int nd = 1;                    // New Direction

// --> user defined functions

//void DIRECTION();
void FADE();

// --> setup

void setup()
{ FastLED.addLeds<NEOPIXEL, 3>(leds, 0, 255);
  FastLED.addLeds<NEOPIXEL, 4>(leds, 256, 319);
  FastLED.addLeds<NEOPIXEL, 5>(leds, 320, 383);  
  //FastLED.addLeds<WS2812, 3, RGB>(leds, NUM_LEDS);
  //FastLED.addLeds<WS2812,DATA_PINr2,RGB>(ledsr2,NUM_LEDSr2);
  randomSeed(analogRead(0));
}

// --> loop

void loop()
{
  if ( nd == -1 or nd == 1 )
  {
    d = random(2);                //random pick number
    nd = (NS[d]);                 //use random number to pick direct
  }
  else if ( nd == -8 or nd == 8 )
  {
    d = random(2);                //random pick number
    nd = (EW[d]);                 //use random number to pick direct
  }


  t = random(12, 17);             //pick how long dot travels in that direction
  for (int w = 1; w < t; w++)
  {
    leds[i] = CHSV(c = c + 5, 255, brightness); FastLED.show();
    for(int i = 0; i < NUM_LEDS; i++) { leds[i].nscale8(210);}    //uniform tail
    //FADE(1, 200, true, 100);                                    //random tail
    delay(100);
    //i = i + nd;   
    
    if (i >= 0 and i <= 63)
    { 
      i = i + nd;
      if (nd ==  1)
      {
        if (i ==   8) {i = 320;}
        if (i ==  16) {i = 328;}
        if (i ==  24) {i = 336;}
        if (i ==  32) {i = 344;}
        if (i ==  40) {i = 352;}
        if (i ==  48) {i = 360;}
        if (i ==  56) {i = 368;}
        if (i ==  64) {i = 376;}
      }
      if (nd ==  8)
      { }
      if (nd == -1)
      {
        if (i ==  55) {i = 319;}
        if (i ==  47) {i = 311;}
        if (i ==  39) {i = 303;}
        if (i ==  31) {i = 295;}
        if (i ==  23) {i = 287;}
        if (i ==  15) {i = 279;}
        if (i ==   7) {i = 271;}
        if (i ==  -1) {i = 263;}
      }
      if (nd == -8)
      {
        if (i ==   -1) {i = 255;}
        if (i ==   -2) {i = 254;}
        if (i ==   -3) {i = 253;}
        if (i ==   -4) {i = 252;}
        if (i ==   -5) {i = 251;}
        if (i ==   -6) {i = 250;}
        if (i ==   -7) {i = 249;}
        if (i ==   -8) {i = 248;}
      }
    }
    else if (i >= 64 and i <= 127)
    {
      i = i + nd;
      if (nd ==  1)
      {
        if (i ==  72) {i = 376; nd = -8;}
        if (i ==  80) {i = 377; nd = -8;}
        if (i ==  88) {i = 378; nd = -8;}
        if (i ==  96) {i = 379; nd = -8;}
        if (i == 104) {i = 380; nd = -8;}
        if (i == 112) {i = 381; nd = -8;}
        if (i == 120) {i = 382; nd = -8;}
        if (i == 128) {i = 383; nd = -8;}
      }
      if (nd ==  8)
      { }
      if (nd == -1)
      {
        if (i == 119) {i = 312; nd = -8;}
        if (i == 111) {i = 313; nd = -8;}
        if (i == 103) {i = 314; nd = -8;}
        if (i ==  95) {i = 315; nd = -8;}
        if (i ==  87) {i = 316; nd = -8;}
        if (i ==  79) {i = 317; nd = -8;}
        if (i ==  71) {i = 318; nd = -8;}
        if (i ==  63) {i = 319; nd = -8;}
      }
      if (nd == -8)
      { }
    }
    else if (i >= 128 and i <= 191)
    {
      i = i + nd;
      if (nd ==  1)
      {
        if (i == 136) {i = 383; nd = -1;}
        if (i == 144) {i = 375; nd = -1;}
        if (i == 152) {i = 367; nd = -1;}
        if (i == 160) {i = 359; nd = -1;}
        if (i == 168) {i = 351; nd = -1;}
        if (i == 176) {i = 343; nd = -1;}
        if (i == 184) {i = 335; nd = -1;}
        if (i == 192) {i = 327; nd = -1;}
      }
      if (nd ==  8)
      { }
      if (nd == -1)
      {
        if (i == 183) {i = 256; nd = 1;}
        if (i == 175) {i = 264; nd = 1;}
        if (i == 167) {i = 272; nd = 1;}
        if (i == 159) {i = 280; nd = 1;}
        if (i == 151) {i = 288; nd = 1;}
        if (i == 143) {i = 296; nd = 1;}
        if (i == 135) {i = 304; nd = 1;}
        if (i == 127) {i = 312; nd = 1;}
      }
      if (nd == -8)
      { }
    }
    else if (i >= 192 and i <= 255)
    {
      i = i + nd;
      if (nd ==  1)
      {
        if (i == 200) {i = 327; nd = 8;}
        if (i == 208) {i = 326; nd = 8;}
        if (i == 216) {i = 325; nd = 8;}
        if (i == 224) {i = 324; nd = 8;}
        if (i == 232) {i = 323; nd = 8;}
        if (i == 240) {i = 322; nd = 8;}
        if (i == 248) {i = 321; nd = 8;}
        if (i == 256) {i = 320; nd = 8;}
      }
      if (nd ==  8)
      {
        if (i ==  256) {i =   0;}
        if (i ==  257) {i =   1;}
        if (i ==  258) {i =   2;}
        if (i ==  259) {i =   3;}
        if (i ==  260) {i =   4;}
        if (i ==  261) {i =   5;}
        if (i ==  262) {i =   6;}
        if (i ==  263) {i =   7;}
      }
      if (nd == -1)
      {
        if (i == 247) {i = 263; nd = 8;}
        if (i == 239) {i = 262; nd = 8;}
        if (i == 231) {i = 261; nd = 8;}
        if (i == 223) {i = 260; nd = 8;}
        if (i == 215) {i = 259; nd = 8;}
        if (i == 207) {i = 258; nd = 8;}
        if (i == 199) {i = 257; nd = 8;}
        if (i == 191) {i = 256; nd = 8;}
      }
      if (nd == -8)
      { }
    }
    else if (i >= 256 and i <= 319)
    {
      i = i + nd;
      if (nd ==  1)
      {
        if (i == 264) {i =  0; nd = 1;}
        if (i == 272) {i =  8; nd = 1;}
        if (i == 280) {i = 16; nd = 1;}
        if (i == 288) {i = 24; nd = 1;}
        if (i == 296) {i = 32; nd = 1;}
        if (i == 304) {i = 40; nd = 1;}
        if (i == 312) {i = 48; nd = 1;}
        if (i == 320) {i = 56; nd = 1;}        
      }
      if (nd ==  8)
      {
        if (i ==  320) {i = 120; nd = 1;}
        if (i ==  321) {i = 112; nd = 1;}
        if (i ==  322) {i = 104; nd = 1;}
        if (i ==  323) {i =  96; nd = 1;}
        if (i ==  324) {i =  88; nd = 1;}
        if (i ==  325) {i =  80; nd = 1;}
        if (i ==  326) {i =  72; nd = 1;}
        if (i ==  327) {i =  64; nd = 1;}
      }
      if (nd == -1)
      {
        if (i == 311) {i = 128; nd = 1;}
        if (i == 303) {i = 136; nd = 1;}
        if (i == 295) {i = 144; nd = 1;}
        if (i == 287) {i = 152; nd = 1;}
        if (i == 279) {i = 160; nd = 1;}
        if (i == 271) {i = 159; nd = 1;}
        if (i == 263) {i = 176; nd = 1;}
        if (i == 255) {i = 184; nd = 1;}
      }
      if (nd == -8)
      {
        if (i ==  255) {i = 248; nd = 1;}
        if (i ==  254) {i = 240; nd = 1;}
        if (i ==  253) {i = 232; nd = 1;}
        if (i ==  252) {i = 224; nd = 1;}
        if (i ==  251) {i = 216; nd = 1;}
        if (i ==  250) {i = 208; nd = 1;}
        if (i ==  249) {i = 200; nd = 1;}
        if (i ==  248) {i = 192; nd = 1;}
      }
    }
    else if (i >= 320 and i <= 383)
    {
      i = i + nd;
      if (nd ==  1)
      {
        if (i == 328) {i = 191; nd = -1;}
        if (i == 336) {i = 183; nd = -1;}
        if (i == 344) {i = 175; nd = -1;}
        if (i == 352) {i = 167; nd = -1;}
        if (i == 360) {i = 159; nd = -1;}
        if (i == 368) {i = 151; nd = -1;}
        if (i == 376) {i = 143; nd = -1;}
        if (i == 384) {i = 135; nd = -1;}
      }
      if (nd ==  8)
      {
        if (i ==  384) {i =  71; nd = -1;}
        if (i ==  385) {i =  79; nd = -1;}
        if (i ==  386) {i =  87; nd = -1;}
        if (i ==  387) {i =  95; nd = -1;}
        if (i ==  388) {i = 103; nd = -1;}
        if (i ==  389) {i = 111; nd = -1;}
        if (i ==  390) {i = 119; nd = -1;}
        if (i ==  391) {i = 127; nd = -1;}
      }
      if (nd == -1)
      {
        if (i == 375) {i =  63;}
        if (i == 367) {i =  55;}
        if (i == 359) {i =  47;}
        if (i == 351) {i =  39;}
        if (i == 343) {i =  31;}
        if (i == 335) {i =  23;}
        if (i == 327) {i =  15;}
        if (i == 319) {i =   7;}
      }
      if (nd == -8)
      {
        if (i ==  319) {i = 199; nd = -1;}
        if (i ==  318) {i = 207; nd = -1;}
        if (i ==  317) {i = 215; nd = -1;}
        if (i ==  316) {i = 223; nd = -1;}
        if (i ==  315) {i = 231; nd = -1;}
        if (i ==  314) {i = 239; nd = -1;}
        if (i ==  313) {i = 247; nd = -1;}
        if (i ==  312) {i = 255; nd = -1;}
      }
    }
  }
}




void fadeToBlack(int ledNo, byte fadeValue)
{ leds[ledNo].fadeToBlackBy( fadeValue ); }


void FADE(byte meteorSize, byte meteorTrailDecay, boolean meteorRandomDecay, int SpeedDelay)
  { for(int f=0; f<NUM_LEDS; f++)                   // fade brightness all LEDs one step
    { if( (!meteorRandomDecay) || (random(10)>5) )
      { fadeToBlack(f, meteorTrailDecay ); }
    } 
  }
FPS: 0
Power: 0.00W