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:
0:6da5625a6946
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 // 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