Glediator y Arduino, Visualizacion no correcta al guardar en SDHC

Hola amigos esperando que todos se encentren bien y de maravilla, les comento y si alguno pudiese ayudarme a entender mejor les estaría agradecido, Diseño una matriz de 32 columnas leds ws2812 * 8 filas, conectadas de forma de serpiente, El primer led lo tengo en la parte Superior Izquierda, el ultimo Se encuentra fijado en la parte Inferior Derecha, como se puede observar en el siguiente esquema.

Arduino

1—> 2–> 3–> 4–> 5–>6–>>> 32–

– 63 <–62<–61<–60<-- 59 <<--------33<-

– 64–>65–>66–>67–>68–>69–>>>96–

97<-

Y así sucesivamente hasta completar los led yo uso el Software Glediator para obtener muy bonitos gráficos en mi Display Tengo Configurado la salida de datos por Puerto Serie a 115200 Uso una configuración De salida en Glediator HS-TL ( Horizontal Snake Top Left ) y todo perfecto. El problema Es cuando yo Grabo las animaciones en un archivo para ejecutar desde la SD usando el propio Arduino, Sin Importar la configuración de salida en Glediator el archivo a grabar siempre sigue esta configuración lineal.

Arduino

1—> 2–> 3–> 4–> 5–>6–>>> 32–
33—>34–> 35–> 36------------------64–
65—>66–> 67–> 68 etc…

Alguno ha sabido como solucionar este problema?

Mi código es el siguiente…

#include <FastLED.h>

#define NUM_LEDS         256
#define LED_TYPE           WS2811
#define COLOR_ORDER    RGB
#define BAUD_RATE        115200
#define CMD_NEW_DATA 1
#define LED                    13
const int dataline =          A0;         //Pin Digital a Utilizar

CRGBArray<NUM_LEDS> leds;

void setup(void) {

FastLED.addLeds<LED_TYPE,dataline,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip );
Serial.begin(115200);

 for(int y = 0 ; y < NUM_LEDS ; y++)  {
    leds[y] = CRGB::Black; // set all leds to black during setup
  }FastLED.show();

  pinMode( SD_ChipSelectPin , OUTPUT); // CS/SS pin as output for SD library to work.
  
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
   pinMode(CsPin, OUTPUT);
   // (         csPin,  mosi, miso, sck) {
  if (!SD.begin(CsPin, Mosi, Miso, Sck)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  // test file open
  fxdata = SD.open("test1.dat");  // read only
  if (fxdata)
  {
    Serial.println("file open ok");      
    fxdata.close();
  }
}

void loop()
{
 fxdata = SD.open("test1.dat");  // read only
  if (fxdata)
    {
      Serial.println("file open ok");      
    }

  while (fxdata.available()) 
  {
    fxdata.read((char*)leds, NUM_LEDS*3);
    FastLED.show();
    delay(50); // set the speed of the animation. 20 is appx ~ 500k bauds
  }
  
  // close the file in order to prevent hanging IO or similar throughout time
  fxdata.close();
}

El efecto guardado en SD es solo una línea color Verde si las conexiones fuesen lineales entonces debería apreciarse así…

Arduino

Led 0----------32

1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0

Pero Sin embargo se muestran así, por la forma en como están conectados los leds…

Arduino

Led 0-----32

1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1

Mi pregunta existe alguna forma de adaptar el software a mi conexión, alguien puede ayudarme a comprender mejor el software, desde ya muchas gracias, y excelente fin de semana…

Supongo que habrás explorado las dos opciones más inmediatas:
-Que gledietor tenga la opción de exportar en el orden alterno tipo “serpiente”.
-O bien que la librería fastled tenga la opción de alternar esas filas.

He intentado compilar tu código y me daba fallo, supongo que porque no tengo la librería correcta, así que no sé si esta variación en el código de tu while te puede funcionar, pero al menos te servirá de guía:

  while (fxdata.available())
  {
    char *lineaLed = (char*) leds;
    for (int a=0; a<8; a++) {
      if (a%2){ // si la línea es impar
        for (int b=93; b>=0; b-=3) { // escribimos la fila en orden inverso
          fxdata.read(linealed + b, 3); // leemos los 3 bytes de cada led de la fila
        }
      } 
      else {
        fxdata.read(linealed, 96); // 32*3 led que tiene la fila
      }
      lineaLed += 96; //avanzamos puntero a la siguiente línea
    }

    FastLED.show();
    delay(50);
  }

Prueba y comenta cómo te fue.