    int r,g,b;
 };
 
+typedef struct runParamTuple
+{
+   gridColorspace colorspace;  
+   axisColorspace xAxisSpace, yAxisSpace; 
+
+   // Axis values may be non-linear (e.g., intensity)
+   union
+   {
+      int axisIntValues[GRID_SIZE_X];
+      float axisFloatValues[GRID_SIZE_X];
+   } x;
+      
+   union
+   {
+      int axisIntValues[GRID_SIZE_Y];
+      float axisFloatValues[GRID_SIZE_Y];
+   } y;
+};
+   
 // ---------------------------------------------------------------------------------------------------------------------
 //  globals
 // ---------------------------------------------------------------------------------------------------------------------

      // c = Color( rgb.r, rgb.g, rgb.b);
      // strip.setPixelColor( run, c);
      strip.show();
      delay( run < 3 ? 5000 : 20000); // Delay longer for HSL part of run
   }

   // Since we skipped "black" and "white", show a checkerboard of those.

struct point org = { 0, 0   }   ;
struct point gridSize = (point) {GRID_SIZE_X, GRID_SIZE_Y };

// Gonna cheat, since we know we have a square grid:  same values on each axis.

float lightness[GRID_SIZE_X]; // HSL
float saturation[GRID_SIZE_X]; // HSL

int ledBrightness[GRID_SIZE_X]; // RGB intensity
float dLedBrightness = 1.0 / (GRID_SIZE_X - 1);
float dLightness = 1.0 / (GRID_SIZE_X + 1); // Will drop lightness = 0 (black) and 1 (white), since that results in an
                                            // entire row/column being all the same (fully off or fully on). 

int exponent = 4;               // Non-linear brightness increase as {x^exponent : x in [0.0..1.0]}
   
float v;
float dHue = 60.0; // 360.0 / GRID_SIZE_X;

struct runParamTuple runParams[6] = { { RGB , RED   , GREEN } ,  // 0
                                      { RGB , BLUE  , RED }   ,  // 1
                                      { RGB , GREEN , BLUE }  ,  // 2
                                      { HSL , HUE   , SAT }   ,  // 3
                                      { HSL , HUE   , LIGHT } ,  // 4
                                      { HSL , SAT   , LIGHT } }; // 5
   
// ---------------------------------------------------------------------------------------------------------------------
//  setup
// ---------------------------------------------------------------------------------------------------------------------

void setup() {
   int t;
   unsigned long desiredDuration = 3600 * 1000; // total desired run time, milliseconds
   
  strip.begin();
  // clearStrip();
  strip.show();
  setupRotatingColorAxes();

  while (millis() < desiredDuration)
     rotatingColorAxes();

   clearStrip();
}

// ---------------------------------------------------------------------------------------------------------------------
