Fixed a few minor issues in 4DGL library Moved pc serial port object used for debug output into 4DGL object itself. Previously it was a global object but its constructor wasn't getting run before the global constructor for the 4DGL object itself which led to an assert in the serial code. I also fixed a few potential buffer overruns that I saw in the code as well.

Committer:
AdamGreen
Date:
Tue Jul 05 11:45:02 2011 +0000
Revision:
0:d6e186427f3e
Fixed a few minor issues in 4DGL library

Moved pc serial port object used for debug output into 4DGL object itself. Previously it was a global object but its constructor wasnt getting run before the global constructor for the 4DGL object itself which led to an assert in the serial code.

I also fixed a few potential buffer overruns that I saw in the code as well.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AdamGreen 0:d6e186427f3e 1 //
AdamGreen 0:d6e186427f3e 2 // TFT_4DGL is a class to drive 4D Systems TFT touch screens
AdamGreen 0:d6e186427f3e 3 //
AdamGreen 0:d6e186427f3e 4 // Copyright (C) <2010> Stephane ROCHON <stephane.rochon at free.fr>
AdamGreen 0:d6e186427f3e 5 //
AdamGreen 0:d6e186427f3e 6 // TFT_4DGL is free software: you can redistribute it and/or modify
AdamGreen 0:d6e186427f3e 7 // it under the terms of the GNU General Public License as published by
AdamGreen 0:d6e186427f3e 8 // the Free Software Foundation, either version 3 of the License, or
AdamGreen 0:d6e186427f3e 9 // (at your option) any later version.
AdamGreen 0:d6e186427f3e 10 //
AdamGreen 0:d6e186427f3e 11 // TFT_4DGL is distributed in the hope that it will be useful,
AdamGreen 0:d6e186427f3e 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
AdamGreen 0:d6e186427f3e 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
AdamGreen 0:d6e186427f3e 14 // GNU General Public License for more details.
AdamGreen 0:d6e186427f3e 15 //
AdamGreen 0:d6e186427f3e 16 // You should have received a copy of the GNU General Public License
AdamGreen 0:d6e186427f3e 17 // along with TFT_4DGL. If not, see <http://www.gnu.org/licenses/>.
AdamGreen 0:d6e186427f3e 18
AdamGreen 0:d6e186427f3e 19 #include "mbed.h"
AdamGreen 0:d6e186427f3e 20 #include "TFT_4DGL.h"
AdamGreen 0:d6e186427f3e 21
AdamGreen 0:d6e186427f3e 22 #define ARRAY_SIZE(X) sizeof(X)/sizeof(X[0])
AdamGreen 0:d6e186427f3e 23
AdamGreen 0:d6e186427f3e 24 //Serial pc(USBTX,USBRX);
AdamGreen 0:d6e186427f3e 25
AdamGreen 0:d6e186427f3e 26 //******************************************************************************************************
AdamGreen 0:d6e186427f3e 27 TFT_4DGL :: TFT_4DGL(PinName tx, PinName rx, PinName rst) : _cmd(tx, rx),
AdamGreen 0:d6e186427f3e 28 _rst(rst)
AdamGreen 0:d6e186427f3e 29 #if DEBUGMODE
AdamGreen 0:d6e186427f3e 30 ,pc(USBTX, USBRX)
AdamGreen 0:d6e186427f3e 31 #endif // DEBUGMODE
AdamGreen 0:d6e186427f3e 32 { // Constructor
AdamGreen 0:d6e186427f3e 33
AdamGreen 0:d6e186427f3e 34 #if DEBUGMODE
AdamGreen 0:d6e186427f3e 35 pc.baud(115200);
AdamGreen 0:d6e186427f3e 36
AdamGreen 0:d6e186427f3e 37 pc.printf("\n\n\n");
AdamGreen 0:d6e186427f3e 38 pc.printf("********************\n");
AdamGreen 0:d6e186427f3e 39 pc.printf("TFT_4DGL CONSTRUCTOR\n");
AdamGreen 0:d6e186427f3e 40 pc.printf("********************\n");
AdamGreen 0:d6e186427f3e 41 #endif
AdamGreen 0:d6e186427f3e 42
AdamGreen 0:d6e186427f3e 43 _rst = 1; // put RESET pin to high to start TFT screen
AdamGreen 0:d6e186427f3e 44
AdamGreen 0:d6e186427f3e 45 reset();
AdamGreen 0:d6e186427f3e 46 autobaud(); // send autobaud command
AdamGreen 0:d6e186427f3e 47 version(); // get version information
AdamGreen 0:d6e186427f3e 48 cls(); // clear screen
AdamGreen 0:d6e186427f3e 49
AdamGreen 0:d6e186427f3e 50 current_col = 0; // initial cursor col
AdamGreen 0:d6e186427f3e 51 current_row = 0; // initial cursor row
AdamGreen 0:d6e186427f3e 52 current_color = WHITE; // initial text color
AdamGreen 0:d6e186427f3e 53 current_orientation = IS_PORTRAIT; // initial screen orientation
AdamGreen 0:d6e186427f3e 54
AdamGreen 0:d6e186427f3e 55 set_font(FONT_5X7); // initial font
AdamGreen 0:d6e186427f3e 56 text_mode(OPAQUE); // initial texr mode
AdamGreen 0:d6e186427f3e 57 }
AdamGreen 0:d6e186427f3e 58
AdamGreen 0:d6e186427f3e 59 //******************************************************************************************************
AdamGreen 0:d6e186427f3e 60 void TFT_4DGL :: writeBYTE(char c) { // send a BYTE command to screen
AdamGreen 0:d6e186427f3e 61
AdamGreen 0:d6e186427f3e 62 _cmd.putc(c);
AdamGreen 0:d6e186427f3e 63 wait_ms(1);
AdamGreen 0:d6e186427f3e 64
AdamGreen 0:d6e186427f3e 65 #if DEBUGMODE
AdamGreen 0:d6e186427f3e 66 pc.printf(" Char sent : 0x%02X\n",c);
AdamGreen 0:d6e186427f3e 67 #endif
AdamGreen 0:d6e186427f3e 68
AdamGreen 0:d6e186427f3e 69 }
AdamGreen 0:d6e186427f3e 70
AdamGreen 0:d6e186427f3e 71 //******************************************************************************************************
AdamGreen 0:d6e186427f3e 72 void TFT_4DGL :: freeBUFFER(void) { // Clear serial buffer before writing command
AdamGreen 0:d6e186427f3e 73
AdamGreen 0:d6e186427f3e 74 while (_cmd.readable()) _cmd.getc(); // clear buffer garbage
AdamGreen 0:d6e186427f3e 75 }
AdamGreen 0:d6e186427f3e 76
AdamGreen 0:d6e186427f3e 77 //******************************************************************************************************
AdamGreen 0:d6e186427f3e 78 int TFT_4DGL :: writeCOMMAND(char *command, int number) { // send several BYTES making a command and return an answer
AdamGreen 0:d6e186427f3e 79
AdamGreen 0:d6e186427f3e 80 #if DEBUGMODE
AdamGreen 0:d6e186427f3e 81 pc.printf("\n");
AdamGreen 0:d6e186427f3e 82 pc.printf("New COMMAND : 0x%02X\n", command[0]);
AdamGreen 0:d6e186427f3e 83 #endif
AdamGreen 0:d6e186427f3e 84 int i, resp = 0;
AdamGreen 0:d6e186427f3e 85 freeBUFFER();
AdamGreen 0:d6e186427f3e 86
AdamGreen 0:d6e186427f3e 87 for (i = 0; i < number; i++) writeBYTE(command[i]); // send command to serial port
AdamGreen 0:d6e186427f3e 88
AdamGreen 0:d6e186427f3e 89 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer
AdamGreen 0:d6e186427f3e 90 if (_cmd.readable()) resp = _cmd.getc(); // read response if any
AdamGreen 0:d6e186427f3e 91 switch (resp) {
AdamGreen 0:d6e186427f3e 92 case ACK : // if OK return 1
AdamGreen 0:d6e186427f3e 93 resp = 1;
AdamGreen 0:d6e186427f3e 94 break;
AdamGreen 0:d6e186427f3e 95 case NAK : // if NOK return -1
AdamGreen 0:d6e186427f3e 96 resp = -1;
AdamGreen 0:d6e186427f3e 97 break;
AdamGreen 0:d6e186427f3e 98 default :
AdamGreen 0:d6e186427f3e 99 resp = 0; // else return 0
AdamGreen 0:d6e186427f3e 100 break;
AdamGreen 0:d6e186427f3e 101 }
AdamGreen 0:d6e186427f3e 102 #if DEBUGMODE
AdamGreen 0:d6e186427f3e 103 pc.printf(" Answer received : %d\n",resp);
AdamGreen 0:d6e186427f3e 104 #endif
AdamGreen 0:d6e186427f3e 105
AdamGreen 0:d6e186427f3e 106 return resp;
AdamGreen 0:d6e186427f3e 107 }
AdamGreen 0:d6e186427f3e 108
AdamGreen 0:d6e186427f3e 109 //**************************************************************************
AdamGreen 0:d6e186427f3e 110 void TFT_4DGL :: reset() { // Reset Screen
AdamGreen 0:d6e186427f3e 111
AdamGreen 0:d6e186427f3e 112 _rst = 0; // put RESET pin to low
AdamGreen 0:d6e186427f3e 113 wait_ms(TEMPO); // wait a few milliseconds for command reception
AdamGreen 0:d6e186427f3e 114 _rst = 1; // put RESET back to high
AdamGreen 0:d6e186427f3e 115 wait(3); // wait 3s for screen to restart
AdamGreen 0:d6e186427f3e 116
AdamGreen 0:d6e186427f3e 117 freeBUFFER(); // clean buffer from possible garbage
AdamGreen 0:d6e186427f3e 118 }
AdamGreen 0:d6e186427f3e 119
AdamGreen 0:d6e186427f3e 120 //**************************************************************************
AdamGreen 0:d6e186427f3e 121 void TFT_4DGL :: autobaud() { // send AutoBaud command (9600)
AdamGreen 0:d6e186427f3e 122 char command[1] = "";
AdamGreen 0:d6e186427f3e 123 command[0] = AUTOBAUD;
AdamGreen 0:d6e186427f3e 124 writeCOMMAND(command, 1);
AdamGreen 0:d6e186427f3e 125 }
AdamGreen 0:d6e186427f3e 126
AdamGreen 0:d6e186427f3e 127 //**************************************************************************
AdamGreen 0:d6e186427f3e 128 void TFT_4DGL :: cls() { // clear screen
AdamGreen 0:d6e186427f3e 129 char command[1] = "";
AdamGreen 0:d6e186427f3e 130 command[0] = CLS;
AdamGreen 0:d6e186427f3e 131 writeCOMMAND(command, 1);
AdamGreen 0:d6e186427f3e 132 }
AdamGreen 0:d6e186427f3e 133
AdamGreen 0:d6e186427f3e 134 //**************************************************************************
AdamGreen 0:d6e186427f3e 135 void TFT_4DGL :: version() { // get API version
AdamGreen 0:d6e186427f3e 136 char command[2] = "";
AdamGreen 0:d6e186427f3e 137 command[0] = VERSION;
AdamGreen 0:d6e186427f3e 138 command[1] = OFF;
AdamGreen 0:d6e186427f3e 139 readVERSION(command, 2);
AdamGreen 0:d6e186427f3e 140 }
AdamGreen 0:d6e186427f3e 141
AdamGreen 0:d6e186427f3e 142 //**************************************************************************
AdamGreen 0:d6e186427f3e 143 void TFT_4DGL :: baudrate(int speed) { // set screen baud rate
AdamGreen 0:d6e186427f3e 144 char command[2]= "";
AdamGreen 0:d6e186427f3e 145 command[0] = BAUDRATE;
AdamGreen 0:d6e186427f3e 146 switch (speed) {
AdamGreen 0:d6e186427f3e 147 case 110 :
AdamGreen 0:d6e186427f3e 148 command[1] = BAUD_110;
AdamGreen 0:d6e186427f3e 149 break;
AdamGreen 0:d6e186427f3e 150 case 300 :
AdamGreen 0:d6e186427f3e 151 command[1] = BAUD_300;
AdamGreen 0:d6e186427f3e 152 break;
AdamGreen 0:d6e186427f3e 153 case 600 :
AdamGreen 0:d6e186427f3e 154 command[1] = BAUD_600;
AdamGreen 0:d6e186427f3e 155 break;
AdamGreen 0:d6e186427f3e 156 case 1200 :
AdamGreen 0:d6e186427f3e 157 command[1] = BAUD_1200;
AdamGreen 0:d6e186427f3e 158 break;
AdamGreen 0:d6e186427f3e 159 case 2400 :
AdamGreen 0:d6e186427f3e 160 command[1] = BAUD_2400;
AdamGreen 0:d6e186427f3e 161 break;
AdamGreen 0:d6e186427f3e 162 case 4800 :
AdamGreen 0:d6e186427f3e 163 command[1] = BAUD_4800;
AdamGreen 0:d6e186427f3e 164 break;
AdamGreen 0:d6e186427f3e 165 case 9600 :
AdamGreen 0:d6e186427f3e 166 command[1] = BAUD_9600;
AdamGreen 0:d6e186427f3e 167 break;
AdamGreen 0:d6e186427f3e 168 case 14400 :
AdamGreen 0:d6e186427f3e 169 command[1] = BAUD_14400;
AdamGreen 0:d6e186427f3e 170 break;
AdamGreen 0:d6e186427f3e 171 case 19200 :
AdamGreen 0:d6e186427f3e 172 command[1] = BAUD_19200;
AdamGreen 0:d6e186427f3e 173 break;
AdamGreen 0:d6e186427f3e 174 case 31250 :
AdamGreen 0:d6e186427f3e 175 command[1] = BAUD_31250;
AdamGreen 0:d6e186427f3e 176 break;
AdamGreen 0:d6e186427f3e 177 case 38400 :
AdamGreen 0:d6e186427f3e 178 command[1] = BAUD_38400;
AdamGreen 0:d6e186427f3e 179 break;
AdamGreen 0:d6e186427f3e 180 case 56000 :
AdamGreen 0:d6e186427f3e 181 command[1] = BAUD_56000;
AdamGreen 0:d6e186427f3e 182 break;
AdamGreen 0:d6e186427f3e 183 case 57600 :
AdamGreen 0:d6e186427f3e 184 command[1] = BAUD_57600;
AdamGreen 0:d6e186427f3e 185 break;
AdamGreen 0:d6e186427f3e 186 case 115200 :
AdamGreen 0:d6e186427f3e 187 command[1] = BAUD_115200;
AdamGreen 0:d6e186427f3e 188 break;
AdamGreen 0:d6e186427f3e 189 case 128000 :
AdamGreen 0:d6e186427f3e 190 command[1] = BAUD_128000;
AdamGreen 0:d6e186427f3e 191 break;
AdamGreen 0:d6e186427f3e 192 case 256000 :
AdamGreen 0:d6e186427f3e 193 command[1] = BAUD_256000;
AdamGreen 0:d6e186427f3e 194 break;
AdamGreen 0:d6e186427f3e 195 default :
AdamGreen 0:d6e186427f3e 196 command[1] = BAUD_9600;
AdamGreen 0:d6e186427f3e 197 speed = 9600;
AdamGreen 0:d6e186427f3e 198 break;
AdamGreen 0:d6e186427f3e 199 }
AdamGreen 0:d6e186427f3e 200
AdamGreen 0:d6e186427f3e 201 int i, resp = 0;
AdamGreen 0:d6e186427f3e 202
AdamGreen 0:d6e186427f3e 203 freeBUFFER();
AdamGreen 0:d6e186427f3e 204
AdamGreen 0:d6e186427f3e 205 for (i = 0; i <2; i++) writeBYTE(command[i]); // send command to serial port
AdamGreen 0:d6e186427f3e 206 _cmd.baud(speed); // set mbed to same speed
AdamGreen 0:d6e186427f3e 207
AdamGreen 0:d6e186427f3e 208 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer
AdamGreen 0:d6e186427f3e 209
AdamGreen 0:d6e186427f3e 210 if (_cmd.readable()) resp = _cmd.getc(); // read response if any
AdamGreen 0:d6e186427f3e 211 switch (resp) {
AdamGreen 0:d6e186427f3e 212 case ACK : // if OK return 1
AdamGreen 0:d6e186427f3e 213 resp = 1;
AdamGreen 0:d6e186427f3e 214 break;
AdamGreen 0:d6e186427f3e 215 case NAK : // if NOK return -1
AdamGreen 0:d6e186427f3e 216 resp = -1;
AdamGreen 0:d6e186427f3e 217 break;
AdamGreen 0:d6e186427f3e 218 default :
AdamGreen 0:d6e186427f3e 219 resp = 0; // else return 0
AdamGreen 0:d6e186427f3e 220 break;
AdamGreen 0:d6e186427f3e 221 }
AdamGreen 0:d6e186427f3e 222 }
AdamGreen 0:d6e186427f3e 223
AdamGreen 0:d6e186427f3e 224 //******************************************************************************************************
AdamGreen 0:d6e186427f3e 225 int TFT_4DGL :: readVERSION(char *command, int number) { // read screen info and populate data
AdamGreen 0:d6e186427f3e 226
AdamGreen 0:d6e186427f3e 227 int i, temp = 0, resp = 0;
AdamGreen 0:d6e186427f3e 228 char response[5] = "";
AdamGreen 0:d6e186427f3e 229
AdamGreen 0:d6e186427f3e 230 freeBUFFER();
AdamGreen 0:d6e186427f3e 231
AdamGreen 0:d6e186427f3e 232 for (i = 0; i < number; i++) writeBYTE(command[i]); // send all chars to serial port
AdamGreen 0:d6e186427f3e 233
AdamGreen 0:d6e186427f3e 234 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer
AdamGreen 0:d6e186427f3e 235
AdamGreen 0:d6e186427f3e 236 while (_cmd.readable() && resp < ARRAY_SIZE(response)) {
AdamGreen 0:d6e186427f3e 237 temp = _cmd.getc();
AdamGreen 0:d6e186427f3e 238 response[resp++] = (char)temp;
AdamGreen 0:d6e186427f3e 239 }
AdamGreen 0:d6e186427f3e 240 switch (resp) {
AdamGreen 0:d6e186427f3e 241 case 5 : // if OK populate data and return 1
AdamGreen 0:d6e186427f3e 242 type = response[0];
AdamGreen 0:d6e186427f3e 243 revision = response[1];
AdamGreen 0:d6e186427f3e 244 firmware = response[2];
AdamGreen 0:d6e186427f3e 245 reserved1 = response[3];
AdamGreen 0:d6e186427f3e 246 reserved2 = response[4];
AdamGreen 0:d6e186427f3e 247 resp = 1;
AdamGreen 0:d6e186427f3e 248 break;
AdamGreen 0:d6e186427f3e 249 default :
AdamGreen 0:d6e186427f3e 250 resp = 0; // else return 0
AdamGreen 0:d6e186427f3e 251 break;
AdamGreen 0:d6e186427f3e 252 }
AdamGreen 0:d6e186427f3e 253 return resp;
AdamGreen 0:d6e186427f3e 254 }
AdamGreen 0:d6e186427f3e 255
AdamGreen 0:d6e186427f3e 256 //****************************************************************************************************
AdamGreen 0:d6e186427f3e 257 void TFT_4DGL :: background_color(int color) { // set screen background color
AdamGreen 0:d6e186427f3e 258 char command[3]= ""; // input color is in 24bits like 0xRRGGBB
AdamGreen 0:d6e186427f3e 259
AdamGreen 0:d6e186427f3e 260 command[0] = BCKGDCOLOR;
AdamGreen 0:d6e186427f3e 261
AdamGreen 0:d6e186427f3e 262 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
AdamGreen 0:d6e186427f3e 263 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
AdamGreen 0:d6e186427f3e 264 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
AdamGreen 0:d6e186427f3e 265
AdamGreen 0:d6e186427f3e 266 command[1] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
AdamGreen 0:d6e186427f3e 267 command[2] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
AdamGreen 0:d6e186427f3e 268
AdamGreen 0:d6e186427f3e 269 writeCOMMAND(command, 3);
AdamGreen 0:d6e186427f3e 270 }
AdamGreen 0:d6e186427f3e 271
AdamGreen 0:d6e186427f3e 272 //****************************************************************************************************
AdamGreen 0:d6e186427f3e 273 void TFT_4DGL :: display_control(char mode, char value) { // set screen mode to value
AdamGreen 0:d6e186427f3e 274 char command[3]= "";
AdamGreen 0:d6e186427f3e 275
AdamGreen 0:d6e186427f3e 276 command[0] = DISPCONTROL;
AdamGreen 0:d6e186427f3e 277 command[1] = mode;
AdamGreen 0:d6e186427f3e 278 command[2] = value;
AdamGreen 0:d6e186427f3e 279
AdamGreen 0:d6e186427f3e 280 if (mode == ORIENTATION) {
AdamGreen 0:d6e186427f3e 281 switch (value) {
AdamGreen 0:d6e186427f3e 282 case LANDSCAPE :
AdamGreen 0:d6e186427f3e 283 current_orientation = IS_LANDSCAPE;
AdamGreen 0:d6e186427f3e 284 break;
AdamGreen 0:d6e186427f3e 285 case LANDSCAPE_R :
AdamGreen 0:d6e186427f3e 286 current_orientation = IS_LANDSCAPE;
AdamGreen 0:d6e186427f3e 287 break;
AdamGreen 0:d6e186427f3e 288 case PORTRAIT :
AdamGreen 0:d6e186427f3e 289 current_orientation = IS_PORTRAIT;
AdamGreen 0:d6e186427f3e 290 break;
AdamGreen 0:d6e186427f3e 291 case PORTRAIT_R :
AdamGreen 0:d6e186427f3e 292 current_orientation = IS_PORTRAIT;
AdamGreen 0:d6e186427f3e 293 break;
AdamGreen 0:d6e186427f3e 294 }
AdamGreen 0:d6e186427f3e 295 }
AdamGreen 0:d6e186427f3e 296 writeCOMMAND(command, 3);
AdamGreen 0:d6e186427f3e 297 set_font(current_font);
AdamGreen 0:d6e186427f3e 298 }
AdamGreen 0:d6e186427f3e 299
AdamGreen 0:d6e186427f3e 300 //****************************************************************************************************
AdamGreen 0:d6e186427f3e 301 void TFT_4DGL :: set_volume(char value) { // set sound volume to value
AdamGreen 0:d6e186427f3e 302 char command[2]= "";
AdamGreen 0:d6e186427f3e 303
AdamGreen 0:d6e186427f3e 304 command[0] = SETVOLUME;
AdamGreen 0:d6e186427f3e 305 command[1] = value;
AdamGreen 0:d6e186427f3e 306
AdamGreen 0:d6e186427f3e 307 writeCOMMAND(command, 2);
AdamGreen 0:d6e186427f3e 308 }
AdamGreen 0:d6e186427f3e 309
AdamGreen 0:d6e186427f3e 310
AdamGreen 0:d6e186427f3e 311 //******************************************************************************************************
AdamGreen 0:d6e186427f3e 312 void TFT_4DGL :: getTOUCH(char *command, int number, int *x, int *y) { // read screen info and populate data
AdamGreen 0:d6e186427f3e 313
AdamGreen 0:d6e186427f3e 314 #if DEBUGMODE
AdamGreen 0:d6e186427f3e 315 pc.printf("\n");
AdamGreen 0:d6e186427f3e 316 pc.printf("New COMMAND : 0x%02X\n", command[0]);
AdamGreen 0:d6e186427f3e 317 #endif
AdamGreen 0:d6e186427f3e 318 int i, temp = 0, resp = 0;
AdamGreen 0:d6e186427f3e 319 char response[5] = "";
AdamGreen 0:d6e186427f3e 320
AdamGreen 0:d6e186427f3e 321 freeBUFFER();
AdamGreen 0:d6e186427f3e 322
AdamGreen 0:d6e186427f3e 323 for (i = 0; i < number; i++) writeBYTE(command[i]); // send all chars to serial port
AdamGreen 0:d6e186427f3e 324
AdamGreen 0:d6e186427f3e 325 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer
AdamGreen 0:d6e186427f3e 326
AdamGreen 0:d6e186427f3e 327 while (_cmd.readable() && resp < ARRAY_SIZE(response)) {
AdamGreen 0:d6e186427f3e 328 temp = _cmd.getc();
AdamGreen 0:d6e186427f3e 329 response[resp++] = (char)temp;
AdamGreen 0:d6e186427f3e 330 }
AdamGreen 0:d6e186427f3e 331
AdamGreen 0:d6e186427f3e 332 #if DEBUGMODE
AdamGreen 0:d6e186427f3e 333 pc.printf(" Answer received %d : 0x%02X 0x%02X 0x%02X 0x%02X\n", resp, response[0], response[1], response[2], response[3]);
AdamGreen 0:d6e186427f3e 334 #endif
AdamGreen 0:d6e186427f3e 335
AdamGreen 0:d6e186427f3e 336 switch (resp) {
AdamGreen 0:d6e186427f3e 337 case 4 : // if OK populate data
AdamGreen 0:d6e186427f3e 338 *x = ((response[0]<<8)+ response[1]) * (response[0] != 0xFF);
AdamGreen 0:d6e186427f3e 339 *y = ((response[2]<<8)+ response[3]) * (response[2] != 0xFF);
AdamGreen 0:d6e186427f3e 340 break;
AdamGreen 0:d6e186427f3e 341 default :
AdamGreen 0:d6e186427f3e 342 *x = -1;
AdamGreen 0:d6e186427f3e 343 *y = -1;
AdamGreen 0:d6e186427f3e 344 break;
AdamGreen 0:d6e186427f3e 345 }
AdamGreen 0:d6e186427f3e 346
AdamGreen 0:d6e186427f3e 347 #if DEBUGMODE
AdamGreen 0:d6e186427f3e 348 pc.printf(" X,Y : %03d,%03d\n", *x, *y);
AdamGreen 0:d6e186427f3e 349 #endif
AdamGreen 0:d6e186427f3e 350 }
AdamGreen 0:d6e186427f3e 351
AdamGreen 0:d6e186427f3e 352 //******************************************************************************************************
AdamGreen 0:d6e186427f3e 353 int TFT_4DGL :: getSTATUS(char *command, int number) { // read screen info and populate data
AdamGreen 0:d6e186427f3e 354
AdamGreen 0:d6e186427f3e 355 #if DEBUGMODE
AdamGreen 0:d6e186427f3e 356 pc.printf("\n");
AdamGreen 0:d6e186427f3e 357 pc.printf("New COMMAND : 0x%02X\n", command[0]);
AdamGreen 0:d6e186427f3e 358 #endif
AdamGreen 0:d6e186427f3e 359
AdamGreen 0:d6e186427f3e 360 int i, temp = 0, resp = 0;
AdamGreen 0:d6e186427f3e 361 char response[5] = "";
AdamGreen 0:d6e186427f3e 362
AdamGreen 0:d6e186427f3e 363 freeBUFFER();
AdamGreen 0:d6e186427f3e 364
AdamGreen 0:d6e186427f3e 365 for (i = 0; i < number; i++) writeBYTE(command[i]); // send all chars to serial port
AdamGreen 0:d6e186427f3e 366
AdamGreen 0:d6e186427f3e 367 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer
AdamGreen 0:d6e186427f3e 368
AdamGreen 0:d6e186427f3e 369 while (_cmd.readable() && resp < ARRAY_SIZE(response)) {
AdamGreen 0:d6e186427f3e 370 temp = _cmd.getc();
AdamGreen 0:d6e186427f3e 371 response[resp++] = (char)temp;
AdamGreen 0:d6e186427f3e 372 }
AdamGreen 0:d6e186427f3e 373 switch (resp) {
AdamGreen 0:d6e186427f3e 374 case 4 :
AdamGreen 0:d6e186427f3e 375 resp = (int)response[1]; // if OK populate data
AdamGreen 0:d6e186427f3e 376 break;
AdamGreen 0:d6e186427f3e 377 default :
AdamGreen 0:d6e186427f3e 378 resp = -1; // else return 0
AdamGreen 0:d6e186427f3e 379 break;
AdamGreen 0:d6e186427f3e 380 }
AdamGreen 0:d6e186427f3e 381
AdamGreen 0:d6e186427f3e 382 #if DEBUGMODE
AdamGreen 0:d6e186427f3e 383 pc.printf(" Answer received : %d\n", resp);
AdamGreen 0:d6e186427f3e 384 #endif
AdamGreen 0:d6e186427f3e 385
AdamGreen 0:d6e186427f3e 386 return resp;
AdamGreen 0:d6e186427f3e 387 }