MiniDisplay/minidisplay.cpp
author sl
Wed, 28 May 2014 17:08:47 +0200
changeset 10 64cfde8062c7
parent 9 52372bbbc0f8
child 11 b935de604982
permissions -rw-r--r--
Adding brightness slider and an option to connect display on start-up.
Both brightness and connect options are persisted.
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@10
     8
    QQuickItem(parent),iReadAttempt(0),iBrightness(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@10
    29
        iDisplay.SetBrightness(iBrightness);
sl@5
    30
        emit opened();
sl@5
    31
        emit statusChanged();
sl@4
    32
    }
sl@4
    33
    else
sl@4
    34
    {
sl@5
    35
        emit openError();
sl@4
    36
    }
sl@4
    37
}
sl@4
    38
sl@4
    39
sl@4
    40
void MiniDisplay::close()
sl@4
    41
{
sl@4
    42
    iDisplay.Close();
sl@5
    43
    emit closed();
sl@5
    44
    emit statusChanged();
sl@4
    45
}
sl@4
    46
sl@4
    47
bool MiniDisplay::isOpen()
sl@4
    48
{
sl@4
    49
    return iDisplay.IsOpen();
sl@4
    50
}
sl@4
    51
sl@4
    52
void MiniDisplay::clear()
sl@4
    53
{
sl@4
    54
    if (!iDisplay.IsOpen()) return;
sl@4
    55
    //
sl@4
    56
    iDisplay.Clear();
sl@4
    57
}
sl@4
    58
sl@4
    59
void MiniDisplay::fill()
sl@4
    60
{
sl@4
    61
    if (!iDisplay.IsOpen()) return;
sl@4
    62
    //
sl@4
    63
    iDisplay.SetAllPixels(0xFF);
sl@4
    64
}
sl@4
    65
sl@4
    66
void MiniDisplay::swapBuffers()
sl@4
    67
{
sl@4
    68
    if (!iDisplay.IsOpen()) return;
sl@4
    69
    //
sl@4
    70
    iDisplay.SwapBuffers();
sl@4
    71
}
sl@5
    72
sl@9
    73
void MiniDisplay::requestPowerStatus()
sl@9
    74
{
sl@9
    75
    if (!iDisplay.IsOpen()) return;
sl@9
    76
sl@9
    77
    iDisplay.RequestPowerSupplyStatus();
sl@9
    78
    QTimer::singleShot(4, this, SLOT(readTimer()));
sl@9
    79
    iReadAttempt=0;
sl@9
    80
}
sl@9
    81
sl@9
    82
void MiniDisplay::requestDeviceId()
sl@9
    83
{
sl@9
    84
    if (!iDisplay.IsOpen()) return;
sl@9
    85
sl@9
    86
    iDisplay.RequestDeviceId();
sl@9
    87
    QTimer::singleShot(4, this, SLOT(readTimer()));
sl@9
    88
    iReadAttempt=0;
sl@9
    89
}
sl@9
    90
sl@9
    91
void MiniDisplay::requestFirmwareVersion()
sl@9
    92
{
sl@9
    93
    if (!iDisplay.IsOpen()) return;
sl@9
    94
sl@9
    95
    iDisplay.RequestFirmwareRevision();
sl@9
    96
    QTimer::singleShot(4, this, SLOT(readTimer()));
sl@9
    97
    iReadAttempt=0;
sl@9
    98
}
sl@9
    99
sl@9
   100
sl@9
   101
sl@5
   102
/**
sl@5
   103
 * @brief setFont
sl@5
   104
 * @param aFont
sl@5
   105
 */
sl@5
   106
void MiniDisplay::setFont(const QFont& aFont)
sl@5
   107
{
sl@5
   108
    iFont=aFont;
sl@6
   109
    iFont.setStyleStrategy(QFont::NoAntialias);
sl@5
   110
    QString strDemo="0123456789ABCDEF";
sl@5
   111
    QFontMetrics metrics(iFont);
sl@6
   112
    int w=metrics.width(strDemo);
sl@6
   113
    int h=metrics.height();
sl@6
   114
    QSize size(w,h);
sl@5
   115
    QImage image(size,QImage::Format_Mono);
sl@5
   116
    image.fill(0xFFFFFFFF);
sl@6
   117
    //Draw some text into our image
sl@5
   118
    {
sl@5
   119
        QPainter painter(&image);
sl@5
   120
        //painter.begin(&image);
sl@5
   121
        painter.setPen(0xFF000000);
sl@5
   122
        painter.setFont(iFont);
sl@5
   123
        painter.drawText(0,metrics.ascent(),strDemo);
sl@5
   124
    }
sl@6
   125
    //Save image as PNG for validation
sl@5
   126
    image.save("font.png");
sl@6
   127
    //
sl@6
   128
    //int sizeInBytes=image.byteCount();
sl@6
   129
    int pixelCount=w*h;
sl@6
   130
    BitArray bits(pixelCount);
sl@6
   131
sl@6
   132
    for (int i=0;i<w;i++)
sl@6
   133
        {
sl@6
   134
        for (int j=0;j<h;j++)
sl@6
   135
            {
sl@6
   136
            QRgb color=image.pixel(i,j);
sl@6
   137
            if (color!=0xffffffff)
sl@6
   138
                {
sl@6
   139
                bits.SetBit(i*h+j);
sl@6
   140
                }
sl@6
   141
            }
sl@6
   142
        }
sl@6
   143
sl@8
   144
    if (iDisplay.IsOpen())
sl@8
   145
    {
sl@8
   146
        iDisplay.Clear();
sl@8
   147
        iDisplay.BitBlit(bits,w,h,0,0);
sl@8
   148
        iDisplay.SwapBuffers();
sl@8
   149
    }
sl@6
   150
    //
sl@5
   151
}
sl@8
   152
sl@8
   153
sl@8
   154
QString MiniDisplay::vendor()
sl@8
   155
{
sl@8
   156
    return QString::fromWCharArray(iDisplay.Vendor());
sl@8
   157
}
sl@8
   158
sl@8
   159
QString MiniDisplay::product()
sl@8
   160
{
sl@8
   161
    return QString::fromWCharArray(iDisplay.Product());
sl@8
   162
}
sl@8
   163
sl@8
   164
QString MiniDisplay::serialNumber()
sl@8
   165
{
sl@8
   166
    return QString::fromWCharArray(iDisplay.SerialNumber());
sl@8
   167
}
sl@8
   168
sl@9
   169
/**
sl@9
   170
 * @brief MiniDisplay::readTimer
sl@10
   171
 * Called when our read timer completes.
sl@10
   172
 * We then attempt to complete our pending display request.
sl@10
   173
 * We typically attempt to read an input report from our HID device.
sl@9
   174
 */
sl@9
   175
void MiniDisplay::readTimer()
sl@9
   176
{
sl@9
   177
    if (!iDisplay.IsOpen()) return;
sl@9
   178
    if (!iDisplay.RequestPending()) return;
sl@8
   179
sl@9
   180
    iReadAttempt++;
sl@9
   181
    GP1212A01A::Request request = iDisplay.AttemptRequestCompletion();
sl@9
   182
sl@9
   183
    if (!request)
sl@9
   184
    {
sl@9
   185
        if (iReadAttempt<KMaxReadAttempt)
sl@9
   186
        {
sl@9
   187
            //Will try again later
sl@9
   188
            QTimer::singleShot(4, this, SLOT(readTimer()));
sl@9
   189
        }
sl@9
   190
sl@9
   191
        return;
sl@9
   192
    }
sl@9
   193
sl@9
   194
    //TODO: Find a way to remove device specific stuff from here
sl@9
   195
    if (request==GP1212A01A::ERequestFirmwareRevision)
sl@9
   196
    {
sl@9
   197
        QString version=QString::fromLocal8Bit((const char*)iDisplay.InputReport().Buffer()+1);
sl@9
   198
        emit firmwareVersion(version);
sl@9
   199
    }
sl@9
   200
    else if (request==GP1212A01A::ERequestDeviceId)
sl@9
   201
    {
sl@9
   202
        QString id=QString::fromLocal8Bit((const char*)iDisplay.InputReport().Buffer()+1);
sl@9
   203
        emit deviceId(id);
sl@9
   204
    }
sl@9
   205
    else if (request==GP1212A01A::ERequestPowerSupplyStatus)
sl@9
   206
    {
sl@9
   207
        emit powerStatus(iDisplay.PowerOn());
sl@9
   208
    }
sl@9
   209
}
sl@9
   210
sl@10
   211
sl@10
   212
int MiniDisplay::maxBrightness() const
sl@10
   213
{
sl@10
   214
    return iDisplay.MaxBrightness();
sl@10
   215
}
sl@10
   216
sl@10
   217
int MiniDisplay::minBrightness() const
sl@10
   218
{
sl@10
   219
    return iDisplay.MinBrightness();
sl@10
   220
}
sl@10
   221
sl@10
   222
int MiniDisplay::brightness() const
sl@10
   223
{
sl@10
   224
    return iBrightness;
sl@10
   225
}
sl@10
   226
sl@10
   227
void MiniDisplay::setBrightness(int aBrightness)
sl@10
   228
{
sl@10
   229
    //Still track the brightness when disconnected
sl@10
   230
    iBrightness=aBrightness;
sl@10
   231
sl@10
   232
    if (!iDisplay.IsOpen()) return;
sl@10
   233
sl@10
   234
    iDisplay.SetBrightness(aBrightness);
sl@10
   235
}
sl@10
   236
sl@10
   237