BlinkenLights.ino 12.2 KB
Newer Older
Mitchell Pomery's avatar
Mitchell Pomery committed
1
/**
Mitchell Pomery's avatar
Mitchell Pomery committed
2 3
 BlinkenLights
 
Mitchell Pomery's avatar
Mitchell Pomery committed
4 5 6 7 8 9
 Code by Mitchell Pomery [BG3] with help from Andrew Adamson [BOB]
 Hardware by Andrew Adamson [BOB] with help from Mitchell Pomery [BG3]
 
 Get the dates from the git commits.
 
 The LED strip should be wired from the top left corner and zig zag down
Mitchell Pomery's avatar
Mitchell Pomery committed
10 11 12 13 14 15
 
 */

///TODO: Vary light pattern randomly
///TODO: Make run when no network is present
///TODO: Recover when network reappears
Mitchell Pomery's avatar
Mitchell Pomery committed
16
///TODO: Make everything use posts. maybe
Mitchell Pomery's avatar
Mitchell Pomery committed
17
///TODO: Sanity checks. Everywhere. Until I'm Insane.
Mitchell Pomery's avatar
Mitchell Pomery committed
18
///TODO: Figure out rough memory usage. If we max memory we will see weird behaviour.
Mitchell Pomery's avatar
Mitchell Pomery committed
19 20 21 22 23 24 25 26 27 28 29

#include <Ethernet.h> // Needed For Reasons
#include <WebServer.h> // Lets us easily do web requests
#include <SPI.h> // Needed to control Lights
#include <Adafruit_NeoPixel.h> // Controls the Lights

#define PIN 6 // Pin that the LED strip is attached to
#define PREFIX "" // Document root for our pages
#define PORT 80 // Web Server Port
#define NAMELEN 8 // Max variable length in request
#define VALUELEN 256 // Max value from request
Mitchell Pomery's avatar
Mitchell Pomery committed
30 31 32
#define WIDTH 7 // How many LEDs wide our array is
#define HEIGHT 6 // How many LEDs high our array is
#define STRIPLENGTH 42 // Number of LED's in light strip
Mitchell Pomery's avatar
Mitchell Pomery committed
33
#define NUMSEQUENCES 8 // Number predefined sequences
Mitchell Pomery's avatar
Mitchell Pomery committed
34 35 36 37 38 39 40 41

// Used to store the LED's values
struct led {
  char red;
  char green;
  char blue;
};

Mitchell Pomery's avatar
Mitchell Pomery committed
42 43 44 45 46
// Used for our default light sequences
char red = (int) 255;
char green = (int) 255;
char blue = (int) 255;

Mitchell Pomery's avatar
Mitchell Pomery committed
47
// For controlling the lights - Should only be changed by the functions
Mitchell Pomery's avatar
Mitchell Pomery committed
48 49
int position = 0; // How far through the cycle we are
struct led ledArray[STRIPLENGTH]; // led array
Mitchell Pomery's avatar
Mitchell Pomery committed
50
int lightOption = 0; // Which predefined light sequence we are running
Mitchell Pomery's avatar
Mitchell Pomery committed
51 52 53
char brightness = (char) 128; //Brightness of the LEDs
  // We seem to have issues at the moment putting this up to the maximum (255)
  // Most likely due to the fact the LED strip is underpowered
Mitchell Pomery's avatar
Mitchell Pomery committed
54

Mitchell Pomery's avatar
Mitchell Pomery committed
55
// Network Settings
Mitchell Pomery's avatar
Mitchell Pomery committed
56
static uint8_t mac[] = { 0xC0, 0xCA, 0xC0, 0x1A, 0x19, 0x82 }; // C0CA C01A 1982
Mitchell Pomery's avatar
Mitchell Pomery committed
57
IPAddress ip(130,95,13,96); // 130.95.13.96 (Can we forcefully take .82?
Mitchell Pomery's avatar
Mitchell Pomery committed
58
// If we remove the ip address, we will automatically use DHCP
Mitchell Pomery's avatar
Mitchell Pomery committed
59 60

// Set up our light strip
Mitchell Pomery's avatar
Mitchell Pomery committed
61 62
Adafruit_NeoPixel strip = Adafruit_NeoPixel(STRIPLENGTH, PIN,
  NEO_GRB + NEO_KHZ800);
Mitchell Pomery's avatar
Mitchell Pomery committed
63 64 65
// Set up our webserver
WebServer webserver(PREFIX, 80);

Mitchell Pomery's avatar
Mitchell Pomery committed
66 67
// ============================ LIGHT MANIPULATION ============================

Mitchell Pomery's avatar
Mitchell Pomery committed
68 69
/**
 * Change the lights to our updated array
Mitchell Pomery's avatar
Mitchell Pomery committed
70
 * We should probably get rid of this soonish
Mitchell Pomery's avatar
Mitchell Pomery committed
71
 */
Mitchell Pomery's avatar
Mitchell Pomery committed
72
void updateLights() {
Mitchell Pomery's avatar
Mitchell Pomery committed
73
  for (int i = 0; i < STRIPLENGTH; i ++) {
Mitchell Pomery's avatar
Mitchell Pomery committed
74
    strip.setPixelColor(i, (int) ledArray[i].red, (int) ledArray[i].green, (int) ledArray[i].blue);
Mitchell Pomery's avatar
Mitchell Pomery committed
75 76 77 78
  }
  strip.show();
}

Mitchell Pomery's avatar
Mitchell Pomery committed
79
/**
Mitchell Pomery's avatar
Mitchell Pomery committed
80
 * go from (x,y) to position in the array
Mitchell Pomery's avatar
Mitchell Pomery committed
81 82
 * @param xpos  x coordinate
 * @param ypos  y cordinate
Mitchell Pomery's avatar
Mitchell Pomery committed
83
 * @return      position in the array, -1 if out of array
Mitchell Pomery's avatar
Mitchell Pomery committed
84 85 86 87
 */
int coordToPos(int xpos, int ypos) {
  ///TODO: Test this function
  int pos = 0;
Mitchell Pomery's avatar
Mitchell Pomery committed
88 89 90
  if ((xpos < 0 || xpos >= WIDTH) || (ypos < 0 || ypos >= HEIGHT)) {
    return -1;
  }
Mitchell Pomery's avatar
Mitchell Pomery committed
91 92 93 94 95 96 97 98 99 100 101 102 103 104
  if (ypos % 2 == 0) { // if we are on an even line, add y
    pos = ypos * WIDTH + xpos;
  }
  else { // on an odd line, take y
    if (WIDTH % 2 == 0) { // even width
      pos = ypos * WIDTH + HEIGHT - xpos;
    }
    else { // odd width
      pos = ypos * WIDTH + HEIGHT - xpos -1;
    }
  }
  return pos;
}

Mitchell Pomery's avatar
Mitchell Pomery committed
105
/**
Mitchell Pomery's avatar
Mitchell Pomery committed
106
 * Set the LED at pos in the strip to the defined colour
Mitchell Pomery's avatar
Mitchell Pomery committed
107
 * @param pos   position in the array
Mitchell Pomery's avatar
Mitchell Pomery committed
108 109 110
 * @param red   red portion of colour
 * @param green green portion of colour
 * @param blue  blue portion of colour
Mitchell Pomery's avatar
Mitchell Pomery committed
111
 */
Mitchell Pomery's avatar
Mitchell Pomery committed
112
void setLED(int pos, int red, int green, int blue) {
Mitchell Pomery's avatar
Mitchell Pomery committed
113 114 115 116 117
  if (pos > 0 && pos < STRIPLENGTH) {
    ledArray[pos].red = red;
    ledArray[pos].green = green;
    ledArray[pos].blue = blue;
  }
Mitchell Pomery's avatar
Mitchell Pomery committed
118 119
}

Mitchell Pomery's avatar
Mitchell Pomery committed
120
/**
Mitchell Pomery's avatar
Mitchell Pomery committed
121
 * Set the LED at (xpos, ypos) in the strip to the defined colour
Mitchell Pomery's avatar
Mitchell Pomery committed
122 123
 * @param xpos  x coordinate
 * @param ypos  y coordinate
Mitchell Pomery's avatar
Mitchell Pomery committed
124 125 126
 * @param red   red portion of colour
 * @param green green portion of colour
 * @param blue  blue portion of colour
Mitchell Pomery's avatar
Mitchell Pomery committed
127
 */
Mitchell Pomery's avatar
Mitchell Pomery committed
128 129
void setLED(int xpos, int ypos, int red, int green, int blue) {
  int pos = coordToPos(xpos, ypos);
Mitchell Pomery's avatar
Mitchell Pomery committed
130 131 132 133
  setLED(pos, red, green, blue);
}

/**
Mitchell Pomery's avatar
Mitchell Pomery committed
134 135
 * Get the colour of the LED in pos position in the strip
 * @param pos   position in the strip
Mitchell Pomery's avatar
Mitchell Pomery committed
136
 * @return      colour of LED at pos
Mitchell Pomery's avatar
Mitchell Pomery committed
137 138 139 140 141
 */
struct led getLED(int pos) {
  return ledArray[pos];
}

Mitchell Pomery's avatar
Mitchell Pomery committed
142 143 144 145
/**
 * Get the colour of the LED at (xpos, ypos)
 * @param xpos  x coordinate
 * @param ypos  y coordinate
Mitchell Pomery's avatar
Mitchell Pomery committed
146
 * @return      colour of LED at (xpos, ypos)
Mitchell Pomery's avatar
Mitchell Pomery committed
147 148 149 150 151 152 153 154 155 156 157 158
 */
struct led getLED(int xpos, int ypos) {
  int pos = coordToPos(xpos, ypos);
  return ledArray[pos];
}

// ================================ WEB PAGES ================================

///TODO: Comment this stuff
///TODO: Reduce code reuse in the web page functions
///TODO: Make a function to set all the lights at once

Mitchell Pomery's avatar
Mitchell Pomery committed
159 160 161 162 163 164 165 166
/**
 * Sets the light sequence to one that is predefined.
 * Set it to 0 to disable the cycling of lights.
 * @param server        
 * @param type          
 * @param url_tail      
 * @param tail_complete 
 */
Mitchell Pomery's avatar
Mitchell Pomery committed
167 168
void webSetSequence(WebServer &server, WebServer::ConnectionType type,
char *url_tail, bool tail_complete) {
Mitchell Pomery's avatar
Mitchell Pomery committed
169 170 171 172 173
  URLPARAM_RESULT rc;
  char name[NAMELEN];
  char value[VALUELEN];
  
  server.httpSuccess();
Mitchell Pomery's avatar
Mitchell Pomery committed
174
  // Kill the connection before doing anything if all they want is head
Mitchell Pomery's avatar
Mitchell Pomery committed
175 176 177
  if (type == WebServer::HEAD) {
    return;
  }
Mitchell Pomery's avatar
Mitchell Pomery committed
178
  else if (type == WebServer::GET) {
Mitchell Pomery's avatar
Mitchell Pomery committed
179 180 181 182 183 184 185
    if (strlen(url_tail)) {
      while (strlen(url_tail)) {
        rc = server.nextURLparam(&url_tail, name, NAMELEN, value, VALUELEN);
        if (rc != URLPARAM_EOS) {
          if (String(name).equals("seq")) {
            lightOption = atoi(value);
            server.print(lightOption);
Mitchell Pomery's avatar
Mitchell Pomery committed
186
            position = 0;
Mitchell Pomery's avatar
Mitchell Pomery committed
187 188 189 190 191 192
          }
        }
      }
    }
  }
  else {
Mitchell Pomery's avatar
Mitchell Pomery committed
193
    server.print("Unknown Request");
Mitchell Pomery's avatar
Mitchell Pomery committed
194 195 196
  }
}

Mitchell Pomery's avatar
Mitchell Pomery committed
197 198 199 200 201 202 203
/**
 * Set a specific LED to a specific colour
 * @param server        
 * @param type          
 * @param url_tail      
 * @param tail_complete 
 */
Mitchell Pomery's avatar
Mitchell Pomery committed
204 205
void webSetLED(WebServer &server, WebServer::ConnectionType type,
char *url_tail, bool tail_complete) {
Mitchell Pomery's avatar
Mitchell Pomery committed
206 207 208 209 210 211 212 213 214 215
  URLPARAM_RESULT rc;
  char name[NAMELEN];
  char value[VALUELEN];
  int xPos = -1;
  int yPos = -1;
  int r = -1;
  int g = -1;
  int b = -1;
  
  server.httpSuccess();
Mitchell Pomery's avatar
Mitchell Pomery committed
216
  // Kill the connection before doing anything if all they want is head
Mitchell Pomery's avatar
Mitchell Pomery committed
217 218 219
  if (type == WebServer::HEAD) {
    return;
  }
Mitchell Pomery's avatar
Mitchell Pomery committed
220
  else if (type == WebServer::GET) {
Mitchell Pomery's avatar
Mitchell Pomery committed
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
    if (strlen(url_tail)) {
      while (strlen(url_tail)) {
        rc = server.nextURLparam(&url_tail, name, NAMELEN, value, VALUELEN);
        if (rc != URLPARAM_EOS) {
          if (String(name).equals("x")) {
            xPos = atoi(value);
          }
          else if (String(name).equals("y")) {
            yPos = atoi(value);
          }
          else if (String(name).equals("r")) {
            r = atoi(value);
          }
          else if (String(name).equals("g")) {
            g = atoi(value);
          }
          else if (String(name).equals("b")) {
            b = atoi(value);
          }
        }
      }
    }
  }
  else {
    server.print("Unknown");
  }
  if (xPos != -1 && yPos != -1 && r != -1 && g != -1 && b != -1) {
    setLED(xPos, r, g, b);
  }
}

Mitchell Pomery's avatar
Mitchell Pomery committed
252 253 254 255 256 257 258
/**
 * Set the brightness to a specific magnitude
 * @param server        
 * @param type          
 * @param url_tail      
 * @param tail_complete 
 */
Mitchell Pomery's avatar
Mitchell Pomery committed
259 260
void webSetBrightness(WebServer &server, WebServer::ConnectionType type,
char *url_tail, bool tail_complete) {
Mitchell Pomery's avatar
Mitchell Pomery committed
261 262 263 264 265
  URLPARAM_RESULT rc;
  char name[NAMELEN];
  char value[VALUELEN];
  
  server.httpSuccess();
Mitchell Pomery's avatar
Mitchell Pomery committed
266
  // Kill the connection before doing anything if all they want is head
Mitchell Pomery's avatar
Mitchell Pomery committed
267 268 269 270 271 272 273 274
  if (type == WebServer::HEAD) {
    return;
  }
  else if (type == WebServer::GET) { //WebServer::POST
    if (strlen(url_tail)) {
      while (strlen(url_tail)) {
        rc = server.nextURLparam(&url_tail, name, NAMELEN, value, VALUELEN);
        if (rc != URLPARAM_EOS) {
Mitchell Pomery's avatar
Mitchell Pomery committed
275
          if (String(name).equals("bright")) {
Mitchell Pomery's avatar
Mitchell Pomery committed
276
            strip.setBrightness(atoi(value));
Mitchell Pomery's avatar
Mitchell Pomery committed
277 278
            server.print(atoi(value));
            strip.show();
Mitchell Pomery's avatar
Mitchell Pomery committed
279 280 281 282 283 284 285 286 287 288
          }
        }
      }
    }
  }
  else {
    server.print("Unknown");
  }
}

Mitchell Pomery's avatar
Mitchell Pomery committed
289 290
// ============================== LIGHT DISPLAYS ==============================

Mitchell Pomery's avatar
Mitchell Pomery committed
291 292 293 294 295 296
/**
 * Fill the dots one after the other with a colour
 * @param colour colour to fill the array with
 * @param wait  delay between colour changes
 */
void colourWipe(uint32_t c, uint8_t wait) {
Mitchell Pomery's avatar
Mitchell Pomery committed
297 298 299 300 301 302
  strip.setPixelColor(position, c);
  strip.show();
  delay(wait);
  position++;
  if (position > STRIPLENGTH) {
    position = 256;
Mitchell Pomery's avatar
Mitchell Pomery committed
303 304 305
  }
}

Mitchell Pomery's avatar
Mitchell Pomery committed
306
/**
Mitchell Pomery's avatar
Mitchell Pomery committed
307
 * Turn the light strip into a rainbow
Mitchell Pomery's avatar
Mitchell Pomery committed
308 309
 * @param wait  delay between colour changes
 */
Mitchell Pomery's avatar
Mitchell Pomery committed
310
void rainbow(uint8_t wait) {
Mitchell Pomery's avatar
Mitchell Pomery committed
311 312
  for(int i = 0; i <strip.numPixels(); i++) {
    strip.setPixelColor(i, Wheel((i+position) & 255));
Mitchell Pomery's avatar
Mitchell Pomery committed
313 314 315 316 317 318
  }
  strip.show();
  delay(wait);
  position++;
}

Mitchell Pomery's avatar
Mitchell Pomery committed
319 320 321 322
/**
 * Slightly different, this makes the rainbow equally distributed throughout
 * @param wait  delay between colour changes
 */
Mitchell Pomery's avatar
Mitchell Pomery committed
323
void rainbowCycle(uint8_t wait) {
Mitchell Pomery's avatar
Mitchell Pomery committed
324 325 326 327 328 329 330 331 332
  uint16_t j;
  for(int j = 0; j < 256 * 5; j++) { // 5 cycles of all colours on wheel
    strip.setPixelColor(position, Wheel(((position * 256 / strip.numPixels()) + j) & 255));
  }
  strip.show();
  delay(wait);
  position++;
  if (position > STRIPLENGTH) {
    position = 256;
Mitchell Pomery's avatar
Mitchell Pomery committed
333 334 335
  }
}

Mitchell Pomery's avatar
Mitchell Pomery committed
336 337 338 339 340
/**
 * Theatre-style crawling lights.
 * @param colour colour to fill the array with
 * @param wait  delay between colour changes
 */
Mitchell Pomery's avatar
Mitchell Pomery committed
341
void theaterChase(uint32_t c, uint8_t wait) {
Mitchell Pomery's avatar
Mitchell Pomery committed
342
  ///TODO: stop this blocking. Somehow
Mitchell Pomery's avatar
Mitchell Pomery committed
343
  for (int j=0; j<10; j++) { // do 10 cycles of chasing
Mitchell Pomery's avatar
Mitchell Pomery committed
344 345
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
Mitchell Pomery's avatar
Mitchell Pomery committed
346
        strip.setPixelColor(i+q, c); // turn every third pixel on
Mitchell Pomery's avatar
Mitchell Pomery committed
347 348 349 350 351 352
      }
      strip.show();
     
      delay(wait);
     
      for (int i=0; i < strip.numPixels(); i=i+3) {
Mitchell Pomery's avatar
Mitchell Pomery committed
353
        strip.setPixelColor(i+q, 0); // turn every third pixel off
Mitchell Pomery's avatar
Mitchell Pomery committed
354 355 356 357 358
      }
    }
  }
}

Mitchell Pomery's avatar
Mitchell Pomery committed
359 360 361 362
/**
 * Theatre-style crawling lights with rainbow effect
 * @param wait  delay between colour changes
 */
Mitchell Pomery's avatar
Mitchell Pomery committed
363
void theaterChaseRainbow(uint8_t wait) {
Mitchell Pomery's avatar
Mitchell Pomery committed
364
  ///TODO: stop this blocking. Somehow
Mitchell Pomery's avatar
Mitchell Pomery committed
365
  for (int j=0; j < 256; j++) { // cycle all 256 colours in the wheel
Mitchell Pomery's avatar
Mitchell Pomery committed
366 367
    for (int q=0; q < 3; q++) {
        for (int i=0; i < strip.numPixels(); i=i+3) {
Mitchell Pomery's avatar
Mitchell Pomery committed
368
          // turn every third pixel on
Mitchell Pomery's avatar
Mitchell Pomery committed
369
          strip.setPixelColor(i+q, Wheel( (i+j) % 255));
Mitchell Pomery's avatar
Mitchell Pomery committed
370 371 372 373 374 375
        }
        strip.show();
       
        delay(wait);
       
        for (int i=0; i < strip.numPixels(); i=i+3) {
Mitchell Pomery's avatar
Mitchell Pomery committed
376
          strip.setPixelColor(i+q, 0); // turn every third pixel off
Mitchell Pomery's avatar
Mitchell Pomery committed
377 378 379 380 381
        }
    }
  }
}

Mitchell Pomery's avatar
Mitchell Pomery committed
382 383 384 385 386 387
/**
 * Input a value 0 to 255 to get a colour value.
 * The colours are a transition r - g - b - back to r.
 * @param WheelPos  Where we currently are in the cycle
 * @return          A new colour
 */
Mitchell Pomery's avatar
Mitchell Pomery committed
388 389
uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
Mitchell Pomery's avatar
Mitchell Pomery committed
390
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
Mitchell Pomery's avatar
Mitchell Pomery committed
391 392
  } else if(WheelPos < 170) {
   WheelPos -= 85;
Mitchell Pomery's avatar
Mitchell Pomery committed
393
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
Mitchell Pomery's avatar
Mitchell Pomery committed
394 395
  } else {
   WheelPos -= 170;
Mitchell Pomery's avatar
Mitchell Pomery committed
396
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
Mitchell Pomery's avatar
Mitchell Pomery committed
397 398 399
  }
}

Mitchell Pomery's avatar
Mitchell Pomery committed
400 401
// =============================== MAIN PROGRAM ===============================

Mitchell Pomery's avatar
Mitchell Pomery committed
402 403
///TODO: Comment this stuff

Mitchell Pomery's avatar
Mitchell Pomery committed
404
void setup() {
Mitchell Pomery's avatar
Mitchell Pomery committed
405
  // Start Ethernet
Mitchell Pomery's avatar
Mitchell Pomery committed
406
  Ethernet.begin(mac, ip);
Mitchell Pomery's avatar
Mitchell Pomery committed
407
  // Set up webpages
Mitchell Pomery's avatar
Mitchell Pomery committed
408 409 410 411
  webserver.setDefaultCommand(&webSetSequence);
  webserver.addCommand("custom", &webSetSequence);
  webserver.addCommand("individual", &webSetLED);
  webserver.addCommand("brightness", &webSetBrightness);
Mitchell Pomery's avatar
Mitchell Pomery committed
412
  // Start Webserver
Mitchell Pomery's avatar
Mitchell Pomery committed
413
  webserver.begin();
Mitchell Pomery's avatar
Mitchell Pomery committed
414
  // Turn our lights on
Mitchell Pomery's avatar
Mitchell Pomery committed
415 416 417 418 419 420 421 422
  for (int i = 0; i < STRIPLENGTH; i ++) {
    ledArray[i].red = (char) 128;
    ledArray[i].green = (char) 128;
    ledArray[i].blue = (char) 128;
  }
  
  // Start Lights
  strip.begin();
Mitchell Pomery's avatar
Mitchell Pomery committed
423
  strip.setBrightness(128);
Mitchell Pomery's avatar
Mitchell Pomery committed
424
  updateLights();
Mitchell Pomery's avatar
Mitchell Pomery committed
425 426 427 428 429 430 431 432
}

void loop()
{
  // process incoming connections one at a time forever
  char buff[64];
  int len = 64;
  webserver.processConnection(buff, &len);
Mitchell Pomery's avatar
Mitchell Pomery committed
433 434 435 436 437 438 439 440 441
  if (position > 255) {
    position = position % 256;
    if (lightOption != 0) {
      lightOption++;
    }
  }
  if (lightOption > NUMSEQUENCES) {
    lightOption = 1;
  }
Mitchell Pomery's avatar
Mitchell Pomery committed
442
  // Run our light sequence after checking for we requests
Mitchell Pomery's avatar
Mitchell Pomery committed
443
  ///TODO: Make these switches nicer
Mitchell Pomery's avatar
Mitchell Pomery committed
444 445
  switch (lightOption) {
    case 0: // Don't change the lights at all
Mitchell Pomery's avatar
Mitchell Pomery committed
446
      break;
Mitchell Pomery's avatar
Mitchell Pomery committed
447
    case 1: // Wipe the LED's to Red
Mitchell Pomery's avatar
Mitchell Pomery committed
448
      colourWipe(strip.Color(red, green, blue), 50); // Red
Mitchell Pomery's avatar
Mitchell Pomery committed
449
      break;
Mitchell Pomery's avatar
Mitchell Pomery committed
450 451
    case 2:
      
Mitchell Pomery's avatar
Mitchell Pomery committed
452
    default:
Mitchell Pomery's avatar
Mitchell Pomery committed
453
      lightOption = 1;
Mitchell Pomery's avatar
Mitchell Pomery committed
454
      break;
Mitchell Pomery's avatar
Mitchell Pomery committed
455
  }
Mitchell Pomery's avatar
Mitchell Pomery committed
456
  // Show our lights
Mitchell Pomery's avatar
Mitchell Pomery committed
457
  updateLights();
Mitchell Pomery's avatar
Mitchell Pomery committed
458
}