LPD8806 code and sanity check

Hey!
So, I have six lighting fixtures with 3 LPD8806 based LED strips each attached to them.
Because of physical limitations of the fixtures, they are connected in parellel, and I can't chain the strips. Each strip has 20 LEDs on it. They aren't the adafruit LEDs, but a roll I ordered from alibaba.
I'm running everything off of an arduino mega, and don't have any additional circuitry, just basically direct connect from arduino to appropriate LED.

Currently, I'm getting just a string of gibberish LEDs. Really hoping to get a sanity check, as I get demos working previously, and I don't understand what's going wrong now The installation is going up in two days, kinda panicked. Thanks in advance!

To explain the code a bit:
It sets up all the different strips, and runs a test (currently not working).
The strips should be constrained to a particular colour set based off the the individual power values from the Light struct, so between 0-127 red and 0-60 yellow, creating a range from deep red to orange (it's for a fire light)
But ya, currently nothing is happening.

Here's my code (gist here: Having a hell of a time with this arduino sketch. It's for this installation: http://www.andrewlb.com/2013/01/firesite-debug-view/ I think I'm getting there though. It is currently not quite working, but kind of working. I had misunderstood how the LPD8806 chip worked, switched over to only using the PWM pins. I'm going to have to split the signals across the different strips somehow, also potentially boost via 74HCT245 IC to get distance. Also, the color mixing for this thing is insane, and not corresponding to the RGB vals I pulled from the LPD8806 lib from adafruit. These aren't the adafruit LED strips though. · GitHub)

#include "LPD8806.h"
#include "SPI.h"

// Constants
const int NUMLIGHTS = 6;    // Number of lights per arm
const int NUMARMS = 3;      // Number of arms per light
const int LEDPERARM = 20;   // Number of lights
const int testPin = 53;

int dataPins[NUMLIGHTS*NUMARMS] = {
    22,24,26,   // Light 0
    28,30,32,   // Light 1
    34,36,38,   // Light 2
    40,42,44,   // Light 3
    46,48,50,   // Light 4
    4,6,8     // Light 5 
/*    2,
    4,
    6,
    8,
    10,
    12 */
    
    
    
};

int clockPins[NUMLIGHTS*NUMARMS] = {
    23,25,27,   // Light 0
    29,31,33,   // Light 1
    35,37,39,   // Light 2
    41,43,45,   // Light 3
    47,49,51,   // Light 4
    5,7,9     // Light 5    
/*    3,
    5,
    7,
    9,
    11,
    13 */
    
    
};

// Light struct
typedef struct {
    int id; // The id must match that of the OF program
    int pwr; // 0-127 val, derived from OF float val
    LPD8806 strip[NUMARMS]; // The three strips
} Light;

Light Lights[NUMLIGHTS]; // Declare lights array


// Serial communication
String inString = ""; 
int inChar;
int curLight = 0;
//int curArm = 0;
int curPwr = 0;

void setup() {
    // Setup all lights and arms
    pinMode(testPin,OUTPUT);
    for(int i=0;i<NUMLIGHTS;i++) {
        // Set up the Lights with the appropriate objects
        Lights[i].id = i;
        for(int a=0;a<NUMARMS;a++) {
            Lights[i].strip[a] = LPD8806(LEDPERARM, dataPins[i+a],   clockPins[i+a]);   
            Lights[i].strip[a].begin();
            Lights[i].strip[a].show();
            testStrip(&Lights[i].strip[a]);
            clearStrip(&Lights[i].strip[a]);
        }
    }
    
    // Start serial communication    
    Serial.begin(9600);
    digitalWrite(testPin, HIGH); 
    delay(500);
}

void testStrip(LPD8806 * strip) {
    int i;
    for(i=0; i<strip->numPixels(); i++) { 
        strip->setPixelColor(i, 0);
        strip->show(); 
    }
    
    // Then display one pixel at a time:
    for(i=0; i<strip->numPixels(); i++) {
        strip->setPixelColor(i, getColor(127) ); // Set new pixel 'on'
        strip->show();              // Refresh LED states
        strip->setPixelColor(i, 0); // Erase pixel, but don't refresh!
        delay(25);
    }
    
    strip->show(); // Refresh to turn off last pixel
}

void clearStrip(LPD8806 * strip) {
    int i;
    
    for (i=0; i < strip->numPixels(); i++) {
        strip->setPixelColor(i, getColor(0));
        strip->show();
        delay(10);
    }
}
               
void loop() {
    if(Serial.available() == 0) {
        digitalWrite(testPin, LOW); 
        for(int i=0;i<NUMLIGHTS;i++) {
            render(i);
        }
        digitalWrite(testPin, HIGH); 
    } else {
        digitalWrite(testPin, HIGH); 
        for(int i=0;i<NUMLIGHTS;i++) {
            testStrip(&Lights[i].strip[0]);
        }        
        digitalWrite(testPin, LOW); 
    }
}                  
                                         
void render(uint32_t lightId) {
    int maxPower, minPower, ptr, ledStr, pwr;
    for(int a=0;a<NUMARMS;a++) {
        for(int i=0;i<LEDPERARM;i++) {
            maxPower = i / LEDPERARM;
            minPower = 127 - (maxPower * (127-Lights[lightId].pwr));
          //  ptr = i + ( a * LEDPERARM );
            pwr = (byte)Lights[lightId].pwr;
            Lights[lightId].strip[a].setPixelColor(i,getColor(pwr));
        }
        Lights[lightId].strip[a].show();
    }
    
    delay(10); // holders for 10ms
}

// Derived from the LPD8806 lib
uint32_t getColor(byte pwr) {    
    byte r,g,b;
    r = (byte)(1 + (.5 * pwr));
    g = (byte)(.5 * pwr);
    b = (byte)0;
    
    return ((uint32_t)(g | 0x80) << 16) |
    ((uint32_t)(r | 0x80) <<  8) |
    b | 0x80 ;
}
                                         
void parseSerial() {
    // Read serial input:
    if (Serial.available() > 0) {
        inChar = Serial.read();
    }
    
    // Collecting the datas.
    if (isDigit(inChar)) {
        inString += (char)inChar; 
    }
    
    // Iterating through the lights
    if (inChar == ',') {
        Lights[curLight].pwr = inString.toInt();
        inString = ""; 
        curLight++;
    }
    
    // Last light
    if (inChar == '\n') {
        Lights[NUMLIGHTS-1].pwr = inString.toInt();
        inString = ""; 
        curLight = 0;
    }   
}