Stream text on the LCD_DISCO_F746NG TFT screeen.

Dependencies:   BSP_DISCO_F746NG

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?

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