     case LightMode::CRUDE:
       processCrudeLightMode();
       break;
+    case LightMode::TRIANGLE:
+      processTriangleLightMode();
+      break;
   }
 }
 

#define EMPTY_COMMAND_FAIL ""

enum LightMode {
  NONE, STATIC, CRUDE, CANDLE
};

const int crude_T = 5000;
const int crude_I = 255/2;
const float crude_Ts = 1.0/6 * crude_T;

unsigned long lightModeStart = 0;
LightMode lightMode = NONE;

  setColor(r, g, b);
}

void processTriangleLightMode() {
  unsigned long ms = millis();
  if (ms < triangleStepTime) {
    return;
  }

  int r = 0;
  int g = 0;
  int b = 0;
  
  switch (triangleMode) {
    case 0: // From RED to GREEN
      r = currentR - triangleStep;
      g = currentG + triangleStep;

      if (r <= 0) r = 0;
      if (g >= 255) g = 255;
      if (g == 255) triangleMode = 1;
      break;
    case 1:
      g = currentG - triangleStep;
      b = currentB + triangleStep;

      if (g <= 0) g = 0;
      if (b >= 255) b = 255;
      if (b == 255) triangleMode = 2;
      break;
    case 2:
      r = currentR + triangleStep;
      b = currentB - triangleStep;

      if (b <= 0) b = 0;
      if (r >= 255) r = 255;
      if (r == 255) triangleMode = 0;
      break;
  }

  setColor(r, g, b);
  
  triangleStepTime = ms + triangleDelay;
}

String processCommand(String command) {
  if (command.startsWith("SET #")) {
    String colorStr = command.substring(5, 5+6);
