Display librairy manage 3 LED and a TextLCD (on, off, flash) (print message, clear)
Diff: Display.cpp
- Revision:
- 4:424dd7f7b12c
diff -r 28370613ca07 -r 424dd7f7b12c Display.cpp --- /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