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:
0:6da5625a6946
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 NokiaLCD.h - Library for a Nokia LCD with the epson driver.
isonno 0:6da5625a6946 3 Created by Thomas Jespersen, July 2009 (Originally Arduino Sketch by Gravitech.us)
isonno 0:6da5625a6946 4 Released into the public domain.
isonno 0:6da5625a6946 5 */
isonno 0:6da5625a6946 6 #ifndef NokiaLCD_h
isonno 0:6da5625a6946 7 #define NokiaLCD_h
isonno 0:6da5625a6946 8
isonno 0:6da5625a6946 9 #ifndef MBED_H
isonno 0:6da5625a6946 10 #include "mbed.h"
isonno 0:6da5625a6946 11 #endif
isonno 0:6da5625a6946 12
isonno 0:6da5625a6946 13 #ifndef __HOLDINTERRUPTS__
isonno 0:6da5625a6946 14 #include "HoldInterrupts.h"
isonno 0:6da5625a6946 15 #endif
isonno 0:6da5625a6946 16
isonno 0:6da5625a6946 17 typedef unsigned char byte;
isonno 0:6da5625a6946 18
isonno 0:6da5625a6946 19 // Full color image
isonno 0:6da5625a6946 20 typedef struct image_data_t
isonno 0:6da5625a6946 21 {
isonno 0:6da5625a6946 22 const unsigned char *pixel_data;
isonno 0:6da5625a6946 23 uint32_t numRows, numCols;
isonno 0:6da5625a6946 24 } image_data_t;
isonno 0:6da5625a6946 25
isonno 0:6da5625a6946 26 // A "sprite" just defines a mask for combining two colors
isonno 0:6da5625a6946 27 typedef struct sprite_data_t
isonno 0:6da5625a6946 28 {
isonno 0:6da5625a6946 29 const unsigned char * pixel_data;
isonno 0:6da5625a6946 30 uint32_t numRows, numCols;
isonno 0:6da5625a6946 31 } sprite_data_t;
isonno 0:6da5625a6946 32
isonno 0:6da5625a6946 33 // Glyphs are like sprites, with text baseline information.
isonno 0:6da5625a6946 34 typedef struct glyph_data_t
isonno 0:6da5625a6946 35 {
isonno 0:6da5625a6946 36 const unsigned char * pixel_data;
isonno 0:6da5625a6946 37 uint32_t numRows, numCols;
isonno 0:6da5625a6946 38 int32_t baseline;
isonno 0:6da5625a6946 39 } glyph_data_t;
isonno 0:6da5625a6946 40
isonno 0:6da5625a6946 41 // This class provides a way to fade in/out the backlight
isonno 0:6da5625a6946 42
isonno 0:6da5625a6946 43 class LCDFadeOut
isonno 0:6da5625a6946 44 {
isonno 0:6da5625a6946 45 public:
isonno 0:6da5625a6946 46 LCDFadeOut( PinName pwmPin ) : fPWM( pwmPin )
isonno 0:6da5625a6946 47 {
isonno 0:6da5625a6946 48 fPWM.period( 0.002 ); // Fairly fast (500 cycles/sec)
isonno 0:6da5625a6946 49 fPWM = 0.0; // default on
isonno 0:6da5625a6946 50 fState = true;
isonno 0:6da5625a6946 51 }
isonno 0:6da5625a6946 52
isonno 0:6da5625a6946 53 ~LCDFadeOut() { }
isonno 0:6da5625a6946 54
isonno 0:6da5625a6946 55 void Fade( bool on )
isonno 0:6da5625a6946 56 {
isonno 0:6da5625a6946 57 if (on == fState) // no change
isonno 0:6da5625a6946 58 return;
isonno 0:6da5625a6946 59
isonno 0:6da5625a6946 60 fState = on;
isonno 0:6da5625a6946 61 HoldInterrupts noirq();
isonno 0:6da5625a6946 62
isonno 0:6da5625a6946 63 const int numSteps = 40;
isonno 0:6da5625a6946 64 const float maxStep = (numSteps - 1.0);
isonno 0:6da5625a6946 65
isonno 0:6da5625a6946 66 // For some reason, the fade looks better with asymetric times.
isonno 0:6da5625a6946 67 int delay = (on ? 300 : 400) / numSteps; // Total time to fade, in ms, divided by steps
isonno 0:6da5625a6946 68
isonno 0:6da5625a6946 69 for (int i = 0; i < numSteps; ++i)
isonno 0:6da5625a6946 70 {
isonno 0:6da5625a6946 71 wait_ms( delay );
isonno 0:6da5625a6946 72 // Note the line is pulled -low- to turn the display on
isonno 0:6da5625a6946 73 fPWM = (!on) ? i / maxStep : (maxStep - i) / maxStep;
isonno 0:6da5625a6946 74 }
isonno 0:6da5625a6946 75 }
isonno 0:6da5625a6946 76
isonno 0:6da5625a6946 77 // Switch w/o fading
isonno 0:6da5625a6946 78 void Switch( bool on )
isonno 0:6da5625a6946 79 {
isonno 0:6da5625a6946 80 if (on == fState)
isonno 0:6da5625a6946 81 return;
isonno 0:6da5625a6946 82
isonno 0:6da5625a6946 83 fState = on;
isonno 0:6da5625a6946 84 fPWM = (!fState) ? 1.0 : 0.0;
isonno 0:6da5625a6946 85 }
isonno 4:cfef06d8bb96 86
isonno 4:cfef06d8bb96 87 bool BacklightOn() const { return fState; }
isonno 0:6da5625a6946 88
isonno 0:6da5625a6946 89 private:
isonno 0:6da5625a6946 90 bool fState;
isonno 0:6da5625a6946 91 PwmOut fPWM;
isonno 0:6da5625a6946 92 };
isonno 0:6da5625a6946 93
isonno 0:6da5625a6946 94 class CheapLCD
isonno 0:6da5625a6946 95 {
isonno 0:6da5625a6946 96 public:
isonno 0:6da5625a6946 97 CheapLCD( PinName mosi, PinName sclk,
isonno 0:6da5625a6946 98 PinName cs, PinName rst );
isonno 0:6da5625a6946 99
isonno 0:6da5625a6946 100 void put_pixel(byte color, byte x, byte y);
isonno 0:6da5625a6946 101 void set_box(byte x1, byte y1, byte x2, byte y2);
isonno 0:6da5625a6946 102 void clear(uint32_t color, byte x1, byte y1, byte x2, byte y2);
isonno 0:6da5625a6946 103 void draw_color_bar(void);
isonno 0:6da5625a6946 104 void erase(void);
isonno 0:6da5625a6946 105
isonno 0:6da5625a6946 106 // This draws small, aliased, 8x8 characters
isonno 0:6da5625a6946 107 void draw_text_line(uint32_t fcolor,
isonno 0:6da5625a6946 108 uint32_t bcolor,
isonno 0:6da5625a6946 109 byte x, byte y,char c);
isonno 0:6da5625a6946 110 void draw_text(uint32_t fcolor,
isonno 0:6da5625a6946 111 uint32_t bcolor,
isonno 0:6da5625a6946 112 byte x, byte y,char *text);
isonno 0:6da5625a6946 113
isonno 0:6da5625a6946 114 // This draws large, high quality anti-aliased text.
isonno 0:6da5625a6946 115 // Note "y" refers to the text baseline
isonno 0:6da5625a6946 116 void draw_glyph_text( uint32_t fcolor, uint32_t bcolor,
isonno 0:6da5625a6946 117 int x, int y, const char * str );
isonno 0:6da5625a6946 118
isonno 0:6da5625a6946 119 // Draw anti-aliased numbers (smaller than the
isonno 0:6da5625a6946 120 // general text)
isonno 0:6da5625a6946 121 void draw_number( uint32_t fcolor,
isonno 0:6da5625a6946 122 uint32_t bcolor, byte x, byte y,
isonno 0:6da5625a6946 123 int number );
isonno 0:6da5625a6946 124
isonno 0:6da5625a6946 125 // Copy image data to the screen
isonno 0:6da5625a6946 126 void copy_screen( const image_data_t * screenData );
isonno 0:6da5625a6946 127
isonno 0:6da5625a6946 128 // Draw a "splash" image, covering the whole screen
isonno 0:6da5625a6946 129 // (screen data is hard coded, the argument is an index to them)
isonno 0:6da5625a6946 130 void splash(int demo);
isonno 0:6da5625a6946 131
isonno 0:6da5625a6946 132 // Backlight control
isonno 4:cfef06d8bb96 133 void fade_backlight( bool on ) { fBacklight.Fade( on ); }
isonno 4:cfef06d8bb96 134 void switch_backlight( bool on ){ fBacklight.Switch( on ); }
isonno 4:cfef06d8bb96 135 bool is_backlight_on() const { return fBacklight.BacklightOn(); }
isonno 0:6da5625a6946 136
isonno 0:6da5625a6946 137 // Guts of the sprite/text rendering
isonno 0:6da5625a6946 138 void draw_sprite( uint32_t fcolor, uint32_t bcolor,
isonno 0:6da5625a6946 139 byte x, byte y,
isonno 0:6da5625a6946 140 const sprite_data_t * sprite );
isonno 0:6da5625a6946 141 void draw_glyph( uint32_t fcolor, uint32_t bcolor,
isonno 0:6da5625a6946 142 byte x, byte y,
isonno 0:6da5625a6946 143 const glyph_data_t * sprite );
isonno 0:6da5625a6946 144 void send_packed_pixels( uint32_t pixel_data[], uint32_t numPixels );
isonno 0:6da5625a6946 145
isonno 0:6da5625a6946 146 // TEST CODE
isonno 0:6da5625a6946 147 void demo_number( int number );
isonno 0:6da5625a6946 148 void ramp( uint32_t color, uint32_t y, uint32_t height );
isonno 0:6da5625a6946 149
isonno 0:6da5625a6946 150 friend class ChipSelect;
isonno 0:6da5625a6946 151
isonno 0:6da5625a6946 152 private:
isonno 0:6da5625a6946 153
isonno 0:6da5625a6946 154 void sendData( byte data );
isonno 0:6da5625a6946 155 void sendCMD( byte data );
isonno 0:6da5625a6946 156 void init();
isonno 0:6da5625a6946 157
isonno 0:6da5625a6946 158 void draw_mask( uint32_t fcolor, uint32_t bcolor,
isonno 0:6da5625a6946 159 byte x, byte y,
isonno 0:6da5625a6946 160 uint32_t numRows, uint32_t numCols,
isonno 0:6da5625a6946 161 const unsigned char * pixel_data );
isonno 0:6da5625a6946 162
isonno 0:6da5625a6946 163 SPI fSPI;
isonno 0:6da5625a6946 164 DigitalOut fReset;
isonno 0:6da5625a6946 165 DigitalOut fCS;
isonno 0:6da5625a6946 166 int fCSLevel;
isonno 0:6da5625a6946 167
isonno 0:6da5625a6946 168 LCDFadeOut fBacklight;
isonno 0:6da5625a6946 169 };
isonno 0:6da5625a6946 170
isonno 0:6da5625a6946 171 //*******************************************************
isonno 0:6da5625a6946 172 // 12-Bit Color Definitions
isonno 0:6da5625a6946 173 //*******************************************************
isonno 0:6da5625a6946 174 #define WHITE 0xFFF
isonno 0:6da5625a6946 175 #define BLACK 0x000
isonno 0:6da5625a6946 176 #define RED 0xF00
isonno 0:6da5625a6946 177 #define GREEN 0x0F0
isonno 0:6da5625a6946 178 #define BLUE 0x00F
isonno 0:6da5625a6946 179 #define CYAN 0x0FF
isonno 0:6da5625a6946 180 #define MAGENTA 0xF0F
isonno 0:6da5625a6946 181 #define YELLOW 0xFF0
isonno 0:6da5625a6946 182 #define BROWN 0xB22
isonno 0:6da5625a6946 183 #define ORANGE 0xFA0
isonno 0:6da5625a6946 184 #define PINK 0xF6A
isonno 0:6da5625a6946 185 #define GRAY 0x888
isonno 0:6da5625a6946 186
isonno 0:6da5625a6946 187 const int kColorWheelImg = 1;
isonno 0:6da5625a6946 188
isonno 0:6da5625a6946 189 #endif