Ruth Pavoor / Mbed 2 deprecated project1

Dependencies:   mbed mbed-rtos PinDetect

Committer:
rpavoor3
Date:
Mon Apr 27 23:18:38 2020 +0000
Revision:
0:0ca943ce4014
4180 Your Fitness Buddy

Who changed what in which revision?

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