#include <FastLED.h>

const uint8_t kMatrixWidth  = 23;
const uint8_t kMatrixHeight = 13;
#define LED_PIN 3
#define LAST_VISIBLE_LED 114
#define NUM_LEDS    ((kMatrixWidth*kMatrixHeight) + 1)
#define DUMMY_LED   (NUM_LEDS - 1)
CRGB leds[NUM_LEDS];
#define MAX_DIMENSION ((kMatrixWidth>kMatrixHeight)? kMatrixWidth: kMatrixHeight)

// XYtable moved to global scope so it works correctly with PROGMEM
const uint16_t XYTable[] PROGMEM = {
    0,   0,   0,   0,   0,   0,   0,   5,   0,   4,   0,   3,   0,   2,   0,   1,   0,   0,   0,   0,   0,   0,   0,
    0,   0,   0,   0,   0,   0,   6,   0,   7,   0,   8,   0,   9,   0,  10,   0,  11,   0,   0,   0,   0,   0,   0,
    0,   0,   0,   0,   0,  18,   0,  17,   0,  16,   0,  15,   0,  14,   0,  13,   0,  12,   0,   0,   0,   0,   0,
    0,   0,   0,   0,  19,   0,  20,   0,  21,   0,  22,   0,  23,   0,  24,   0,  25,   0,  26,   0,   0,   0,   0,
    0,   0,   0,  35,   0,  34,   0,  33,   0,  32,   0,  31,   0,  30,   0,  29,   0,  28,   0,  27,   0,   0,   0,
    0,   0,  36,   0,  37,   0,  38,   0,  39,   0,  40,   0,  41,   0,  42,   0,  43,   0,  44,   0,  45,   0,   0,
    0,  56,   0,  55,   0,  54,   0,  53,   0,  52,   0,  51,   0,  50,   0,  49,   0,  48,   0,  47,   0,  46,   0,
    57,   0,  58,   0,  59,   0,  60,   0,  61,   0,  62,   0,  63,   0,  64,   0,  65,   0,  66,   0,  67,   0,  68,
    0,  79,   0,  78,   0,  77,   0,  76,   0,  75,   0,  74,   0,  73,   0,  72,   0,  71,   0,  70,   0,  69,   0,
    80,   0,  81,   0,  82,   0,  83,   0,  84,   0,  85,   0,  86,   0,  87,   0,  88,   0,  89,   0,  90,   0,  91,
    0,   0,   0,   0,   0,  98,   0,  97,   0,  96,   0,  95,   0,  94,   0,  93,   0,  92,   0,   0,   0,   0,   0,
    0,   0,   0,   0,  99,   0, 100,   0, 101,   0, 102,   0, 103,   0, 104,   0, 105,   0, 106,   0,   0,   0,   0,
    0,   0,   0, 115,   0, 114,   0, 113,   0, 112,   0, 111,   0, 110,   0, 109,   0, 108,   0, 107,   0,   0,   0,
}; 

uint16_t XY (uint16_t x, uint16_t y) {
  // any out of bounds address maps to the first hidden pixel
  if ( (x >= kMatrixWidth) || (y >= kMatrixHeight) ) {
    return DUMMY_LED;
  }

  uint16_t i = (y * kMatrixWidth) + x;
  uint16_t j = pgm_read_word_near(&XYTable[i]) != 0 ? i : DUMMY_LED;
  return j;
}

// Color correction for the SmartMatrix
#define COLOR_CORRECTION CRGB(255,110,178)


//Patterns
#include "Rainbow.h"
#include "Drops.h"

void setup()
{
  // Serial.begin(115200);
    FastLED.addLeds<WS2812, LED_PIN, RGB>(leds, NUM_LEDS);
}

void loop()
{
runRainbow();
}


void runRainbow(){
  bool isRunning = true;
  Rainbow rainbow = Rainbow();
  while(isRunning) isRunning = rainbow.runPattern();
}


void runDrops(){
  bool isRunning = true;
  Drops drops = Drops();
  while(isRunning) isRunning = drops.runPattern();
}
FPS: 0
Power: 0.00W