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

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;