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

Committer:
us191
Date:
Fri May 03 08:21:39 2013 +0000
Revision:
0:71286332d6f7
Display librairy

Who changed what in which revision?

UserRevisionLine numberNew contents of line
us191 0:71286332d6f7 1
us191 0:71286332d6f7 2 #include "Display.h"
us191 0:71286332d6f7 3
us191 0:71286332d6f7 4
us191 0:71286332d6f7 5 /** Create a Display interface (default : 16X2 screen)
us191 0:71286332d6f7 6 *
us191 0:71286332d6f7 7 * @param pinGreenLED greenLED broche
us191 0:71286332d6f7 8 * @param pinRedLED redLED broche
us191 0:71286332d6f7 9 * @param pinOrangeLED orangeLED broche
us191 0:71286332d6f7 10 * @param pinLCDrs LCD Instruction/data control line
us191 0:71286332d6f7 11 * @param pinLCDe LCD Enable line (clock)
us191 0:71286332d6f7 12 * @param pinLCDd0-d3 LCD Data lines
us191 0:71286332d6f7 13 */
us191 0:71286332d6f7 14 Display::Display(PinName pinGreenLED, PinName pinRedLED, PinName pinOrangeLED, PinName pinLCDrs, PinName pinLCDe,
us191 0:71286332d6f7 15 PinName pinLCDd0, PinName pinLCDd1, PinName pinLCDd2, PinName pinLCDd3) : _greenLED(pinGreenLED), _redLED(pinRedLED),
us191 0:71286332d6f7 16 _orangeLED(pinOrangeLED), _lcd(pinLCDrs, pinLCDe, pinLCDd0, pinLCDd1, pinLCDd2, pinLCDd3)
us191 0:71286332d6f7 17 {
us191 0:71286332d6f7 18 this->clear();
us191 0:71286332d6f7 19 }
us191 0:71286332d6f7 20
us191 0:71286332d6f7 21 /** Create a Display interface
us191 0:71286332d6f7 22 *
us191 0:71286332d6f7 23 * @param pinGreenLED greenLED broche
us191 0:71286332d6f7 24 * @param pinRedLED redLED broche
us191 0:71286332d6f7 25 * @param pinOrangeLED orangeLED broche
us191 0:71286332d6f7 26 * @param pinLCDrs LCD Instruction/data control line
us191 0:71286332d6f7 27 * @param pinLCDe LCD Enable line (clock)
us191 0:71286332d6f7 28 * @param pinLCDd0-d3 LCD Data lines
us191 0:71286332d6f7 29 * @param typeScreen LCD Sets the panel size/addressing mode (default = LCD16x2)
us191 0:71286332d6f7 30 */
us191 0:71286332d6f7 31 Display::Display(PinName pinGreenLED, PinName pinRedLED, PinName pinOrangeLED, PinName pinLCDrs, PinName pinLCDe,
us191 0:71286332d6f7 32 PinName pinLCDd0, PinName pinLCDd1, PinName pinLCDd2, PinName pinLCDd3, TextLCD::LCDType typeScreen) :
us191 0:71286332d6f7 33 _greenLED(pinGreenLED), _redLED(pinRedLED), _orangeLED(pinOrangeLED),
us191 0:71286332d6f7 34 _lcd(pinLCDrs, pinLCDe, pinLCDd0, pinLCDd1, pinLCDd2, pinLCDd3, typeScreen)
us191 0:71286332d6f7 35 {
us191 0:71286332d6f7 36 this->clear();
us191 0:71286332d6f7 37 }
us191 0:71286332d6f7 38
us191 0:71286332d6f7 39 /** Destructor
us191 0:71286332d6f7 40 */
us191 0:71286332d6f7 41 Display::~Display()
us191 0:71286332d6f7 42 {
us191 0:71286332d6f7 43 }
us191 0:71286332d6f7 44
us191 0:71286332d6f7 45 /** print message on LCD screen and change status of green, red and orange LED
us191 0:71286332d6f7 46 * all line except the last line, have to finish by '\n'. Warning : '\n' count like a character
us191 0:71286332d6f7 47 * don't end message by '\n'
us191 0:71286332d6f7 48 *
us191 0:71286332d6f7 49 * @param message message will be display on screen
us191 0:71286332d6f7 50 * @param statusGreenLED new status of greenLED (on, off, flash)
us191 0:71286332d6f7 51 * @param statusRedLED new status of redLED (on, off, flash)
us191 0:71286332d6f7 52 * @param statusOrangeLED new status of orangeLED (on, off, flash)
us191 0:71286332d6f7 53 */
us191 0:71286332d6f7 54 void Display::printMessage(string message, choiceStatusLED statusGreenLED, choiceStatusLED statusRedLED, choiceStatusLED statusOrangeLED) {
us191 0:71286332d6f7 55 // clear LCD screen and shutdown 3 LED
us191 0:71286332d6f7 56 this->clear();
us191 0:71286332d6f7 57
us191 0:71286332d6f7 58 // change green LED status to statusGreenLED
us191 0:71286332d6f7 59 this->changeStatusLED(Display::green, statusGreenLED);
us191 0:71286332d6f7 60 // ...
us191 0:71286332d6f7 61 this->changeStatusLED(Display::red, statusRedLED);
us191 0:71286332d6f7 62 this->changeStatusLED(Display::orange, statusOrangeLED);
us191 0:71286332d6f7 63
us191 0:71286332d6f7 64 if (this->checkMessage(message))
us191 0:71286332d6f7 65 // print message on LCD screen
us191 0:71286332d6f7 66 this->_lcd.printf("%s\n", message.c_str());
us191 0:71286332d6f7 67 else
us191 0:71286332d6f7 68 this->_lcd.printf("this message can't show rigthly");
us191 0:71286332d6f7 69 }
us191 0:71286332d6f7 70
us191 0:71286332d6f7 71
us191 0:71286332d6f7 72 /** put off 3 LED and clear LCD screen
us191 0:71286332d6f7 73 */
us191 0:71286332d6f7 74 void Display::clear(void) {
us191 0:71286332d6f7 75 this->shutdownLED();
us191 0:71286332d6f7 76 this->cls();
us191 0:71286332d6f7 77 }
us191 0:71286332d6f7 78
us191 0:71286332d6f7 79
us191 0:71286332d6f7 80
us191 0:71286332d6f7 81 /** change led status to statusLED
us191 0:71286332d6f7 82 * use by printMessage()
us191 0:71286332d6f7 83 *
us191 0:71286332d6f7 84 * @param led the led (green, red, orange)
us191 0:71286332d6f7 85 * @param statusLED new status (on, off, flash)
us191 0:71286332d6f7 86 */
us191 0:71286332d6f7 87 void Display::changeStatusLED(choiceLED led, choiceStatusLED statusLED) {
us191 0:71286332d6f7 88 Led *ptr_led;
us191 0:71286332d6f7 89
us191 0:71286332d6f7 90 // select LED
us191 0:71286332d6f7 91 switch (led) {
us191 0:71286332d6f7 92 case green : ptr_led = &_greenLED;
us191 0:71286332d6f7 93 break;
us191 0:71286332d6f7 94 case red : ptr_led = &_redLED;
us191 0:71286332d6f7 95 break;
us191 0:71286332d6f7 96 default : ptr_led = &_orangeLED;
us191 0:71286332d6f7 97 break;
us191 0:71286332d6f7 98 }
us191 0:71286332d6f7 99
us191 0:71286332d6f7 100 // change this status
us191 0:71286332d6f7 101 switch (statusLED) {
us191 0:71286332d6f7 102 case on : ptr_led->on();
us191 0:71286332d6f7 103 break;
us191 0:71286332d6f7 104 case flash : ptr_led->flash();
us191 0:71286332d6f7 105 break;
us191 0:71286332d6f7 106 default : ptr_led->off();
us191 0:71286332d6f7 107 break;
us191 0:71286332d6f7 108 }
us191 0:71286332d6f7 109 }
us191 0:71286332d6f7 110
us191 0:71286332d6f7 111 /** put off 3 LED
us191 0:71286332d6f7 112 * use by clear()
us191 0:71286332d6f7 113 */
us191 0:71286332d6f7 114 void Display::shutdownLED(void) {
us191 0:71286332d6f7 115 _greenLED.off(); _redLED.off(); _orangeLED.off();
us191 0:71286332d6f7 116 }
us191 0:71286332d6f7 117
us191 0:71286332d6f7 118 /** clear LCD screen
us191 0:71286332d6f7 119 * use by clear()
us191 0:71286332d6f7 120 */
us191 0:71286332d6f7 121 void Display::cls(void) {
us191 0:71286332d6f7 122 _lcd.cls();
us191 0:71286332d6f7 123 }
us191 0:71286332d6f7 124
us191 0:71286332d6f7 125 /** check if this message can be display correctly on LCD screen
us191 0:71286332d6f7 126 * use by printMessage()
us191 0:71286332d6f7 127 *
us191 0:71286332d6f7 128 * @param message the message to be verified
us191 0:71286332d6f7 129 * @return
us191 0:71286332d6f7 130 * true if message is ok
us191 0:71286332d6f7 131 * flase else
us191 0:71286332d6f7 132 */
us191 0:71286332d6f7 133 bool Display::checkMessage(string message) {
us191 0:71286332d6f7 134 // check message length (don't exceed screen capacity)
us191 0:71286332d6f7 135 unsigned int screenSize = _lcd.columns() * _lcd.rows();
us191 0:71286332d6f7 136 if (message.length() > screenSize)
us191 0:71286332d6f7 137 return false;
us191 0:71286332d6f7 138
us191 0:71286332d6f7 139 // check number of '\n'
us191 0:71286332d6f7 140 // TextLCD is circular, so if we are on last line, a '\n' we come back on first line
us191 0:71286332d6f7 141 int nbCRLF = this->calculNbCRLF(message);
us191 0:71286332d6f7 142 if (nbCRLF >= _lcd.rows())
us191 0:71286332d6f7 143 return false;
us191 0:71286332d6f7 144
us191 0:71286332d6f7 145 // check all line length (don't exceed column capacity)
us191 0:71286332d6f7 146 std::vector<std::string> allLine = this->subAllLine(message);
us191 0:71286332d6f7 147 int lineLength;
us191 0:71286332d6f7 148 for (unsigned int i = 0; i < allLine.size(); i++) {
us191 0:71286332d6f7 149 lineLength = allLine[i].length();
us191 0:71286332d6f7 150 if (lineLength > _lcd.columns())
us191 0:71286332d6f7 151 return false;
us191 0:71286332d6f7 152 }
us191 0:71286332d6f7 153
us191 0:71286332d6f7 154
us191 0:71286332d6f7 155 return true;
us191 0:71286332d6f7 156 }
us191 0:71286332d6f7 157
us191 0:71286332d6f7 158 /** calcul number of '\n'
us191 0:71286332d6f7 159 * use by checkMessage()
us191 0:71286332d6f7 160 *
us191 0:71286332d6f7 161 * @param message the message to be analyse
us191 0:71286332d6f7 162 * @return number of '\n'
us191 0:71286332d6f7 163 */
us191 0:71286332d6f7 164 int Display::calculNbCRLF(string message) {
us191 0:71286332d6f7 165 unsigned int index = 0, nbCRLF = 0;
us191 0:71286332d6f7 166
us191 0:71286332d6f7 167 while ((index = message.find('\n', index)) != std::string::npos) { // npos is a static member constant of string,
us191 0:71286332d6f7 168 nbCRLF++; // defined with a value of -1
us191 0:71286332d6f7 169 index++;
us191 0:71286332d6f7 170 }
us191 0:71286332d6f7 171
us191 0:71286332d6f7 172 return nbCRLF;
us191 0:71286332d6f7 173 }
us191 0:71286332d6f7 174
us191 0:71286332d6f7 175 /** return vector of all line message
us191 0:71286332d6f7 176 * use by checkMessage()
us191 0:71286332d6f7 177 *
us191 0:71286332d6f7 178 * @param message the message to be cut
us191 0:71286332d6f7 179 * @return a vector which contains a line of the message by entry
us191 0:71286332d6f7 180 */
us191 0:71286332d6f7 181 vector<string> Display::subAllLine(string message) {
us191 0:71286332d6f7 182 std::vector<std::string> allLine;
us191 0:71286332d6f7 183 unsigned int index = 0, indexNext = 0;
us191 0:71286332d6f7 184
us191 0:71286332d6f7 185 // get next '\n' from last position
us191 0:71286332d6f7 186 while ((indexNext = message.find('\n', index)) != std::string::npos) {
us191 0:71286332d6f7 187 // sub new line (with '\n')
us191 0:71286332d6f7 188 allLine.push_back(message.substr(index, indexNext-index+1));
us191 0:71286332d6f7 189 // go to next line
us191 0:71286332d6f7 190 index = indexNext + 1;
us191 0:71286332d6f7 191 }
us191 0:71286332d6f7 192
us191 0:71286332d6f7 193 // get last line
us191 0:71286332d6f7 194 allLine.push_back(message.substr(index));
us191 0:71286332d6f7 195
us191 0:71286332d6f7 196 return allLine;
us191 0:71286332d6f7 197 }