Simple starter skeleton for asteroids video game.

Dependencies:   PinDetect

Committer:
jhurley31
Date:
Thu Apr 01 20:09:47 2021 +0000
Revision:
5:454ff3197a74
Parent:
1:a6872783beca
Updating OS

Who changed what in which revision?

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