#include "FastLED.h"

// Matrix size
#define HEIGHT 17
#define WIDTH 17
#define NUM_LEDS WIDTH * HEIGHT
#define MATRIX_TYPE 1
// LEDs pin
#define DATA_PIN 3
// LED brightness
#define BRIGHTNESS 255
// Define the array of leds
CRGB leds[NUM_LEDS];


//// ----------------------------- SolarSystem ------------------------------
//(c)stepko
#define CENTER_X WIDTH/2
#define CENTER_Y HEIGHT/2
#define LIGHTERS_AM (WIDTH+HEIGHT)/4
byte lightersColor[LIGHTERS_AM];
byte loopCounter;

int angle[LIGHTERS_AM];
int8_t angleSpeed[LIGHTERS_AM];


bool loadingFlag = true;

uint8_t scale = 16;

void SolarSystem() {
  if (loadingFlag) {
    loadingFlag = false;
    randomSeed(millis());
    for (byte i = 0; i < LIGHTERS_AM; i++) {
      lightersColor[i] = random(0, 9) * 28;
      angle[i] = random(0, 360);
      angleSpeed[i] = 1 + i * random(0, 2) - 1;
    }
  }
  fadeToBlackBy (leds, NUM_LEDS, 10);
  //FastLED.clear();
  for (byte i = 0; i < map(scale, 1, 16, 1, LIGHTERS_AM); i++) {
    angle[i] += angleSpeed[i];
    if (angle[i] > 360) angle[i] = 360 - angle[i];
    if (angle[i] < 0) angle[i] = angle[i];
    leds[XY(CENTER_X + sin(radians(angle[i]))*  angleSpeed[i], CENTER_Y + cos(radians(angle[i]))* angleSpeed[i])] = CHSV(lightersColor[i] + 128, 255, 255);
    /*  EVERY_N_SECONDS(random(10,20)){
      angleSpeed[i] = random(-10, 10);
      }*/
  }
}

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

void loop() {
  SolarSystem();
  FastLED.show();
  static int frame = 0;
  if (frame++ % 32 == 0)
    Serial.println(FastLED.getFPS());

} //loop

uint16_t XY (uint8_t x, uint8_t y) {

  if ((y % 2 == 0) || MATRIX_TYPE)                     // if steam line
  {
    return ((uint32_t)y * WIDTH + x) % (WIDTH * HEIGHT);
  }
  else                                                      // if not steam line
  {
    return ((uint32_t)y  * WIDTH + WIDTH - x - 1) % (WIDTH * HEIGHT);
  }
}