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:
1:d1da77023e6a
Contest submission version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
isonno 0:6da5625a6946 1 //
isonno 0:6da5625a6946 2 // User interface implementation
isonno 0:6da5625a6946 3 //
isonno 0:6da5625a6946 4
isonno 0:6da5625a6946 5 #ifndef _USERINTERFACE_
isonno 0:6da5625a6946 6 #define _USERINTERFACE_
isonno 0:6da5625a6946 7
isonno 0:6da5625a6946 8 #ifndef _UIMENU_
isonno 0:6da5625a6946 9 #include "UIMenu.h"
isonno 0:6da5625a6946 10 #endif
isonno 0:6da5625a6946 11
isonno 0:6da5625a6946 12 class HomeMenu;
isonno 0:6da5625a6946 13 class LightString;
isonno 0:6da5625a6946 14
isonno 0:6da5625a6946 15 // The ControllerUI is a pure virtual class describing the
isonno 0:6da5625a6946 16 // functions one of the light selectors needs to provide
isonno 0:6da5625a6946 17 class ControllerUI
isonno 0:6da5625a6946 18 {
isonno 0:6da5625a6946 19 public:
isonno 0:6da5625a6946 20 ControllerUI( CheapLCD * lcd, LightString * lights )
isonno 0:6da5625a6946 21 : fLCD( lcd ), fLights( lights ), fLightsOn( true ) {};
isonno 0:6da5625a6946 22
isonno 0:6da5625a6946 23 virtual ~ControllerUI() {}
isonno 0:6da5625a6946 24
isonno 0:6da5625a6946 25 virtual void Display( bool on ) = 0;
isonno 0:6da5625a6946 26 virtual int32_t KnobMoved( int32_t step ) = 0;
isonno 0:6da5625a6946 27
isonno 0:6da5625a6946 28 virtual void LightSwitch( bool on );
isonno 0:6da5625a6946 29 virtual void TurnOn() = 0;
isonno 0:6da5625a6946 30 virtual bool AreLightsOn() const { return fLightsOn; }
isonno 0:6da5625a6946 31
isonno 0:6da5625a6946 32 protected:
isonno 0:6da5625a6946 33 CheapLCD * fLCD;
isonno 0:6da5625a6946 34 LightString * fLights;
isonno 0:6da5625a6946 35 bool fLightsOn;
isonno 0:6da5625a6946 36 };
isonno 0:6da5625a6946 37
isonno 0:6da5625a6946 38 typedef vector<uint32_t> Pattern;
isonno 0:6da5625a6946 39
isonno 0:6da5625a6946 40 class PatternSelector : public ControllerUI
isonno 0:6da5625a6946 41 {
isonno 0:6da5625a6946 42 public:
isonno 0:6da5625a6946 43 PatternSelector( CheapLCD * lcd, LightString * lights );
isonno 0:6da5625a6946 44
isonno 0:6da5625a6946 45 virtual ~PatternSelector() {};
isonno 0:6da5625a6946 46
isonno 0:6da5625a6946 47 virtual void Display( bool on );
isonno 0:6da5625a6946 48 virtual int32_t KnobMoved( int32_t step );
isonno 0:6da5625a6946 49
isonno 0:6da5625a6946 50 virtual void TurnOn();
isonno 0:6da5625a6946 51
isonno 0:6da5625a6946 52 private:
isonno 0:6da5625a6946 53 void DrawPattern();
isonno 0:6da5625a6946 54 void SetLights();
isonno 0:6da5625a6946 55
isonno 0:6da5625a6946 56 vector<string> fPatternNames;
isonno 0:6da5625a6946 57 vector<Pattern> fPatterns;
isonno 0:6da5625a6946 58 };
isonno 0:6da5625a6946 59
isonno 0:6da5625a6946 60 // This selector lets you choose among saturated colors
isonno 0:6da5625a6946 61 class ColorSelector : public ControllerUI
isonno 0:6da5625a6946 62 {
isonno 0:6da5625a6946 63 public:
isonno 0:6da5625a6946 64 ColorSelector( CheapLCD * lcd, LightString * lights )
isonno 0:6da5625a6946 65 : ControllerUI( lcd, lights )
isonno 0:6da5625a6946 66 {}
isonno 0:6da5625a6946 67
isonno 0:6da5625a6946 68 virtual ~ColorSelector() {};
isonno 0:6da5625a6946 69
isonno 0:6da5625a6946 70 virtual void Display( bool on );
isonno 0:6da5625a6946 71 virtual int32_t KnobMoved( int32_t step );
isonno 0:6da5625a6946 72
isonno 0:6da5625a6946 73 virtual void TurnOn();
isonno 0:6da5625a6946 74
isonno 0:6da5625a6946 75 private:
isonno 0:6da5625a6946 76 void DrawCursor( bool drawSprite );
isonno 0:6da5625a6946 77 };
isonno 0:6da5625a6946 78
isonno 0:6da5625a6946 79 // This selector lets you choose white lights
isonno 0:6da5625a6946 80 // with a variety of brightness levels
isonno 0:6da5625a6946 81 class WhiteSelector : public ControllerUI
isonno 0:6da5625a6946 82 {
isonno 0:6da5625a6946 83 public:
isonno 0:6da5625a6946 84 WhiteSelector( CheapLCD * lcd, LightString * lights )
isonno 0:6da5625a6946 85 : ControllerUI( lcd, lights )
isonno 0:6da5625a6946 86 {}
isonno 0:6da5625a6946 87
isonno 0:6da5625a6946 88 virtual ~WhiteSelector() {};
isonno 0:6da5625a6946 89
isonno 0:6da5625a6946 90 virtual void Display( bool on );
isonno 0:6da5625a6946 91 virtual int32_t KnobMoved( int32_t step );
isonno 0:6da5625a6946 92
isonno 0:6da5625a6946 93 virtual void TurnOn();
isonno 0:6da5625a6946 94
isonno 0:6da5625a6946 95 private:
isonno 0:6da5625a6946 96 void SetLights();
isonno 0:6da5625a6946 97 void DrawLevel();
isonno 0:6da5625a6946 98 };
isonno 0:6da5625a6946 99
isonno 0:6da5625a6946 100 // This is the generic interface the UI uses to choose a
isonno 0:6da5625a6946 101 // selector and talk to it.
isonno 0:6da5625a6946 102 typedef enum { kColorSelector = 0, kWhiteSelector = 1, kPatternSelector = 2 } ESelector;
isonno 0:6da5625a6946 103
isonno 0:6da5625a6946 104 class LightController : public PushKnobUI
isonno 0:6da5625a6946 105 {
isonno 0:6da5625a6946 106 public:
isonno 0:6da5625a6946 107 LightController( HomeMenu * parent, CheapLCD * lcd, LightString * lights );
isonno 0:6da5625a6946 108
isonno 0:6da5625a6946 109 virtual void Display( bool on ) { fSubController->Display( on ); }
isonno 0:6da5625a6946 110 void LightSwitch( bool on ) { fSubController->LightSwitch( on ); }
isonno 0:6da5625a6946 111 bool AreLightsOn() const { return fSubController->AreLightsOn(); }
isonno 0:6da5625a6946 112
isonno 0:6da5625a6946 113 void SetSelector( ESelector sel );
isonno 0:6da5625a6946 114
isonno 0:6da5625a6946 115 protected:
isonno 0:6da5625a6946 116
isonno 0:6da5625a6946 117 virtual int32_t KnobMoved( int32_t step );
isonno 0:6da5625a6946 118 virtual void KnobPushed();
isonno 0:6da5625a6946 119
isonno 0:6da5625a6946 120 SETUP_KNOB_CALLBACKS( LightController )
isonno 0:6da5625a6946 121
isonno 0:6da5625a6946 122 private:
isonno 0:6da5625a6946 123 HomeMenu * fParent;
isonno 0:6da5625a6946 124 CheapLCD * fLCD;
isonno 0:6da5625a6946 125 LightString * fLights;
isonno 0:6da5625a6946 126
isonno 0:6da5625a6946 127 ControllerUI * fSubController;
isonno 0:6da5625a6946 128 ColorSelector fColorSelector;
isonno 0:6da5625a6946 129 WhiteSelector fWhiteSelector;
isonno 0:6da5625a6946 130 PatternSelector fPatternSelector;
isonno 0:6da5625a6946 131 };
isonno 0:6da5625a6946 132
isonno 0:6da5625a6946 133 // This implements the home-page menu
isonno 0:6da5625a6946 134 //
isonno 0:6da5625a6946 135 class HomeMenu : public UIMenu
isonno 0:6da5625a6946 136 {
isonno 0:6da5625a6946 137 public:
isonno 0:6da5625a6946 138 HomeMenu( CheapLCD * lcd, LightString * lights );
isonno 0:6da5625a6946 139 virtual ~HomeMenu() {};
isonno 0:6da5625a6946 140
isonno 0:6da5625a6946 141 void SetLightsOn( bool isOn );
isonno 0:6da5625a6946 142
isonno 0:6da5625a6946 143 protected:
isonno 0:6da5625a6946 144 void DoLightController( ESelector sel );
isonno 0:6da5625a6946 145 void DoToggleLightsOn();
isonno 0:6da5625a6946 146
isonno 0:6da5625a6946 147 virtual void KnobPushed();
isonno 0:6da5625a6946 148 virtual void AttachButton( PushButton * button ) { button->attach( this, &HomeMenu::KnobPushed ); }
isonno 0:6da5625a6946 149
isonno 0:6da5625a6946 150 LightController fLightController;
isonno 0:6da5625a6946 151
isonno 0:6da5625a6946 152 private:
isonno 0:6da5625a6946 153 bool fForcedOff;
isonno 0:6da5625a6946 154 };
isonno 0:6da5625a6946 155
isonno 0:6da5625a6946 156 #endif
isonno 0:6da5625a6946 157