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.cpp - 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 Reworked by J. P------- for the TI LM3S9B96
isonno 0:6da5625a6946 6 Reworked again by J. P------- for the mbed
isonno 0:6da5625a6946 7
isonno 0:6da5625a6946 8 */
isonno 0:6da5625a6946 9
isonno 0:6da5625a6946 10 #include "NokiaLCD.h"
isonno 0:6da5625a6946 11
isonno 0:6da5625a6946 12 // Define Software SPI Pin Signal
isonno 0:6da5625a6946 13
isonno 0:6da5625a6946 14 // Epson S1D15G10 Command Set
isonno 0:6da5625a6946 15 #define DISON 0xaf
isonno 0:6da5625a6946 16 #define DISOFF 0xae
isonno 0:6da5625a6946 17 #define DISNOR 0xa6
isonno 0:6da5625a6946 18 #define DISINV 0xa7
isonno 0:6da5625a6946 19 #define COMSCN 0xbb
isonno 0:6da5625a6946 20 #define DISCTL 0xca
isonno 0:6da5625a6946 21 #define SLPIN 0x95
isonno 0:6da5625a6946 22 #define SLPOUT 0x94
isonno 0:6da5625a6946 23 #define PASET 0x75
isonno 0:6da5625a6946 24 #define CASET 0x15
isonno 0:6da5625a6946 25 #define DATCTL 0xbc
isonno 0:6da5625a6946 26 #define RGBSET8 0xce
isonno 0:6da5625a6946 27 #define RAMWR 0x5c
isonno 0:6da5625a6946 28 #define RAMRD 0x5d
isonno 0:6da5625a6946 29 #define PTLIN 0xa8
isonno 0:6da5625a6946 30 #define PTLOUT 0xa9
isonno 0:6da5625a6946 31 #define RMWIN 0xe0
isonno 0:6da5625a6946 32 #define RMWOUT 0xee
isonno 0:6da5625a6946 33 #define ASCSET 0xaa
isonno 0:6da5625a6946 34 #define SCSTART 0xab
isonno 0:6da5625a6946 35 #define OSCON 0xd1
isonno 0:6da5625a6946 36 #define OSCOFF 0xd2
isonno 0:6da5625a6946 37 #define PWRCTR 0x20
isonno 0:6da5625a6946 38 #define VOLCTR 0x81
isonno 0:6da5625a6946 39 #define VOLUP 0xd6
isonno 0:6da5625a6946 40 #define VOLDOWN 0xd7
isonno 0:6da5625a6946 41 #define TMPGRD 0x82
isonno 0:6da5625a6946 42 #define EPCTIN 0xcd
isonno 0:6da5625a6946 43 #define EPCOUT 0xcc
isonno 0:6da5625a6946 44 #define EPMWR 0xfc
isonno 0:6da5625a6946 45 #define EPMRD 0xfd
isonno 0:6da5625a6946 46 #define EPSRRD1 0x7c
isonno 0:6da5625a6946 47 #define EPSRRD2 0x7d
isonno 0:6da5625a6946 48 #define NOP 0x25
isonno 0:6da5625a6946 49
isonno 0:6da5625a6946 50 #include "SmallText.h"
isonno 0:6da5625a6946 51 #include "Splash.h"
isonno 0:6da5625a6946 52 #include "ColorWheel.h"
isonno 0:6da5625a6946 53 #include "NumSprites.h"
isonno 0:6da5625a6946 54 #include "f18TextData.h"
isonno 0:6da5625a6946 55
isonno 0:6da5625a6946 56 const sprite_data_t * NumSprites[] = {&N0_sprt, &N1_sprt,
isonno 0:6da5625a6946 57 &N2_sprt, &N3_sprt,
isonno 0:6da5625a6946 58 &N4_sprt, &N5_sprt,
isonno 0:6da5625a6946 59 &N6_sprt, &N7_sprt,
isonno 0:6da5625a6946 60 &N8_sprt, &N9_sprt };
isonno 0:6da5625a6946 61
isonno 0:6da5625a6946 62
isonno 0:6da5625a6946 63
isonno 0:6da5625a6946 64 CheapLCD::CheapLCD( PinName mosi, PinName sclk, PinName cs, PinName rst )
isonno 0:6da5625a6946 65 :fSPI( mosi, NC, sclk ),
isonno 0:6da5625a6946 66 fReset( rst ),
isonno 0:6da5625a6946 67 fCS( cs ),
isonno 0:6da5625a6946 68 fCSLevel( 0 ),
isonno 0:6da5625a6946 69 fBacklight( p21 )
isonno 0:6da5625a6946 70 {
isonno 0:6da5625a6946 71 init();
isonno 0:6da5625a6946 72 }
isonno 0:6da5625a6946 73
isonno 0:6da5625a6946 74 void CheapLCD::init()
isonno 0:6da5625a6946 75 {
isonno 0:6da5625a6946 76 // Initialize the LCD display
isonno 0:6da5625a6946 77
isonno 0:6da5625a6946 78 // Hardware Reset LCD
isonno 0:6da5625a6946 79 fCS = 1;
isonno 0:6da5625a6946 80 fReset = 0;
isonno 0:6da5625a6946 81 fSPI.format( 9 );
isonno 0:6da5625a6946 82 fSPI.frequency( 5000000 );
isonno 0:6da5625a6946 83 wait_ms( 1 );
isonno 0:6da5625a6946 84 fReset = 1;
isonno 0:6da5625a6946 85 wait_ms( 1 );
isonno 0:6da5625a6946 86 fCS = 0;
isonno 0:6da5625a6946 87
isonno 0:6da5625a6946 88 // Display control
isonno 0:6da5625a6946 89 sendCMD(DISCTL);
isonno 0:6da5625a6946 90 sendData(0x0C); // 2 divisions, Field swithcing period
isonno 0:6da5625a6946 91 sendData(32); // 132 lines to be display
isonno 0:6da5625a6946 92 sendData(0); // Inversely hightlighted lines - 1
isonno 0:6da5625a6946 93 sendData(0);
isonno 0:6da5625a6946 94
isonno 0:6da5625a6946 95 sendCMD(COMSCN); // comscn
isonno 0:6da5625a6946 96 sendData(0x00);
isonno 0:6da5625a6946 97
isonno 0:6da5625a6946 98 sendCMD(OSCON); // oscon
isonno 0:6da5625a6946 99
isonno 0:6da5625a6946 100 sendCMD(SLPOUT); // sleep out
isonno 0:6da5625a6946 101
isonno 0:6da5625a6946 102 sendCMD(PWRCTR); // power ctrl
isonno 0:6da5625a6946 103 sendData(0x0f); // everything on, no external reference resistors
isonno 0:6da5625a6946 104 wait_ms( 1 );
isonno 0:6da5625a6946 105
isonno 0:6da5625a6946 106 sendCMD(VOLCTR); // electronic volume, this is kinda contrast/brightness
isonno 0:6da5625a6946 107 sendData(0x24); // this might be different for individual LCDs
isonno 0:6da5625a6946 108 sendData(0x03);
isonno 0:6da5625a6946 109
isonno 0:6da5625a6946 110 // sendCMD(DISINV); // display mode
isonno 0:6da5625a6946 111
isonno 0:6da5625a6946 112 sendCMD(DATCTL); // datctl
isonno 0:6da5625a6946 113 sendData(0x02); // Set
isonno 0:6da5625a6946 114 sendData(0); // RGB (not BGR) LCD
isonno 0:6da5625a6946 115 sendData(0x02); // 16 bit grayscale type A
isonno 0:6da5625a6946 116
isonno 0:6da5625a6946 117 sendCMD(DISON); // display on
isonno 0:6da5625a6946 118 fCS = 1;
isonno 0:6da5625a6946 119 }
isonno 0:6da5625a6946 120
isonno 0:6da5625a6946 121 void CheapLCD::sendCMD( byte data )
isonno 0:6da5625a6946 122 {
isonno 0:6da5625a6946 123 fSPI.write( data & 0xFF );
isonno 0:6da5625a6946 124 }
isonno 0:6da5625a6946 125
isonno 0:6da5625a6946 126 void CheapLCD::sendData( byte data )
isonno 0:6da5625a6946 127 {
isonno 0:6da5625a6946 128 fSPI.write( data | 0x100 );
isonno 0:6da5625a6946 129 }
isonno 0:6da5625a6946 130
isonno 0:6da5625a6946 131 // Chip select must be asserted low while talking to the display.
isonno 0:6da5625a6946 132 // We use this class to keep track of nested calls, so it's done
isonno 0:6da5625a6946 133 // once per operation.
isonno 0:6da5625a6946 134
isonno 0:6da5625a6946 135 class ChipSelect {
isonno 0:6da5625a6946 136 public:
isonno 0:6da5625a6946 137 ChipSelect( CheapLCD * lcd ): fLCD( lcd )
isonno 0:6da5625a6946 138 {
isonno 0:6da5625a6946 139 if (fLCD->fCSLevel == 0)
isonno 0:6da5625a6946 140 fLCD->fCS = 0;
isonno 0:6da5625a6946 141 fLCD->fCSLevel++;
isonno 0:6da5625a6946 142 }
isonno 0:6da5625a6946 143
isonno 0:6da5625a6946 144
isonno 0:6da5625a6946 145 ~ChipSelect()
isonno 0:6da5625a6946 146 {
isonno 0:6da5625a6946 147 fLCD->fCSLevel--;
isonno 0:6da5625a6946 148 if (fLCD->fCSLevel < 0)
isonno 0:6da5625a6946 149 printf("WTF?? fLCD level negative\r\n");
isonno 0:6da5625a6946 150 if (fLCD->fCSLevel == 0)
isonno 0:6da5625a6946 151 fLCD->fCS = 1;
isonno 0:6da5625a6946 152 }
isonno 0:6da5625a6946 153
isonno 0:6da5625a6946 154 private:
isonno 0:6da5625a6946 155 CheapLCD * fLCD;
isonno 0:6da5625a6946 156 };
isonno 0:6da5625a6946 157
isonno 0:6da5625a6946 158
isonno 0:6da5625a6946 159 /**************************************/
isonno 0:6da5625a6946 160 /* Put pixel to LCD */
isonno 0:6da5625a6946 161 /**************************************/
isonno 0:6da5625a6946 162
isonno 0:6da5625a6946 163 void CheapLCD::put_pixel(byte color, byte x, byte y)
isonno 0:6da5625a6946 164 {
isonno 0:6da5625a6946 165 ChipSelect cs(this);
isonno 0:6da5625a6946 166
isonno 0:6da5625a6946 167 sendCMD(CASET); // page start/end ram
isonno 0:6da5625a6946 168 sendData(x); // for some reason starts at 2
isonno 0:6da5625a6946 169 sendData(x+1);
isonno 0:6da5625a6946 170
isonno 0:6da5625a6946 171 sendCMD(PASET); // column start/end ram
isonno 0:6da5625a6946 172 sendData(y);
isonno 0:6da5625a6946 173 sendData(y+1);
isonno 0:6da5625a6946 174 sendCMD(RAMWR);
isonno 0:6da5625a6946 175 sendData(color);
isonno 0:6da5625a6946 176 }
isonno 0:6da5625a6946 177
isonno 0:6da5625a6946 178 void CheapLCD::set_box(byte x1, byte y1, byte x2, byte y2)
isonno 0:6da5625a6946 179 {
isonno 0:6da5625a6946 180 ChipSelect cs(this);
isonno 0:6da5625a6946 181 /*
isonno 0:6da5625a6946 182 sendCMD(CASET); // page start/end ram
isonno 0:6da5625a6946 183 sendData(x1); // for some reason starts at 2
isonno 0:6da5625a6946 184 sendData(x2);
isonno 0:6da5625a6946 185
isonno 0:6da5625a6946 186 sendCMD(PASET); // column start/end ram
isonno 0:6da5625a6946 187 sendData(y1);
isonno 0:6da5625a6946 188 sendData(y2);
isonno 0:6da5625a6946 189 */
isonno 0:6da5625a6946 190
isonno 0:6da5625a6946 191 sendCMD(CASET); // page start/end ram
isonno 0:6da5625a6946 192 sendData(131-x2); // for some reason starts at 2
isonno 0:6da5625a6946 193 sendData(131-x1);
isonno 0:6da5625a6946 194
isonno 0:6da5625a6946 195 sendCMD(PASET); // column start/end ram
isonno 0:6da5625a6946 196 sendData(131-y2);
isonno 0:6da5625a6946 197 sendData(131-y1);
isonno 0:6da5625a6946 198 }
isonno 0:6da5625a6946 199
isonno 0:6da5625a6946 200 #define MEMPIXEL(color) sendData( (color>>4) & 0x00FF);\
isonno 0:6da5625a6946 201 sendData( ((color & 0x0F) << 4) | (color >> 8));\
isonno 0:6da5625a6946 202 sendData( color & 0xFF );
isonno 0:6da5625a6946 203
isonno 0:6da5625a6946 204
isonno 0:6da5625a6946 205 void CheapLCD::clear(uint32_t color, byte x1, byte y1, byte x2, byte y2)
isonno 0:6da5625a6946 206 {
isonno 0:6da5625a6946 207 ChipSelect cs(this);
isonno 0:6da5625a6946 208
isonno 0:6da5625a6946 209 uint32_t i;
isonno 0:6da5625a6946 210 uint32_t total_bytes1;
isonno 0:6da5625a6946 211 uint32_t total_bytes2;
isonno 0:6da5625a6946 212 uint32_t total_bytes;
isonno 0:6da5625a6946 213
isonno 0:6da5625a6946 214 CheapLCD::set_box(x1, y1, x2, y2);
isonno 0:6da5625a6946 215
isonno 0:6da5625a6946 216 sendCMD(RAMWR);
isonno 0:6da5625a6946 217 total_bytes1 = (x2 - x1) +1;
isonno 0:6da5625a6946 218 total_bytes2 = (y2 - y1) +1;
isonno 0:6da5625a6946 219 total_bytes = total_bytes1 * total_bytes2;
isonno 0:6da5625a6946 220 for (i = 0; i < total_bytes/2; i++)
isonno 0:6da5625a6946 221 {
isonno 0:6da5625a6946 222 MEMPIXEL( color )
isonno 0:6da5625a6946 223 }
isonno 0:6da5625a6946 224 }
isonno 0:6da5625a6946 225
isonno 0:6da5625a6946 226 void CheapLCD::copy_screen( const image_data_t * screenData )
isonno 0:6da5625a6946 227 {
isonno 0:6da5625a6946 228 ChipSelect cs(this);
isonno 0:6da5625a6946 229
isonno 0:6da5625a6946 230 int i, start, row, num;
isonno 0:6da5625a6946 231 // clear( BLACK, 0, 0, 131, 131 );
isonno 0:6da5625a6946 232
isonno 0:6da5625a6946 233 sendCMD(CASET); // page start/end ram
isonno 0:6da5625a6946 234 sendData(0); // for some reason starts at 2
isonno 0:6da5625a6946 235 sendData(131);
isonno 0:6da5625a6946 236
isonno 0:6da5625a6946 237 sendCMD(PASET); // column start/end ram
isonno 0:6da5625a6946 238 sendData(0);
isonno 0:6da5625a6946 239 sendData(131);
isonno 0:6da5625a6946 240
isonno 0:6da5625a6946 241 sendCMD(RAMWR);
isonno 0:6da5625a6946 242 for (row = 0; row <= 131; ++row)
isonno 0:6da5625a6946 243 {
isonno 0:6da5625a6946 244 start = (((row + 2) % 131)) * (132/2)*3;
isonno 0:6da5625a6946 245 // start = row * (132/2)*3;
isonno 0:6da5625a6946 246 num = (132/2)*3;
isonno 0:6da5625a6946 247 for (i = 0; i < num; ++i)
isonno 0:6da5625a6946 248 sendData( screenData->pixel_data[start + i] );
isonno 0:6da5625a6946 249 }
isonno 0:6da5625a6946 250 }
isonno 0:6da5625a6946 251
isonno 0:6da5625a6946 252 /*
isonno 0:6da5625a6946 253 // NOTE! (x1-x0)+1 must be even!
isonno 0:6da5625a6946 254 void CheapLCD::copy_screen_section( byte x0, byte y0, byte x1, byte y1,
isonno 0:6da5625a6946 255 const image_data_t * screenData )
isonno 0:6da5625a6946 256 {
isonno 0:6da5625a6946 257 int row, i, num, start;
isonno 0:6da5625a6946 258 // set_box( x0, y0, x1, y1 );
isonno 0:6da5625a6946 259 sendCMD(CASET); // page start/end ram
isonno 0:6da5625a6946 260 sendData((131-x1));
isonno 0:6da5625a6946 261 sendData((131-x0));
isonno 0:6da5625a6946 262
isonno 0:6da5625a6946 263 sendCMD(PASET); // column start/end ram
isonno 0:6da5625a6946 264 if (y0 == 0)
isonno 0:6da5625a6946 265 sendData(2);
isonno 0:6da5625a6946 266 else
isonno 0:6da5625a6946 267 sendData(y0);
isonno 0:6da5625a6946 268 y1++;
isonno 0:6da5625a6946 269 sendData(y1);
isonno 0:6da5625a6946 270
isonno 0:6da5625a6946 271 sendCMD(RAMWR);
isonno 0:6da5625a6946 272 for (row = y0; row <= y1; ++row)
isonno 0:6da5625a6946 273 {
isonno 0:6da5625a6946 274 if (y0 == 0)
isonno 0:6da5625a6946 275 start = (((row + 2) % y1)) * (132/2)*3;
isonno 0:6da5625a6946 276 else
isonno 0:6da5625a6946 277 start = (row) * (132/2)*3;
isonno 0:6da5625a6946 278 start += (x0/2) * 3;
isonno 0:6da5625a6946 279 num = ((x1 - x0)+1)/2 * 3;
isonno 0:6da5625a6946 280 for (i = 0; i < num; ++i)
isonno 0:6da5625a6946 281 sendData( screenData->pixel_data[start + i] );
isonno 0:6da5625a6946 282 }
isonno 0:6da5625a6946 283 }
isonno 0:6da5625a6946 284 */
isonno 0:6da5625a6946 285
isonno 0:6da5625a6946 286 void CheapLCD::splash(int demo)
isonno 0:6da5625a6946 287 {
isonno 0:6da5625a6946 288 switch (demo)
isonno 0:6da5625a6946 289 {
isonno 0:6da5625a6946 290 case 1:
isonno 0:6da5625a6946 291 copy_screen( &ColorWheel_img );
isonno 0:6da5625a6946 292 break;
isonno 0:6da5625a6946 293 /*
isonno 0:6da5625a6946 294 */
isonno 0:6da5625a6946 295 default:
isonno 0:6da5625a6946 296 case 0:
isonno 0:6da5625a6946 297 copy_screen( &Splash_img );
isonno 0:6da5625a6946 298 break;
isonno 0:6da5625a6946 299 }
isonno 0:6da5625a6946 300 }
isonno 0:6da5625a6946 301
isonno 0:6da5625a6946 302 void CheapLCD::ramp( uint32_t color, uint32_t y, uint32_t height )
isonno 0:6da5625a6946 303 {
isonno 0:6da5625a6946 304 ChipSelect cs(this);
isonno 0:6da5625a6946 305
isonno 0:6da5625a6946 306 int i, j;
isonno 0:6da5625a6946 307 uint32_t red = (color >> 8);
isonno 0:6da5625a6946 308 uint32_t grn = (color & 0xFF) >> 4;
isonno 0:6da5625a6946 309 uint32_t blu = (color & 0x0F);
isonno 0:6da5625a6946 310 uint32_t c = color, scanline[132/2];
isonno 0:6da5625a6946 311
isonno 0:6da5625a6946 312 for (i = 0; i < 132/2; ++i)
isonno 0:6da5625a6946 313 {
isonno 0:6da5625a6946 314 if (((i+1) % 4) == 0)
isonno 0:6da5625a6946 315 {
isonno 0:6da5625a6946 316 if (red > 0) red--;
isonno 0:6da5625a6946 317 if (grn > 0) grn--;
isonno 0:6da5625a6946 318 if (blu > 0) blu--;
isonno 0:6da5625a6946 319 c = (red << 8) | (grn << 4) | blu;
isonno 0:6da5625a6946 320 }
isonno 0:6da5625a6946 321 scanline[i] = c;
isonno 0:6da5625a6946 322 }
isonno 0:6da5625a6946 323
isonno 0:6da5625a6946 324 set_box( 0, y, 131, y+height );
isonno 0:6da5625a6946 325
isonno 0:6da5625a6946 326 sendCMD(RAMWR);
isonno 0:6da5625a6946 327
isonno 0:6da5625a6946 328 for (i = 0; i < height; ++i)
isonno 0:6da5625a6946 329 {
isonno 0:6da5625a6946 330 for (j = 0; j < 132/2; ++j)
isonno 0:6da5625a6946 331 {
isonno 0:6da5625a6946 332 c = scanline[j];
isonno 0:6da5625a6946 333 MEMPIXEL( c );
isonno 0:6da5625a6946 334 }
isonno 0:6da5625a6946 335 }
isonno 0:6da5625a6946 336 }
isonno 0:6da5625a6946 337
isonno 0:6da5625a6946 338 void CheapLCD::draw_color_bar()
isonno 0:6da5625a6946 339 {
isonno 0:6da5625a6946 340 ChipSelect cs(this);
isonno 0:6da5625a6946 341
isonno 0:6da5625a6946 342 clear(RED,0,0,131,33);
isonno 0:6da5625a6946 343 clear(GREEN,0,34,131,66);
isonno 0:6da5625a6946 344 clear(BLUE,0,67,131,99);
isonno 0:6da5625a6946 345 clear(WHITE,0,100,131,131);
isonno 0:6da5625a6946 346
isonno 0:6da5625a6946 347 ramp( RED, 0, 15 );
isonno 0:6da5625a6946 348 ramp( GREEN, 34, 15 );
isonno 0:6da5625a6946 349 ramp( BLUE, 67, 15 );
isonno 0:6da5625a6946 350 ramp( WHITE, 100, 15 );
isonno 0:6da5625a6946 351 }
isonno 0:6da5625a6946 352
isonno 0:6da5625a6946 353 void CheapLCD::erase()
isonno 0:6da5625a6946 354 {
isonno 0:6da5625a6946 355 clear( BLACK, 0, 0, 131, 131 );
isonno 0:6da5625a6946 356 }
isonno 0:6da5625a6946 357
isonno 0:6da5625a6946 358 void CheapLCD::send_packed_pixels( uint32_t pixel_data[], unsigned int numPixels )
isonno 0:6da5625a6946 359 {
isonno 0:6da5625a6946 360 ChipSelect cs(this);
isonno 0:6da5625a6946 361
isonno 0:6da5625a6946 362 uint32_t c0, c1;
isonno 0:6da5625a6946 363 unsigned char d;
isonno 0:6da5625a6946 364 unsigned int i;
isonno 0:6da5625a6946 365
isonno 0:6da5625a6946 366 sendCMD(RAMWR);
isonno 0:6da5625a6946 367
isonno 0:6da5625a6946 368 for (i = 0; i < numPixels/2; ++i)
isonno 0:6da5625a6946 369 {
isonno 0:6da5625a6946 370 c0 = pixel_data[i*2];
isonno 0:6da5625a6946 371 c1 = pixel_data[i*2+1];
isonno 0:6da5625a6946 372 d = (c0 >> 4) | ((c0 >> 4) & 0xF);
isonno 0:6da5625a6946 373 sendData( d );
isonno 0:6da5625a6946 374 d = ((c0 & 0xF) << 4) | (c1 >> 8);
isonno 0:6da5625a6946 375 sendData( d );
isonno 0:6da5625a6946 376 d = c1 & 0xFF;
isonno 0:6da5625a6946 377 sendData( d );
isonno 0:6da5625a6946 378 }
isonno 0:6da5625a6946 379 }
isonno 0:6da5625a6946 380
isonno 0:6da5625a6946 381 void CheapLCD::draw_text_line(uint32_t fcolor, uint32_t bcolor,byte x, byte y,char c)
isonno 0:6da5625a6946 382 {
isonno 0:6da5625a6946 383 ChipSelect cs(this);
isonno 0:6da5625a6946 384
isonno 0:6da5625a6946 385 unsigned int i;
isonno 0:6da5625a6946 386 uint32_t text_pixels[8];
isonno 0:6da5625a6946 387
isonno 0:6da5625a6946 388 set_box(x,y,x,y+7);
isonno 0:6da5625a6946 389
isonno 0:6da5625a6946 390 for(i=0;i<8;i++)
isonno 0:6da5625a6946 391 {
isonno 0:6da5625a6946 392 if ((1<<(7-i)) & c)
isonno 0:6da5625a6946 393 text_pixels[i] = fcolor;
isonno 0:6da5625a6946 394 else
isonno 0:6da5625a6946 395 text_pixels[i] = bcolor;
isonno 0:6da5625a6946 396 }
isonno 0:6da5625a6946 397
isonno 0:6da5625a6946 398 send_packed_pixels( text_pixels, 8 );
isonno 0:6da5625a6946 399 }
isonno 0:6da5625a6946 400
isonno 0:6da5625a6946 401 void unpack_color( short * r, short * g, short * b, uint32_t color )
isonno 0:6da5625a6946 402 {
isonno 0:6da5625a6946 403 *r = color>>8;
isonno 0:6da5625a6946 404 *g = (color>>4) & 0x0F;
isonno 0:6da5625a6946 405 *b = color & 0x0F;
isonno 0:6da5625a6946 406 }
isonno 0:6da5625a6946 407
isonno 0:6da5625a6946 408 void CheapLCD::draw_mask( uint32_t fcolor, uint32_t bcolor,
isonno 0:6da5625a6946 409 byte x, byte y,
isonno 0:6da5625a6946 410 uint32_t numRows, uint32_t numCols,
isonno 0:6da5625a6946 411 const unsigned char * pixel_data )
isonno 0:6da5625a6946 412 {
isonno 0:6da5625a6946 413 ChipSelect cs(this);
isonno 0:6da5625a6946 414
isonno 0:6da5625a6946 415 uint32_t sline[132]; // Worse case scanline buffer
isonno 0:6da5625a6946 416 short rf = 0, gf = 0, bf = 0, rb, gb, bb, spixel;
isonno 0:6da5625a6946 417 short r, g, b;
isonno 0:6da5625a6946 418 int row, col, ypos;
isonno 0:6da5625a6946 419
isonno 0:6da5625a6946 420 unpack_color( &rf, &gf, &bf, fcolor );
isonno 0:6da5625a6946 421 unpack_color( &rb, &gb, &bb, bcolor );
isonno 0:6da5625a6946 422
isonno 0:6da5625a6946 423 // Whacky epson driver chip: The width of the line must
isonno 0:6da5625a6946 424 // be odd, and the first and last pixels are tossed when
isonno 0:6da5625a6946 425 // filling the display
isonno 0:6da5625a6946 426 // uint32_t oddNumCols = (numCols & 1) ? numCols : numCols + 1;
isonno 0:6da5625a6946 427 sline[0] = bcolor;
isonno 0:6da5625a6946 428 for (row = 0; row < numRows; row++)
isonno 0:6da5625a6946 429 {
isonno 0:6da5625a6946 430 for (col = 0; col < numCols; col++)
isonno 0:6da5625a6946 431 {
isonno 0:6da5625a6946 432 spixel = pixel_data[row * (numCols/2 + (numCols & 1)) + col/2];
isonno 0:6da5625a6946 433 spixel = (col & 1) ? spixel & 0x0F : (spixel >> 4);
isonno 0:6da5625a6946 434
isonno 0:6da5625a6946 435 // Note f*t + b*(1-t) reduces to t*(f-b) + b
isonno 0:6da5625a6946 436 r = ((spixel * (rf - rb)) >> 4) + rb;
isonno 0:6da5625a6946 437 g = ((spixel * (gf - gb)) >> 4) + gb;
isonno 0:6da5625a6946 438 b = ((spixel * (bf - bb)) >> 4) + bb;
isonno 0:6da5625a6946 439
isonno 0:6da5625a6946 440 sline[col+1] = (uint32_t) ( (r << 8) | (g << 4) | b );
isonno 0:6da5625a6946 441 }
isonno 0:6da5625a6946 442 sline[col+1] = bcolor;
isonno 0:6da5625a6946 443
isonno 0:6da5625a6946 444 ypos = (y + numRows-1) - row;
isonno 0:6da5625a6946 445 set_box( x, ypos, x + numCols-1, ypos );
isonno 0:6da5625a6946 446
isonno 0:6da5625a6946 447 send_packed_pixels( sline, numCols+2 );
isonno 0:6da5625a6946 448 }
isonno 0:6da5625a6946 449 }
isonno 0:6da5625a6946 450
isonno 0:6da5625a6946 451 void CheapLCD::draw_glyph_text( uint32_t fcolor, uint32_t bcolor,
isonno 0:6da5625a6946 452 int x, int y, const char * str )
isonno 0:6da5625a6946 453 {
isonno 0:6da5625a6946 454 const char * p = str;
isonno 0:6da5625a6946 455 int xpos = x;
isonno 0:6da5625a6946 456 while (*p)
isonno 0:6da5625a6946 457 {
isonno 0:6da5625a6946 458 if (*p == ' ')
isonno 0:6da5625a6946 459 xpos += 8;
isonno 0:6da5625a6946 460 else
isonno 0:6da5625a6946 461 {
isonno 0:6da5625a6946 462 const glyph_data_t * g = f18_glyph_array[((*p) & 0x7f) - 0x21];
isonno 0:6da5625a6946 463 draw_glyph( fcolor, bcolor, xpos, y, g );
isonno 0:6da5625a6946 464 xpos += (g->numCols + 1);
isonno 0:6da5625a6946 465 }
isonno 0:6da5625a6946 466 p++;
isonno 0:6da5625a6946 467 }
isonno 0:6da5625a6946 468 }
isonno 0:6da5625a6946 469
isonno 0:6da5625a6946 470 // Note "y" in this case refers to the baseline origin, not top left
isonno 0:6da5625a6946 471 void CheapLCD::draw_glyph( uint32_t fcolor, uint32_t bcolor,
isonno 0:6da5625a6946 472 byte x, byte y,
isonno 0:6da5625a6946 473 const glyph_data_t * glyph )
isonno 0:6da5625a6946 474 {
isonno 0:6da5625a6946 475 int y1 = (int)y - (int)(glyph->numRows) + glyph->baseline;
isonno 0:6da5625a6946 476 draw_mask( fcolor, bcolor, x, (byte) y1,
isonno 0:6da5625a6946 477 glyph->numRows, glyph->numCols, glyph->pixel_data );
isonno 0:6da5625a6946 478 }
isonno 0:6da5625a6946 479
isonno 0:6da5625a6946 480 void CheapLCD::draw_sprite( uint32_t fcolor, uint32_t bcolor,
isonno 0:6da5625a6946 481 byte x, byte y,
isonno 0:6da5625a6946 482 const sprite_data_t * sprite )
isonno 0:6da5625a6946 483 {
isonno 0:6da5625a6946 484 draw_mask( fcolor, bcolor, x, y,
isonno 0:6da5625a6946 485 sprite->numRows, sprite->numCols, sprite->pixel_data );
isonno 0:6da5625a6946 486 }
isonno 0:6da5625a6946 487
isonno 0:6da5625a6946 488 void CheapLCD::draw_number( uint32_t fcolor,
isonno 0:6da5625a6946 489 uint32_t bcolor, byte x, byte y,
isonno 0:6da5625a6946 490 int number )
isonno 0:6da5625a6946 491 {
isonno 0:6da5625a6946 492 ChipSelect cs( this );
isonno 0:6da5625a6946 493
isonno 0:6da5625a6946 494 char digits[10];
isonno 0:6da5625a6946 495 int i, numDigits = 0;
isonno 0:6da5625a6946 496 const sprite_data_t * sprite;
isonno 0:6da5625a6946 497
isonno 0:6da5625a6946 498 // Store digits
isonno 0:6da5625a6946 499 sprintf( digits, "%d", number );
isonno 0:6da5625a6946 500
isonno 0:6da5625a6946 501 numDigits = strlen( digits );
isonno 0:6da5625a6946 502
isonno 0:6da5625a6946 503 for (i = 0; i < numDigits; ++i)
isonno 0:6da5625a6946 504 {
isonno 0:6da5625a6946 505 sprite = NULL;
isonno 0:6da5625a6946 506 switch (digits[i])
isonno 0:6da5625a6946 507 {
isonno 0:6da5625a6946 508 case '-':
isonno 0:6da5625a6946 509 sprite = &minus_sprt;
isonno 0:6da5625a6946 510 break;
isonno 0:6da5625a6946 511
isonno 0:6da5625a6946 512 default:
isonno 0:6da5625a6946 513 if ((digits[i] >= '0') && (digits[i] <= '9'))
isonno 0:6da5625a6946 514 sprite = NumSprites[digits[i] - '0'];
isonno 0:6da5625a6946 515 break;
isonno 0:6da5625a6946 516 }
isonno 0:6da5625a6946 517
isonno 0:6da5625a6946 518 if (sprite)
isonno 0:6da5625a6946 519 {
isonno 0:6da5625a6946 520 draw_sprite( fcolor, bcolor, x, y, sprite );
isonno 0:6da5625a6946 521 x += sprite->numCols;
isonno 0:6da5625a6946 522 clear( bcolor, x, y, x, y + (sprite->numRows - 1) );
isonno 0:6da5625a6946 523 x++;
isonno 0:6da5625a6946 524 }
isonno 0:6da5625a6946 525 }
isonno 0:6da5625a6946 526 }
isonno 0:6da5625a6946 527
isonno 0:6da5625a6946 528 #define SHADE 0xB
isonno 0:6da5625a6946 529 #define DKRED (SHADE << 8)
isonno 0:6da5625a6946 530 #define DKGRN (SHADE << 4)
isonno 0:6da5625a6946 531 #define DKBLU (SHADE)
isonno 0:6da5625a6946 532
isonno 0:6da5625a6946 533 #define LABELOFF 8
isonno 0:6da5625a6946 534 #define NUMBEROFF 52
isonno 0:6da5625a6946 535
isonno 0:6da5625a6946 536 /*
isonno 0:6da5625a6946 537 void CheapLCD::backlight( tBoolean backlight_on )
isonno 0:6da5625a6946 538 {
isonno 0:6da5625a6946 539 if (backlight_on) BL0 else BL1;
isonno 0:6da5625a6946 540 }
isonno 0:6da5625a6946 541
isonno 0:6da5625a6946 542 void CheapLCD::draw_RGB( int r, int g, int b )
isonno 0:6da5625a6946 543 {
isonno 0:6da5625a6946 544 ChipSelect cs( this );
isonno 0:6da5625a6946 545
isonno 0:6da5625a6946 546 clear( BLACK, 0, 0, 131, 59 );
isonno 0:6da5625a6946 547 clear( DKRED, 0, 60, 131, 83 );
isonno 0:6da5625a6946 548 clear( DKGRN, 0, 84, 131, 107 );
isonno 0:6da5625a6946 549 clear( DKBLU, 0, 108, 131, 131 );
isonno 0:6da5625a6946 550
isonno 0:6da5625a6946 551 draw_sprite( WHITE, BLACK, 6, 13, &RGBColor_sprt );
isonno 0:6da5625a6946 552 draw_sprite( WHITE, DKRED, LABELOFF, 65, &Red_sprt );
isonno 0:6da5625a6946 553 draw_sprite( WHITE, DKGRN, LABELOFF, 89, &Grn_sprt );
isonno 0:6da5625a6946 554 draw_sprite( WHITE, DKBLU, LABELOFF, 111,&Blu_sprt );
isonno 0:6da5625a6946 555
isonno 0:6da5625a6946 556 draw_number( WHITE, DKRED, NUMBEROFF, 65, r );
isonno 0:6da5625a6946 557 draw_number( WHITE, DKGRN, NUMBEROFF, 89, g );
isonno 0:6da5625a6946 558 draw_number( WHITE, DKBLU, NUMBEROFF, 112,b );
isonno 0:6da5625a6946 559 }
isonno 0:6da5625a6946 560
isonno 0:6da5625a6946 561 void CheapLCD::demo_sprite( void )
isonno 0:6da5625a6946 562 {
isonno 0:6da5625a6946 563 draw_sprite( WHITE, RED, 10, 10, &OddAt_sprt );
isonno 0:6da5625a6946 564 }
isonno 0:6da5625a6946 565 */
isonno 0:6da5625a6946 566
isonno 0:6da5625a6946 567 void CheapLCD::demo_number( int num )
isonno 0:6da5625a6946 568 {
isonno 0:6da5625a6946 569 draw_number( RED, WHITE, 10, 10, num );
isonno 0:6da5625a6946 570 }
isonno 0:6da5625a6946 571
isonno 0:6da5625a6946 572
isonno 0:6da5625a6946 573 void CheapLCD::draw_text(uint32_t fcolor, uint32_t bcolor, byte x, byte y,char *text)
isonno 0:6da5625a6946 574 {
isonno 0:6da5625a6946 575 ChipSelect cs( this );
isonno 0:6da5625a6946 576 byte c;
isonno 0:6da5625a6946 577 byte t;
isonno 0:6da5625a6946 578 unsigned int i;
isonno 0:6da5625a6946 579 unsigned int j;
isonno 0:6da5625a6946 580 while(*text != 0)
isonno 0:6da5625a6946 581 {
isonno 0:6da5625a6946 582 t = *text;
isonno 0:6da5625a6946 583 i = t - 32;
isonno 0:6da5625a6946 584 i = i * 5;
isonno 0:6da5625a6946 585 for(j = i; j < i+5; j++)
isonno 0:6da5625a6946 586 {
isonno 0:6da5625a6946 587 c = font[j];
isonno 0:6da5625a6946 588 draw_text_line(fcolor, bcolor, x++, y, c);
isonno 0:6da5625a6946 589 }
isonno 0:6da5625a6946 590 draw_text_line(fcolor, bcolor, x++, y, 0);
isonno 0:6da5625a6946 591 text++;
isonno 0:6da5625a6946 592 }
isonno 0:6da5625a6946 593 }
isonno 0:6da5625a6946 594
isonno 0:6da5625a6946 595 #define DATALINE(name, y, reg)\
isonno 0:6da5625a6946 596 draw_data_line( name, y, (int)(reg[0]), (int)(reg[1]), (int)(reg[2]), (int)(reg[3]) );
isonno 0:6da5625a6946 597
isonno 0:6da5625a6946 598 char *
isonno 0:6da5625a6946 599 convert_float( const char * msg, float H )
isonno 0:6da5625a6946 600 {
isonno 0:6da5625a6946 601 static char digits[15];
isonno 0:6da5625a6946 602
isonno 0:6da5625a6946 603 if (H * 1000 == 1000)
isonno 0:6da5625a6946 604 sprintf( digits, "%s1.0", msg );
isonno 0:6da5625a6946 605 else
isonno 0:6da5625a6946 606 if (H * 1000 > 100)
isonno 0:6da5625a6946 607 sprintf( digits, "%s0.%d", msg, (int) (H * 1000) );
isonno 0:6da5625a6946 608 else
isonno 0:6da5625a6946 609 if (H * 1000 > 10)
isonno 0:6da5625a6946 610 sprintf( digits, "%s0.0%d", msg, (int) (H * 1000) );
isonno 0:6da5625a6946 611 else
isonno 0:6da5625a6946 612 sprintf( digits, "%s0.00%d", msg, (int) (H * 1000) );
isonno 0:6da5625a6946 613 return digits;
isonno 0:6da5625a6946 614 }
isonno 0:6da5625a6946 615
isonno 0:6da5625a6946 616 /*
isonno 0:6da5625a6946 617 void CheapLCD::draw_HSL( float H, float S, float L )
isonno 0:6da5625a6946 618 {
isonno 0:6da5625a6946 619 byte x = (byte) (H * 131.0);
isonno 0:6da5625a6946 620 byte y = (byte) (S * 131.0);
isonno 0:6da5625a6946 621
isonno 0:6da5625a6946 622 copy_screen( &hslImage_img );
isonno 0:6da5625a6946 623
isonno 0:6da5625a6946 624 clear( WHITE, x-2, y-2, x+2, y+2 );
isonno 0:6da5625a6946 625
isonno 0:6da5625a6946 626 draw_text( WHITE, 0x0888, 10, 120, convert_float( "H=", H ) );
isonno 0:6da5625a6946 627 draw_text( WHITE, 0x0888, 65, 120, convert_float( "S=", S ) );
isonno 0:6da5625a6946 628 }
isonno 0:6da5625a6946 629 */