Kamil Ondrousek
/
2D-Lorenz
Lorenz limit cycle - 2D nonlinear attractor
Embed:
(wiki syntax)
Show/hide line numbers
TFT_4DGL_main.cpp
00001 // 00002 // TFT_4DGL is a class to drive 4D Systems TFT touch screens 00003 // 00004 // Copyright (C) <2010> Stephane ROCHON <stephane.rochon at free.fr> 00005 // 00006 // TFT_4DGL is free software: you can redistribute it and/or modify 00007 // it under the terms of the GNU General Public License as published by 00008 // the Free Software Foundation, either version 3 of the License, or 00009 // (at your option) any later version. 00010 // 00011 // TFT_4DGL is distributed in the hope that it will be useful, 00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 // GNU General Public License for more details. 00015 // 00016 // You should have received a copy of the GNU General Public License 00017 // along with TFT_4DGL. If not, see <http://www.gnu.org/licenses/>. 00018 00019 #include "mbed.h" 00020 #include "TFT_4DGL.h" 00021 00022 Serial pc(USBTX,USBRX); 00023 //DigitalOut led1(LED1), led2(LED2); 00024 00025 //****************************************************************************************************** 00026 TFT_4DGL :: TFT_4DGL(PinName tx, PinName rx, PinName rst) : _cmd(tx, rx), _rst(rst) { // Constructor 00027 00028 #if DEBUGMODE 00029 pc.baud(115200); 00030 00031 pc.printf("\n\n\n"); 00032 pc.printf("********************\n\r"); 00033 pc.printf("TFT_4DGL CONSTRUCTOR\n\r"); 00034 pc.printf("********************\n\r"); 00035 #endif 00036 00037 _rst = 1; // put RESET pin to high to start TFT screen 00038 00039 reset(); 00040 autobaud(); // send autobaud command 00041 baudrate(256000); // set the initial baudrate to 256kbps - fastest supported by uLCD-32PT 00042 cls(); // clear screen 00043 00044 current_col = 0; // initial cursor col 00045 current_row = 0; // initial cursor row 00046 current_color = WHITE; // initial text color 00047 current_orientation = IS_PORTRAIT; // initial screen orientation 00048 00049 set_font(FONT_5X7); // initial font 00050 text_mode(TRANSPARENT); // initial text mode 00051 display_control(0x06,0x00); // initial Image control new format 00052 } 00053 00054 //****************************************************************************************************** 00055 void TFT_4DGL :: writeBYTE(char c) { // send a BYTE command to screen 00056 00057 _cmd.putc(c); 00058 00059 #if DEBUGMODE 00060 pc.printf(" Char sent : 0x%02X ",c); 00061 pc.putc(c); 00062 pc.printf(" \n\r"); 00063 #endif 00064 00065 } 00066 00067 //****************************************************************************************************** 00068 void TFT_4DGL :: freeBUFFER(void) { // Clear serial buffer before writing command 00069 00070 while (_cmd.readable()) _cmd.getc(); // clear buffer garbage 00071 } 00072 00073 //****************************************************************************************************** 00074 int TFT_4DGL :: writeCOMMAND(char *command, int number) { // send several BYTES making a command and return an answer 00075 00076 #if DEBUGMODE 00077 pc.printf("\n\r"); 00078 pc.printf("New COMMAND : 0x%02X\n\r", command[0]); 00079 #endif 00080 int i, resp = 0; 00081 freeBUFFER(); 00082 00083 for (i = 0; i < number; i++) writeBYTE(command[i]); // send command to serial port 00084 00085 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer 00086 if (_cmd.readable()) resp = _cmd.getc(); // read response if any 00087 switch (resp) { 00088 case ACK : // if OK return 1 00089 resp = 1; 00090 break; 00091 case NAK : // if NOK return -1 00092 resp = -1; 00093 break; 00094 default : 00095 resp = 0; // else return 0 00096 break; 00097 } 00098 #if DEBUGMODE 00099 pc.printf(" Answer received : %d\n\r",resp); 00100 #endif 00101 00102 return resp; 00103 } 00104 00105 //************************************************************************** 00106 void TFT_4DGL :: reset() { // Reset Screen 00107 00108 _rst = 0; // put RESET pin to low 00109 wait_ms(TEMPO); // wait a few milliseconds for command reception 00110 _rst = 1; // put RESET back to high 00111 wait(3); // wait 3s for screen to restart 00112 00113 freeBUFFER(); // clean buffer from possible garbage 00114 } 00115 00116 //************************************************************************** 00117 void TFT_4DGL :: autobaud() { // send AutoBaud command (9600) 00118 char command[1] = ""; 00119 command[0] = AUTOBAUD; 00120 writeCOMMAND(command, 1); 00121 } 00122 00123 //************************************************************************** 00124 void TFT_4DGL :: cls() { // clear screen 00125 char command[1] = ""; 00126 command[0] = CLS; 00127 writeCOMMAND(command, 1); 00128 } 00129 00130 //************************************************************************** 00131 void TFT_4DGL :: version() { // get API version 00132 char command[2] = ""; 00133 command[0] = VERSION; 00134 command[1] = OFF; 00135 readVERSION(command, 2); 00136 } 00137 00138 //************************************************************************** 00139 void TFT_4DGL :: baudrate(long speed) { // set screen baud rate 00140 char command[2]= ""; 00141 command[0] = BAUDRATE; 00142 switch (speed) { 00143 case 110 : 00144 command[1] = BAUD_110; 00145 break; 00146 case 300 : 00147 command[1] = BAUD_300; 00148 break; 00149 case 600 : 00150 command[1] = BAUD_600; 00151 break; 00152 case 1200 : 00153 command[1] = BAUD_1200; 00154 break; 00155 case 2400 : 00156 command[1] = BAUD_2400; 00157 break; 00158 case 4800 : 00159 command[1] = BAUD_4800; 00160 break; 00161 case 9600 : 00162 command[1] = BAUD_9600; 00163 break; 00164 case 14400 : 00165 command[1] = BAUD_14400; 00166 break; 00167 case 19200 : 00168 command[1] = BAUD_19200; 00169 break; 00170 case 31250 : 00171 command[1] = BAUD_31250; 00172 break; 00173 case 38400 : 00174 command[1] = BAUD_38400; 00175 break; 00176 case 56000 : 00177 command[1] = BAUD_56000; 00178 break; 00179 case 57600 : 00180 command[1] = BAUD_57600; 00181 break; 00182 case 115200 : 00183 command[1] = BAUD_115200; 00184 break; 00185 case 128000 : 00186 command[1] = BAUD_128000; 00187 break; 00188 case 256000 : 00189 command[1] = BAUD_256000; 00190 break; 00191 default : 00192 command[1] = BAUD_9600; 00193 speed = 9600; 00194 break; 00195 } 00196 00197 #if DEBUGMODE 00198 pc.printf("\n\r"); 00199 pc.printf("New COMMAND : 0x%02X\n\r", command[0]); 00200 #endif 00201 00202 int i, resp = 0; 00203 freeBUFFER(); 00204 00205 if(speed==256000) 00206 speed=281000; //If baud rate is 256K comm at 281k - as instructed by 4DGL 00207 00208 for (i = 0; i <2; i++) writeBYTE(command[i]); // send command to serial port 00209 _cmd.baud(speed); // set mbed to same speed 00210 00211 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer 00212 00213 if (_cmd.readable()) resp = _cmd.getc(); // read response if any 00214 switch (resp) { 00215 case ACK : // if OK return 1 00216 resp = 1; 00217 break; 00218 case NAK : // if NOK return -1 00219 resp = -1; 00220 break; 00221 default : 00222 resp = 0; // else return 0 00223 break; 00224 } 00225 #if DEBUGMODE 00226 pc.printf(" Baudrate reply received : %d\n\r",resp); 00227 #endif 00228 } 00229 00230 //****************************************************************************************************** 00231 int TFT_4DGL :: readVERSION(char *command, int number) { // read screen info and populate data 00232 00233 int i, temp = 0, resp = 0; 00234 char response[5] = ""; 00235 00236 freeBUFFER(); 00237 00238 for (i = 0; i < number; i++) writeBYTE(command[i]); // send all chars to serial port 00239 00240 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer 00241 00242 while (_cmd.readable()) { 00243 temp = _cmd.getc(); 00244 response[resp++] = (char)temp; 00245 } 00246 switch (resp) { 00247 case 5 : // if OK populate data and return 1 00248 type = response[0]; 00249 revision = response[1]; 00250 firmware = response[2]; 00251 reserved1 = response[3]; 00252 reserved2 = response[4]; 00253 resp = 1; 00254 break; 00255 default : 00256 resp = 0; // else return 0 00257 break; 00258 } 00259 return resp; 00260 } 00261 00262 //**************************************************************************************************** 00263 void TFT_4DGL :: background_color(int color) { // set screen background color 00264 char command[3]= ""; // input color is in 24bits like 0xRRGGBB 00265 00266 command[0] = BCKGDCOLOR; 00267 00268 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits 00269 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits 00270 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits 00271 00272 command[1] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color 00273 command[2] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color 00274 00275 writeCOMMAND(command, 3); 00276 } 00277 00278 //**************************************************************************************************** 00279 void TFT_4DGL :: display_control(char mode, char value) { // set screen mode to value 00280 char command[3]= ""; 00281 00282 command[0] = DISPCONTROL; 00283 command[1] = mode; 00284 command[2] = value; 00285 00286 if (mode == ORIENTATION) { 00287 switch (value) { 00288 case LANDSCAPE : 00289 current_orientation = IS_LANDSCAPE; 00290 break; 00291 case LANDSCAPE_R : 00292 current_orientation = IS_LANDSCAPE; 00293 break; 00294 case PORTRAIT : 00295 current_orientation = IS_PORTRAIT; 00296 break; 00297 case PORTRAIT_R : 00298 current_orientation = IS_PORTRAIT; 00299 break; 00300 } 00301 set_font(current_font); 00302 } 00303 writeCOMMAND(command, 3); 00304 00305 } 00306 00307 //**************************************************************************************************** 00308 void TFT_4DGL :: set_volume(char value) { // set sound volume to value 00309 char command[2]= ""; 00310 00311 command[0] = SETVOLUME; 00312 command[1] = value; 00313 00314 writeCOMMAND(command, 2); 00315 } 00316 00317 00318 //****************************************************************************************************** 00319 void TFT_4DGL :: getTOUCH(char *command, int number, int *x, int *y) { // read screen info and populate data 00320 00321 #if DEBUGMODE 00322 pc.printf("\n\r"); 00323 pc.printf("New COMMAND : 0x%02X\n\r", command[0]); 00324 #endif 00325 int i, temp = 0, resp = 0; 00326 char response[5] = ""; 00327 00328 freeBUFFER(); 00329 00330 for (i = 0; i < number; i++) writeBYTE(command[i]); // send all chars to serial port 00331 00332 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer 00333 00334 while (_cmd.readable()) { 00335 temp = _cmd.getc(); 00336 response[resp++] = (char)temp; 00337 } 00338 00339 #if DEBUGMODE 00340 pc.printf(" Answer received %d : 0x%02X 0x%02X 0x%02X 0x%02X\n\r", resp, response[0], response[1], response[2], response[3]); 00341 #endif 00342 00343 switch (resp) { 00344 case 4 : // if OK populate data 00345 *x = ((response[0]<<8)+ response[1]) * (response[0] != 0xFF); 00346 *y = ((response[2]<<8)+ response[3]) * (response[2] != 0xFF); 00347 break; 00348 default : 00349 *x = -1; 00350 *y = -1; 00351 break; 00352 } 00353 00354 #if DEBUGMODE 00355 pc.printf(" X,Y : %03d,%03d\n\r", *x, *y); 00356 #endif 00357 } 00358 00359 //****************************************************************************************************** 00360 int TFT_4DGL :: getSTATUS(char *command, int number) { // read screen info and populate data 00361 00362 #if DEBUGMODE 00363 pc.printf("\n\r"); 00364 pc.printf("New COMMAND : 0x%02X\n\r", command[0]); 00365 #endif 00366 00367 int i, temp = 0, resp = 0; 00368 char response[5] = ""; 00369 00370 freeBUFFER(); 00371 00372 for (i = 0; i < number; i++) writeBYTE(command[i]); // send all chars to serial port 00373 00374 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer 00375 00376 while (_cmd.readable()) { 00377 temp = _cmd.getc(); 00378 response[resp++] = (char)temp; 00379 } 00380 switch (resp) { 00381 case 4 : 00382 resp = (int)response[1]; // if OK populate data 00383 break; 00384 default : 00385 resp = -1; // else return 0 00386 break; 00387 } 00388 00389 #if DEBUGMODE 00390 pc.printf(" Answer received : %d\n\r", resp); 00391 #endif 00392 00393 return resp; 00394 }
Generated on Sat Jul 16 2022 19:52:13 by 1.7.2