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