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