 /* csarc allows you to do do a couple things with newline-terminated commands:
  *  
- *  set a constant color value: "V#FFFFFF"
- *  make gradient pulses between two colors: "G#000000:#FFFFFF:pulseTime"
- *    \--loop between two colors: "L#000000:#FFFFFF:pulseTime"
- *    \--smooth loop between two colors: "S#000000:#FFFFFF:pulseTime
- *  start flashing between two colors:     "F#000000:#FFFFFF:pulseTime"
- *  lock for a period of time: "DIS:waitTime"
+ *  set a constant color value: ------------- "V#FFFFFF"
+ *  make gradient pulses between two colors:- "G#000000:#FFFFFF:pulseTime"
+ *    \--loop gradient between two colors: -- "L#000000:#FFFFFF:pulseTime"
+ *    \--smooth loop between two colors: ---- "S#000000:#FFFFFF:pulseTime
+ *  start flashing two colors --------------- "F#000000:#FFFFFF:pulseTime"
  *  
- *  Change SINGLE_LED and the color pins to match your hardware.
+ *  To use, toggle GROVE_DRIVER or set the color pins to match your hardware.
  *  You can toggle a handy debug mode with "d".
  */
-// TO DO: implement start/stop flashing //done
-// TO DO: implement smooth gradients // done
-// TO DO: implement verbosity levels
+// TO DO: cut off timeout gradient when activity resumes
+//        implement verbosity levels
+//        evaluate memory gain from using #define for some constants
 
 #include <stdarg.h>
 
+// JUMPER SETUP FOR COMP
+
+
+
 // -------------  LED SETUP -------------
-#include <RGBdriver.h>
-const int CLK = 2; //definitions for
-const int DIO = 3; //Grove driver
+const boolean GROVE_DRIVER = false; // Grove LED driver or DFRobot shield?
+
+#include <RGBdriver.h> // Grove driver
+const int CLK = 2;
+const int DIO = 3;
 RGBdriver Driver(CLK,DIO);
-const boolean SINGLE_LED = true; // Grove LED driver or DFRobot shield?
-const int R_PIN = 10; // pins for
-const int G_PIN = 11; // directly driven
-const int B_PIN =  9; // setup
-int GND = 7; // ( <-for wiring convenience)
+
+const int R_PIN = 10; // pins for directly
+const int G_PIN = 11; // driven setup or
+const int B_PIN =  9; // DFRobot shield
+const int EXTRA_GND = 7; // <- for wiring convenience
 
 // --------- CONSTANTS + CONFIG ---------
 const int   OFF[] = {0,   0,   0 };

    int *col2p[4] = {&col2[0],&col2[1],&col2[2],0};    
    decodeHex(hex1,col1p);
    decodeHex(hex2,col2p);
    float timeVal = atol(timev); //use strtol or sscanf instead
    flashSetup(col1,col2,timeVal);
  }
}

void flashSetup (const int col1[3],const int col2[3], float timev) {
  flashTime = (float) timev*1000;
  for (int x=0; x<3; x++) {
    flashcol1[x]=col1[x];
    flashcol2[x]=col2[x];
  }
  
  flashThread.setInterval(flashTime);
  flashThread.reset();
  flashThread.enable();
  if (debugMode) {

    
    decodeHex(hex1,col1p);
    decodeHex(hex2,col2p);
    float timeVal = atof(timev); //use strtol or sscanf instead
    gradientPulseSetup(col1,col2,timeVal);

    if (debugMode) {
