an mbed tile music game using a capacitive touchpad and uLCD

Dependencies:   SDFileSystem mbed wave_player

Committer:
clu67
Date:
Mon Mar 14 00:26:24 2016 +0000
Revision:
0:a1c374b9a4fe
Initial Release

Who changed what in which revision?

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