Stream text on the LCD_DISCO_F746NG TFT screeen.

Dependencies:   BSP_DISCO_F746NG

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?

UserRevisionLine numberNew 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 };