Stream text on the LCD_DISCO_F746NG TFT screeen.

Dependencies:   BSP_DISCO_F746NG

Revision:
0:ad0cf038ea33
Child:
1:c8b8be3c4741
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TftStream.h	Tue Dec 04 14:05:31 2018 +0000
@@ -0,0 +1,128 @@
+#include "mbed.h"
+#include "LCD_DISCO_F746NG.h"
+
+#include <sstream>
+#include <queue>
+
+
+//Serial pc(SERIAL_TX, SERIAL_RX); // DEBUG
+
+class TftStream
+{
+public:
+    // init empty screen with default font
+    TftStream()
+    :
+    lineLengthMax(28),
+    lineCntMax(11)
+    {
+        _lcd.Clear(LCD_COLOR_BLUE); 
+        resetFont();
+    }
+
+    // use this like std::cout: TftStream stream; stream << "i:" << i << "\n";
+    // the screen is only updated if there is a newline '\n' at the end
+    template<typename T>
+    TftStream& operator <<(const T& arg) 
+    {
+        _streamBuffer << arg;
+        
+        const bool newLineAtEnd = *(_streamBuffer.str().end() - 1) == '\n';
+        
+        if (newLineAtEnd == false)
+        {
+            return *this;
+        }
+
+        addNewLinesFromBuffer();
+
+        while (_linesNew.size() > 1)
+        {
+            newLineToSrceenLines();
+            drawLines();
+        }
+        
+        if (newLineAtEnd)
+        {
+            newLineToSrceenLines();
+            drawLines();
+        }
+            
+        return *this;
+    }
+    
+    // get the underlying screen object for direct manipulation
+    LCD_DISCO_F746NG& getLcd()
+    {
+        return _lcd;
+    }
+    
+    // clear the screen
+    void clear()
+    {
+        _lcd.Clear(LCD_COLOR_BLUE);       
+        _linesOnScreen.clear();
+    }
+    
+    // reset to default font
+    void resetFont()
+    {
+        _lcd.SetBackColor(LCD_COLOR_BLUE);
+        _lcd.SetTextColor(LCD_COLOR_WHITE);
+    }
+    
+private:
+    void addNewLinesFromBuffer()
+    {
+        std::string line;
+        std::istringstream lineStream(_streamBuffer.str());
+        _streamBuffer.str("");
+        
+        while (std::getline(lineStream, line, '\n')) {
+            if (line.empty())
+            {
+                line = std::string(lineLengthMax, ' ');
+            }
+            
+            for (unsigned i = 0; i < line.length(); i += lineLengthMax ) 
+            {
+                std::string lineTrimmed = line.substr(i, lineLengthMax );
+                lineTrimmed = lineTrimmed += std::string(lineLengthMax - lineTrimmed.length(), ' ');
+                _linesNew.push(lineTrimmed);
+                //pc.printf("  line tr: '%s'\n", lineTrimmed.c_str());
+            }
+        }
+    }
+    
+    
+    void drawLines()
+    {
+        int lineNb = 0;
+        for (std::deque<std::string>::iterator lineIt = _linesOnScreen.begin(); lineIt != _linesOnScreen.end(); ++lineIt)
+        {
+            _lcd.DisplayStringAtLine(lineNb, (uint8_t *)(lineIt->c_str()));
+            ++lineNb;
+        }         
+    }
+    
+    
+    void newLineToSrceenLines()
+    {
+        _linesOnScreen.push_back(_linesNew.front());
+        _linesNew.pop();
+        
+        if(_linesOnScreen.size() > lineCntMax)
+        {
+            _linesOnScreen.pop_front();
+        }       
+    }
+    
+    
+    const int lineLengthMax;
+    const int lineCntMax;
+      
+    std::ostringstream      _streamBuffer;
+    std::queue<std::string> _linesNew;
+    std::deque<std::string> _linesOnScreen;
+    LCD_DISCO_F746NG        _lcd;    
+};
\ No newline at end of file