sl@2: #include "minidisplay.h" sl@5: #include sl@9: #include sl@9: sl@9: const int KMaxReadAttempt=100; sl@2: sl@2: MiniDisplay::MiniDisplay(QQuickItem *parent): sl@15: QQuickItem(parent),iReadAttempt(0),iBrightness(iDisplay.MaxBrightness()) sl@2: { sl@2: // By default, QQuickItem does not draw anything. If you subclass sl@2: // QQuickItem to create a visual item, you will need to uncomment the sl@2: // following line and re-implement updatePaintNode() sl@2: sl@2: // setFlag(ItemHasContents, true); sl@3: // sl@4: //qDebug() << "New MiniDisplay"; sl@2: } sl@2: sl@2: MiniDisplay::~MiniDisplay() sl@2: { sl@4: //qDebug() << "Delete MiniDisplay"; sl@11: close(); sl@2: } sl@2: sl@4: sl@4: void MiniDisplay::open() sl@4: { sl@4: if (iDisplay.Open()) sl@4: { sl@10: iDisplay.SetBrightness(iBrightness); sl@5: emit opened(); sl@5: emit statusChanged(); sl@4: } sl@4: else sl@4: { sl@5: emit openError(); sl@4: } sl@4: } sl@4: sl@4: sl@4: void MiniDisplay::close() sl@4: { sl@11: //qDebug() << "MiniDisplay::close"; sl@11: //Try to put back ourframe position to RAM 0,0 which is a multiple of 128 sl@11: if (iDisplay.IsOpen()) sl@11: { sl@11: emit closing(); sl@11: sl@11: if (iDisplay.DisplayPositionY()%128!=0) sl@11: { sl@11: //qDebug() << "SwapBuffer to put back our frame position to zero " << iDisplay.DisplayPositionY(); sl@11: iDisplay.SwapBuffers(); sl@11: } sl@11: } sl@4: iDisplay.Close(); sl@5: emit closed(); sl@5: emit statusChanged(); sl@4: } sl@4: sl@4: bool MiniDisplay::isOpen() sl@4: { sl@4: return iDisplay.IsOpen(); sl@4: } sl@4: sl@4: void MiniDisplay::clear() sl@4: { sl@4: if (!iDisplay.IsOpen()) return; sl@4: // sl@4: iDisplay.Clear(); sl@4: } sl@4: sl@4: void MiniDisplay::fill() sl@4: { sl@4: if (!iDisplay.IsOpen()) return; sl@4: // sl@4: iDisplay.SetAllPixels(0xFF); sl@4: } sl@4: sl@4: void MiniDisplay::swapBuffers() sl@4: { sl@4: if (!iDisplay.IsOpen()) return; sl@4: // sl@4: iDisplay.SwapBuffers(); sl@4: } sl@5: sl@9: void MiniDisplay::requestPowerStatus() sl@9: { sl@9: if (!iDisplay.IsOpen()) return; sl@9: sl@9: iDisplay.RequestPowerSupplyStatus(); sl@9: QTimer::singleShot(4, this, SLOT(readTimer())); sl@9: iReadAttempt=0; sl@9: } sl@9: sl@9: void MiniDisplay::requestDeviceId() sl@9: { sl@9: if (!iDisplay.IsOpen()) return; sl@9: sl@9: iDisplay.RequestDeviceId(); sl@9: QTimer::singleShot(4, this, SLOT(readTimer())); sl@9: iReadAttempt=0; sl@9: } sl@9: sl@9: void MiniDisplay::requestFirmwareVersion() sl@9: { sl@9: if (!iDisplay.IsOpen()) return; sl@9: sl@9: iDisplay.RequestFirmwareRevision(); sl@9: QTimer::singleShot(4, this, SLOT(readTimer())); sl@9: iReadAttempt=0; sl@9: } sl@9: sl@9: sl@9: sl@5: /** sl@5: * @brief setFont sl@5: * @param aFont sl@5: */ sl@5: void MiniDisplay::setFont(const QFont& aFont) sl@5: { sl@5: iFont=aFont; sl@6: iFont.setStyleStrategy(QFont::NoAntialias); sl@5: QString strDemo="0123456789ABCDEF"; sl@5: QFontMetrics metrics(iFont); sl@14: int w=metrics.boundingRect(strDemo).width(); sl@6: int h=metrics.height(); sl@14: //int h=metrics.boundingRect(strDemo).height(); sl@6: QSize size(w,h); sl@12: //Rendering in mono is quite broken we need RGB32 sl@12: QImage image(size,QImage::Format_RGB32); sl@5: image.fill(0xFFFFFFFF); sl@6: //Draw some text into our image sl@5: { sl@5: QPainter painter(&image); sl@5: painter.setPen(0xFF000000); sl@5: painter.setFont(iFont); sl@5: painter.drawText(0,metrics.ascent(),strDemo); sl@5: } sl@6: //Save image as PNG for validation sl@15: //image.save("font.png"); sl@6: // sl@15: renderImage(&image); sl@15: } sl@15: sl@15: /** sl@15: * @brief MiniDisplay::renderWindow sl@15: */ sl@15: void MiniDisplay::renderOwnWindow() sl@15: { sl@15: QImage image=window()->grabWindow(); sl@15: //image.save("window.png"); sl@15: renderImage(&image); sl@15: } sl@15: sl@15: /** sl@15: * @brief MiniDisplay::render sl@15: * @param aWindow sl@15: */ sl@15: void MiniDisplay::renderWindow(QQuickWindow* aWindow) sl@15: { sl@15: QImage image=aWindow->grabWindow(); sl@15: //image.save("window.png"); sl@15: renderImage(&image); sl@15: } sl@15: sl@15: /** sl@15: * @brief MiniDisplay::render sl@15: * @param aImage sl@15: */ sl@15: void MiniDisplay::renderImage(QImage* aImage) sl@15: { sl@15: if (!iDisplay.IsOpen()) sl@15: { sl@15: return; sl@15: } sl@15: sl@15: //Convert our image into a bit array sl@15: int w=aImage->width(); sl@15: int h=aImage->height(); sl@15: sl@6: int pixelCount=w*h; sl@6: BitArray bits(pixelCount); sl@6: sl@6: for (int i=0;ipixel(i,j); sl@6: if (color!=0xffffffff) sl@6: { sl@6: bits.SetBit(i*h+j); sl@6: } sl@6: } sl@6: } sl@6: sl@15: //Just blit it then sl@15: iDisplay.BitBlit(bits,w,h,0,0); sl@5: } sl@8: sl@15: /** sl@15: * @brief MiniDisplay::vendor sl@15: * @return sl@15: */ sl@8: QString MiniDisplay::vendor() sl@8: { sl@8: return QString::fromWCharArray(iDisplay.Vendor()); sl@8: } sl@8: sl@15: /** sl@15: * @brief MiniDisplay::product sl@15: * @return sl@15: */ sl@8: QString MiniDisplay::product() sl@8: { sl@8: return QString::fromWCharArray(iDisplay.Product()); sl@8: } sl@8: sl@15: /** sl@15: * @brief MiniDisplay::serialNumber sl@15: * @return sl@15: */ sl@8: QString MiniDisplay::serialNumber() sl@8: { sl@8: return QString::fromWCharArray(iDisplay.SerialNumber()); sl@8: } sl@8: sl@9: /** sl@9: * @brief MiniDisplay::readTimer sl@10: * Called when our read timer completes. sl@10: * We then attempt to complete our pending display request. sl@10: * We typically attempt to read an input report from our HID device. sl@9: */ sl@9: void MiniDisplay::readTimer() sl@9: { sl@9: if (!iDisplay.IsOpen()) return; sl@9: if (!iDisplay.RequestPending()) return; sl@8: sl@9: iReadAttempt++; sl@9: GP1212A01A::Request request = iDisplay.AttemptRequestCompletion(); sl@9: sl@9: if (!request) sl@9: { sl@9: if (iReadAttempt