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 // Click-knob menu implementation
isonno 0:6da5625a6946 3 //
isonno 0:6da5625a6946 4
isonno 0:6da5625a6946 5 #ifndef _UIMENU_
isonno 0:6da5625a6946 6 #define _UIMENU_
isonno 0:6da5625a6946 7
isonno 0:6da5625a6946 8 #include <vector>
isonno 0:6da5625a6946 9 #include <string>
isonno 0:6da5625a6946 10
isonno 0:6da5625a6946 11 #ifndef _ROTARY_ENCODER_
isonno 0:6da5625a6946 12 #include "RotaryEncoder.h"
isonno 0:6da5625a6946 13 #endif
isonno 0:6da5625a6946 14
isonno 0:6da5625a6946 15 #ifndef _PUSHBUTTON_
isonno 0:6da5625a6946 16 #include "PushButton.h"
isonno 0:6da5625a6946 17 #endif
isonno 0:6da5625a6946 18
isonno 0:6da5625a6946 19 class CheapLCD;
isonno 0:6da5625a6946 20
isonno 0:6da5625a6946 21 #define SETUP_KNOB_CALLBACKS( className ) \
isonno 0:6da5625a6946 22 virtual void AttachKnob( RotaryEncoder * knob ) { knob->attach( this, &className::KnobMoved ); }\
isonno 0:6da5625a6946 23 virtual void AttachButton( PushButton * button ) { button->attach( this, &className::KnobPushed ); }
isonno 0:6da5625a6946 24
isonno 0:6da5625a6946 25 // This class manages the input hardware
isonno 0:6da5625a6946 26 class PushKnobUI
isonno 0:6da5625a6946 27 {
isonno 0:6da5625a6946 28 public:
isonno 0:6da5625a6946 29 PushKnobUI( CheapLCD * lcd ) : fKnob( NULL ), fKnobButton( NULL ), fLCD( lcd ) {}
isonno 0:6da5625a6946 30 virtual ~PushKnobUI() {}
isonno 0:6da5625a6946 31
isonno 0:6da5625a6946 32 // Call this with pointers to the devices when the menu is active.
isonno 0:6da5625a6946 33 // When another screen is active, pass NULL pointers to de-activate
isonno 0:6da5625a6946 34 // the menu.
isonno 0:6da5625a6946 35 virtual void ConnectDevices( RotaryEncoder * knob, PushButton * button );
isonno 0:6da5625a6946 36
isonno 0:6da5625a6946 37 // Hands over the control from one control item to another
isonno 0:6da5625a6946 38 // (e.g., from a menu to a submenu). Control actions are routed
isonno 0:6da5625a6946 39 // to the other item)
isonno 0:6da5625a6946 40 virtual void SwitchTo( PushKnobUI * otherDevice );
isonno 0:6da5625a6946 41
isonno 0:6da5625a6946 42 // This gets called any time there's control
isonno 0:6da5625a6946 43 // activity, it wakes up the LCD backlight.
isonno 0:6da5625a6946 44 virtual void Wake();
isonno 0:6da5625a6946 45
isonno 0:6da5625a6946 46 protected:
isonno 0:6da5625a6946 47
isonno 0:6da5625a6946 48 virtual int32_t KnobMoved( int32_t step );
isonno 0:6da5625a6946 49 virtual void KnobPushed();
isonno 0:6da5625a6946 50 virtual void Sleep();
isonno 0:6da5625a6946 51
isonno 0:6da5625a6946 52 SETUP_KNOB_CALLBACKS( PushKnobUI )
isonno 0:6da5625a6946 53
isonno 0:6da5625a6946 54 private:
isonno 0:6da5625a6946 55 RotaryEncoder * fKnob;
isonno 0:6da5625a6946 56 PushButton * fKnobButton;
isonno 0:6da5625a6946 57 CheapLCD * fLCD;
isonno 0:6da5625a6946 58 };
isonno 0:6da5625a6946 59
isonno 0:6da5625a6946 60 // This knob implements a basic menu system
isonno 0:6da5625a6946 61 class UIMenu : public PushKnobUI
isonno 0:6da5625a6946 62 {
isonno 0:6da5625a6946 63 public:
isonno 0:6da5625a6946 64 static const int kNoSelection = -1;
isonno 0:6da5625a6946 65
isonno 0:6da5625a6946 66 UIMenu( CheapLCD * lcd, const char * header = NULL, bool upMenuItem = false );
isonno 0:6da5625a6946 67 virtual ~UIMenu() {}
isonno 0:6da5625a6946 68
isonno 0:6da5625a6946 69 // Call to add an item to the menu
isonno 0:6da5625a6946 70 virtual void AddItem( const char * label );
isonno 0:6da5625a6946 71
isonno 0:6da5625a6946 72 // Turn on the display of the menu
isonno 0:6da5625a6946 73 virtual void Display( bool on );
isonno 0:6da5625a6946 74
isonno 0:6da5625a6946 75 // Returns the currently selected item
isonno 0:6da5625a6946 76 virtual int SelectedItem() { return fSelectedItem; }
isonno 0:6da5625a6946 77
isonno 0:6da5625a6946 78 // Force select item (simulates selecting and click it w/ the knob)
isonno 0:6da5625a6946 79 virtual void SelectItem( int i ) { fSelectedItem = i; Display( true ); }
isonno 0:6da5625a6946 80
isonno 0:6da5625a6946 81 // Change the text of an item (updates display if display is on)
isonno 0:6da5625a6946 82 virtual void ChangeItem( int item, const char * label );
isonno 0:6da5625a6946 83
isonno 0:6da5625a6946 84 protected:
isonno 0:6da5625a6946 85 vector<string> fLabels;
isonno 0:6da5625a6946 86 string fHeader;
isonno 0:6da5625a6946 87
isonno 0:6da5625a6946 88 virtual int32_t KnobMoved( int32_t step );
isonno 0:6da5625a6946 89 virtual void KnobPushed();
isonno 0:6da5625a6946 90
isonno 0:6da5625a6946 91 SETUP_KNOB_CALLBACKS( UIMenu )
isonno 0:6da5625a6946 92
isonno 0:6da5625a6946 93 private:
isonno 0:6da5625a6946 94 void DrawItem( int item );
isonno 0:6da5625a6946 95
isonno 0:6da5625a6946 96 bool fDisplayOn;
isonno 0:6da5625a6946 97 bool fUpMenuItem;
isonno 0:6da5625a6946 98 int fSelectedItem;
isonno 0:6da5625a6946 99 CheapLCD * fLCD;
isonno 0:6da5625a6946 100 };
isonno 0:6da5625a6946 101
isonno 0:6da5625a6946 102 #endif