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
System Block Diagram
SystemState.cpp@0:6da5625a6946, 2011-12-29 (annotated)
- 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?
User | Revision | Line number | New 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 | } |