Trying to get rid of our QML timer.
We now connect to our window after animation signal from C++.
It looks like it works much better now. Less UI lags smother animation.
1 #include "minidisplay.h"
5 const int KMaxReadAttempt=100;
7 MiniDisplay::MiniDisplay(QQuickItem *parent):
8 QQuickItem(parent),iReadAttempt(0),iBrightness(iDisplay.MaxBrightness())
10 // By default, QQuickItem does not draw anything. If you subclass
11 // QQuickItem to create a visual item, you will need to uncomment the
12 // following line and re-implement updatePaintNode()
14 // setFlag(ItemHasContents, true);
16 //qDebug() << "New MiniDisplay";
19 MiniDisplay::~MiniDisplay()
21 //qDebug() << "Delete MiniDisplay";
26 void MiniDisplay::open()
30 iDisplay.SetBrightness(iBrightness);
41 void MiniDisplay::close()
43 //qDebug() << "MiniDisplay::close";
44 //Try to put back ourframe position to RAM 0,0 which is a multiple of 128
45 if (iDisplay.IsOpen())
49 if (iDisplay.DisplayPositionY()%128!=0)
51 //qDebug() << "SwapBuffer to put back our frame position to zero " << iDisplay.DisplayPositionY();
52 iDisplay.SwapBuffers();
60 bool MiniDisplay::isOpen()
62 return iDisplay.IsOpen();
65 void MiniDisplay::clear()
67 if (!iDisplay.IsOpen()) return;
72 void MiniDisplay::fill()
74 if (!iDisplay.IsOpen()) return;
76 iDisplay.SetAllPixels(0xFF);
79 void MiniDisplay::swapBuffers()
81 if (!iDisplay.IsOpen()) return;
83 iDisplay.SwapBuffers();
86 void MiniDisplay::requestPowerStatus()
88 if (!iDisplay.IsOpen()) return;
90 iDisplay.RequestPowerSupplyStatus();
91 QTimer::singleShot(4, this, SLOT(readTimer()));
95 void MiniDisplay::requestDeviceId()
97 if (!iDisplay.IsOpen()) return;
99 iDisplay.RequestDeviceId();
100 QTimer::singleShot(4, this, SLOT(readTimer()));
104 void MiniDisplay::requestFirmwareVersion()
106 if (!iDisplay.IsOpen()) return;
108 iDisplay.RequestFirmwareRevision();
109 QTimer::singleShot(4, this, SLOT(readTimer()));
119 void MiniDisplay::setFont(const QFont& aFont)
122 iFont.setStyleStrategy(QFont::NoAntialias);
123 QString strDemo="0123456789ABCDEF";
124 QFontMetrics metrics(iFont);
125 int w=metrics.boundingRect(strDemo).width();
126 int h=metrics.height();
127 //int h=metrics.boundingRect(strDemo).height();
129 //Rendering in mono is quite broken we need RGB32
130 QImage image(size,QImage::Format_RGB32);
131 image.fill(0xFFFFFFFF);
132 //Draw some text into our image
134 QPainter painter(&image);
135 painter.setPen(0xFF000000);
136 painter.setFont(iFont);
137 painter.drawText(0,metrics.ascent(),strDemo);
139 //Save image as PNG for validation
140 //image.save("font.png");
146 * @brief MiniDisplay::renderWindow
148 void MiniDisplay::renderOwnWindow()
150 QImage image=window()->grabWindow();
151 //image.save("window.png");
156 * @brief MiniDisplay::render
159 void MiniDisplay::renderWindow(QQuickWindow* aWindow)
161 QImage image=aWindow->grabWindow();
162 //image.save("window.png");
167 * @brief MiniDisplay::render
170 void MiniDisplay::renderImage(QImage* aImage)
172 if (!iDisplay.IsOpen())
177 //Convert our image into a bit array
178 int w=aImage->width();
179 int h=aImage->height();
182 BitArray bits(pixelCount);
184 for (int i=0;i<w;i++)
186 for (int j=0;j<h;j++)
188 QRgb color=aImage->pixel(i,j);
189 if (color!=0xffffffff)
197 iDisplay.BitBlit(bits,w,h,0,0);
202 * @brief MiniDisplay::connectWindow
205 void MiniDisplay::connectWindow(QQuickWindow* aWindow, QJSValue aFunction)
207 QObject::connect(aWindow, SIGNAL(afterAnimating()),
208 this, SLOT(onAfterAnimating()));
210 iAfterAnimatingCallback = aFunction;
215 * @brief MiniDisplay::onAfterAnimating
217 void MiniDisplay::onAfterAnimating()
220 qDebug() << frame << "MiniDisplay::onAfterAnimating";
222 if (iAfterAnimatingCallback.isCallable())
224 iAfterAnimatingCallback.call();
227 renderWindow(iWindow);
230 //Interrestingly rendering will suspend when we stop changing our text field content
233 if (iAfterAnimatingCallback.isCallable())
235 iAfterAnimatingCallback.call(QJSValueList() << frame);
244 * @brief MiniDisplay::setPixel
249 void MiniDisplay::setPixel(int x, int y, bool on)
251 if (!iDisplay.IsOpen())
256 iDisplay.SetPixel(x,y,on);
260 * @brief MiniDisplay::offScreenMode
263 bool MiniDisplay::offScreenMode()
265 return iDisplay.OffScreenMode();
269 * @brief MiniDisplay::setOffScreenMode
272 void MiniDisplay::setOffScreenMode(bool aOn)
274 if (!iDisplay.IsOpen())
279 iDisplay.SetOffScreenMode(aOn);
286 * @brief MiniDisplay::vendor
289 QString MiniDisplay::vendor()
291 return QString::fromWCharArray(iDisplay.Vendor());
295 * @brief MiniDisplay::product
298 QString MiniDisplay::product()
300 return QString::fromWCharArray(iDisplay.Product());
304 * @brief MiniDisplay::serialNumber
307 QString MiniDisplay::serialNumber()
309 return QString::fromWCharArray(iDisplay.SerialNumber());
313 * @brief MiniDisplay::readTimer
314 * Called when our read timer completes.
315 * We then attempt to complete our pending display request.
316 * We typically attempt to read an input report from our HID device.
318 void MiniDisplay::readTimer()
320 if (!iDisplay.IsOpen()) return;
321 if (!iDisplay.RequestPending()) return;
324 GP1212A01A::Request request = iDisplay.AttemptRequestCompletion();
328 if (iReadAttempt<KMaxReadAttempt)
330 //Will try again later
331 QTimer::singleShot(4, this, SLOT(readTimer()));
337 //TODO: Find a way to remove device specific stuff from here
338 if (request==GP1212A01A::ERequestFirmwareRevision)
340 QString version=QString::fromLocal8Bit((const char*)iDisplay.InputReport().Buffer()+1);
341 emit firmwareVersion(version);
343 else if (request==GP1212A01A::ERequestDeviceId)
345 QString id=QString::fromLocal8Bit((const char*)iDisplay.InputReport().Buffer()+1);
348 else if (request==GP1212A01A::ERequestPowerSupplyStatus)
350 emit powerStatus(iDisplay.PowerOn());
355 int MiniDisplay::maxBrightness() const
357 return iDisplay.MaxBrightness();
360 int MiniDisplay::minBrightness() const
362 return iDisplay.MinBrightness();
365 int MiniDisplay::brightness() const
370 void MiniDisplay::setBrightness(int aBrightness)
372 //Still track the brightness when disconnected
373 iBrightness=aBrightness;
375 if (!iDisplay.IsOpen()) return;
377 iDisplay.SetBrightness(aBrightness);
381 @brief MiniDisplay::frameDifferencing
384 bool MiniDisplay::frameDifferencing() const
386 return iDisplay.FrameDifferencing();
390 @brief MiniDisplay::setFrameDifferencing
393 void MiniDisplay::setFrameDifferencing(bool aOn)
395 iDisplay.SetFrameDifferencing(aOn);
399 QPoint MiniDisplay::framePosition() const
401 return QPoint(iDisplay.DisplayPositionX(),iDisplay.DisplayPositionX());
404 void MiniDisplay::setFramePosition(const QPoint& aPoint)
406 iFramePosition = aPoint;
408 if (!iDisplay.IsOpen()) return;
410 iDisplay.SetDisplayPosition(aPoint.x(),aPoint.y());