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
Diff: UIMenu.cpp
- Revision:
- 3:0ac64c4ca40f
- Parent:
- 1:d1da77023e6a
- Child:
- 4:cfef06d8bb96
--- a/UIMenu.cpp Sun Jan 15 09:07:04 2012 +0000 +++ b/UIMenu.cpp Tue Jan 17 13:45:17 2012 +0000 @@ -76,9 +76,7 @@ UIMenu::UIMenu( CheapLCD * lcd, const char * header, bool upMenuItem ) : PushKnobUI( lcd ), fHeader( header ), fDisplayOn( false ), - fUpMenuItem( upMenuItem ), - fSelectedItem( kNoSelection ), - fLCD( lcd ) + fSelectedItem( kNoSelection ) {} void UIMenu::AddItem( const char * label ) @@ -97,6 +95,12 @@ } } +void UIMenu::ChangeHeader( const char * newHeader ) +{ + fHeader = string( newHeader ); + DrawHeader(); +} + int32_t UIMenu::KnobMoved( int32_t step ) { Wake(); @@ -142,6 +146,16 @@ const int kIndent = 12; #define MEDGREEN 0x0A0 // "medium" green +void UIMenu::ClearItem( int i, uint32_t color ) +{ + if (! fDisplayOn) + return; + + fLCD->clear( color, + 0, i * kLineSpace + kLineSpace + kTopGap, + 131, (i+1) * kLineSpace + kLineSpace + kTopGap ); +} + void UIMenu::DrawItem( int i ) { if (! fDisplayOn) @@ -150,29 +164,39 @@ uint32_t foreColor = WHITE; uint32_t backColor = (i == fSelectedItem) ? MEDGREEN : BLACK; - fLCD->clear( backColor, - 0, i * kLineSpace + kLineSpace + kTopGap, - 131, (i+1) * kLineSpace + kLineSpace + kTopGap ); + ClearItem( i, backColor ); fLCD->draw_glyph_text( foreColor, backColor, kIndent, (i+2) * kLineSpace, fLabels[i].c_str() ); } +void UIMenu::DrawHeader() +{ + if (! fDisplayOn) + return; + fLCD->clear( BLACK, 0, 0, 131, kLineSpace + kTopGap ); + fLCD->clear( GRAY, 0, kLineSpace + kTopGap-1, 131, kLineSpace + kTopGap ); + if (! fHeader.empty()) + fLCD->draw_glyph_text( WHITE, BLACK, 2, kLineSpace-2, fHeader.c_str() ); +} + void UIMenu::Display( bool on ) { if (on) { fDisplayOn = true; - fLCD->clear( BLACK, 0, 0, 131, kLineSpace + kTopGap ); - fLCD->clear( GRAY, 0, kLineSpace + kTopGap-1, 131, kLineSpace + kTopGap ); - if (! fHeader.empty()) - fLCD->draw_glyph_text( WHITE, BLACK, 2, kLineSpace-2, fHeader.c_str() ); + DrawHeader(); + + int maxLines = (int)((131 - (kLineSpace + kTopGap)) / kLineSpace); + + int numLines = std::min( maxLines, (int)fLabels.size() ); - int maxLines = std::min( (int)((131 - (kLineSpace + kTopGap)) / kLineSpace), (int)fLabels.size() ); + for (int i = 0; i < numLines; ++i) + DrawItem( i ); - for (int i = 0; i < maxLines; ++i) - DrawItem( i ); + for (int i = numLines; i < maxLines; ++i ) + ClearItem( i, BLACK ); } else fDisplayOn = false;