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:
4:cfef06d8bb96
Contest submission version

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 0:6da5625a6946 86
isonno 0:6da5625a6946 87
isonno 0:6da5625a6946 88 private:
isonno 0:6da5625a6946 89 bool fState;
isonno 0:6da5625a6946 90 PwmOut fPWM;
isonno 0:6da5625a6946 91 };
isonno 0:6da5625a6946 92
isonno 0:6da5625a6946 93 class CheapLCD
isonno 0:6da5625a6946 94 {
isonno 0:6da5625a6946 95 public:
isonno 0:6da5625a6946 96 CheapLCD( PinName mosi, PinName sclk,
isonno 0:6da5625a6946 97 PinName cs, PinName rst );
isonno 0:6da5625a6946 98
isonno 0:6da5625a6946 99 void put_pixel(byte color, byte x, byte y);
isonno 0:6da5625a6946 100 void set_box(byte x1, byte y1, byte x2, byte y2);
isonno 0:6da5625a6946 101 void clear(uint32_t color, byte x1, byte y1, byte x2, byte y2);
isonno 0:6da5625a6946 102 void draw_color_bar(void);
isonno 0:6da5625a6946 103 void erase(void);
isonno 0:6da5625a6946 104
isonno 0:6da5625a6946 105 // This draws small, aliased, 8x8 characters
isonno 0:6da5625a6946 106 void draw_text_line(uint32_t fcolor,
isonno 0:6da5625a6946 107 uint32_t bcolor,
isonno 0:6da5625a6946 108 byte x, byte y,char c);
isonno 0:6da5625a6946 109 void draw_text(uint32_t fcolor,
isonno 0:6da5625a6946 110 uint32_t bcolor,
isonno 0:6da5625a6946 111 byte x, byte y,char *text);
isonno 0:6da5625a6946 112
isonno 0:6da5625a6946 113 // This draws large, high quality anti-aliased text.
isonno 0:6da5625a6946 114 // Note "y" refers to the text baseline
isonno 0:6da5625a6946 115 void draw_glyph_text( uint32_t fcolor, uint32_t bcolor,
isonno 0:6da5625a6946 116 int x, int y, const char * str );
isonno 0:6da5625a6946 117
isonno 0:6da5625a6946 118 // Draw anti-aliased numbers (smaller than the
isonno 0:6da5625a6946 119 // general text)
isonno 0:6da5625a6946 120 void draw_number( uint32_t fcolor,
isonno 0:6da5625a6946 121 uint32_t bcolor, byte x, byte y,
isonno 0:6da5625a6946 122 int number );
isonno 0:6da5625a6946 123
isonno 0:6da5625a6946 124 // Copy image data to the screen
isonno 0:6da5625a6946 125 void copy_screen( const image_data_t * screenData );
isonno 0:6da5625a6946 126
isonno 0:6da5625a6946 127 // Draw a "splash" image, covering the whole screen
isonno 0:6da5625a6946 128 // (screen data is hard coded, the argument is an index to them)
isonno 0:6da5625a6946 129 void splash(int demo);
isonno 0:6da5625a6946 130
isonno 0:6da5625a6946 131 // Backlight control
isonno 0:6da5625a6946 132 void fade_backlight( bool on ) { fBacklight.Fade( on ); }
isonno 0:6da5625a6946 133 void switch_backlight( bool on ) { fBacklight.Switch( on ); }
isonno 0:6da5625a6946 134
isonno 0:6da5625a6946 135 // Guts of the sprite/text rendering
isonno 0:6da5625a6946 136 void draw_sprite( uint32_t fcolor, uint32_t bcolor,
isonno 0:6da5625a6946 137 byte x, byte y,
isonno 0:6da5625a6946 138 const sprite_data_t * sprite );
isonno 0:6da5625a6946 139 void draw_glyph( uint32_t fcolor, uint32_t bcolor,
isonno 0:6da5625a6946 140 byte x, byte y,
isonno 0:6da5625a6946 141 const glyph_data_t * sprite );
isonno 0:6da5625a6946 142 void send_packed_pixels( uint32_t pixel_data[], uint32_t numPixels );
isonno 0:6da5625a6946 143
isonno 0:6da5625a6946 144 // TEST CODE
isonno 0:6da5625a6946 145 void demo_number( int number );
isonno 0:6da5625a6946 146 void ramp( uint32_t color, uint32_t y, uint32_t height );
isonno 0:6da5625a6946 147
isonno 0:6da5625a6946 148 friend class ChipSelect;
isonno 0:6da5625a6946 149
isonno 0:6da5625a6946 150 private:
isonno 0:6da5625a6946 151
isonno 0:6da5625a6946 152 void sendData( byte data );
isonno 0:6da5625a6946 153 void sendCMD( byte data );
isonno 0:6da5625a6946 154 void init();
isonno 0:6da5625a6946 155
isonno 0:6da5625a6946 156 void draw_mask( uint32_t fcolor, uint32_t bcolor,
isonno 0:6da5625a6946 157 byte x, byte y,
isonno 0:6da5625a6946 158 uint32_t numRows, uint32_t numCols,
isonno 0:6da5625a6946 159 const unsigned char * pixel_data );
isonno 0:6da5625a6946 160
isonno 0:6da5625a6946 161 SPI fSPI;
isonno 0:6da5625a6946 162 DigitalOut fReset;
isonno 0:6da5625a6946 163 DigitalOut fCS;
isonno 0:6da5625a6946 164 int fCSLevel;
isonno 0:6da5625a6946 165
isonno 0:6da5625a6946 166 LCDFadeOut fBacklight;
isonno 0:6da5625a6946 167 };
isonno 0:6da5625a6946 168
isonno 0:6da5625a6946 169 //*******************************************************
isonno 0:6da5625a6946 170 // 12-Bit Color Definitions
isonno 0:6da5625a6946 171 //*******************************************************
isonno 0:6da5625a6946 172 #define WHITE 0xFFF
isonno 0:6da5625a6946 173 #define BLACK 0x000
isonno 0:6da5625a6946 174 #define RED 0xF00
isonno 0:6da5625a6946 175 #define GREEN 0x0F0
isonno 0:6da5625a6946 176 #define BLUE 0x00F
isonno 0:6da5625a6946 177 #define CYAN 0x0FF
isonno 0:6da5625a6946 178 #define MAGENTA 0xF0F
isonno 0:6da5625a6946 179 #define YELLOW 0xFF0
isonno 0:6da5625a6946 180 #define BROWN 0xB22
isonno 0:6da5625a6946 181 #define ORANGE 0xFA0
isonno 0:6da5625a6946 182 #define PINK 0xF6A
isonno 0:6da5625a6946 183 #define GRAY 0x888
isonno 0:6da5625a6946 184
isonno 0:6da5625a6946 185 const int kColorWheelImg = 1;
isonno 0:6da5625a6946 186
isonno 0:6da5625a6946 187 #endif