Stream text on the LCD_DISCO_F746NG TFT screeen.
Dependencies: BSP_DISCO_F746NG
TftStream.h@0:ad0cf038ea33, 2018-12-04 (annotated)
- Committer:
- simon_stm
- Date:
- Tue Dec 04 14:05:31 2018 +0000
- Revision:
- 0:ad0cf038ea33
- Child:
- 1:c8b8be3c4741
initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
simon_stm | 0:ad0cf038ea33 | 1 | #include "mbed.h" |
simon_stm | 0:ad0cf038ea33 | 2 | #include "LCD_DISCO_F746NG.h" |
simon_stm | 0:ad0cf038ea33 | 3 | |
simon_stm | 0:ad0cf038ea33 | 4 | #include <sstream> |
simon_stm | 0:ad0cf038ea33 | 5 | #include <queue> |
simon_stm | 0:ad0cf038ea33 | 6 | |
simon_stm | 0:ad0cf038ea33 | 7 | |
simon_stm | 0:ad0cf038ea33 | 8 | //Serial pc(SERIAL_TX, SERIAL_RX); // DEBUG |
simon_stm | 0:ad0cf038ea33 | 9 | |
simon_stm | 0:ad0cf038ea33 | 10 | class TftStream |
simon_stm | 0:ad0cf038ea33 | 11 | { |
simon_stm | 0:ad0cf038ea33 | 12 | public: |
simon_stm | 0:ad0cf038ea33 | 13 | // init empty screen with default font |
simon_stm | 0:ad0cf038ea33 | 14 | TftStream() |
simon_stm | 0:ad0cf038ea33 | 15 | : |
simon_stm | 0:ad0cf038ea33 | 16 | lineLengthMax(28), |
simon_stm | 0:ad0cf038ea33 | 17 | lineCntMax(11) |
simon_stm | 0:ad0cf038ea33 | 18 | { |
simon_stm | 0:ad0cf038ea33 | 19 | _lcd.Clear(LCD_COLOR_BLUE); |
simon_stm | 0:ad0cf038ea33 | 20 | resetFont(); |
simon_stm | 0:ad0cf038ea33 | 21 | } |
simon_stm | 0:ad0cf038ea33 | 22 | |
simon_stm | 0:ad0cf038ea33 | 23 | // use this like std::cout: TftStream stream; stream << "i:" << i << "\n"; |
simon_stm | 0:ad0cf038ea33 | 24 | // the screen is only updated if there is a newline '\n' at the end |
simon_stm | 0:ad0cf038ea33 | 25 | template<typename T> |
simon_stm | 0:ad0cf038ea33 | 26 | TftStream& operator <<(const T& arg) |
simon_stm | 0:ad0cf038ea33 | 27 | { |
simon_stm | 0:ad0cf038ea33 | 28 | _streamBuffer << arg; |
simon_stm | 0:ad0cf038ea33 | 29 | |
simon_stm | 0:ad0cf038ea33 | 30 | const bool newLineAtEnd = *(_streamBuffer.str().end() - 1) == '\n'; |
simon_stm | 0:ad0cf038ea33 | 31 | |
simon_stm | 0:ad0cf038ea33 | 32 | if (newLineAtEnd == false) |
simon_stm | 0:ad0cf038ea33 | 33 | { |
simon_stm | 0:ad0cf038ea33 | 34 | return *this; |
simon_stm | 0:ad0cf038ea33 | 35 | } |
simon_stm | 0:ad0cf038ea33 | 36 | |
simon_stm | 0:ad0cf038ea33 | 37 | addNewLinesFromBuffer(); |
simon_stm | 0:ad0cf038ea33 | 38 | |
simon_stm | 0:ad0cf038ea33 | 39 | while (_linesNew.size() > 1) |
simon_stm | 0:ad0cf038ea33 | 40 | { |
simon_stm | 0:ad0cf038ea33 | 41 | newLineToSrceenLines(); |
simon_stm | 0:ad0cf038ea33 | 42 | drawLines(); |
simon_stm | 0:ad0cf038ea33 | 43 | } |
simon_stm | 0:ad0cf038ea33 | 44 | |
simon_stm | 0:ad0cf038ea33 | 45 | if (newLineAtEnd) |
simon_stm | 0:ad0cf038ea33 | 46 | { |
simon_stm | 0:ad0cf038ea33 | 47 | newLineToSrceenLines(); |
simon_stm | 0:ad0cf038ea33 | 48 | drawLines(); |
simon_stm | 0:ad0cf038ea33 | 49 | } |
simon_stm | 0:ad0cf038ea33 | 50 | |
simon_stm | 0:ad0cf038ea33 | 51 | return *this; |
simon_stm | 0:ad0cf038ea33 | 52 | } |
simon_stm | 0:ad0cf038ea33 | 53 | |
simon_stm | 0:ad0cf038ea33 | 54 | // get the underlying screen object for direct manipulation |
simon_stm | 0:ad0cf038ea33 | 55 | LCD_DISCO_F746NG& getLcd() |
simon_stm | 0:ad0cf038ea33 | 56 | { |
simon_stm | 0:ad0cf038ea33 | 57 | return _lcd; |
simon_stm | 0:ad0cf038ea33 | 58 | } |
simon_stm | 0:ad0cf038ea33 | 59 | |
simon_stm | 0:ad0cf038ea33 | 60 | // clear the screen |
simon_stm | 0:ad0cf038ea33 | 61 | void clear() |
simon_stm | 0:ad0cf038ea33 | 62 | { |
simon_stm | 0:ad0cf038ea33 | 63 | _lcd.Clear(LCD_COLOR_BLUE); |
simon_stm | 0:ad0cf038ea33 | 64 | _linesOnScreen.clear(); |
simon_stm | 0:ad0cf038ea33 | 65 | } |
simon_stm | 0:ad0cf038ea33 | 66 | |
simon_stm | 0:ad0cf038ea33 | 67 | // reset to default font |
simon_stm | 0:ad0cf038ea33 | 68 | void resetFont() |
simon_stm | 0:ad0cf038ea33 | 69 | { |
simon_stm | 0:ad0cf038ea33 | 70 | _lcd.SetBackColor(LCD_COLOR_BLUE); |
simon_stm | 0:ad0cf038ea33 | 71 | _lcd.SetTextColor(LCD_COLOR_WHITE); |
simon_stm | 0:ad0cf038ea33 | 72 | } |
simon_stm | 0:ad0cf038ea33 | 73 | |
simon_stm | 0:ad0cf038ea33 | 74 | private: |
simon_stm | 0:ad0cf038ea33 | 75 | void addNewLinesFromBuffer() |
simon_stm | 0:ad0cf038ea33 | 76 | { |
simon_stm | 0:ad0cf038ea33 | 77 | std::string line; |
simon_stm | 0:ad0cf038ea33 | 78 | std::istringstream lineStream(_streamBuffer.str()); |
simon_stm | 0:ad0cf038ea33 | 79 | _streamBuffer.str(""); |
simon_stm | 0:ad0cf038ea33 | 80 | |
simon_stm | 0:ad0cf038ea33 | 81 | while (std::getline(lineStream, line, '\n')) { |
simon_stm | 0:ad0cf038ea33 | 82 | if (line.empty()) |
simon_stm | 0:ad0cf038ea33 | 83 | { |
simon_stm | 0:ad0cf038ea33 | 84 | line = std::string(lineLengthMax, ' '); |
simon_stm | 0:ad0cf038ea33 | 85 | } |
simon_stm | 0:ad0cf038ea33 | 86 | |
simon_stm | 0:ad0cf038ea33 | 87 | for (unsigned i = 0; i < line.length(); i += lineLengthMax ) |
simon_stm | 0:ad0cf038ea33 | 88 | { |
simon_stm | 0:ad0cf038ea33 | 89 | std::string lineTrimmed = line.substr(i, lineLengthMax ); |
simon_stm | 0:ad0cf038ea33 | 90 | lineTrimmed = lineTrimmed += std::string(lineLengthMax - lineTrimmed.length(), ' '); |
simon_stm | 0:ad0cf038ea33 | 91 | _linesNew.push(lineTrimmed); |
simon_stm | 0:ad0cf038ea33 | 92 | //pc.printf(" line tr: '%s'\n", lineTrimmed.c_str()); |
simon_stm | 0:ad0cf038ea33 | 93 | } |
simon_stm | 0:ad0cf038ea33 | 94 | } |
simon_stm | 0:ad0cf038ea33 | 95 | } |
simon_stm | 0:ad0cf038ea33 | 96 | |
simon_stm | 0:ad0cf038ea33 | 97 | |
simon_stm | 0:ad0cf038ea33 | 98 | void drawLines() |
simon_stm | 0:ad0cf038ea33 | 99 | { |
simon_stm | 0:ad0cf038ea33 | 100 | int lineNb = 0; |
simon_stm | 0:ad0cf038ea33 | 101 | for (std::deque<std::string>::iterator lineIt = _linesOnScreen.begin(); lineIt != _linesOnScreen.end(); ++lineIt) |
simon_stm | 0:ad0cf038ea33 | 102 | { |
simon_stm | 0:ad0cf038ea33 | 103 | _lcd.DisplayStringAtLine(lineNb, (uint8_t *)(lineIt->c_str())); |
simon_stm | 0:ad0cf038ea33 | 104 | ++lineNb; |
simon_stm | 0:ad0cf038ea33 | 105 | } |
simon_stm | 0:ad0cf038ea33 | 106 | } |
simon_stm | 0:ad0cf038ea33 | 107 | |
simon_stm | 0:ad0cf038ea33 | 108 | |
simon_stm | 0:ad0cf038ea33 | 109 | void newLineToSrceenLines() |
simon_stm | 0:ad0cf038ea33 | 110 | { |
simon_stm | 0:ad0cf038ea33 | 111 | _linesOnScreen.push_back(_linesNew.front()); |
simon_stm | 0:ad0cf038ea33 | 112 | _linesNew.pop(); |
simon_stm | 0:ad0cf038ea33 | 113 | |
simon_stm | 0:ad0cf038ea33 | 114 | if(_linesOnScreen.size() > lineCntMax) |
simon_stm | 0:ad0cf038ea33 | 115 | { |
simon_stm | 0:ad0cf038ea33 | 116 | _linesOnScreen.pop_front(); |
simon_stm | 0:ad0cf038ea33 | 117 | } |
simon_stm | 0:ad0cf038ea33 | 118 | } |
simon_stm | 0:ad0cf038ea33 | 119 | |
simon_stm | 0:ad0cf038ea33 | 120 | |
simon_stm | 0:ad0cf038ea33 | 121 | const int lineLengthMax; |
simon_stm | 0:ad0cf038ea33 | 122 | const int lineCntMax; |
simon_stm | 0:ad0cf038ea33 | 123 | |
simon_stm | 0:ad0cf038ea33 | 124 | std::ostringstream _streamBuffer; |
simon_stm | 0:ad0cf038ea33 | 125 | std::queue<std::string> _linesNew; |
simon_stm | 0:ad0cf038ea33 | 126 | std::deque<std::string> _linesOnScreen; |
simon_stm | 0:ad0cf038ea33 | 127 | LCD_DISCO_F746NG _lcd; |
simon_stm | 0:ad0cf038ea33 | 128 | }; |