 #define EEPROM_SAVE_TIMEOUT_MS 5000
 #define EEPROM_START_POINTER_ADDR 0x0
 
-#define NUM_LEDS    40
-#define WIDTH       6
+#define NUM_LEDS    104
+#define BASE_WIDTH  6
+// If true, adds 1 to BASE_WIDTH for every other row
+#define STAGGERED   true
 // Add 1 if there's a remainder to pretend there's one last full row.
-#define HEIGHT      (NUM_LEDS / WIDTH + (NUM_LEDS % WIDTH ? 1 : 0))
-
 
 CRGB leds[NUM_LEDS];
 
+int width;
+int height;
 int eepromStart;
 long saveTarget;
 

  FastLED.setBrightness(0);
  FastLED.show();

  // FIRST TIME ONLY: Write a valid eepromStart address
  //EEPROM.put(EEPROM_START_POINTER_ADDR, 0x2);

  // Initialize eepromStart: the address where we start writing our settings.
  EEPROM.get(EEPROM_START_POINTER_ADDR, eepromStart);
  // Initialize settings

  checkSave();
}


void setAt(byte x, byte y, CRGB color) {
  if (STAGGERED) {
    
  } else {
    if (x + y * width < NUM_LEDS) {
      leds[x + y * width] = color;
    }
  }
}
void fillRow(byte row, CRGB color) {
  if (STAGGERED) {
    byte start = row * width / 2;
    byte num = width / 2;
    if (row % 2) {
      start += 1;
    } else {
      num += 1;
    }
    if (start + num > NUM_LEDS) {
      Serial.print("DANGER: ");
      Serial.print(row);
      Serial.print(',');
      Serial.print(start);
      Serial.print(',');
      Serial.println(num);
      return;
    }
    fill_solid(leds + start, num, color);
  } else {
    for (byte j = 0; j < width; j++) {
      if (row * width + j < NUM_LEDS) {
        leds[row * width + j] = color; 
      }
    }
  }
}
void fillCol(byte col, CRGB color) {
  if (STAGGERED) {
    for (byte i = col / 2 + (col % 2) * (BASE_WIDTH + 1);
         i < NUM_LEDS; i += width) {
      leds[i] = color;
    }
  } else {
    for (byte j = col; j < NUM_LEDS; j+= width) {
      leds[j] = color;
    }
  }
}

void sendSeparately(byte* buf, int len) {
  // Flush any existing sending,
  Serial.flush();
