Display librairy manage 3 LED and a TextLCD (on, off, flash) (print message, clear)

Files at this revision

API Documentation at this revision

Comitter:
us191
Date:
Mon May 06 08:00:51 2013 +0000
Parent:
3:28370613ca07
Commit message:
message examples V2

Changed in this revision

Display.cpp Show annotated file Show diff for this revision Revisions of this file
Display.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Display.cpp	Mon May 06 08:00:51 2013 +0000
@@ -0,0 +1,196 @@
+#include "Display.h"
+
+
+/* Create a Display interface (default : 16X2 screen)
+* 
+* @param pinGreenLED    greenLED broche
+* @param pinRedLED      redLED broche
+* @param pinOrangeLED   orangeLED broche
+* @param pinLCDrs       LCD Instruction/data control line
+* @param pinLCDe        LCD Enable line (clock)
+* @param pinLCDd0-d3    LCD Data lines     
+*/
+Display::Display(PinName pinGreenLED, PinName pinRedLED, PinName pinOrangeLED, PinName pinLCDrs, PinName pinLCDe,
+        PinName pinLCDd0, PinName pinLCDd1, PinName pinLCDd2, PinName pinLCDd3) : _greenLED(pinGreenLED), _redLED(pinRedLED), 
+        _orangeLED(pinOrangeLED), _lcd(pinLCDrs, pinLCDe, pinLCDd0, pinLCDd1, pinLCDd2, pinLCDd3)
+{
+    this->clear();
+}
+
+/* Create a Display interface
+* 
+* @param pinGreenLED    greenLED broche
+* @param pinRedLED      redLED broche
+* @param pinOrangeLED   orangeLED broche
+* @param pinLCDrs       LCD Instruction/data control line
+* @param pinLCDe        LCD Enable line (clock)
+* @param pinLCDd0-d3    LCD Data lines
+* @param typeScreen     LCD Sets the panel size/addressing mode (default = LCD16x2)
+*/
+Display::Display(PinName pinGreenLED, PinName pinRedLED, PinName pinOrangeLED, PinName pinLCDrs, PinName pinLCDe,
+        PinName pinLCDd0, PinName pinLCDd1, PinName pinLCDd2, PinName pinLCDd3, TextLCD::LCDType typeScreen) : 
+            _greenLED(pinGreenLED), _redLED(pinRedLED), _orangeLED(pinOrangeLED), 
+            _lcd(pinLCDrs, pinLCDe, pinLCDd0, pinLCDd1, pinLCDd2, pinLCDd3, typeScreen)
+{
+    this->clear();
+}
+
+/* Destructor
+*/
+Display::~Display()
+{
+}
+
+/* print message on LCD screen and change status of green, red and orange LED
+* all line except the last line, have to finish by '\n'. Warning : '\n' count like a character
+* don't end message by '\n'
+*
+* @param message            message will be display on screen
+* @param statusGreenLED     new status of greenLED (on, off, flash)
+* @param statusRedLED       new status of redLED (on, off, flash)
+* @param statusOrangeLED    new status of orangeLED (on, off, flash)
+*/
+void Display::printMessage(string message, choiceStatusLED statusGreenLED, choiceStatusLED statusRedLED, choiceStatusLED statusOrangeLED) {
+    // clear LCD screen and shutdown 3 LED
+    this->clear();
+    
+    // change green LED status to statusGreenLED
+    this->changeStatusLED(Display::green, statusGreenLED);
+    // ...
+    this->changeStatusLED(Display::red, statusRedLED);
+    this->changeStatusLED(Display::orange, statusOrangeLED);
+    
+    if (this->checkMessage(message))    
+        // print message on LCD screen
+        this->_lcd.printf("%s\n", message.c_str());
+    else
+        this->_lcd.printf("this message can't show rigthly");
+}
+
+
+/* put off 3 LED and clear LCD screen
+*/
+void Display::clear(void) {
+    this->shutdownLED();
+    this->cls();
+}
+
+
+
+/* change led status to statusLED
+* use by printMessage()
+*
+* @param led        the led (green, red, orange)
+* @param statusLED  new status (on, off, flash)
+*/
+void Display::changeStatusLED(choiceLED led, choiceStatusLED statusLED) {
+    Led *ptr_led;
+    
+    // select LED 
+    switch (led) {
+    case green : ptr_led = &_greenLED;
+                break;
+    case red : ptr_led = &_redLED;
+                break;
+    default : ptr_led = &_orangeLED;
+                break;
+    }
+    
+    // change this status
+    switch (statusLED) {
+    case on : ptr_led->on();
+                break;
+    case flash : ptr_led->flash();
+                break;
+    default : ptr_led->off();
+                break;
+    }
+}
+
+/* put off 3 LED
+* use by clear()
+*/
+void Display::shutdownLED(void) {
+    _greenLED.off(); _redLED.off(); _orangeLED.off();
+}
+
+/* clear LCD screen
+* use by clear()
+*/
+void Display::cls(void) {
+    _lcd.cls();
+}
+
+/* check if this message can be display correctly on LCD screen 
+* use by printMessage()
+*
+* @param message    the message to be verified
+* @return 
+*        true if message is ok
+*        flase else
+*/
+bool Display::checkMessage(string message) {
+    // check message length (don't exceed screen capacity)
+    unsigned int screenSize = _lcd.columns() * _lcd.rows();
+    if (message.length() > screenSize)
+        return false;
+    
+    // check number of '\n'
+    // TextLCD is circular, so if we are on last line, a '\n' we come back on first line
+    int nbCRLF = this->calculNbCRLF(message);
+    if (nbCRLF >= _lcd.rows())
+        return false;
+    
+    // check all line length (don't exceed column capacity)
+    std::vector<std::string> allLine = this->subAllLine(message);
+    int lineLength;
+    for (unsigned int i = 0; i < allLine.size(); i++) {
+        lineLength = allLine[i].length();
+        if (lineLength > _lcd.columns())
+            return false;
+    }
+    
+    
+    return true;
+}
+
+/* calcul number of '\n'
+* use by checkMessage()
+*
+* @param message    the message to be analyse
+* @return number of '\n'
+*/ 
+int Display::calculNbCRLF(string message) {
+    unsigned int index = 0, nbCRLF = 0;
+    
+    while ((index = message.find('\n', index)) != std::string::npos) {      // npos is a static member constant of string,
+        nbCRLF++;                                                           // defined with a value of -1
+        index++;
+    }
+    
+    return nbCRLF;
+}
+
+/* return vector of all line message
+* use by checkMessage()
+*
+* @param message    the message to be cut
+* @return   a vector which contains a line of the message by entry
+*/
+vector<string> Display::subAllLine(string message) {
+    std::vector<std::string> allLine;
+    unsigned int index = 0, indexNext = 0; 
+    
+    // get next '\n' from last position
+    while ((indexNext = message.find('\n', index)) != std::string::npos) {
+        // sub new line (with '\n')
+        allLine.push_back(message.substr(index, indexNext-index+1));
+        // go to next line
+        index = indexNext + 1;
+    }
+    
+    // get last line
+    allLine.push_back(message.substr(index));
+        
+    return allLine;
+}
\ No newline at end of file
--- a/Display.h	Mon May 06 07:56:10 2013 +0000
+++ b/Display.h	Mon May 06 08:00:51 2013 +0000
@@ -94,8 +94,8 @@
       
     /** print message on LCD screen and change status of green, red and orange LED.
     * all line except the last line, have to finish by CRLF. Warning : CRLF count like a character.
-    * don't end message by CRLF
-    * examples :
+    * don't end message by CRLF.
+    * examples :\n
     * "this line have to finish by CRLF\/n
     * and next too\/n
     * but not the last"