Stream text on the LCD_DISCO_F746NG TFT screeen.
Dependencies: BSP_DISCO_F746NG
TftStream.h@2:805972c861f4, 2018-12-04 (annotated)
- Committer:
- simon_stm
- Date:
- Tue Dec 04 14:21:59 2018 +0000
- Revision:
- 2:805972c861f4
- Parent:
- 1:c8b8be3c4741
Change text color
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 | 1:c8b8be3c4741 | 7 | /* |
simon_stm | 1:c8b8be3c4741 | 8 | * TFTSTREAM DEMO: |
simon_stm | 1:c8b8be3c4741 | 9 | |
simon_stm | 1:c8b8be3c4741 | 10 | #include "mbed.h" |
simon_stm | 1:c8b8be3c4741 | 11 | #include "TftStream.h" |
simon_stm | 1:c8b8be3c4741 | 12 | |
simon_stm | 1:c8b8be3c4741 | 13 | |
simon_stm | 1:c8b8be3c4741 | 14 | int main() |
simon_stm | 1:c8b8be3c4741 | 15 | { |
simon_stm | 1:c8b8be3c4741 | 16 | TftStream tft_out; |
simon_stm | 1:c8b8be3c4741 | 17 | LCD_DISCO_F746NG& lcd = tft_out.getLcd(); |
simon_stm | 1:c8b8be3c4741 | 18 | |
simon_stm | 1:c8b8be3c4741 | 19 | tft_out << "TftStream_demo for DISCOVERY STM32F746NG\n\n"; |
simon_stm | 1:c8b8be3c4741 | 20 | wait(1); |
simon_stm | 1:c8b8be3c4741 | 21 | |
simon_stm | 1:c8b8be3c4741 | 22 | while(1) { |
simon_stm | 1:c8b8be3c4741 | 23 | wait(0.5); |
simon_stm | 1:c8b8be3c4741 | 24 | for (int i = 0; i < 30; ++i) { |
simon_stm | 1:c8b8be3c4741 | 25 | tft_out << i << " slow output\n"; |
simon_stm | 1:c8b8be3c4741 | 26 | wait(0.1); |
simon_stm | 1:c8b8be3c4741 | 27 | } |
simon_stm | 1:c8b8be3c4741 | 28 | wait(0.1); |
simon_stm | 1:c8b8be3c4741 | 29 | |
simon_stm | 1:c8b8be3c4741 | 30 | for (int i = 0; i < 30; ++i) { |
simon_stm | 1:c8b8be3c4741 | 31 | tft_out << i << " fast output\n"; |
simon_stm | 1:c8b8be3c4741 | 32 | wait(0.01); |
simon_stm | 1:c8b8be3c4741 | 33 | } |
simon_stm | 1:c8b8be3c4741 | 34 | wait(0.1); |
simon_stm | 1:c8b8be3c4741 | 35 | |
simon_stm | 1:c8b8be3c4741 | 36 | for (int i = 0; i < 30; ++i) { |
simon_stm | 1:c8b8be3c4741 | 37 | tft_out << i << " very fast output\n"; |
simon_stm | 1:c8b8be3c4741 | 38 | } |
simon_stm | 1:c8b8be3c4741 | 39 | wait(0.1); |
simon_stm | 1:c8b8be3c4741 | 40 | |
simon_stm | 1:c8b8be3c4741 | 41 | tft_out << "\n\nsome\n\nnewlines\n"; |
simon_stm | 1:c8b8be3c4741 | 42 | wait(0.5); |
simon_stm | 1:c8b8be3c4741 | 43 | tft_out << "this is a looooooooooooooooooooooooooooooooooooooooong text\n"; |
simon_stm | 1:c8b8be3c4741 | 44 | wait(0.5); |
simon_stm | 1:c8b8be3c4741 | 45 | |
simon_stm | 2:805972c861f4 | 46 | lcd.SetTextColor(LCD_COLOR_YELLOW); |
simon_stm | 1:c8b8be3c4741 | 47 | tft_out << "HAVE FUN !!!\n"; |
simon_stm | 1:c8b8be3c4741 | 48 | wait(1); |
simon_stm | 1:c8b8be3c4741 | 49 | |
simon_stm | 1:c8b8be3c4741 | 50 | tft_out.clear(); |
simon_stm | 1:c8b8be3c4741 | 51 | tft_out.resetFont(); |
simon_stm | 1:c8b8be3c4741 | 52 | wait(2); |
simon_stm | 1:c8b8be3c4741 | 53 | } |
simon_stm | 1:c8b8be3c4741 | 54 | } |
simon_stm | 1:c8b8be3c4741 | 55 | */ |
simon_stm | 1:c8b8be3c4741 | 56 | |
simon_stm | 0:ad0cf038ea33 | 57 | |
simon_stm | 0:ad0cf038ea33 | 58 | //Serial pc(SERIAL_TX, SERIAL_RX); // DEBUG |
simon_stm | 0:ad0cf038ea33 | 59 | |
simon_stm | 0:ad0cf038ea33 | 60 | class TftStream |
simon_stm | 0:ad0cf038ea33 | 61 | { |
simon_stm | 0:ad0cf038ea33 | 62 | public: |
simon_stm | 0:ad0cf038ea33 | 63 | // init empty screen with default font |
simon_stm | 0:ad0cf038ea33 | 64 | TftStream() |
simon_stm | 0:ad0cf038ea33 | 65 | : |
simon_stm | 0:ad0cf038ea33 | 66 | lineLengthMax(28), |
simon_stm | 0:ad0cf038ea33 | 67 | lineCntMax(11) |
simon_stm | 0:ad0cf038ea33 | 68 | { |
simon_stm | 0:ad0cf038ea33 | 69 | _lcd.Clear(LCD_COLOR_BLUE); |
simon_stm | 0:ad0cf038ea33 | 70 | resetFont(); |
simon_stm | 0:ad0cf038ea33 | 71 | } |
simon_stm | 0:ad0cf038ea33 | 72 | |
simon_stm | 0:ad0cf038ea33 | 73 | // use this like std::cout: TftStream stream; stream << "i:" << i << "\n"; |
simon_stm | 0:ad0cf038ea33 | 74 | // the screen is only updated if there is a newline '\n' at the end |
simon_stm | 0:ad0cf038ea33 | 75 | template<typename T> |
simon_stm | 0:ad0cf038ea33 | 76 | TftStream& operator <<(const T& arg) |
simon_stm | 0:ad0cf038ea33 | 77 | { |
simon_stm | 0:ad0cf038ea33 | 78 | _streamBuffer << arg; |
simon_stm | 0:ad0cf038ea33 | 79 | |
simon_stm | 0:ad0cf038ea33 | 80 | const bool newLineAtEnd = *(_streamBuffer.str().end() - 1) == '\n'; |
simon_stm | 0:ad0cf038ea33 | 81 | |
simon_stm | 0:ad0cf038ea33 | 82 | if (newLineAtEnd == false) |
simon_stm | 0:ad0cf038ea33 | 83 | { |
simon_stm | 0:ad0cf038ea33 | 84 | return *this; |
simon_stm | 0:ad0cf038ea33 | 85 | } |
simon_stm | 0:ad0cf038ea33 | 86 | |
simon_stm | 0:ad0cf038ea33 | 87 | addNewLinesFromBuffer(); |
simon_stm | 0:ad0cf038ea33 | 88 | |
simon_stm | 0:ad0cf038ea33 | 89 | while (_linesNew.size() > 1) |
simon_stm | 0:ad0cf038ea33 | 90 | { |
simon_stm | 0:ad0cf038ea33 | 91 | newLineToSrceenLines(); |
simon_stm | 0:ad0cf038ea33 | 92 | drawLines(); |
simon_stm | 0:ad0cf038ea33 | 93 | } |
simon_stm | 0:ad0cf038ea33 | 94 | |
simon_stm | 0:ad0cf038ea33 | 95 | if (newLineAtEnd) |
simon_stm | 0:ad0cf038ea33 | 96 | { |
simon_stm | 0:ad0cf038ea33 | 97 | newLineToSrceenLines(); |
simon_stm | 0:ad0cf038ea33 | 98 | drawLines(); |
simon_stm | 0:ad0cf038ea33 | 99 | } |
simon_stm | 0:ad0cf038ea33 | 100 | |
simon_stm | 0:ad0cf038ea33 | 101 | return *this; |
simon_stm | 0:ad0cf038ea33 | 102 | } |
simon_stm | 0:ad0cf038ea33 | 103 | |
simon_stm | 0:ad0cf038ea33 | 104 | // get the underlying screen object for direct manipulation |
simon_stm | 0:ad0cf038ea33 | 105 | LCD_DISCO_F746NG& getLcd() |
simon_stm | 0:ad0cf038ea33 | 106 | { |
simon_stm | 0:ad0cf038ea33 | 107 | return _lcd; |
simon_stm | 0:ad0cf038ea33 | 108 | } |
simon_stm | 0:ad0cf038ea33 | 109 | |
simon_stm | 0:ad0cf038ea33 | 110 | // clear the screen |
simon_stm | 0:ad0cf038ea33 | 111 | void clear() |
simon_stm | 0:ad0cf038ea33 | 112 | { |
simon_stm | 0:ad0cf038ea33 | 113 | _lcd.Clear(LCD_COLOR_BLUE); |
simon_stm | 0:ad0cf038ea33 | 114 | _linesOnScreen.clear(); |
simon_stm | 0:ad0cf038ea33 | 115 | } |
simon_stm | 0:ad0cf038ea33 | 116 | |
simon_stm | 0:ad0cf038ea33 | 117 | // reset to default font |
simon_stm | 0:ad0cf038ea33 | 118 | void resetFont() |
simon_stm | 0:ad0cf038ea33 | 119 | { |
simon_stm | 0:ad0cf038ea33 | 120 | _lcd.SetBackColor(LCD_COLOR_BLUE); |
simon_stm | 0:ad0cf038ea33 | 121 | _lcd.SetTextColor(LCD_COLOR_WHITE); |
simon_stm | 0:ad0cf038ea33 | 122 | } |
simon_stm | 0:ad0cf038ea33 | 123 | |
simon_stm | 0:ad0cf038ea33 | 124 | private: |
simon_stm | 0:ad0cf038ea33 | 125 | void addNewLinesFromBuffer() |
simon_stm | 0:ad0cf038ea33 | 126 | { |
simon_stm | 0:ad0cf038ea33 | 127 | std::string line; |
simon_stm | 0:ad0cf038ea33 | 128 | std::istringstream lineStream(_streamBuffer.str()); |
simon_stm | 0:ad0cf038ea33 | 129 | _streamBuffer.str(""); |
simon_stm | 0:ad0cf038ea33 | 130 | |
simon_stm | 0:ad0cf038ea33 | 131 | while (std::getline(lineStream, line, '\n')) { |
simon_stm | 0:ad0cf038ea33 | 132 | if (line.empty()) |
simon_stm | 0:ad0cf038ea33 | 133 | { |
simon_stm | 0:ad0cf038ea33 | 134 | line = std::string(lineLengthMax, ' '); |
simon_stm | 0:ad0cf038ea33 | 135 | } |
simon_stm | 0:ad0cf038ea33 | 136 | |
simon_stm | 0:ad0cf038ea33 | 137 | for (unsigned i = 0; i < line.length(); i += lineLengthMax ) |
simon_stm | 0:ad0cf038ea33 | 138 | { |
simon_stm | 0:ad0cf038ea33 | 139 | std::string lineTrimmed = line.substr(i, lineLengthMax ); |
simon_stm | 0:ad0cf038ea33 | 140 | lineTrimmed = lineTrimmed += std::string(lineLengthMax - lineTrimmed.length(), ' '); |
simon_stm | 0:ad0cf038ea33 | 141 | _linesNew.push(lineTrimmed); |
simon_stm | 0:ad0cf038ea33 | 142 | //pc.printf(" line tr: '%s'\n", lineTrimmed.c_str()); |
simon_stm | 0:ad0cf038ea33 | 143 | } |
simon_stm | 0:ad0cf038ea33 | 144 | } |
simon_stm | 0:ad0cf038ea33 | 145 | } |
simon_stm | 0:ad0cf038ea33 | 146 | |
simon_stm | 0:ad0cf038ea33 | 147 | |
simon_stm | 0:ad0cf038ea33 | 148 | void drawLines() |
simon_stm | 0:ad0cf038ea33 | 149 | { |
simon_stm | 0:ad0cf038ea33 | 150 | int lineNb = 0; |
simon_stm | 0:ad0cf038ea33 | 151 | for (std::deque<std::string>::iterator lineIt = _linesOnScreen.begin(); lineIt != _linesOnScreen.end(); ++lineIt) |
simon_stm | 0:ad0cf038ea33 | 152 | { |
simon_stm | 0:ad0cf038ea33 | 153 | _lcd.DisplayStringAtLine(lineNb, (uint8_t *)(lineIt->c_str())); |
simon_stm | 0:ad0cf038ea33 | 154 | ++lineNb; |
simon_stm | 0:ad0cf038ea33 | 155 | } |
simon_stm | 0:ad0cf038ea33 | 156 | } |
simon_stm | 0:ad0cf038ea33 | 157 | |
simon_stm | 0:ad0cf038ea33 | 158 | |
simon_stm | 0:ad0cf038ea33 | 159 | void newLineToSrceenLines() |
simon_stm | 0:ad0cf038ea33 | 160 | { |
simon_stm | 0:ad0cf038ea33 | 161 | _linesOnScreen.push_back(_linesNew.front()); |
simon_stm | 0:ad0cf038ea33 | 162 | _linesNew.pop(); |
simon_stm | 0:ad0cf038ea33 | 163 | |
simon_stm | 0:ad0cf038ea33 | 164 | if(_linesOnScreen.size() > lineCntMax) |
simon_stm | 0:ad0cf038ea33 | 165 | { |
simon_stm | 0:ad0cf038ea33 | 166 | _linesOnScreen.pop_front(); |
simon_stm | 0:ad0cf038ea33 | 167 | } |
simon_stm | 0:ad0cf038ea33 | 168 | } |
simon_stm | 0:ad0cf038ea33 | 169 | |
simon_stm | 0:ad0cf038ea33 | 170 | |
simon_stm | 0:ad0cf038ea33 | 171 | const int lineLengthMax; |
simon_stm | 0:ad0cf038ea33 | 172 | const int lineCntMax; |
simon_stm | 0:ad0cf038ea33 | 173 | |
simon_stm | 0:ad0cf038ea33 | 174 | std::ostringstream _streamBuffer; |
simon_stm | 0:ad0cf038ea33 | 175 | std::queue<std::string> _linesNew; |
simon_stm | 0:ad0cf038ea33 | 176 | std::deque<std::string> _linesOnScreen; |
simon_stm | 0:ad0cf038ea33 | 177 | LCD_DISCO_F746NG _lcd; |
simon_stm | 0:ad0cf038ea33 | 178 | }; |