Adding MiniDisplay methods to display image and window.
authorsl
Thu, 29 May 2014 14:27:08 +0200
changeset 15737f8bb110be
parent 14 9903a5edeb56
child 16 35f01a0d460a
Adding MiniDisplay methods to display image and window.
Using our test tab to render our display frame in QML and send it to our display.
Using a timer and frame counter to profile our performance.
DisplayFrame.qml
FontsTab.qml
Manager.pro
MiniDisplay/minidisplay.cpp
MiniDisplay/minidisplay.h
TestsTab.qml
qml.qrc
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/DisplayFrame.qml	Thu May 29 14:27:08 2014 +0200
     1.3 @@ -0,0 +1,7 @@
     1.4 +import QtQuick 2.0
     1.5 +
     1.6 +Rectangle {
     1.7 +    width: 256
     1.8 +    height: 64
     1.9 +    color: red
    1.10 +}
     2.1 --- a/FontsTab.qml	Wed May 28 21:31:03 2014 +0200
     2.2 +++ b/FontsTab.qml	Thu May 29 14:27:08 2014 +0200
     2.3 @@ -34,7 +34,9 @@
     2.4          onAccepted: {
     2.5              //console.log("Accepted: " + font);
     2.6              textFontDemoLowerCase.font = currentFont;
     2.7 +            display.clear();
     2.8              display.font = currentFont;
     2.9 +            display.swapBuffers();
    2.10              //textFontDemoUpperCase.font = currentFont;
    2.11              //textFontDemoDigits.font = currentFont;
    2.12          }
     3.1 --- a/Manager.pro	Wed May 28 21:31:03 2014 +0200
     3.2 +++ b/Manager.pro	Thu May 29 14:27:08 2014 +0200
     3.3 @@ -23,4 +23,5 @@
     3.4      main.qml \
     3.5      TestsTab.qml \
     3.6      DisplayTab.qml \
     3.7 -    DisplayStatusBar.qml
     3.8 +    DisplayStatusBar.qml \
     3.9 +    DisplayFrame.qml
     4.1 --- a/MiniDisplay/minidisplay.cpp	Wed May 28 21:31:03 2014 +0200
     4.2 +++ b/MiniDisplay/minidisplay.cpp	Thu May 29 14:27:08 2014 +0200
     4.3 @@ -5,7 +5,7 @@
     4.4  const int KMaxReadAttempt=100;
     4.5  
     4.6  MiniDisplay::MiniDisplay(QQuickItem *parent):
     4.7 -    QQuickItem(parent),iReadAttempt(0),iBrightness(0)
     4.8 +    QQuickItem(parent),iReadAttempt(0),iBrightness(iDisplay.MaxBrightness())
     4.9  {
    4.10      // By default, QQuickItem does not draw anything. If you subclass
    4.11      // QQuickItem to create a visual item, you will need to uncomment the
    4.12 @@ -137,9 +137,47 @@
    4.13          painter.drawText(0,metrics.ascent(),strDemo);
    4.14      }
    4.15      //Save image as PNG for validation
    4.16 -    image.save("font.png");
    4.17 +    //image.save("font.png");
    4.18      //
    4.19 -    //int sizeInBytes=image.byteCount();
    4.20 +    renderImage(&image);
    4.21 +}
    4.22 +
    4.23 +/**
    4.24 + * @brief MiniDisplay::renderWindow
    4.25 + */
    4.26 +void MiniDisplay::renderOwnWindow()
    4.27 +{
    4.28 +    QImage image=window()->grabWindow();
    4.29 +    //image.save("window.png");
    4.30 +    renderImage(&image);
    4.31 +}
    4.32 +
    4.33 +/**
    4.34 + * @brief MiniDisplay::render
    4.35 + * @param aWindow
    4.36 + */
    4.37 +void MiniDisplay::renderWindow(QQuickWindow* aWindow)
    4.38 +{
    4.39 +    QImage image=aWindow->grabWindow();
    4.40 +    //image.save("window.png");
    4.41 +    renderImage(&image);
    4.42 +}
    4.43 +
    4.44 +/**
    4.45 + * @brief MiniDisplay::render
    4.46 + * @param aImage
    4.47 + */
    4.48 +void MiniDisplay::renderImage(QImage* aImage)
    4.49 +{
    4.50 +    if (!iDisplay.IsOpen())
    4.51 +    {
    4.52 +        return;
    4.53 +    }
    4.54 +
    4.55 +    //Convert our image into a bit array
    4.56 +    int w=aImage->width();
    4.57 +    int h=aImage->height();
    4.58 +
    4.59      int pixelCount=w*h;
    4.60      BitArray bits(pixelCount);
    4.61  
    4.62 @@ -147,7 +185,7 @@
    4.63          {
    4.64          for (int j=0;j<h;j++)
    4.65              {
    4.66 -            QRgb color=image.pixel(i,j);
    4.67 +            QRgb color=aImage->pixel(i,j);
    4.68              if (color!=0xffffffff)
    4.69                  {
    4.70                  bits.SetBit(i*h+j);
    4.71 @@ -155,26 +193,32 @@
    4.72              }
    4.73          }
    4.74  
    4.75 -    if (iDisplay.IsOpen())
    4.76 -    {
    4.77 -        iDisplay.Clear();
    4.78 -        iDisplay.BitBlit(bits,w,h,0,0);
    4.79 -        iDisplay.SwapBuffers();
    4.80 -    }
    4.81 -    //
    4.82 +    //Just blit it then
    4.83 +    iDisplay.BitBlit(bits,w,h,0,0);
    4.84  }
    4.85  
    4.86 -
    4.87 +/**
    4.88 + * @brief MiniDisplay::vendor
    4.89 + * @return
    4.90 + */
    4.91  QString MiniDisplay::vendor()
    4.92  {
    4.93      return QString::fromWCharArray(iDisplay.Vendor());
    4.94  }
    4.95  
    4.96 +/**
    4.97 + * @brief MiniDisplay::product
    4.98 + * @return
    4.99 + */
   4.100  QString MiniDisplay::product()
   4.101  {
   4.102      return QString::fromWCharArray(iDisplay.Product());
   4.103  }
   4.104  
   4.105 +/**
   4.106 + * @brief MiniDisplay::serialNumber
   4.107 + * @return
   4.108 + */
   4.109  QString MiniDisplay::serialNumber()
   4.110  {
   4.111      return QString::fromWCharArray(iDisplay.SerialNumber());
     5.1 --- a/MiniDisplay/minidisplay.h	Wed May 28 21:31:03 2014 +0200
     5.2 +++ b/MiniDisplay/minidisplay.h	Thu May 29 14:27:08 2014 +0200
     5.3 @@ -2,6 +2,7 @@
     5.4  #define MINIDISPLAY_H
     5.5  
     5.6  #include <QQuickItem>
     5.7 +#include <QQuickWindow>
     5.8  #include "FutabaVfd.h"
     5.9  
    5.10  class MiniDisplay : public QQuickItem
    5.11 @@ -32,6 +33,10 @@
    5.12      Q_INVOKABLE void requestDeviceId();
    5.13      Q_INVOKABLE void requestFirmwareVersion();
    5.14  
    5.15 +    Q_INVOKABLE void renderOwnWindow();
    5.16 +    Q_INVOKABLE void renderWindow(QQuickWindow* aWindow);
    5.17 +    Q_INVOKABLE void renderImage(QImage* aImage);
    5.18 +
    5.19  public:
    5.20      //Properties
    5.21      bool isOpen();
     6.1 --- a/TestsTab.qml	Wed May 28 21:31:03 2014 +0200
     6.2 +++ b/TestsTab.qml	Thu May 29 14:27:08 2014 +0200
     6.3 @@ -1,10 +1,109 @@
     6.4  import QtQuick 2.2
     6.5  import QtQuick.Controls 1.2
     6.6 +import QtQuick.Window 2.1
     6.7 +import MiniDisplay 1.0
     6.8 +import QtQuick.Layouts 1.1
     6.9 +
    6.10  
    6.11  Item {
    6.12 -    width: 100
    6.13 -    height: 62
    6.14 +    //width: 100
    6.15 +    //height: 62
    6.16      //SystemPalette { id: palette }
    6.17      clip: true
    6.18 +    //anchors.fill:parent
    6.19  
    6.20 +
    6.21 +
    6.22 +    Window {
    6.23 +        //parent: appWindow
    6.24 +        id: splash
    6.25 +        color: "transparent"
    6.26 +        title: "Splash Window"
    6.27 +        modality: Qt.NonModal
    6.28 +        flags: Qt.SplashScreen
    6.29 +        property int timeoutInterval: 41
    6.30 +        signal timeout
    6.31 +    //! [splash-properties]
    6.32 +    //! [screen-properties]
    6.33 +        x: (Screen.width - rectangleScreen.width) / 2
    6.34 +        y: (Screen.height - rectangleScreen.height) / 2
    6.35 +    //! [screen-properties]
    6.36 +        width: rectangleScreen.width
    6.37 +        height: rectangleScreen.height
    6.38 +        property int frameCounter:0;
    6.39 +        property var startTime:new Date();
    6.40 +
    6.41 +        Rectangle {
    6.42 +            id: rectangleScreen
    6.43 +            anchors.centerIn: parent
    6.44 +            width: 256
    6.45 +            height: 64
    6.46 +            color: "white"
    6.47 +            border.width:1
    6.48 +            border.color: "black"
    6.49 +            smooth: false
    6.50 +        }
    6.51 +
    6.52 +        ColumnLayout {
    6.53 +            anchors.fill:parent
    6.54 +            anchors.margins: 6
    6.55 +            spacing: 4
    6.56 +
    6.57 +            Label {
    6.58 +                id: labelFrameCount
    6.59 +                //anchors.centerIn: parent
    6.60 +                text: "Frame Count"
    6.61 +                antialiasing: false
    6.62 +            }
    6.63 +
    6.64 +            Label {
    6.65 +                id: labelTime
    6.66 +                //anchors.centerIn: parent
    6.67 +                text: "Time"
    6.68 +                antialiasing: false
    6.69 +            }
    6.70 +
    6.71 +        }
    6.72 +
    6.73 +
    6.74 +
    6.75 +
    6.76 +
    6.77 +        //! [timer]
    6.78 +        Timer {
    6.79 +            interval: splash.timeoutInterval; running: true; repeat: true
    6.80 +            onTriggered: {
    6.81 +                //visible = false
    6.82 +
    6.83 +                var current = new Date();
    6.84 +                var seconds = (current.getTime() - splash.startTime.getTime())/1000;
    6.85 +
    6.86 +                splash.frameCounter++;
    6.87 +                labelFrameCount.text=splash.frameCounter;
    6.88 +                labelTime.text=seconds;
    6.89 +                display.renderWindow(splash);
    6.90 +                display.swapBuffers();
    6.91 +                splash.timeout()
    6.92 +            }
    6.93 +        }
    6.94 +        //! [timer]
    6.95 +        Component.onCompleted: {
    6.96 +            visible = true
    6.97 +        }
    6.98 +
    6.99 +    }
   6.100 +
   6.101 +    Column {
   6.102 +        anchors.fill: parent
   6.103 +        anchors.margins: 8
   6.104 +        spacing: 8
   6.105 +
   6.106 +        Button {
   6.107 +            text: qsTr("Render Window")
   6.108 +            onClicked: {
   6.109 +                display.renderWindow(splash);
   6.110 +                display.swapBuffers();
   6.111 +            }
   6.112 +        }
   6.113 +    }
   6.114  }
     7.1 --- a/qml.qrc	Wed May 28 21:31:03 2014 +0200
     7.2 +++ b/qml.qrc	Thu May 29 14:27:08 2014 +0200
     7.3 @@ -5,5 +5,6 @@
     7.4          <file>TestsTab.qml</file>
     7.5          <file>DisplayTab.qml</file>
     7.6          <file>DisplayStatusBar.qml</file>
     7.7 +        <file>DisplayFrame.qml</file>
     7.8      </qresource>
     7.9  </RCC>