Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ezLCDLib.cpp
00001 /** 00002 * 00003 * 00004 * 00005 * 00006 * 00007 * 00008 */ 00009 00010 00011 #include "mbed.h" 00012 #include "ezLCDLib.h" 00013 00014 void Tx_interrupt(); 00015 void Rx_interrupt(); 00016 void send_line(); 00017 void read_line(); 00018 00019 // Circular buffers for serial TX and RX data - used by interrupt routines 00020 const int buffer_size = 64; 00021 // might need to increase buffer size for high baud rates 00022 char tx_buffer[buffer_size]; 00023 char rx_buffer[buffer_size]; 00024 // Circular buffer pointers 00025 // volatile makes read-modify-write atomic 00026 volatile int tx_in=0; 00027 volatile int tx_out=0; 00028 volatile int rx_in=0; 00029 volatile int rx_out=0; 00030 00031 char buf[64]; 00032 00033 ezLCD3::ezLCD3(PinName tx, PinName rx) : Stream("ezLCD3") , _ser(tx, rx) 00034 { 00035 _ser.baud(115200); // default baud rate 00036 _ser.attach(this,&ezLCD3::Rx_interrupt, Serial::RxIrq); 00037 } 00038 00039 void ezLCD3::Rx_interrupt( void ) 00040 { 00041 // Loop just in case more than one character is in UART's receive FIFO buffer 00042 // Stop if buffer full 00043 while ((_ser.readable()) || (((rx_in + 1) % buffer_size) == rx_out)) { 00044 rx_buffer[rx_in] = _ser.getc(); 00045 rx_in = (rx_in + 1) % buffer_size; 00046 } 00047 return; 00048 } 00049 00050 /* itoa: convert n to characters in s */ 00051 void ezLCD3::itoa(int value, char *sp, int radix) 00052 { 00053 char tmp[16];// be careful with the length of the buffer 00054 char *tp = tmp; 00055 int i; 00056 unsigned v; 00057 int sign; 00058 00059 sign = (radix == 10 && value < 0); 00060 if (sign) v = -value; 00061 else v = (unsigned)value; 00062 00063 while (v || tp == tmp) { 00064 i = v % radix; 00065 v /= radix; // v/=radix uses less CPU clocks than v=v/radix does 00066 if (i < 10) 00067 *tp++ = i+'0'; 00068 else 00069 *tp++ = i + 'a' - 10; 00070 } 00071 00072 if (sign) 00073 *sp++ = '-'; 00074 while (tp > tmp) 00075 *sp++ = *--tp; 00076 } 00077 00078 bool ezLCD3::sync( void ) 00079 { 00080 rx_in=0; 00081 rx_out=0; 00082 _ser.putc('\r'); 00083 if(waitForCR()) 00084 return true; 00085 else 00086 return false; 00087 00088 } 00089 void ezLCD3::sendInt( int i ) 00090 { 00091 char value[5]= {0, 0, 0, 0, 0}; 00092 itoa(i, value, 10); 00093 if(value[0]) _ser.putc(value[0]); 00094 if(value[1]) _ser.putc(value[1]); 00095 if(value[2]) _ser.putc(value[2]); 00096 if(value[3]) _ser.putc(value[3]); 00097 if(value[4]) _ser.putc(value[4]); 00098 } 00099 00100 void ezLCD3::stripSpace(char* str) 00101 { 00102 char* i = str; 00103 char* j = str; 00104 while(*j != 0) { 00105 *i = *j++; 00106 if(*i != ' ') 00107 i++; 00108 } 00109 *i = 0; 00110 } 00111 00112 int ezLCD3::getInt( char *str ) 00113 { 00114 stripSpace(str); 00115 return atoi(str ); 00116 } 00117 00118 void ezLCD3::getString( char *str ) 00119 { 00120 char c=0; 00121 unsigned long timeOut=0; 00122 do { 00123 if(rx_in != rx_out) { 00124 c=rx_buffer[rx_out]; 00125 rx_out = (rx_out + 1) % buffer_size; 00126 *str++ = c; 00127 } 00128 timeOut++; 00129 } while(c!='\r' && timeOut != 0xfffffff); 00130 *str--; 00131 *str = 0; 00132 } 00133 00134 bool ezLCD3::waitForCR( void ) 00135 { 00136 char c=0; 00137 unsigned long timeOut=0; 00138 while(rx_in == rx_out) { 00139 if(timeOut++ > 0xffffff) return false; 00140 } 00141 c=rx_buffer[rx_out]; 00142 rx_out = (rx_out + 1) % buffer_size; 00143 if(c == '\r') { 00144 return true; 00145 } else { 00146 return false; 00147 } 00148 } 00149 00150 void ezLCD3::cls() 00151 { 00152 sendInt(Clr_Screen); 00153 _ser.putc('\r'); 00154 waitForCR(); 00155 } 00156 00157 void ezLCD3::cls(int bColor) 00158 { 00159 sendInt(Clr_Screen); 00160 _ser.putc(' '); 00161 sendInt(bColor); 00162 _ser.putc('\r'); 00163 waitForCR(); 00164 } 00165 00166 void ezLCD3::cls(int bColor, int fColor) 00167 { 00168 sendInt(Clr_Screen); 00169 _ser.putc(' '); 00170 sendInt(bColor); 00171 _ser.putc(' '); 00172 sendInt(fColor); 00173 _ser.putc('\r'); 00174 waitForCR(); 00175 } 00176 void ezLCD3::color(int fColor) 00177 { 00178 sendInt(Color); 00179 _ser.putc(' '); 00180 sendInt(fColor); 00181 _ser.putc('\r'); 00182 waitForCR(); 00183 } 00184 00185 void ezLCD3::xy(int x, int y) 00186 { 00187 sendInt(XY); 00188 _ser.putc(' '); 00189 sendInt(x); 00190 _ser.putc(' '); 00191 sendInt(y); 00192 _ser.putc('\r'); 00193 waitForCR(); 00194 } 00195 00196 void ezLCD3::plot( void ) 00197 { 00198 sendInt(Plot); 00199 _ser.putc('\r'); 00200 waitForCR(); 00201 } 00202 00203 void ezLCD3::plot( int x, int y ) 00204 { 00205 sendInt(Plot); 00206 _ser.putc(' '); 00207 sendInt(x); 00208 _ser.putc(' '); 00209 sendInt(y); 00210 _ser.putc('\r'); 00211 waitForCR(); 00212 } 00213 void ezLCD3::line(int x, int y ) 00214 { 00215 sendInt(Line); 00216 _ser.putc(' '); 00217 sendInt(x); 00218 _ser.putc(' '); 00219 sendInt(y); 00220 _ser.putc('\r'); 00221 waitForCR(); 00222 } 00223 void ezLCD3::lineType( int type ) 00224 { 00225 sendInt(Line_Type); 00226 _ser.putc(' '); 00227 sendInt(type); 00228 _ser.putc('\r'); 00229 waitForCR(); 00230 } 00231 void ezLCD3::lineWidth( int width ) 00232 { 00233 sendInt(Line_Width); 00234 _ser.putc(' '); 00235 sendInt(width); 00236 _ser.putc('\r'); 00237 waitForCR(); 00238 } 00239 void ezLCD3::circle(int radius, bool filled) 00240 { 00241 sendInt(Circle); 00242 _ser.putc(' '); 00243 sendInt(radius); 00244 if(filled) { 00245 _ser.putc(' '); 00246 _ser.putc('f'); 00247 } 00248 _ser.putc('\r'); 00249 waitForCR(); 00250 } 00251 00252 void ezLCD3::box(int width, int heigth, bool filled) 00253 { 00254 sendInt(Box); 00255 _ser.putc(' '); 00256 sendInt(width); 00257 _ser.putc(' '); 00258 sendInt(heigth); 00259 if(filled) { 00260 _ser.putc(' '); 00261 _ser.putc('f'); 00262 } 00263 _ser.putc('\r'); 00264 waitForCR(); 00265 } 00266 00267 void ezLCD3::light(int level) 00268 { 00269 sendInt( Light ); 00270 putc(' '); 00271 sendInt( level ); 00272 putc('\r'); 00273 waitForCR(); 00274 } 00275 00276 int ezLCD3::getXmax( void ) 00277 { 00278 sendInt(Xmax); 00279 _ser.putc('\r'); 00280 getString( buf ); 00281 return getInt( buf ); 00282 } 00283 int ezLCD3::getYmax( void ) 00284 { 00285 sendInt(Ymax); 00286 _ser.putc('\r'); 00287 getString( buf ); 00288 return getInt( buf ); 00289 } 00290 00291 void ezLCD3::sendString( char *str ) 00292 { 00293 unsigned char c; 00294 while( (c = *str++) ) 00295 _ser.putc(c); 00296 } 00297 00298 void ezLCD3::setStringID( int ID, char *str ) 00299 { 00300 sendInt(StringID); 00301 _ser.putc(' '); 00302 sendInt(ID); 00303 _ser.putc(' '); 00304 _ser.putc('\"'); 00305 sendString(str); 00306 _ser.putc('\"'); 00307 _ser.putc('\r'); 00308 waitForCR(); 00309 } 00310 00311 void ezLCD3::getStringID( int ID , char *str) 00312 { 00313 sendInt(StringID); 00314 _ser.putc(' '); 00315 sendInt(ID); 00316 _ser.putc('\r'); 00317 getString(str); 00318 } 00319 00320 void ezLCD3::print( char *str ) 00321 { 00322 sendInt(Print); 00323 _ser.putc(' '); 00324 _ser.putc('\"'); 00325 sendString(str); 00326 _ser.putc('\"'); 00327 _ser.putc('\r'); 00328 waitForCR(); 00329 } 00330 void ezLCD3::fontw( int ID, char *str) 00331 { 00332 sendInt(Fontw); 00333 _ser.putc(' '); 00334 sendInt(ID); 00335 _ser.putc(' '); 00336 _ser.putc('\"'); 00337 sendString(str); 00338 _ser.putc('\"'); 00339 _ser.putc('\r'); 00340 waitForCR(); 00341 } 00342 00343 void ezLCD3::fontw( int ID, int font) 00344 { 00345 sendInt(Fontw); 00346 _ser.putc(' '); 00347 sendInt(ID); 00348 _ser.putc(' '); 00349 sendInt(font); 00350 _ser.putc('\r'); 00351 waitForCR(); 00352 } 00353 00354 void ezLCD3::font( char *str) 00355 { 00356 sendInt(Font); 00357 _ser.putc(' '); 00358 sendString(str); 00359 _ser.putc('\r'); 00360 waitForCR(); 00361 } 00362 00363 void ezLCD3::fontO( bool dir ) 00364 { 00365 sendInt(Font_Orient); 00366 _ser.putc(' '); 00367 if(dir) 00368 _ser.putc('1'); 00369 else 00370 _ser.putc('0'); 00371 _ser.putc('\r'); 00372 waitForCR(); 00373 } 00374 00375 void ezLCD3::clipArea( int l, int t, int r, int b) 00376 { 00377 sendInt(ClipArea); 00378 _ser.putc(' '); 00379 sendInt(l); 00380 _ser.putc(' '); 00381 sendInt(t); 00382 _ser.putc(' '); 00383 sendInt(r); 00384 _ser.putc(' '); 00385 sendInt(b); 00386 _ser.putc(' '); 00387 _ser.putc('\r'); 00388 waitForCR(); 00389 } 00390 void ezLCD3::clipEnable( bool enable) 00391 { 00392 sendInt(ClipEnable); 00393 _ser.putc(' '); 00394 if(enable) 00395 _ser.putc('1'); 00396 else 00397 _ser.putc('0'); 00398 _ser.putc('\r'); 00399 00400 } 00401 void ezLCD3::theme(int ID, int EmbossDkColor, int EmbossLtColor, int TextColor0, int TextColor1, int TextColorDisabled, int Color0, int Color1, int ColorDisabled, int CommonBkColor, int Fontw) 00402 { 00403 sendInt(Widget_Theme); 00404 _ser.putc(' '); 00405 sendInt(ID); 00406 _ser.putc(' '); 00407 sendInt(EmbossDkColor); 00408 _ser.putc(' '); 00409 sendInt(EmbossLtColor); 00410 _ser.putc(' '); 00411 sendInt(TextColor0); 00412 _ser.putc(' '); 00413 sendInt(TextColor1); 00414 _ser.putc(' '); 00415 sendInt(TextColorDisabled); 00416 _ser.putc(' '); 00417 sendInt(Color0); 00418 _ser.putc(' '); 00419 sendInt(Color1); 00420 _ser.putc(' '); 00421 sendInt(ColorDisabled); 00422 _ser.putc(' '); 00423 sendInt(CommonBkColor); 00424 _ser.putc(' '); 00425 sendInt(Fontw); 00426 _ser.putc('\r'); 00427 waitForCR(); 00428 } 00429 void ezLCD3::groupBox( int ID, int x, int y, int w, int h, int options, int theme, int stringID) 00430 { 00431 sendInt(Set_Gbox); 00432 _ser.putc(' '); 00433 sendInt(ID); 00434 _ser.putc(' '); 00435 sendInt(x); 00436 _ser.putc(' '); 00437 sendInt(y); 00438 _ser.putc(' '); 00439 sendInt(w); 00440 _ser.putc(' '); 00441 sendInt(h); 00442 _ser.putc(' '); 00443 sendInt(options); 00444 _ser.putc(' '); 00445 sendInt(theme); 00446 _ser.putc(' '); 00447 sendInt(stringID); 00448 _ser.putc('\r'); 00449 waitForCR(); 00450 } 00451 00452 void ezLCD3::ameter( int ID, int x, int y, int w, int h, int options, int value, int min, int max, int theme, int stringID, int type) 00453 { 00454 sendInt(Set_AMeter); 00455 _ser.putc(' '); 00456 sendInt(ID); 00457 _ser.putc(' '); 00458 sendInt(x); 00459 _ser.putc(' '); 00460 sendInt(y); 00461 _ser.putc(' '); 00462 sendInt(w); 00463 _ser.putc(' '); 00464 sendInt(h); 00465 _ser.putc(' '); 00466 sendInt(options); 00467 _ser.putc(' '); 00468 sendInt(value); 00469 _ser.putc(' '); 00470 sendInt(min); 00471 _ser.putc(' '); 00472 sendInt(max); 00473 _ser.putc(' '); 00474 sendInt(theme); 00475 _ser.putc(' '); 00476 sendInt(stringID); 00477 _ser.putc(' '); 00478 sendInt(type); 00479 _ser.putc('\r'); 00480 waitForCR(); 00481 } 00482 00483 void ezLCD3::touchZone( int ID, int x, int y, int w, int h, bool option) 00484 { 00485 sendInt(Set_TouchZone); 00486 _ser.putc(' '); 00487 sendInt(ID); 00488 _ser.putc(' '); 00489 sendInt(x); 00490 _ser.putc(' '); 00491 sendInt(y); 00492 _ser.putc(' '); 00493 sendInt(w); 00494 _ser.putc(' '); 00495 sendInt(h); 00496 _ser.putc(' '); 00497 if(option) 00498 sendInt('1'); 00499 else 00500 sendInt('0'); 00501 _ser.putc('\r'); 00502 waitForCR(); 00503 } 00504 00505 void ezLCD3::button( int ID, int x, int y, int w, int h, int option, int align, int radius, int theme, int stringID ) 00506 { 00507 sendInt(Set_Button); 00508 _ser.putc(' '); 00509 sendInt(ID); 00510 _ser.putc(' '); 00511 sendInt(x); 00512 _ser.putc(' '); 00513 sendInt(y); 00514 _ser.putc(' '); 00515 sendInt(w); 00516 _ser.putc(' '); 00517 sendInt(h); 00518 _ser.putc(' '); 00519 sendInt(option); 00520 _ser.putc(' '); 00521 sendInt(align); 00522 _ser.putc(' '); 00523 sendInt(radius); 00524 _ser.putc(' '); 00525 sendInt(theme); 00526 _ser.putc(' '); 00527 sendInt(stringID); 00528 _ser.putc('\r'); 00529 waitForCR(); 00530 } 00531 void ezLCD3::image( char *str ) 00532 { 00533 sendInt(Picture); 00534 _ser.putc(' '); 00535 _ser.putc('\"'); 00536 sendString(str); 00537 _ser.putc('\"'); 00538 _ser.putc('\r'); 00539 waitForCR(); 00540 } 00541 00542 void ezLCD3::progressBar(int ID, int x, int y, int w, int h, int option, int value, int max, int theme, int stringID) 00543 { 00544 sendInt(Set_Progress); 00545 _ser.putc(' '); 00546 sendInt(ID); 00547 _ser.putc(' '); 00548 sendInt(x); 00549 _ser.putc(' '); 00550 sendInt(y); 00551 _ser.putc(' '); 00552 sendInt(w); 00553 _ser.putc(' '); 00554 sendInt(h); 00555 _ser.putc(' '); 00556 sendInt(option); 00557 _ser.putc(' '); 00558 sendInt(value); 00559 _ser.putc(' '); 00560 sendInt(max); 00561 _ser.putc(' '); 00562 sendInt(theme); 00563 _ser.putc(' '); 00564 sendInt(stringID); 00565 _ser.putc('\r'); 00566 waitForCR(); 00567 } 00568 00569 void ezLCD3::slider(int ID, int x, int y, int w, int h, int option, int range, int res, int value, int theme) 00570 { 00571 sendInt(Set_Slider); 00572 _ser.putc(' '); 00573 sendInt(ID); 00574 _ser.putc(' '); 00575 sendInt(x); 00576 _ser.putc(' '); 00577 sendInt(y); 00578 _ser.putc(' '); 00579 sendInt(w); 00580 _ser.putc(' '); 00581 sendInt(h); 00582 _ser.putc(' '); 00583 sendInt(option); 00584 _ser.putc(' '); 00585 sendInt(range); 00586 _ser.putc(' '); 00587 sendInt(res); 00588 _ser.putc(' '); 00589 sendInt(value); 00590 _ser.putc(' '); 00591 sendInt(theme); 00592 _ser.putc('\r'); 00593 waitForCR(); 00594 } 00595 00596 void ezLCD3::image( int x, int y, char *str ) 00597 { 00598 sendInt(Picture); 00599 _ser.putc(' '); 00600 sendInt(x); 00601 _ser.putc(' '); 00602 sendInt(y); 00603 _ser.putc(' '); 00604 _ser.putc('\"'); 00605 sendString(str); 00606 _ser.putc('\"'); 00607 _ser.putc('\r'); 00608 waitForCR(); 00609 } 00610 void ezLCD3::staticText( int ID, int x, int y, int w, int h, int option, int theme, int stringID) 00611 { 00612 sendInt(Set_StaticText); 00613 _ser.putc(' '); 00614 sendInt(ID); 00615 _ser.putc(' '); 00616 sendInt(x); 00617 _ser.putc(' '); 00618 sendInt(y); 00619 _ser.putc(' '); 00620 sendInt(w); 00621 _ser.putc(' '); 00622 sendInt(h); 00623 _ser.putc(' '); 00624 sendInt(option); 00625 _ser.putc(' '); 00626 sendInt(theme); 00627 _ser.putc(' '); 00628 sendInt(stringID); 00629 _ser.putc('\r'); 00630 waitForCR(); 00631 } 00632 00633 unsigned int ezLCD3::wstack( int type ) 00634 { 00635 sendInt( Wstack ); 00636 _ser.putc(' '); 00637 sendInt( type ); 00638 _ser.putc('\r'); 00639 getString( buf ); 00640 return getInt( buf ); 00641 } 00642 void ezLCD3::wvalue( int ID, int value) 00643 { 00644 sendInt( Widget_Values ); 00645 _ser.putc(' '); 00646 sendInt( ID ); 00647 _ser.putc(' '); 00648 sendInt( value ); 00649 _ser.putc('\r'); 00650 waitForCR(); 00651 } 00652 void ezLCD3::wstate( int ID, int option ) 00653 { 00654 sendInt( Widget_State ); 00655 _ser.putc(' '); 00656 sendInt( ID ); 00657 _ser.putc(' '); 00658 sendInt( option ); 00659 _ser.putc('\r'); 00660 waitForCR(); 00661 } 00662 00663 void ezLCD3::sendCommand(char *str) 00664 { 00665 sendString(str); 00666 _ser.putc('\r'); 00667 waitForCR(); 00668 } 00669 00670 int ezLCD3::_putc( int c) 00671 { 00672 sendInt(Print); 00673 _ser.putc(' '); 00674 _ser.putc('\"'); 00675 _ser.putc(c); 00676 _ser.putc('\"'); 00677 _ser.putc('\r'); 00678 waitForCR(); 00679 return (c); 00680 } 00681 00682 int ezLCD3::_getc(void) 00683 { 00684 char r = 0; 00685 return(r); 00686 } 00687 00688 int ezLCD3::putc ( int c ) 00689 { 00690 return(_ser.putc(c)); 00691 } 00692 00693 int ezLCD3::getc (void) 00694 { 00695 return(_ser.getc()); 00696 } 00697 00698 00699
Generated on Wed Jul 13 2022 05:25:49 by
1.7.2