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.cpp@4:cfef06d8bb96, 2013-02-11 (annotated)
- 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?
User | Revision | Line number | New 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 | */ |