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