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:
Thu Dec 29 01:59:53 2011 +0000
Revision:
0:6da5625a6946
Child:
3:0ac64c4ca40f
Contest submission version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
isonno 0:6da5625a6946 1 // SystemState.cpp - Keeps track of system state, so you can
isonno 0:6da5625a6946 2 // power on back where you left off.
isonno 0:6da5625a6946 3
isonno 0:6da5625a6946 4 #include "SystemState.h"
isonno 0:6da5625a6946 5 #include "HoldInterrupts.h"
isonno 0:6da5625a6946 6 #include "SDFileSystem.h"
isonno 0:6da5625a6946 7
isonno 0:6da5625a6946 8 const char * kStateFilename = "/sd/SYSSTATE.TXT";
isonno 0:6da5625a6946 9
isonno 0:6da5625a6946 10 static SystemState static_SystemState;
isonno 0:6da5625a6946 11 SystemState& gSystemState = static_SystemState;
isonno 0:6da5625a6946 12
isonno 0:6da5625a6946 13 SystemState::SystemState()
isonno 0:6da5625a6946 14 {
isonno 0:6da5625a6946 15
isonno 0:6da5625a6946 16 fModeSelector = kWhiteSelector;
isonno 0:6da5625a6946 17 fBrightLevel = 7;
isonno 0:6da5625a6946 18 fSatColorIndex = 0; // This is an INDEX, not actual color
isonno 0:6da5625a6946 19 fPatternIndex = 0;
isonno 0:6da5625a6946 20
isonno 0:6da5625a6946 21 LoadState();
isonno 0:6da5625a6946 22 }
isonno 0:6da5625a6946 23
isonno 0:6da5625a6946 24 void SystemState::DumpState()
isonno 0:6da5625a6946 25 {
isonno 0:6da5625a6946 26 printf( "ModeSelector: %d\r\n", (int) fModeSelector );
isonno 0:6da5625a6946 27 printf( "BrightLevel: %d\r\n", (int) fBrightLevel );
isonno 0:6da5625a6946 28 printf( "SatColorIndex: %d\r\n",(int) fSatColorIndex);
isonno 0:6da5625a6946 29 printf( "PatternIndex: %d\r\n", (int) fPatternIndex );
isonno 0:6da5625a6946 30 }
isonno 0:6da5625a6946 31
isonno 0:6da5625a6946 32 void SystemState::Modified()
isonno 0:6da5625a6946 33 {
isonno 0:6da5625a6946 34 fStateTimer.detach(); // Reset any previous timer
isonno 0:6da5625a6946 35 fStateTimer.attach( this, &SystemState::SaveState, 30.0 );
isonno 0:6da5625a6946 36 }
isonno 0:6da5625a6946 37
isonno 0:6da5625a6946 38 void SystemState::SaveState()
isonno 0:6da5625a6946 39 {
isonno 0:6da5625a6946 40 HoldInterrupts noint();
isonno 0:6da5625a6946 41 SDFileSystem sdcard( p5, p6, p7, p8, "sd" );
isonno 0:6da5625a6946 42
isonno 0:6da5625a6946 43 printf("Saving state...");
isonno 0:6da5625a6946 44 FILE * f = fopen( kStateFilename, "w" );
isonno 0:6da5625a6946 45 if (f)
isonno 0:6da5625a6946 46 {
isonno 0:6da5625a6946 47 fprintf( f, "ModeSelector: %d\n", (int) fModeSelector );
isonno 0:6da5625a6946 48 fprintf( f, "BrightLevel: %d\n", (int) fBrightLevel );
isonno 0:6da5625a6946 49 fprintf( f, "SatColorIndex: %d\n",(int) fSatColorIndex);
isonno 0:6da5625a6946 50 fprintf( f, "PatternIndex: %d\n", (int) fPatternIndex );
isonno 0:6da5625a6946 51 fclose(f);
isonno 0:6da5625a6946 52 printf("saved\r\n");
isonno 0:6da5625a6946 53 }
isonno 0:6da5625a6946 54 else
isonno 0:6da5625a6946 55 printf("failed.\r\n");
isonno 0:6da5625a6946 56 }
isonno 0:6da5625a6946 57
isonno 0:6da5625a6946 58 static int getInt( const char * buffer )
isonno 0:6da5625a6946 59 {
isonno 0:6da5625a6946 60 string s(buffer);
isonno 0:6da5625a6946 61 size_t colon = s.find(':');
isonno 0:6da5625a6946 62 if ((colon > 0) && (colon < s.size()))
isonno 0:6da5625a6946 63 {
isonno 0:6da5625a6946 64 int value;
isonno 0:6da5625a6946 65 s.erase( 0, colon + 1 );
isonno 0:6da5625a6946 66 sscanf( s.c_str(), "%d", &value );
isonno 0:6da5625a6946 67 return value;
isonno 0:6da5625a6946 68 }
isonno 0:6da5625a6946 69 else
isonno 0:6da5625a6946 70 printf("ERROR: problem reading integer in state file\r\n" );
isonno 0:6da5625a6946 71 return 0;
isonno 0:6da5625a6946 72 }
isonno 0:6da5625a6946 73
isonno 0:6da5625a6946 74 /*
isonno 0:6da5625a6946 75 static string getStr( const char * buffer )
isonno 0:6da5625a6946 76 {
isonno 0:6da5625a6946 77 char junk[20];
isonno 0:6da5625a6946 78 char value[20];
isonno 0:6da5625a6946 79 int numRead = sscanf( buffer, "%s : %s", junk, value );
isonno 0:6da5625a6946 80 if (numRead != 2)
isonno 0:6da5625a6946 81 printf("ERROR: problem reading string in state file\n" );
isonno 0:6da5625a6946 82 return string(value);
isonno 0:6da5625a6946 83 }
isonno 0:6da5625a6946 84 */
isonno 0:6da5625a6946 85
isonno 0:6da5625a6946 86 static string GetKeyword( const char * buffer )
isonno 0:6da5625a6946 87 {
isonno 0:6da5625a6946 88 string s(buffer);
isonno 0:6da5625a6946 89 size_t colon = s.find(':');
isonno 0:6da5625a6946 90 if ((colon > 0) && (colon < s.size()))
isonno 0:6da5625a6946 91 s.resize( colon ); // Truncate
isonno 0:6da5625a6946 92 else
isonno 0:6da5625a6946 93 printf("ERROR: problem reading keyword in state file\r\n" );
isonno 0:6da5625a6946 94 return s;
isonno 0:6da5625a6946 95 }
isonno 0:6da5625a6946 96
isonno 0:6da5625a6946 97 #define READ_STATE_VALUE( key, reader ) \
isonno 0:6da5625a6946 98 if (GetKeyword( buffer ) == string(#key)) f ## key = reader(buffer);
isonno 0:6da5625a6946 99
isonno 0:6da5625a6946 100 bool SystemState::LoadState()
isonno 0:6da5625a6946 101 {
isonno 0:6da5625a6946 102 HoldInterrupts noint();
isonno 0:6da5625a6946 103 SDFileSystem sdcard( p5, p6, p7, p8, "sd" );
isonno 0:6da5625a6946 104
isonno 0:6da5625a6946 105 char buffer[200];
isonno 0:6da5625a6946 106 printf("Loading state...");
isonno 0:6da5625a6946 107
isonno 0:6da5625a6946 108 FILE * f = fopen( kStateFilename, "r" );
isonno 0:6da5625a6946 109 if (f)
isonno 0:6da5625a6946 110 {
isonno 0:6da5625a6946 111 while (fgets( buffer, sizeof(buffer), f))
isonno 0:6da5625a6946 112 {
isonno 0:6da5625a6946 113 READ_STATE_VALUE( ModeSelector, (ESelector)getInt );
isonno 0:6da5625a6946 114 READ_STATE_VALUE( BrightLevel, getInt );
isonno 0:6da5625a6946 115 READ_STATE_VALUE( SatColorIndex,getInt );
isonno 0:6da5625a6946 116 READ_STATE_VALUE( PatternIndex, getInt );
isonno 0:6da5625a6946 117 }
isonno 0:6da5625a6946 118 fclose(f);
isonno 0:6da5625a6946 119 printf("loaded.\r\n");
isonno 0:6da5625a6946 120 return true;
isonno 0:6da5625a6946 121 }
isonno 0:6da5625a6946 122 printf("failed.\r\n");
isonno 0:6da5625a6946 123 return false;
isonno 0:6da5625a6946 124 }