- -

Dependents:   deal_or_no_deal_graphics

Committer:
AlexFerrara
Date:
Mon Oct 31 08:07:41 2016 +0000
Revision:
0:d904fc771672
-

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AlexFerrara 0:d904fc771672 1 //
AlexFerrara 0:d904fc771672 2 // uLCD_4DGL is a class to drive 4D Systems uLCD 144 G2
AlexFerrara 0:d904fc771672 3 //
AlexFerrara 0:d904fc771672 4 // Copyright (C) <2010> Stephane ROCHON <stephane.rochon at free.fr>
AlexFerrara 0:d904fc771672 5 // Modifed for Goldelox processor <2013> Jim Hamblen
AlexFerrara 0:d904fc771672 6 //
AlexFerrara 0:d904fc771672 7 // uLCD_4DGL is free software: you can redistribute it and/or modify
AlexFerrara 0:d904fc771672 8 // it under the terms of the GNU General Public License as published by
AlexFerrara 0:d904fc771672 9 // the Free Software Foundation, either version 3 of the License, or
AlexFerrara 0:d904fc771672 10 // (at your option) any later version.
AlexFerrara 0:d904fc771672 11 //
AlexFerrara 0:d904fc771672 12 // uLCD_4DGL is distributed in the hope that it will be useful,
AlexFerrara 0:d904fc771672 13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
AlexFerrara 0:d904fc771672 14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
AlexFerrara 0:d904fc771672 15 // GNU General Public License for more details.
AlexFerrara 0:d904fc771672 16 //
AlexFerrara 0:d904fc771672 17 // You should have received a copy of the GNU General Public License
AlexFerrara 0:d904fc771672 18 // along with uLCD_4DGL. If not, see <http://www.gnu.org/licenses/>.
AlexFerrara 0:d904fc771672 19
AlexFerrara 0:d904fc771672 20 #include "mbed.h"
AlexFerrara 0:d904fc771672 21 #include "uLCD_4DGL.h"
AlexFerrara 0:d904fc771672 22
AlexFerrara 0:d904fc771672 23 #define ARRAY_SIZE(X) sizeof(X)/sizeof(X[0])
AlexFerrara 0:d904fc771672 24
AlexFerrara 0:d904fc771672 25 //Serial pc(USBTX,USBRX);
AlexFerrara 0:d904fc771672 26
AlexFerrara 0:d904fc771672 27
AlexFerrara 0:d904fc771672 28 //******************************************************************************************************
AlexFerrara 0:d904fc771672 29 uLCD_4DGL :: uLCD_4DGL(PinName tx, PinName rx, PinName rst) : _cmd(tx, rx),
AlexFerrara 0:d904fc771672 30 _rst(rst)
AlexFerrara 0:d904fc771672 31 #if DEBUGMODE
AlexFerrara 0:d904fc771672 32 ,pc(USBTX, USBRX)
AlexFerrara 0:d904fc771672 33 #endif // DEBUGMODE
AlexFerrara 0:d904fc771672 34 {
AlexFerrara 0:d904fc771672 35 // Constructor
AlexFerrara 0:d904fc771672 36 _cmd.baud(9600);
AlexFerrara 0:d904fc771672 37 #if DEBUGMODE
AlexFerrara 0:d904fc771672 38 pc.baud(115200);
AlexFerrara 0:d904fc771672 39
AlexFerrara 0:d904fc771672 40 pc.printf("\n\n\n");
AlexFerrara 0:d904fc771672 41 pc.printf("*********************\n");
AlexFerrara 0:d904fc771672 42 pc.printf("uLCD_4DGL CONSTRUCTOR\n");
AlexFerrara 0:d904fc771672 43 pc.printf("*********************\n");
AlexFerrara 0:d904fc771672 44 #endif
AlexFerrara 0:d904fc771672 45
AlexFerrara 0:d904fc771672 46 _rst = 1; // put RESET pin to high to start TFT screen
AlexFerrara 0:d904fc771672 47 reset();
AlexFerrara 0:d904fc771672 48 cls(); // clear screen
AlexFerrara 0:d904fc771672 49 current_col = 0; // initial cursor col
AlexFerrara 0:d904fc771672 50 current_row = 0; // initial cursor row
AlexFerrara 0:d904fc771672 51 current_color = WHITE; // initial text color
AlexFerrara 0:d904fc771672 52 current_orientation = IS_PORTRAIT; // initial screen orientation
AlexFerrara 0:d904fc771672 53 current_hf = 1;
AlexFerrara 0:d904fc771672 54 current_wf = 1;
AlexFerrara 0:d904fc771672 55 set_font(FONT_7X8); // initial font
AlexFerrara 0:d904fc771672 56 // text_mode(OPAQUE); // initial texr mode
AlexFerrara 0:d904fc771672 57 }
AlexFerrara 0:d904fc771672 58
AlexFerrara 0:d904fc771672 59 //******************************************************************************************************
AlexFerrara 0:d904fc771672 60 void uLCD_4DGL :: writeBYTE(char c) // send a BYTE command to screen
AlexFerrara 0:d904fc771672 61 {
AlexFerrara 0:d904fc771672 62
AlexFerrara 0:d904fc771672 63 _cmd.putc(c);
AlexFerrara 0:d904fc771672 64 wait_us(500); //mbed is too fast for LCD at high baud rates in some long commands
AlexFerrara 0:d904fc771672 65
AlexFerrara 0:d904fc771672 66 #if DEBUGMODE
AlexFerrara 0:d904fc771672 67 pc.printf(" Char sent : 0x%02X\n",c);
AlexFerrara 0:d904fc771672 68 #endif
AlexFerrara 0:d904fc771672 69
AlexFerrara 0:d904fc771672 70 }
AlexFerrara 0:d904fc771672 71
AlexFerrara 0:d904fc771672 72 //******************************************************************************************************
AlexFerrara 0:d904fc771672 73 void uLCD_4DGL :: writeBYTEfast(char c) // send a BYTE command to screen
AlexFerrara 0:d904fc771672 74 {
AlexFerrara 0:d904fc771672 75
AlexFerrara 0:d904fc771672 76 _cmd.putc(c);
AlexFerrara 0:d904fc771672 77 //wait_ms(0.0); //mbed is too fast for LCD at high baud rates - but not in short commands
AlexFerrara 0:d904fc771672 78
AlexFerrara 0:d904fc771672 79 #if DEBUGMODE
AlexFerrara 0:d904fc771672 80 pc.printf(" Char sent : 0x%02X\n",c);
AlexFerrara 0:d904fc771672 81 #endif
AlexFerrara 0:d904fc771672 82
AlexFerrara 0:d904fc771672 83 }
AlexFerrara 0:d904fc771672 84 //******************************************************************************************************
AlexFerrara 0:d904fc771672 85 void uLCD_4DGL :: freeBUFFER(void) // Clear serial buffer before writing command
AlexFerrara 0:d904fc771672 86 {
AlexFerrara 0:d904fc771672 87
AlexFerrara 0:d904fc771672 88 while (_cmd.readable()) _cmd.getc(); // clear buffer garbage
AlexFerrara 0:d904fc771672 89 }
AlexFerrara 0:d904fc771672 90
AlexFerrara 0:d904fc771672 91 //******************************************************************************************************
AlexFerrara 0:d904fc771672 92 int uLCD_4DGL :: writeCOMMAND(char *command, int number) // send several BYTES making a command and return an answer
AlexFerrara 0:d904fc771672 93 {
AlexFerrara 0:d904fc771672 94
AlexFerrara 0:d904fc771672 95 #if DEBUGMODE
AlexFerrara 0:d904fc771672 96 pc.printf("\n");
AlexFerrara 0:d904fc771672 97 pc.printf("New COMMAND : 0x%02X\n", command[0]);
AlexFerrara 0:d904fc771672 98 #endif
AlexFerrara 0:d904fc771672 99 int i, resp = 0;
AlexFerrara 0:d904fc771672 100 freeBUFFER();
AlexFerrara 0:d904fc771672 101 writeBYTE(0xFF);
AlexFerrara 0:d904fc771672 102 for (i = 0; i < number; i++) {
AlexFerrara 0:d904fc771672 103 if (i<16)
AlexFerrara 0:d904fc771672 104 writeBYTEfast(command[i]); // send command to serial port
AlexFerrara 0:d904fc771672 105 else
AlexFerrara 0:d904fc771672 106 writeBYTE(command[i]); // send command to serial port but slower
AlexFerrara 0:d904fc771672 107 }
AlexFerrara 0:d904fc771672 108 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer
AlexFerrara 0:d904fc771672 109 if (_cmd.readable()) resp = _cmd.getc(); // read response if any
AlexFerrara 0:d904fc771672 110 switch (resp) {
AlexFerrara 0:d904fc771672 111 case ACK : // if OK return 1
AlexFerrara 0:d904fc771672 112 resp = 1;
AlexFerrara 0:d904fc771672 113 break;
AlexFerrara 0:d904fc771672 114 case NAK : // if NOK return -1
AlexFerrara 0:d904fc771672 115 resp = -1;
AlexFerrara 0:d904fc771672 116 break;
AlexFerrara 0:d904fc771672 117 default :
AlexFerrara 0:d904fc771672 118 resp = 0; // else return 0
AlexFerrara 0:d904fc771672 119 break;
AlexFerrara 0:d904fc771672 120 }
AlexFerrara 0:d904fc771672 121 #if DEBUGMODE
AlexFerrara 0:d904fc771672 122 pc.printf(" Answer received : %d\n",resp);
AlexFerrara 0:d904fc771672 123 #endif
AlexFerrara 0:d904fc771672 124
AlexFerrara 0:d904fc771672 125 return resp;
AlexFerrara 0:d904fc771672 126 }
AlexFerrara 0:d904fc771672 127
AlexFerrara 0:d904fc771672 128 //**************************************************************************
AlexFerrara 0:d904fc771672 129 void uLCD_4DGL :: reset() // Reset Screen
AlexFerrara 0:d904fc771672 130 {
AlexFerrara 0:d904fc771672 131 wait_ms(5);
AlexFerrara 0:d904fc771672 132 _rst = 0; // put RESET pin to low
AlexFerrara 0:d904fc771672 133 wait_ms(5); // wait a few milliseconds for command reception
AlexFerrara 0:d904fc771672 134 _rst = 1; // put RESET back to high
AlexFerrara 0:d904fc771672 135 wait(3); // wait 3s for screen to restart
AlexFerrara 0:d904fc771672 136
AlexFerrara 0:d904fc771672 137 freeBUFFER(); // clean buffer from possible garbage
AlexFerrara 0:d904fc771672 138 }
AlexFerrara 0:d904fc771672 139 //******************************************************************************************************
AlexFerrara 0:d904fc771672 140 int uLCD_4DGL :: writeCOMMANDnull(char *command, int number) // send several BYTES making a command and return an answer
AlexFerrara 0:d904fc771672 141 {
AlexFerrara 0:d904fc771672 142
AlexFerrara 0:d904fc771672 143 #if DEBUGMODE
AlexFerrara 0:d904fc771672 144 pc.printf("\n");
AlexFerrara 0:d904fc771672 145 pc.printf("New COMMAND : 0x%02X\n", command[0]);
AlexFerrara 0:d904fc771672 146 #endif
AlexFerrara 0:d904fc771672 147 int i, resp = 0;
AlexFerrara 0:d904fc771672 148 freeBUFFER();
AlexFerrara 0:d904fc771672 149 writeBYTE(0x00); //command has a null prefix byte
AlexFerrara 0:d904fc771672 150 for (i = 0; i < number; i++) {
AlexFerrara 0:d904fc771672 151 if (i<16) //don't overflow LCD UART buffer
AlexFerrara 0:d904fc771672 152 writeBYTEfast(command[i]); // send command to serial port
AlexFerrara 0:d904fc771672 153 else
AlexFerrara 0:d904fc771672 154 writeBYTE(command[i]); // send command to serial port with delay
AlexFerrara 0:d904fc771672 155 }
AlexFerrara 0:d904fc771672 156 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer
AlexFerrara 0:d904fc771672 157 if (_cmd.readable()) resp = _cmd.getc(); // read response if any
AlexFerrara 0:d904fc771672 158 switch (resp) {
AlexFerrara 0:d904fc771672 159 case ACK : // if OK return 1
AlexFerrara 0:d904fc771672 160 resp = 1;
AlexFerrara 0:d904fc771672 161 break;
AlexFerrara 0:d904fc771672 162 case NAK : // if NOK return -1
AlexFerrara 0:d904fc771672 163 resp = -1;
AlexFerrara 0:d904fc771672 164 break;
AlexFerrara 0:d904fc771672 165 default :
AlexFerrara 0:d904fc771672 166 resp = 0; // else return 0
AlexFerrara 0:d904fc771672 167 break;
AlexFerrara 0:d904fc771672 168 }
AlexFerrara 0:d904fc771672 169 #if DEBUGMODE
AlexFerrara 0:d904fc771672 170 pc.printf(" Answer received : %d\n",resp);
AlexFerrara 0:d904fc771672 171 #endif
AlexFerrara 0:d904fc771672 172
AlexFerrara 0:d904fc771672 173 return resp;
AlexFerrara 0:d904fc771672 174 }
AlexFerrara 0:d904fc771672 175
AlexFerrara 0:d904fc771672 176 //**************************************************************************
AlexFerrara 0:d904fc771672 177 void uLCD_4DGL :: cls() // clear screen
AlexFerrara 0:d904fc771672 178 {
AlexFerrara 0:d904fc771672 179 char command[1] = "";
AlexFerrara 0:d904fc771672 180
AlexFerrara 0:d904fc771672 181 command[0] = CLS;
AlexFerrara 0:d904fc771672 182 writeCOMMAND(command, 1);
AlexFerrara 0:d904fc771672 183 current_row=0;
AlexFerrara 0:d904fc771672 184 current_col=0;
AlexFerrara 0:d904fc771672 185 current_hf = 1;
AlexFerrara 0:d904fc771672 186 current_wf = 1;
AlexFerrara 0:d904fc771672 187 set_font(FONT_7X8); // initial font
AlexFerrara 0:d904fc771672 188 }
AlexFerrara 0:d904fc771672 189
AlexFerrara 0:d904fc771672 190 //**************************************************************************
AlexFerrara 0:d904fc771672 191 int uLCD_4DGL :: version() // get API version
AlexFerrara 0:d904fc771672 192 {
AlexFerrara 0:d904fc771672 193
AlexFerrara 0:d904fc771672 194 char command[2] = "";
AlexFerrara 0:d904fc771672 195 command[0] = '\x00';
AlexFerrara 0:d904fc771672 196 command[1] = VERSION;
AlexFerrara 0:d904fc771672 197 return readVERSION(command, 2);
AlexFerrara 0:d904fc771672 198 }
AlexFerrara 0:d904fc771672 199
AlexFerrara 0:d904fc771672 200 //**************************************************************************
AlexFerrara 0:d904fc771672 201 void uLCD_4DGL :: baudrate(int speed) // set screen baud rate
AlexFerrara 0:d904fc771672 202 {
AlexFerrara 0:d904fc771672 203 char command[3]= "";
AlexFerrara 0:d904fc771672 204 writeBYTE(0x00);
AlexFerrara 0:d904fc771672 205 command[0] = BAUDRATE;
AlexFerrara 0:d904fc771672 206 command[1] = 0;
AlexFerrara 0:d904fc771672 207 int newbaud = BAUD_9600;
AlexFerrara 0:d904fc771672 208 switch (speed) {
AlexFerrara 0:d904fc771672 209 case 110 :
AlexFerrara 0:d904fc771672 210 newbaud = BAUD_110;
AlexFerrara 0:d904fc771672 211 break;
AlexFerrara 0:d904fc771672 212 case 300 :
AlexFerrara 0:d904fc771672 213 newbaud = BAUD_300;
AlexFerrara 0:d904fc771672 214 break;
AlexFerrara 0:d904fc771672 215 case 600 :
AlexFerrara 0:d904fc771672 216 newbaud = BAUD_600;
AlexFerrara 0:d904fc771672 217 break;
AlexFerrara 0:d904fc771672 218 case 1200 :
AlexFerrara 0:d904fc771672 219 newbaud = BAUD_1200;
AlexFerrara 0:d904fc771672 220 break;
AlexFerrara 0:d904fc771672 221 case 2400 :
AlexFerrara 0:d904fc771672 222 newbaud = BAUD_2400;
AlexFerrara 0:d904fc771672 223 break;
AlexFerrara 0:d904fc771672 224 case 4800 :
AlexFerrara 0:d904fc771672 225 newbaud = BAUD_4800;
AlexFerrara 0:d904fc771672 226 break;
AlexFerrara 0:d904fc771672 227 case 9600 :
AlexFerrara 0:d904fc771672 228 newbaud = BAUD_9600;
AlexFerrara 0:d904fc771672 229 break;
AlexFerrara 0:d904fc771672 230 case 14400 :
AlexFerrara 0:d904fc771672 231 newbaud = BAUD_14400;
AlexFerrara 0:d904fc771672 232 break;
AlexFerrara 0:d904fc771672 233 case 19200 :
AlexFerrara 0:d904fc771672 234 newbaud = BAUD_19200;
AlexFerrara 0:d904fc771672 235 break;
AlexFerrara 0:d904fc771672 236 case 31250 :
AlexFerrara 0:d904fc771672 237 newbaud = BAUD_31250;
AlexFerrara 0:d904fc771672 238 break;
AlexFerrara 0:d904fc771672 239 case 38400 :
AlexFerrara 0:d904fc771672 240 newbaud = BAUD_38400;
AlexFerrara 0:d904fc771672 241 break;
AlexFerrara 0:d904fc771672 242 case 56000 :
AlexFerrara 0:d904fc771672 243 newbaud = BAUD_56000;
AlexFerrara 0:d904fc771672 244 break;
AlexFerrara 0:d904fc771672 245 case 57600 :
AlexFerrara 0:d904fc771672 246 newbaud = BAUD_57600;
AlexFerrara 0:d904fc771672 247 break;
AlexFerrara 0:d904fc771672 248 case 115200 :
AlexFerrara 0:d904fc771672 249 newbaud = BAUD_115200;
AlexFerrara 0:d904fc771672 250 break;
AlexFerrara 0:d904fc771672 251 case 128000 :
AlexFerrara 0:d904fc771672 252 newbaud = BAUD_128000;
AlexFerrara 0:d904fc771672 253 break;
AlexFerrara 0:d904fc771672 254 case 256000 :
AlexFerrara 0:d904fc771672 255 newbaud = BAUD_256000;
AlexFerrara 0:d904fc771672 256 break;
AlexFerrara 0:d904fc771672 257 case 300000 :
AlexFerrara 0:d904fc771672 258 newbaud = BAUD_300000;
AlexFerrara 0:d904fc771672 259 speed = 272727;
AlexFerrara 0:d904fc771672 260 break;
AlexFerrara 0:d904fc771672 261 case 375000 :
AlexFerrara 0:d904fc771672 262 newbaud = BAUD_375000;
AlexFerrara 0:d904fc771672 263 speed = 333333;
AlexFerrara 0:d904fc771672 264 break;
AlexFerrara 0:d904fc771672 265 case 500000 :
AlexFerrara 0:d904fc771672 266 newbaud = BAUD_500000;
AlexFerrara 0:d904fc771672 267 speed = 428571;
AlexFerrara 0:d904fc771672 268 break;
AlexFerrara 0:d904fc771672 269 case 600000 :
AlexFerrara 0:d904fc771672 270 newbaud = BAUD_600000;
AlexFerrara 0:d904fc771672 271 break;
AlexFerrara 0:d904fc771672 272 case 750000 : //rates over 600000 are not documented, but seem to work
AlexFerrara 0:d904fc771672 273 newbaud = BAUD_750000;
AlexFerrara 0:d904fc771672 274 break;
AlexFerrara 0:d904fc771672 275 case 1000000 :
AlexFerrara 0:d904fc771672 276 newbaud = BAUD_1000000;
AlexFerrara 0:d904fc771672 277 break;
AlexFerrara 0:d904fc771672 278 case 1500000 :
AlexFerrara 0:d904fc771672 279 newbaud = BAUD_1500000;
AlexFerrara 0:d904fc771672 280 break;
AlexFerrara 0:d904fc771672 281 case 3000000 :
AlexFerrara 0:d904fc771672 282 newbaud = BAUD_3000000;
AlexFerrara 0:d904fc771672 283 break;
AlexFerrara 0:d904fc771672 284 default :
AlexFerrara 0:d904fc771672 285 newbaud = BAUD_9600;
AlexFerrara 0:d904fc771672 286 speed = 9600;
AlexFerrara 0:d904fc771672 287 break;
AlexFerrara 0:d904fc771672 288 }
AlexFerrara 0:d904fc771672 289
AlexFerrara 0:d904fc771672 290 int i, resp = 0;
AlexFerrara 0:d904fc771672 291
AlexFerrara 0:d904fc771672 292 freeBUFFER();
AlexFerrara 0:d904fc771672 293 command[1] = char(newbaud >>8);
AlexFerrara 0:d904fc771672 294 command[2] = char(newbaud % 256);
AlexFerrara 0:d904fc771672 295 wait_ms(1);
AlexFerrara 0:d904fc771672 296 for (i = 0; i <3; i++) writeBYTEfast(command[i]); // send command to serial port
AlexFerrara 0:d904fc771672 297 for (i = 0; i<10; i++) wait_ms(1);
AlexFerrara 0:d904fc771672 298 //dont change baud until all characters get sent out
AlexFerrara 0:d904fc771672 299 _cmd.baud(speed); // set mbed to same speed
AlexFerrara 0:d904fc771672 300 i=0;
AlexFerrara 0:d904fc771672 301 while ((!_cmd.readable()) && (i<25000)) {
AlexFerrara 0:d904fc771672 302 wait_ms(TEMPO); // wait for screen answer - comes 100ms after change
AlexFerrara 0:d904fc771672 303 i++; //timeout if ack character missed by baud change
AlexFerrara 0:d904fc771672 304 }
AlexFerrara 0:d904fc771672 305 if (_cmd.readable()) resp = _cmd.getc(); // read response if any
AlexFerrara 0:d904fc771672 306 switch (resp) {
AlexFerrara 0:d904fc771672 307 case ACK : // if OK return 1
AlexFerrara 0:d904fc771672 308 resp = 1;
AlexFerrara 0:d904fc771672 309 break;
AlexFerrara 0:d904fc771672 310 case NAK : // if NOK return -1
AlexFerrara 0:d904fc771672 311 resp = -1;
AlexFerrara 0:d904fc771672 312 break;
AlexFerrara 0:d904fc771672 313 default :
AlexFerrara 0:d904fc771672 314 resp = 0; // else return 0
AlexFerrara 0:d904fc771672 315 break;
AlexFerrara 0:d904fc771672 316 }
AlexFerrara 0:d904fc771672 317 }
AlexFerrara 0:d904fc771672 318
AlexFerrara 0:d904fc771672 319 //******************************************************************************************************
AlexFerrara 0:d904fc771672 320 int uLCD_4DGL :: readVERSION(char *command, int number) // read screen info and populate data
AlexFerrara 0:d904fc771672 321 {
AlexFerrara 0:d904fc771672 322
AlexFerrara 0:d904fc771672 323 int i, temp = 0, resp = 0;
AlexFerrara 0:d904fc771672 324 char response[5] = "";
AlexFerrara 0:d904fc771672 325
AlexFerrara 0:d904fc771672 326 freeBUFFER();
AlexFerrara 0:d904fc771672 327
AlexFerrara 0:d904fc771672 328 for (i = 0; i < number; i++) writeBYTE(command[i]); // send all chars to serial port
AlexFerrara 0:d904fc771672 329
AlexFerrara 0:d904fc771672 330 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer
AlexFerrara 0:d904fc771672 331
AlexFerrara 0:d904fc771672 332 while (_cmd.readable() && resp < ARRAY_SIZE(response)) {
AlexFerrara 0:d904fc771672 333 temp = _cmd.getc();
AlexFerrara 0:d904fc771672 334 response[resp++] = (char)temp;
AlexFerrara 0:d904fc771672 335 }
AlexFerrara 0:d904fc771672 336 switch (resp) {
AlexFerrara 0:d904fc771672 337 case 2 : // if OK populate data and return 1
AlexFerrara 0:d904fc771672 338 revision = response[0]<<8 + response[1];
AlexFerrara 0:d904fc771672 339 resp = 1;
AlexFerrara 0:d904fc771672 340 break;
AlexFerrara 0:d904fc771672 341 default :
AlexFerrara 0:d904fc771672 342 resp = 0; // else return 0
AlexFerrara 0:d904fc771672 343 break;
AlexFerrara 0:d904fc771672 344 }
AlexFerrara 0:d904fc771672 345 return resp;
AlexFerrara 0:d904fc771672 346 }
AlexFerrara 0:d904fc771672 347
AlexFerrara 0:d904fc771672 348 //****************************************************************************************************
AlexFerrara 0:d904fc771672 349 void uLCD_4DGL :: background_color(int color) // set screen background color
AlexFerrara 0:d904fc771672 350 {
AlexFerrara 0:d904fc771672 351 char command[3]= ""; // input color is in 24bits like 0xRRGGBB
AlexFerrara 0:d904fc771672 352
AlexFerrara 0:d904fc771672 353 command[0] = BCKGDCOLOR;
AlexFerrara 0:d904fc771672 354
AlexFerrara 0:d904fc771672 355 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
AlexFerrara 0:d904fc771672 356 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
AlexFerrara 0:d904fc771672 357 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
AlexFerrara 0:d904fc771672 358
AlexFerrara 0:d904fc771672 359 command[1] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
AlexFerrara 0:d904fc771672 360 command[2] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
AlexFerrara 0:d904fc771672 361
AlexFerrara 0:d904fc771672 362 writeCOMMAND(command, 3);
AlexFerrara 0:d904fc771672 363 }
AlexFerrara 0:d904fc771672 364
AlexFerrara 0:d904fc771672 365 //****************************************************************************************************
AlexFerrara 0:d904fc771672 366 void uLCD_4DGL :: textbackground_color(int color) // set screen background color
AlexFerrara 0:d904fc771672 367 {
AlexFerrara 0:d904fc771672 368 char command[3]= ""; // input color is in 24bits like 0xRRGGBB
AlexFerrara 0:d904fc771672 369
AlexFerrara 0:d904fc771672 370 command[0] = TXTBCKGDCOLOR;
AlexFerrara 0:d904fc771672 371
AlexFerrara 0:d904fc771672 372 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
AlexFerrara 0:d904fc771672 373 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
AlexFerrara 0:d904fc771672 374 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
AlexFerrara 0:d904fc771672 375
AlexFerrara 0:d904fc771672 376 command[1] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
AlexFerrara 0:d904fc771672 377 command[2] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
AlexFerrara 0:d904fc771672 378
AlexFerrara 0:d904fc771672 379 writeCOMMAND(command, 3);
AlexFerrara 0:d904fc771672 380 }
AlexFerrara 0:d904fc771672 381
AlexFerrara 0:d904fc771672 382 //****************************************************************************************************
AlexFerrara 0:d904fc771672 383 void uLCD_4DGL :: display_control(char mode) // set screen mode to value
AlexFerrara 0:d904fc771672 384 {
AlexFerrara 0:d904fc771672 385 char command[3]= "";
AlexFerrara 0:d904fc771672 386
AlexFerrara 0:d904fc771672 387 command[0] = DISPCONTROL;
AlexFerrara 0:d904fc771672 388 command[1] = 0;
AlexFerrara 0:d904fc771672 389 command[2] = mode;
AlexFerrara 0:d904fc771672 390
AlexFerrara 0:d904fc771672 391 if (mode == ORIENTATION) {
AlexFerrara 0:d904fc771672 392 switch (mode) {
AlexFerrara 0:d904fc771672 393 case LANDSCAPE :
AlexFerrara 0:d904fc771672 394 current_orientation = IS_LANDSCAPE;
AlexFerrara 0:d904fc771672 395 break;
AlexFerrara 0:d904fc771672 396 case LANDSCAPE_R :
AlexFerrara 0:d904fc771672 397 current_orientation = IS_LANDSCAPE;
AlexFerrara 0:d904fc771672 398 break;
AlexFerrara 0:d904fc771672 399 case PORTRAIT :
AlexFerrara 0:d904fc771672 400 current_orientation = IS_PORTRAIT;
AlexFerrara 0:d904fc771672 401 break;
AlexFerrara 0:d904fc771672 402 case PORTRAIT_R :
AlexFerrara 0:d904fc771672 403 current_orientation = IS_PORTRAIT;
AlexFerrara 0:d904fc771672 404 break;
AlexFerrara 0:d904fc771672 405 }
AlexFerrara 0:d904fc771672 406 }
AlexFerrara 0:d904fc771672 407 writeCOMMAND(command, 3);
AlexFerrara 0:d904fc771672 408 set_font(current_font);
AlexFerrara 0:d904fc771672 409 }
AlexFerrara 0:d904fc771672 410 //****************************************************************************************************
AlexFerrara 0:d904fc771672 411 void uLCD_4DGL :: display_power(char mode) // set screen mode to value
AlexFerrara 0:d904fc771672 412 {
AlexFerrara 0:d904fc771672 413 char command[3]= "";
AlexFerrara 0:d904fc771672 414
AlexFerrara 0:d904fc771672 415 command[0] = DISPPOWER;
AlexFerrara 0:d904fc771672 416 command[1] = 0;
AlexFerrara 0:d904fc771672 417 command[2] = mode;
AlexFerrara 0:d904fc771672 418 writeCOMMAND(command, 3);
AlexFerrara 0:d904fc771672 419 }
AlexFerrara 0:d904fc771672 420 //****************************************************************************************************
AlexFerrara 0:d904fc771672 421 void uLCD_4DGL :: set_volume(char value) // set sound volume to value
AlexFerrara 0:d904fc771672 422 {
AlexFerrara 0:d904fc771672 423 char command[2]= "";
AlexFerrara 0:d904fc771672 424
AlexFerrara 0:d904fc771672 425 command[0] = SETVOLUME;
AlexFerrara 0:d904fc771672 426 command[1] = value;
AlexFerrara 0:d904fc771672 427
AlexFerrara 0:d904fc771672 428 writeCOMMAND(command, 2);
AlexFerrara 0:d904fc771672 429 }
AlexFerrara 0:d904fc771672 430
AlexFerrara 0:d904fc771672 431
AlexFerrara 0:d904fc771672 432 //******************************************************************************************************
AlexFerrara 0:d904fc771672 433 int uLCD_4DGL :: getSTATUS(char *command, int number) // read screen info and populate data
AlexFerrara 0:d904fc771672 434 {
AlexFerrara 0:d904fc771672 435
AlexFerrara 0:d904fc771672 436 #if DEBUGMODE
AlexFerrara 0:d904fc771672 437 pc.printf("\n");
AlexFerrara 0:d904fc771672 438 pc.printf("New COMMAND : 0x%02X\n", command[0]);
AlexFerrara 0:d904fc771672 439 #endif
AlexFerrara 0:d904fc771672 440
AlexFerrara 0:d904fc771672 441 int i, temp = 0, resp = 0;
AlexFerrara 0:d904fc771672 442 char response[5] = "";
AlexFerrara 0:d904fc771672 443
AlexFerrara 0:d904fc771672 444 freeBUFFER();
AlexFerrara 0:d904fc771672 445
AlexFerrara 0:d904fc771672 446 for (i = 0; i < number; i++) writeBYTE(command[i]); // send all chars to serial port
AlexFerrara 0:d904fc771672 447
AlexFerrara 0:d904fc771672 448 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer
AlexFerrara 0:d904fc771672 449
AlexFerrara 0:d904fc771672 450 while (_cmd.readable() && resp < ARRAY_SIZE(response)) {
AlexFerrara 0:d904fc771672 451 temp = _cmd.getc();
AlexFerrara 0:d904fc771672 452 response[resp++] = (char)temp;
AlexFerrara 0:d904fc771672 453 }
AlexFerrara 0:d904fc771672 454 switch (resp) {
AlexFerrara 0:d904fc771672 455 case 4 :
AlexFerrara 0:d904fc771672 456 resp = (int)response[1]; // if OK populate data
AlexFerrara 0:d904fc771672 457 break;
AlexFerrara 0:d904fc771672 458 default :
AlexFerrara 0:d904fc771672 459 resp = -1; // else return 0
AlexFerrara 0:d904fc771672 460 break;
AlexFerrara 0:d904fc771672 461 }
AlexFerrara 0:d904fc771672 462
AlexFerrara 0:d904fc771672 463 #if DEBUGMODE
AlexFerrara 0:d904fc771672 464 pc.printf(" Answer received : %d\n", resp);
AlexFerrara 0:d904fc771672 465 #endif
AlexFerrara 0:d904fc771672 466
AlexFerrara 0:d904fc771672 467 return resp;
AlexFerrara 0:d904fc771672 468 }
AlexFerrara 0:d904fc771672 469