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
NokiaLCD.h@2:965388eecf95, 2012-01-16 (annotated)
- Committer:
- isonno
- Date:
- Mon Jan 16 06:33:34 2012 +0000
- Revision:
- 2:965388eecf95
- Parent:
- 0:6da5625a6946
- Child:
- 4:cfef06d8bb96
Experiment with MODSERIAL - just hung....
Who changed what in which revision?
User | Revision | Line number | New 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 |