MiniDisplay/minidisplay.cpp
author sl
Wed, 28 May 2014 15:23:41 +0200
changeset 9 52372bbbc0f8
parent 8 9543e1703afb
child 10 64cfde8062c7
permissions -rw-r--r--
Now supporting read request for device ID, firmware version and power status.
sl@2
     1
#include "minidisplay.h"
sl@5
     2
#include <QPainter>
sl@9
     3
#include <QTimer>
sl@9
     4
sl@9
     5
const int KMaxReadAttempt=100;
sl@2
     6
sl@2
     7
MiniDisplay::MiniDisplay(QQuickItem *parent):
sl@9
     8
    QQuickItem(parent),iReadAttempt(0)
sl@2
     9
{
sl@2
    10
    // By default, QQuickItem does not draw anything. If you subclass
sl@2
    11
    // QQuickItem to create a visual item, you will need to uncomment the
sl@2
    12
    // following line and re-implement updatePaintNode()
sl@2
    13
sl@2
    14
    // setFlag(ItemHasContents, true);
sl@3
    15
    //
sl@4
    16
    //qDebug() << "New MiniDisplay";
sl@2
    17
}
sl@2
    18
sl@2
    19
MiniDisplay::~MiniDisplay()
sl@2
    20
{
sl@4
    21
    //qDebug() << "Delete MiniDisplay";
sl@2
    22
}
sl@2
    23
sl@4
    24
sl@4
    25
void MiniDisplay::open()
sl@4
    26
{
sl@4
    27
    if (iDisplay.Open())
sl@4
    28
    {
sl@5
    29
        emit opened();
sl@5
    30
        emit statusChanged();
sl@4
    31
    }
sl@4
    32
    else
sl@4
    33
    {
sl@5
    34
        emit openError();
sl@4
    35
    }
sl@4
    36
}
sl@4
    37
sl@4
    38
sl@4
    39
void MiniDisplay::close()
sl@4
    40
{
sl@4
    41
    iDisplay.Close();
sl@5
    42
    emit closed();
sl@5
    43
    emit statusChanged();
sl@4
    44
}
sl@4
    45
sl@4
    46
bool MiniDisplay::isOpen()
sl@4
    47
{
sl@4
    48
    return iDisplay.IsOpen();
sl@4
    49
}
sl@4
    50
sl@4
    51
void MiniDisplay::clear()
sl@4
    52
{
sl@4
    53
    if (!iDisplay.IsOpen()) return;
sl@4
    54
    //
sl@4
    55
    iDisplay.Clear();
sl@4
    56
}
sl@4
    57
sl@4
    58
void MiniDisplay::fill()
sl@4
    59
{
sl@4
    60
    if (!iDisplay.IsOpen()) return;
sl@4
    61
    //
sl@4
    62
    iDisplay.SetAllPixels(0xFF);
sl@4
    63
}
sl@4
    64
sl@4
    65
void MiniDisplay::swapBuffers()
sl@4
    66
{
sl@4
    67
    if (!iDisplay.IsOpen()) return;
sl@4
    68
    //
sl@4
    69
    iDisplay.SwapBuffers();
sl@4
    70
}
sl@5
    71
sl@9
    72
void MiniDisplay::requestPowerStatus()
sl@9
    73
{
sl@9
    74
    if (!iDisplay.IsOpen()) return;
sl@9
    75
sl@9
    76
    iDisplay.RequestPowerSupplyStatus();
sl@9
    77
    QTimer::singleShot(4, this, SLOT(readTimer()));
sl@9
    78
    iReadAttempt=0;
sl@9
    79
}
sl@9
    80
sl@9
    81
void MiniDisplay::requestDeviceId()
sl@9
    82
{
sl@9
    83
    if (!iDisplay.IsOpen()) return;
sl@9
    84
sl@9
    85
    iDisplay.RequestDeviceId();
sl@9
    86
    QTimer::singleShot(4, this, SLOT(readTimer()));
sl@9
    87
    iReadAttempt=0;
sl@9
    88
}
sl@9
    89
sl@9
    90
void MiniDisplay::requestFirmwareVersion()
sl@9
    91
{
sl@9
    92
    if (!iDisplay.IsOpen()) return;
sl@9
    93
sl@9
    94
    iDisplay.RequestFirmwareRevision();
sl@9
    95
    QTimer::singleShot(4, this, SLOT(readTimer()));
sl@9
    96
    iReadAttempt=0;
sl@9
    97
}
sl@9
    98
sl@9
    99
sl@9
   100
sl@5
   101
/**
sl@5
   102
 * @brief setFont
sl@5
   103
 * @param aFont
sl@5
   104
 */
sl@5
   105
void MiniDisplay::setFont(const QFont& aFont)
sl@5
   106
{
sl@5
   107
    iFont=aFont;
sl@6
   108
    iFont.setStyleStrategy(QFont::NoAntialias);
sl@5
   109
    QString strDemo="0123456789ABCDEF";
sl@5
   110
    QFontMetrics metrics(iFont);
sl@6
   111
    int w=metrics.width(strDemo);
sl@6
   112
    int h=metrics.height();
sl@6
   113
    QSize size(w,h);
sl@5
   114
    QImage image(size,QImage::Format_Mono);
sl@5
   115
    image.fill(0xFFFFFFFF);
sl@6
   116
    //Draw some text into our image
sl@5
   117
    {
sl@5
   118
        QPainter painter(&image);
sl@5
   119
        //painter.begin(&image);
sl@5
   120
        painter.setPen(0xFF000000);
sl@5
   121
        painter.setFont(iFont);
sl@5
   122
        painter.drawText(0,metrics.ascent(),strDemo);
sl@5
   123
    }
sl@6
   124
    //Save image as PNG for validation
sl@5
   125
    image.save("font.png");
sl@6
   126
    //
sl@6
   127
    //int sizeInBytes=image.byteCount();
sl@6
   128
    int pixelCount=w*h;
sl@6
   129
    BitArray bits(pixelCount);
sl@6
   130
sl@6
   131
    for (int i=0;i<w;i++)
sl@6
   132
        {
sl@6
   133
        for (int j=0;j<h;j++)
sl@6
   134
            {
sl@6
   135
            QRgb color=image.pixel(i,j);
sl@6
   136
            if (color!=0xffffffff)
sl@6
   137
                {
sl@6
   138
                bits.SetBit(i*h+j);
sl@6
   139
                }
sl@6
   140
            }
sl@6
   141
        }
sl@6
   142
sl@8
   143
    if (iDisplay.IsOpen())
sl@8
   144
    {
sl@8
   145
        iDisplay.Clear();
sl@8
   146
        iDisplay.BitBlit(bits,w,h,0,0);
sl@8
   147
        iDisplay.SwapBuffers();
sl@8
   148
    }
sl@6
   149
    //
sl@5
   150
}
sl@8
   151
sl@8
   152
sl@8
   153
QString MiniDisplay::vendor()
sl@8
   154
{
sl@8
   155
    return QString::fromWCharArray(iDisplay.Vendor());
sl@8
   156
}
sl@8
   157
sl@8
   158
QString MiniDisplay::product()
sl@8
   159
{
sl@8
   160
    return QString::fromWCharArray(iDisplay.Product());
sl@8
   161
}
sl@8
   162
sl@8
   163
QString MiniDisplay::serialNumber()
sl@8
   164
{
sl@8
   165
    return QString::fromWCharArray(iDisplay.SerialNumber());
sl@8
   166
}
sl@8
   167
sl@9
   168
/**
sl@9
   169
 * @brief MiniDisplay::readTimer
sl@9
   170
 */
sl@9
   171
void MiniDisplay::readTimer()
sl@9
   172
{
sl@9
   173
    if (!iDisplay.IsOpen()) return;
sl@9
   174
    if (!iDisplay.RequestPending()) return;
sl@8
   175
sl@9
   176
    iReadAttempt++;
sl@9
   177
    GP1212A01A::Request request = iDisplay.AttemptRequestCompletion();
sl@9
   178
sl@9
   179
    if (!request)
sl@9
   180
    {
sl@9
   181
        if (iReadAttempt<KMaxReadAttempt)
sl@9
   182
        {
sl@9
   183
            //Will try again later
sl@9
   184
            QTimer::singleShot(4, this, SLOT(readTimer()));
sl@9
   185
        }
sl@9
   186
sl@9
   187
        return;
sl@9
   188
    }
sl@9
   189
sl@9
   190
    //TODO: Find a way to remove device specific stuff from here
sl@9
   191
    if (request==GP1212A01A::ERequestFirmwareRevision)
sl@9
   192
    {
sl@9
   193
        QString version=QString::fromLocal8Bit((const char*)iDisplay.InputReport().Buffer()+1);
sl@9
   194
        emit firmwareVersion(version);
sl@9
   195
    }
sl@9
   196
    else if (request==GP1212A01A::ERequestDeviceId)
sl@9
   197
    {
sl@9
   198
        QString id=QString::fromLocal8Bit((const char*)iDisplay.InputReport().Buffer()+1);
sl@9
   199
        emit deviceId(id);
sl@9
   200
    }
sl@9
   201
    else if (request==GP1212A01A::ERequestPowerSupplyStatus)
sl@9
   202
    {
sl@9
   203
        emit powerStatus(iDisplay.PowerOn());
sl@9
   204
    }
sl@9
   205
}
sl@9
   206