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
LightSnoop.cpp@4:cfef06d8bb96, 2013-02-11 (annotated)
- Committer:
- isonno
- Date:
- Mon Feb 11 05:04:18 2013 +0000
- Revision:
- 4:cfef06d8bb96
- Parent:
- 0:6da5625a6946
Minor changes to add backlight routines. Not hooked up yet, shouldn't affect build operation.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
isonno |
0:6da5625a6946 | 1 | // |
isonno |
0:6da5625a6946 | 2 | // LightSnoop.cpp - Listen to a serial stream, and determine light |
isonno |
0:6da5625a6946 | 3 | // colors and settings from it. |
isonno |
0:6da5625a6946 | 4 | // |
isonno |
0:6da5625a6946 | 5 | |
isonno |
0:6da5625a6946 | 6 | #include "HoldInterrupts.h" |
isonno |
0:6da5625a6946 | 7 | #include "LightString.h" |
isonno |
0:6da5625a6946 | 8 | #include "LightSnoop.h" |
isonno |
0:6da5625a6946 | 9 | #include "SystemState.h" |
isonno |
0:6da5625a6946 | 10 | |
isonno |
0:6da5625a6946 | 11 | #include "SDFileSystem.h" |
isonno |
0:6da5625a6946 | 12 | |
isonno |
0:6da5625a6946 | 13 | LightSnoop::LightSnoop( int numLights ) |
isonno |
0:6da5625a6946 | 14 | : fLightValues( numLights ), |
isonno |
0:6da5625a6946 | 15 | fSnoopState( kAwaitCommand ), |
isonno |
0:6da5625a6946 | 16 | fCommand(' '), |
isonno |
0:6da5625a6946 | 17 | fID( 0 ), |
isonno |
0:6da5625a6946 | 18 | fBufferIndex( 0 ), |
isonno |
0:6da5625a6946 | 19 | fLastBufferIndex( 0 ) |
isonno |
0:6da5625a6946 | 20 | { |
isonno |
0:6da5625a6946 | 21 | } |
isonno |
0:6da5625a6946 | 22 | |
isonno |
0:6da5625a6946 | 23 | bool LightSnoop::IsActive() |
isonno |
0:6da5625a6946 | 24 | { |
isonno |
0:6da5625a6946 | 25 | bool active = fBufferIndex != fLastBufferIndex; |
isonno |
0:6da5625a6946 | 26 | fLastBufferIndex = fBufferIndex; |
isonno |
0:6da5625a6946 | 27 | return active; |
isonno |
0:6da5625a6946 | 28 | } |
isonno |
0:6da5625a6946 | 29 | |
isonno |
0:6da5625a6946 | 30 | void LightSnoop::SaveSnoop() |
isonno |
0:6da5625a6946 | 31 | { |
isonno |
0:6da5625a6946 | 32 | HoldInterrupts noint(); |
isonno |
0:6da5625a6946 | 33 | SDFileSystem sdcard( p5, p6, p7, p8, "sd" ); |
isonno |
0:6da5625a6946 | 34 | int i; |
isonno |
0:6da5625a6946 | 35 | |
isonno |
0:6da5625a6946 | 36 | for (i = 0; i < fBufferIndex; ++i) |
isonno |
0:6da5625a6946 | 37 | Process(fBuffer[i]); |
isonno |
0:6da5625a6946 | 38 | fBufferIndex = 0; |
isonno |
0:6da5625a6946 | 39 | fLastBufferIndex = 0; |
isonno |
0:6da5625a6946 | 40 | |
isonno |
0:6da5625a6946 | 41 | FILE * f = fopen( "/sd/_WEBPAGE.CRI", "w" ); |
isonno |
0:6da5625a6946 | 42 | |
isonno |
0:6da5625a6946 | 43 | if (f) |
isonno |
0:6da5625a6946 | 44 | { |
isonno |
0:6da5625a6946 | 45 | int i; |
isonno |
0:6da5625a6946 | 46 | for (i = 0; i < fLightValues.size(); ++i) |
isonno |
0:6da5625a6946 | 47 | fprintf( f, "%d\r\n", fLightValues[i] ); |
isonno |
0:6da5625a6946 | 48 | fclose(f); |
isonno |
0:6da5625a6946 | 49 | printf("Updated /sd/_WEBPAGE.CRI\r\n"); |
isonno |
0:6da5625a6946 | 50 | gSystemState.SetPatternIndex( 0 ); |
isonno |
0:6da5625a6946 | 51 | gSystemState.SetModeSelector( kPatternSelector ); |
isonno |
0:6da5625a6946 | 52 | } |
isonno |
0:6da5625a6946 | 53 | else |
isonno |
0:6da5625a6946 | 54 | printf("Unable to open /sd/_WEBPAGE.CRI\r\n"); |
isonno |
0:6da5625a6946 | 55 | } |
isonno |
0:6da5625a6946 | 56 | |
isonno |
0:6da5625a6946 | 57 | void LightSnoop::Listen( uint8_t ch ) |
isonno |
0:6da5625a6946 | 58 | { |
isonno |
0:6da5625a6946 | 59 | if (fBufferIndex >= kBufferMax) |
isonno |
0:6da5625a6946 | 60 | fBufferIndex = 0; |
isonno |
0:6da5625a6946 | 61 | fBuffer[fBufferIndex++] = ch; |
isonno |
0:6da5625a6946 | 62 | } |
isonno |
0:6da5625a6946 | 63 | |
isonno |
0:6da5625a6946 | 64 | // Convert the nine bit binary RGB value to the |
isonno |
0:6da5625a6946 | 65 | // "BCD" three digit RGB value |
isonno |
0:6da5625a6946 | 66 | static uint16_t RGB_value( int value ) |
isonno |
0:6da5625a6946 | 67 | { |
isonno |
0:6da5625a6946 | 68 | return ((value >> 6) * 100) |
isonno |
0:6da5625a6946 | 69 | + (((value >> 3) & 7) * 10) |
isonno |
0:6da5625a6946 | 70 | + (value & 7); |
isonno |
0:6da5625a6946 | 71 | } |
isonno |
0:6da5625a6946 | 72 | |
isonno |
0:6da5625a6946 | 73 | void LightSnoop::Process( const uint8_t ch ) |
isonno |
0:6da5625a6946 | 74 | { |
isonno |
0:6da5625a6946 | 75 | switch (fSnoopState) |
isonno |
0:6da5625a6946 | 76 | { |
isonno |
0:6da5625a6946 | 77 | case kAwaitCommand: |
isonno |
0:6da5625a6946 | 78 | { |
isonno |
0:6da5625a6946 | 79 | fCommand = ch; |
isonno |
0:6da5625a6946 | 80 | switch (ch) |
isonno |
0:6da5625a6946 | 81 | { |
isonno |
0:6da5625a6946 | 82 | case 'C': fSnoopState = kAwaitID; break; // Set color |
isonno |
0:6da5625a6946 | 83 | |
isonno |
0:6da5625a6946 | 84 | case 'I': // Init string |
isonno |
0:6da5625a6946 | 85 | case 'N': // Set # of lights |
isonno |
0:6da5625a6946 | 86 | case 'f': |
isonno |
0:6da5625a6946 | 87 | case 'F': |
isonno |
0:6da5625a6946 | 88 | case 'D': fSnoopState = kAwaitValue; break; |
isonno |
0:6da5625a6946 | 89 | |
isonno |
0:6da5625a6946 | 90 | case 'S': |
isonno |
0:6da5625a6946 | 91 | case 's': |
isonno |
0:6da5625a6946 | 92 | default: fSnoopState = kAwaitCommand; break; |
isonno |
0:6da5625a6946 | 93 | } |
isonno |
0:6da5625a6946 | 94 | } |
isonno |
0:6da5625a6946 | 95 | |
isonno |
0:6da5625a6946 | 96 | case kAwaitValue: |
isonno |
0:6da5625a6946 | 97 | { |
isonno |
0:6da5625a6946 | 98 | switch (fCommand) |
isonno |
0:6da5625a6946 | 99 | { |
isonno |
0:6da5625a6946 | 100 | case 'C': |
isonno |
0:6da5625a6946 | 101 | if ((fID & 0x7F) < fLightValues.size()) |
isonno |
0:6da5625a6946 | 102 | { |
isonno |
0:6da5625a6946 | 103 | fLightValues[fID & 0x7F] = RGB_value( ((fID & 0x80) < 1) | ch ); |
isonno |
0:6da5625a6946 | 104 | // Modified(); |
isonno |
0:6da5625a6946 | 105 | } |
isonno |
0:6da5625a6946 | 106 | else |
isonno |
0:6da5625a6946 | 107 | printf("Bad light ID: %d\n", (int) (fID & 0x7F)); |
isonno |
0:6da5625a6946 | 108 | break; |
isonno |
0:6da5625a6946 | 109 | |
isonno |
0:6da5625a6946 | 110 | case 'I': break; // Could set the lights to the init pattern here... |
isonno |
0:6da5625a6946 | 111 | case 'N': |
isonno |
0:6da5625a6946 | 112 | fLightValues.resize( ch ); |
isonno |
0:6da5625a6946 | 113 | break; |
isonno |
0:6da5625a6946 | 114 | } |
isonno |
0:6da5625a6946 | 115 | fSnoopState = kAwaitCommand; // reset state machine |
isonno |
0:6da5625a6946 | 116 | } |
isonno |
0:6da5625a6946 | 117 | |
isonno |
0:6da5625a6946 | 118 | case kAwaitID: |
isonno |
0:6da5625a6946 | 119 | { |
isonno |
0:6da5625a6946 | 120 | switch (fCommand) |
isonno |
0:6da5625a6946 | 121 | { |
isonno |
0:6da5625a6946 | 122 | case 'C': |
isonno |
0:6da5625a6946 | 123 | fID = ch; |
isonno |
0:6da5625a6946 | 124 | fSnoopState = kAwaitValue; |
isonno |
0:6da5625a6946 | 125 | break; |
isonno |
0:6da5625a6946 | 126 | default: |
isonno |
0:6da5625a6946 | 127 | printf("Bad state\n"); |
isonno |
0:6da5625a6946 | 128 | fSnoopState = kAwaitCommand; |
isonno |
0:6da5625a6946 | 129 | break; |
isonno |
0:6da5625a6946 | 130 | } |
isonno |
0:6da5625a6946 | 131 | } |
isonno |
0:6da5625a6946 | 132 | } |
isonno |
0:6da5625a6946 | 133 | } |
isonno |
0:6da5625a6946 | 134 | |
isonno |
0:6da5625a6946 | 135 |