Source code for the Curilights Controller. See http://www.saccade.com/writing/projects/CuriController/ for details.

Dependencies:   FatFileSystem mbed

This is the source code for the Curilights controller. This lets you interactively control a string of Curilights. It provides a simple click-wheel user interface for changing colors, brightness and behavior. It responds to movement and lighting.

Finished Controller

/media/uploads/isonno/nxp3872_controllerclose.jpg

System Block Diagram

/media/uploads/isonno/blockdiagram.png

Committer:
isonno
Date:
Mon Feb 11 05:04:18 2013 +0000
Revision:
4:cfef06d8bb96
Parent:
3:0ac64c4ca40f
Minor changes to add backlight routines.  Not hooked up yet, shouldn't affect build operation.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
isonno 0:6da5625a6946 1 //
isonno 0:6da5625a6946 2 // UserInterface - Application specific UI
isonno 0:6da5625a6946 3 //
isonno 0:6da5625a6946 4
isonno 0:6da5625a6946 5 #include "NokiaLCD.h"
isonno 0:6da5625a6946 6 #include "UserInterface.h"
isonno 0:6da5625a6946 7 #include "LightString.h"
isonno 0:6da5625a6946 8 #include "SystemState.h"
isonno 1:d1da77023e6a 9 #include "SettingsMenu.h"
isonno 0:6da5625a6946 10
isonno 0:6da5625a6946 11 #include "SDFileSystem.h"
isonno 0:6da5625a6946 12 #include <string>
isonno 0:6da5625a6946 13 #include <algorithm>
isonno 0:6da5625a6946 14 #include <math.h>
isonno 0:6da5625a6946 15 #define PI 3.141592653589793
isonno 0:6da5625a6946 16
isonno 0:6da5625a6946 17 static uint32_t Int2LCDColor( uint16_t intColor )
isonno 0:6da5625a6946 18 {
isonno 0:6da5625a6946 19 int r = intColor / 100;
isonno 0:6da5625a6946 20 int g = (intColor % 100) / 10;
isonno 0:6da5625a6946 21 int b = intColor % 10;
isonno 0:6da5625a6946 22
isonno 0:6da5625a6946 23 return (r << 9) | (g << 5) | (b << 1);
isonno 0:6da5625a6946 24 }
isonno 0:6da5625a6946 25
isonno 0:6da5625a6946 26 void ControllerUI::LightSwitch( bool on )
isonno 0:6da5625a6946 27 {
isonno 0:6da5625a6946 28 if (on == fLightsOn)
isonno 0:6da5625a6946 29 return;
isonno 0:6da5625a6946 30
isonno 0:6da5625a6946 31 fLightsOn = on;
isonno 0:6da5625a6946 32 if (fLightsOn)
isonno 0:6da5625a6946 33 TurnOn();
isonno 0:6da5625a6946 34 else
isonno 0:6da5625a6946 35 fLights->Off();
isonno 0:6da5625a6946 36 }
isonno 0:6da5625a6946 37
isonno 0:6da5625a6946 38 PatternSelector::PatternSelector( CheapLCD * lcd, LightString * lights )
isonno 0:6da5625a6946 39 : ControllerUI( lcd, lights )
isonno 0:6da5625a6946 40 {
isonno 0:6da5625a6946 41 SDFileSystem sdcard( p5, p6, p7, p8, "sd" );
isonno 0:6da5625a6946 42 DIR * sdDir = opendir("/sd");
isonno 0:6da5625a6946 43
isonno 0:6da5625a6946 44 struct dirent *p;
isonno 0:6da5625a6946 45
isonno 0:6da5625a6946 46 // Read in patterns off of the SD card
isonno 0:6da5625a6946 47 while ((p = readdir( sdDir )) != NULL)
isonno 0:6da5625a6946 48 {
isonno 0:6da5625a6946 49 // Search for files ending in .CRI
isonno 0:6da5625a6946 50 string srcName = string("/sd/") + string(p->d_name);
isonno 0:6da5625a6946 51 size_t pos = srcName.rfind( ".CRI");
isonno 0:6da5625a6946 52 if (pos != string::npos)
isonno 0:6da5625a6946 53 {
isonno 0:6da5625a6946 54 FILE * f = fopen( srcName.c_str(), "r" );
isonno 0:6da5625a6946 55 if (f)
isonno 0:6da5625a6946 56 {
isonno 0:6da5625a6946 57 Pattern pat;
isonno 0:6da5625a6946 58 char line[50];
isonno 0:6da5625a6946 59 uint32_t color;
isonno 0:6da5625a6946 60
isonno 0:6da5625a6946 61 // Read to the end, or the the end of the frame.
isonno 0:6da5625a6946 62 while (fgets( line, sizeof(line), f) && (line[0] != 'F'))
isonno 0:6da5625a6946 63 {
isonno 0:6da5625a6946 64 sscanf( line, "%d", &color );
isonno 0:6da5625a6946 65 pat.push_back( color );
isonno 0:6da5625a6946 66 }
isonno 0:6da5625a6946 67 fPatterns.push_back( pat );
isonno 0:6da5625a6946 68 fPatternNames.push_back( srcName.substr( 4, pos-4 ) ); // Skip "/sd/", Remove ext.
isonno 0:6da5625a6946 69 fclose(f);
isonno 0:6da5625a6946 70 }
isonno 0:6da5625a6946 71 }
isonno 0:6da5625a6946 72 }
isonno 0:6da5625a6946 73
isonno 0:6da5625a6946 74 // Hack: Since readdir doesn't sort names,
isonno 0:6da5625a6946 75 // force file starting "_" to the top.
isonno 0:6da5625a6946 76 int i;
isonno 0:6da5625a6946 77 for (i = 0; (i < fPatternNames.size()) && (fPatternNames[i][0] != '_'); ++i) {}
isonno 0:6da5625a6946 78 if ((i > 0) && (i < fPatternNames.size()))
isonno 0:6da5625a6946 79 {
isonno 0:6da5625a6946 80 swap( fPatternNames[i], fPatternNames[0] );
isonno 0:6da5625a6946 81 swap( fPatterns[i], fPatterns[0] );
isonno 0:6da5625a6946 82 }
isonno 0:6da5625a6946 83
isonno 0:6da5625a6946 84 // Maybe the card was swapped, etc...
isonno 0:6da5625a6946 85 if (gSystemState.GetPatternIndex() > (fPatterns.size()-1))
isonno 0:6da5625a6946 86 {
isonno 0:6da5625a6946 87 printf("Reset pattern index\r\n");
isonno 0:6da5625a6946 88 gSystemState.SetPatternIndex(0);
isonno 0:6da5625a6946 89 }
isonno 0:6da5625a6946 90
isonno 0:6da5625a6946 91 // Need code to make sure "_WEBPAGE.CRI" is in slot zero...
isonno 0:6da5625a6946 92 }
isonno 0:6da5625a6946 93
isonno 0:6da5625a6946 94 void PatternSelector::Display( bool on )
isonno 0:6da5625a6946 95 {
isonno 0:6da5625a6946 96 if (on)
isonno 0:6da5625a6946 97 {
isonno 0:6da5625a6946 98 DrawPattern();
isonno 0:6da5625a6946 99 SetLights();
isonno 0:6da5625a6946 100 }
isonno 0:6da5625a6946 101 }
isonno 0:6da5625a6946 102
isonno 0:6da5625a6946 103 void PatternSelector::SetLights()
isonno 0:6da5625a6946 104 {
isonno 0:6da5625a6946 105 int curPattern = gSystemState.GetPatternIndex();
isonno 0:6da5625a6946 106 if (fPatterns.size() > 0)
isonno 0:6da5625a6946 107 for (int i = 0; i < fLights->GetNumLights(); ++i)
isonno 0:6da5625a6946 108 fLights->SetOneColor( fPatterns[curPattern][i % fPatterns[curPattern].size()], i );
isonno 0:6da5625a6946 109 }
isonno 0:6da5625a6946 110
isonno 0:6da5625a6946 111 void PatternSelector::DrawPattern()
isonno 0:6da5625a6946 112 {
isonno 0:6da5625a6946 113 int curPattern = gSystemState.GetPatternIndex();
isonno 0:6da5625a6946 114
isonno 0:6da5625a6946 115 fLCD->erase();
isonno 0:6da5625a6946 116 if (fPatterns.size() == 0)
isonno 0:6da5625a6946 117 {
isonno 0:6da5625a6946 118 fLCD->draw_glyph_text( WHITE, BLACK, 2, 40, "No Patterns!" );
isonno 0:6da5625a6946 119 return;
isonno 0:6da5625a6946 120 }
isonno 0:6da5625a6946 121
isonno 0:6da5625a6946 122 fLCD->draw_glyph_text( WHITE, BLACK, 5, 40, fPatternNames[curPattern].c_str() );
isonno 0:6da5625a6946 123
isonno 0:6da5625a6946 124 int numColors = std::min( (int) fPatterns[curPattern].size(), 12 );
isonno 0:6da5625a6946 125
isonno 0:6da5625a6946 126 int i, width = 131 / numColors;
isonno 0:6da5625a6946 127
isonno 0:6da5625a6946 128 for (i = 0; i < numColors; ++i)
isonno 0:6da5625a6946 129 fLCD->clear( Int2LCDColor( (uint16_t) fPatterns[curPattern][i] ),
isonno 0:6da5625a6946 130 i*width + 5, 60, ((i+1)*width)+ 3, 80 );
isonno 0:6da5625a6946 131 }
isonno 0:6da5625a6946 132
isonno 0:6da5625a6946 133 void PatternSelector::TurnOn()
isonno 0:6da5625a6946 134 {
isonno 0:6da5625a6946 135 SetLights();
isonno 0:6da5625a6946 136 }
isonno 0:6da5625a6946 137
isonno 0:6da5625a6946 138 int32_t PatternSelector::KnobMoved( int32_t step )
isonno 0:6da5625a6946 139 {
isonno 0:6da5625a6946 140 int curPattern = gSystemState.GetPatternIndex();
isonno 0:6da5625a6946 141 curPattern += step;
isonno 0:6da5625a6946 142 if (curPattern < 0)
isonno 0:6da5625a6946 143 curPattern = fPatterns.size() - 1;
isonno 0:6da5625a6946 144 if (curPattern == fPatterns.size())
isonno 0:6da5625a6946 145 curPattern = 0;
isonno 0:6da5625a6946 146
isonno 0:6da5625a6946 147 gSystemState.SetPatternIndex( curPattern );
isonno 0:6da5625a6946 148
isonno 0:6da5625a6946 149 DrawPattern();
isonno 0:6da5625a6946 150 SetLights();
isonno 0:6da5625a6946 151
isonno 0:6da5625a6946 152 return step;
isonno 0:6da5625a6946 153 }
isonno 0:6da5625a6946 154
isonno 0:6da5625a6946 155 //====================================================
isonno 0:6da5625a6946 156
isonno 0:6da5625a6946 157 const uint16_t wheelColors[] = {
isonno 0:6da5625a6946 158 770, 760, 750, 740, 730, 720,
isonno 0:6da5625a6946 159 710, 700, 701, 702, 703, 704,
isonno 0:6da5625a6946 160 705, 706, 707, 607, 507, 407,
isonno 0:6da5625a6946 161 307, 207, 107, 7, 17, 27,
isonno 0:6da5625a6946 162 37, 47, 57, 67, 77, 76,
isonno 0:6da5625a6946 163 75, 74, 73, 72, 71, 70,
isonno 0:6da5625a6946 164 170, 270, 370, 470, 570, 670 };
isonno 0:6da5625a6946 165
isonno 0:6da5625a6946 166 #include "WheelCursor.h"
isonno 0:6da5625a6946 167
isonno 0:6da5625a6946 168 const int kNumWheelColors = sizeof(wheelColors) / sizeof(uint16_t);
isonno 0:6da5625a6946 169
isonno 0:6da5625a6946 170 void ColorSelector::Display( bool on )
isonno 0:6da5625a6946 171 {
isonno 0:6da5625a6946 172 if (on)
isonno 0:6da5625a6946 173 {
isonno 0:6da5625a6946 174 fLCD->splash( 1 );
isonno 0:6da5625a6946 175 fLights->SetAllLights( wheelColors[gSystemState.GetSatColorIndex()] );
isonno 0:6da5625a6946 176 }
isonno 0:6da5625a6946 177 DrawCursor( true );
isonno 0:6da5625a6946 178 }
isonno 0:6da5625a6946 179
isonno 0:6da5625a6946 180 void ColorSelector::DrawCursor( bool drawSprite )
isonno 0:6da5625a6946 181 {
isonno 0:6da5625a6946 182 const int kScreenSize = 132;
isonno 0:6da5625a6946 183 const int kCursorSize = 13;
isonno 0:6da5625a6946 184 const uint32_t DKGRAY = 0x666;
isonno 0:6da5625a6946 185
isonno 0:6da5625a6946 186 int curColor = gSystemState.GetSatColorIndex();
isonno 0:6da5625a6946 187
isonno 0:6da5625a6946 188 double angle = 2*PI / kNumWheelColors;
isonno 0:6da5625a6946 189 double radius = 40;
isonno 0:6da5625a6946 190
isonno 0:6da5625a6946 191 double vecX = cos(angle * curColor) * radius;
isonno 0:6da5625a6946 192 double vecY = sin(angle * curColor) * radius;
isonno 0:6da5625a6946 193
isonno 0:6da5625a6946 194 vecX += kScreenSize/2 + 1; // Screwy epson offset
isonno 0:6da5625a6946 195 vecY += kScreenSize/2;
isonno 0:6da5625a6946 196
isonno 0:6da5625a6946 197 vecX -= kCursorSize/2; // Move from center to TR
isonno 0:6da5625a6946 198 vecY -= kCursorSize/2; // corner of the cursor
isonno 0:6da5625a6946 199
isonno 0:6da5625a6946 200 if (drawSprite)
isonno 0:6da5625a6946 201 {
isonno 0:6da5625a6946 202 fLCD->draw_sprite( WHITE, DKGRAY,
isonno 0:6da5625a6946 203 (byte)vecX, (byte)vecY,
isonno 0:6da5625a6946 204 &WheelCursor_sprt );
isonno 0:6da5625a6946 205 fLCD->clear( Int2LCDColor(wheelColors[curColor]), 50, 50, 82, 82 );
isonno 0:6da5625a6946 206 }
isonno 0:6da5625a6946 207 else
isonno 0:6da5625a6946 208 fLCD->clear( DKGRAY, (byte)vecX, (byte)vecY,
isonno 0:6da5625a6946 209 ((byte)vecX)+kCursorSize, ((byte)vecY) + kCursorSize );
isonno 0:6da5625a6946 210 }
isonno 0:6da5625a6946 211
isonno 0:6da5625a6946 212 int32_t ColorSelector::KnobMoved( int32_t step )
isonno 0:6da5625a6946 213 {
isonno 0:6da5625a6946 214 int curColor = gSystemState.GetSatColorIndex();
isonno 0:6da5625a6946 215
isonno 0:6da5625a6946 216 DrawCursor( false );
isonno 0:6da5625a6946 217 curColor += step;
isonno 0:6da5625a6946 218 if (curColor < 0)
isonno 0:6da5625a6946 219 curColor = kNumWheelColors-1;
isonno 0:6da5625a6946 220 if (curColor == kNumWheelColors)
isonno 0:6da5625a6946 221 curColor = 0;
isonno 0:6da5625a6946 222
isonno 0:6da5625a6946 223 // Must update system state before drawing new cursor
isonno 0:6da5625a6946 224 gSystemState.SetSatColorIndex( curColor );
isonno 0:6da5625a6946 225 DrawCursor( true );
isonno 0:6da5625a6946 226 fLights->SetAllLights( wheelColors[curColor] );
isonno 0:6da5625a6946 227 return step;
isonno 0:6da5625a6946 228 }
isonno 0:6da5625a6946 229
isonno 0:6da5625a6946 230 void ColorSelector::TurnOn()
isonno 0:6da5625a6946 231 {
isonno 0:6da5625a6946 232 fLights->SetAllLights( wheelColors[gSystemState.GetSatColorIndex()] );
isonno 0:6da5625a6946 233 }
isonno 0:6da5625a6946 234
isonno 0:6da5625a6946 235 //================================================
isonno 0:6da5625a6946 236
isonno 0:6da5625a6946 237 void WhiteSelector::SetLights()
isonno 0:6da5625a6946 238 {
isonno 0:6da5625a6946 239 int level = gSystemState.GetBrightLevel();
isonno 0:6da5625a6946 240 fLights->SetAllLights( level * 100 + level * 10 + level );
isonno 0:6da5625a6946 241 }
isonno 0:6da5625a6946 242
isonno 0:6da5625a6946 243 void WhiteSelector::Display( bool on )
isonno 0:6da5625a6946 244 {
isonno 0:6da5625a6946 245 if (on)
isonno 0:6da5625a6946 246 {
isonno 0:6da5625a6946 247 DrawLevel();
isonno 0:6da5625a6946 248 SetLights();
isonno 0:6da5625a6946 249 }
isonno 0:6da5625a6946 250 }
isonno 0:6da5625a6946 251
isonno 0:6da5625a6946 252 void WhiteSelector::DrawLevel()
isonno 0:6da5625a6946 253 {
isonno 0:6da5625a6946 254 fLCD->erase();
isonno 0:6da5625a6946 255 char msg[20];
isonno 0:6da5625a6946 256 sprintf( msg, "Brightness: %d", gSystemState.GetBrightLevel() );
isonno 0:6da5625a6946 257 fLCD->draw_glyph_text( WHITE, BLACK, 5, 40, msg );
isonno 0:6da5625a6946 258 }
isonno 0:6da5625a6946 259
isonno 0:6da5625a6946 260 int32_t WhiteSelector::KnobMoved( int32_t step )
isonno 0:6da5625a6946 261 {
isonno 0:6da5625a6946 262 int level = gSystemState.GetBrightLevel();
isonno 0:6da5625a6946 263 level += step;
isonno 0:6da5625a6946 264 if (level < 1)
isonno 0:6da5625a6946 265 level = 1;
isonno 0:6da5625a6946 266 if (level > 7)
isonno 0:6da5625a6946 267 level = 7;
isonno 0:6da5625a6946 268
isonno 0:6da5625a6946 269 gSystemState.SetBrightLevel( level );
isonno 0:6da5625a6946 270 DrawLevel();
isonno 0:6da5625a6946 271 SetLights();
isonno 0:6da5625a6946 272 return step;
isonno 0:6da5625a6946 273 }
isonno 0:6da5625a6946 274
isonno 0:6da5625a6946 275 void WhiteSelector::TurnOn()
isonno 0:6da5625a6946 276 {
isonno 0:6da5625a6946 277 SetLights();
isonno 0:6da5625a6946 278 }
isonno 0:6da5625a6946 279
isonno 0:6da5625a6946 280 //================================================
isonno 0:6da5625a6946 281 LightController::LightController( HomeMenu * parent, CheapLCD * lcd, LightString * lights )
isonno 0:6da5625a6946 282 : PushKnobUI( lcd ),
isonno 3:0ac64c4ca40f 283 fParent( parent ), fLights( lights ),
isonno 0:6da5625a6946 284 fSubController( NULL ),
isonno 0:6da5625a6946 285 fColorSelector( lcd, lights ),
isonno 0:6da5625a6946 286 fWhiteSelector( lcd, lights ),
isonno 0:6da5625a6946 287 fPatternSelector( lcd, lights )
isonno 0:6da5625a6946 288 {
isonno 0:6da5625a6946 289 SetSelector( gSystemState.GetModeSelector() );
isonno 0:6da5625a6946 290 if (fSubController)
isonno 0:6da5625a6946 291 fSubController->TurnOn();
isonno 0:6da5625a6946 292 }
isonno 0:6da5625a6946 293
isonno 0:6da5625a6946 294
isonno 0:6da5625a6946 295 int32_t LightController::KnobMoved( int32_t step )
isonno 0:6da5625a6946 296 {
isonno 0:6da5625a6946 297 Wake();
isonno 0:6da5625a6946 298 return fSubController->KnobMoved( step );
isonno 0:6da5625a6946 299 }
isonno 0:6da5625a6946 300
isonno 0:6da5625a6946 301 void LightController::SetSelector( ESelector sel )
isonno 0:6da5625a6946 302 {
isonno 0:6da5625a6946 303 switch (sel)
isonno 0:6da5625a6946 304 {
isonno 0:6da5625a6946 305 case kColorSelector: fSubController = &fColorSelector; break;
isonno 0:6da5625a6946 306 case kWhiteSelector: fSubController = &fWhiteSelector; break;
isonno 0:6da5625a6946 307 case kPatternSelector: fSubController =&fPatternSelector; break;
isonno 0:6da5625a6946 308 default :;
isonno 0:6da5625a6946 309 }
isonno 0:6da5625a6946 310
isonno 0:6da5625a6946 311 gSystemState.SetModeSelector( sel );
isonno 0:6da5625a6946 312 }
isonno 0:6da5625a6946 313
isonno 0:6da5625a6946 314 void LightController::KnobPushed()
isonno 0:6da5625a6946 315 {
isonno 0:6da5625a6946 316 Wake();
isonno 0:6da5625a6946 317 Display( false );
isonno 0:6da5625a6946 318 fLCD->erase();
isonno 1:d1da77023e6a 319 SwitchControl( fParent );
isonno 0:6da5625a6946 320 fParent->Display( true );
isonno 0:6da5625a6946 321 }
isonno 0:6da5625a6946 322
isonno 0:6da5625a6946 323 //================================================
isonno 0:6da5625a6946 324
isonno 0:6da5625a6946 325 HomeMenu::HomeMenu( CheapLCD * lcd, LightString * lights )
isonno 0:6da5625a6946 326 : UIMenu( lcd, "CuriLights" ),
isonno 1:d1da77023e6a 327 fLightController( this, lcd, lights ),
isonno 1:d1da77023e6a 328 fSettingsMenu( lcd, this )
isonno 0:6da5625a6946 329 {
isonno 0:6da5625a6946 330 fForcedOff = false;
isonno 0:6da5625a6946 331 fLabels.push_back( string( "Patterns" ) );
isonno 0:6da5625a6946 332 fLabels.push_back( string( "Colors" ) );
isonno 0:6da5625a6946 333 fLabels.push_back( string( "White" ) );
isonno 0:6da5625a6946 334 fLabels.push_back( string( "Lights Off" ) );
isonno 0:6da5625a6946 335 fLabels.push_back( string( "Settings" ) );
isonno 0:6da5625a6946 336 }
isonno 0:6da5625a6946 337
isonno 0:6da5625a6946 338 void HomeMenu::SetLightsOn( bool isOn )
isonno 0:6da5625a6946 339 {
isonno 0:6da5625a6946 340 if (fForcedOff)
isonno 0:6da5625a6946 341 return;
isonno 0:6da5625a6946 342
isonno 0:6da5625a6946 343 if (isOn != fLightController.AreLightsOn() )
isonno 0:6da5625a6946 344 DoToggleLightsOn();
isonno 0:6da5625a6946 345 }
isonno 0:6da5625a6946 346
isonno 0:6da5625a6946 347 void HomeMenu::DoToggleLightsOn()
isonno 0:6da5625a6946 348 {
isonno 0:6da5625a6946 349 fLightController.LightSwitch( ! fLightController.AreLightsOn() );
isonno 0:6da5625a6946 350 ChangeItem( 3, fLightController.AreLightsOn() ? "Lights Off" : "Lights On" );
isonno 0:6da5625a6946 351 }
isonno 0:6da5625a6946 352
isonno 0:6da5625a6946 353 void HomeMenu::DoLightController( ESelector sel )
isonno 0:6da5625a6946 354 {
isonno 0:6da5625a6946 355 Display( false );
isonno 0:6da5625a6946 356 fLightController.SetSelector( sel );
isonno 1:d1da77023e6a 357 SwitchControl( &fLightController );
isonno 0:6da5625a6946 358 fLightController.Display( true );
isonno 0:6da5625a6946 359 }
isonno 0:6da5625a6946 360
isonno 0:6da5625a6946 361 void HomeMenu::KnobPushed()
isonno 0:6da5625a6946 362 {
isonno 4:cfef06d8bb96 363 // BUG: If display is asleep, should just wake it here.
isonno 0:6da5625a6946 364 switch( SelectedItem() )
isonno 0:6da5625a6946 365 {
isonno 0:6da5625a6946 366 case 0: DoLightController( kPatternSelector ); break;
isonno 1:d1da77023e6a 367 case 1: DoLightController( kColorSelector ); break;
isonno 1:d1da77023e6a 368 case 2: DoLightController( kWhiteSelector ); break;
isonno 1:d1da77023e6a 369
isonno 0:6da5625a6946 370 case 3: DoToggleLightsOn();
isonno 0:6da5625a6946 371 // The ForcedOff state can only be set via the menu
isonno 0:6da5625a6946 372 fForcedOff = !fLightController.AreLightsOn();
isonno 0:6da5625a6946 373 break;
isonno 0:6da5625a6946 374
isonno 1:d1da77023e6a 375 case 4: SwitchTo( &fSettingsMenu );
isonno 1:d1da77023e6a 376 break;
isonno 1:d1da77023e6a 377
isonno 0:6da5625a6946 378 default: UIMenu::KnobPushed(); break;
isonno 0:6da5625a6946 379 }
isonno 0:6da5625a6946 380 }