Skip to content
Snippets Groups Projects
HUD.cc 55.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • pixhawk's avatar
    pixhawk committed
    
        if (yawInt > M_PI) yawInt = M_PI;
        if (yawInt < -M_PI) yawInt = -M_PI;
    
        float yawTrans = yawInt * (double)maxYawTrans;
        yawInt *= 0.6f;
        //qDebug() << "yaw translation" << yawTrans << "integral" << yawInt << "difference" << yawDiff << "yaw" << yaw << "asin(yawInt)" << asinYaw;
    
    
    pixhawk's avatar
    pixhawk committed
        painter.translate(0, (pitch/M_PI)* -180.0f * refToScreenY(1.8));
    
    pixhawk's avatar
    pixhawk committed
        painter.translate(refToScreenX(yawTrans), 0);
    
    
    pixhawk's avatar
    pixhawk committed
        // Rotate view and draw all roll-dependent indicators
        painter.rotate((roll/M_PI)* -180.0f);
    
    
    lm's avatar
    lm committed
        //qDebug() << "ROLL" << roll << "PITCH" << pitch << "YAW DIFF" << valuesDot.value("roll", 0.0f);
    
    pixhawk's avatar
    pixhawk committed
        // PITCH
    
        paintPitchLines((pitch/M_PI)*180.0f, &painter);
    
        painter.end();
    
        glFlush();
    
    
    
    pixhawk's avatar
    pixhawk committed
    
    /**
     * @param pitch pitch angle in degrees (-180 to 180)
     */
    void HUD::paintPitchLines(float pitch, QPainter* painter)
    {
        QString label;
    
        const float yDeg = vPitchPerDeg;
        const float lineDistance = 5.0f; ///< One pitch line every 10 degrees
        const float posIncrement = yDeg * lineDistance;
        float posY = posIncrement;
        const float posLimit = sqrt(pow(vwidth, 2.0f) + pow(vheight, 2.0f));
    
        const float offsetAbs = pitch * yDeg;
    
        float offset = pitch;
        if (offset < 0) offset = -offset;
        int offsetCount = 0;
    
        while (offset > lineDistance) {
    
    pixhawk's avatar
    pixhawk committed
            offset -= lineDistance;
            offsetCount++;
        }
    
        int iPos = (int)(0.5f + lineDistance); ///< The first line
        int iNeg = (int)(-0.5f - lineDistance); ///< The first line
    
        offset *= yDeg;
    
    
        painter->setPen(defaultColor);
    
        posY = -offsetAbs + posIncrement; //+ 100;// + lineDistance;
    
    
        while (posY < posLimit) {
    
    pixhawk's avatar
    pixhawk committed
            paintPitchLinePos(label.sprintf("%3d", iPos), 0.0f, -posY, painter);
            posY += posIncrement;
            iPos += (int)lineDistance;
        }
    
    
    
        // HORIZON
        //
        //    ------------    ------------
        //
        const float pitchWidth = 30.0f;
        const float pitchGap = pitchWidth / 2.5f;
        const QColor horizonColor = defaultColor;
        const float diagonal = sqrt(pow(vwidth, 2.0f) + pow(vheight, 2.0f));
        const float lineWidth = refLineWidthToPen(0.5f);
    
        // Left horizon
        drawLine(0.0f-diagonal, offsetAbs, 0.0f-pitchGap/2.0f, offsetAbs, lineWidth, horizonColor, painter);
        // Right horizon
        drawLine(0.0f+pitchGap/2.0f, offsetAbs, 0.0f+diagonal, offsetAbs, lineWidth, horizonColor, painter);
    
    
    
        label.clear();
    
        posY = offsetAbs  + posIncrement;
    
    
    
        while (posY < posLimit) {
    
    pixhawk's avatar
    pixhawk committed
            paintPitchLineNeg(label.sprintf("%3d", iNeg), 0.0f, posY, painter);
            posY += posIncrement;
            iNeg -= (int)lineDistance;
        }
    }
    
    void HUD::paintPitchLinePos(QString text, float refPosX, float refPosY, QPainter* painter)
    {
        //painter->setPen(QPen(QBrush, normalStrokeWidth));
    
        const float pitchWidth = 30.0f;
        const float pitchGap = pitchWidth / 2.5f;
        const float pitchHeight = pitchWidth / 12.0f;
        const float textSize = pitchHeight * 1.1f;
        const float lineWidth = 0.5f;
    
        // Positive pitch indicator:
        //
        //      _______      _______
        //     |10                  |
        //
    
        // Left vertical line
        drawLine(refPosX-pitchWidth/2.0f, refPosY, refPosX-pitchWidth/2.0f, refPosY+pitchHeight, lineWidth, defaultColor, painter);
        // Left horizontal line
        drawLine(refPosX-pitchWidth/2.0f, refPosY, refPosX-pitchGap/2.0f, refPosY, lineWidth, defaultColor, painter);
        // Text left
        paintText(text, defaultColor, textSize, refPosX-pitchWidth/2.0 + 0.75f, refPosY + pitchHeight - 1.75f, painter);
    
        // Right vertical line
        drawLine(refPosX+pitchWidth/2.0f, refPosY, refPosX+pitchWidth/2.0f, refPosY+pitchHeight, lineWidth, defaultColor, painter);
        // Right horizontal line
        drawLine(refPosX+pitchWidth/2.0f, refPosY, refPosX+pitchGap/2.0f, refPosY, lineWidth, defaultColor, painter);
    }
    
    void HUD::paintPitchLineNeg(QString text, float refPosX, float refPosY, QPainter* painter)
    {
        const float pitchWidth = 30.0f;
        const float pitchGap = pitchWidth / 2.5f;
        const float pitchHeight = pitchWidth / 12.0f;
        const float textSize = pitchHeight * 1.1f;
        const float segmentWidth = ((pitchWidth - pitchGap)/2.0f) / 7.0f; ///< Four lines and three gaps -> 7 segments
    
        const float lineWidth = 0.1f;
    
        // Negative pitch indicator:
        //
        //      -10
        //     _ _ _ _|     |_ _ _ _
        //
        //
    
        // Left vertical line
        drawLine(refPosX-pitchGap/2.0, refPosY, refPosX-pitchGap/2.0, refPosY-pitchHeight, lineWidth, defaultColor, painter);
        // Left horizontal line with four segments
    
        for (int i = 0; i < 7; i+=2) {
    
    pixhawk's avatar
    pixhawk committed
            drawLine(refPosX-pitchWidth/2.0+(i*segmentWidth), refPosY, refPosX-pitchWidth/2.0+(i*segmentWidth)+segmentWidth, refPosY, lineWidth, defaultColor, painter);
        }
        // Text left
        paintText(text, defaultColor, textSize, refPosX-pitchWidth/2.0f + 0.75f, refPosY + pitchHeight - 1.75f, painter);
    
        // Right vertical line
        drawLine(refPosX+pitchGap/2.0, refPosY, refPosX+pitchGap/2.0, refPosY-pitchHeight, lineWidth, defaultColor, painter);
        // Right horizontal line with four segments
    
        for (int i = 0; i < 7; i+=2) {
    
    pixhawk's avatar
    pixhawk committed
            drawLine(refPosX+pitchWidth/2.0f-(i*segmentWidth), refPosY, refPosX+pitchWidth/2.0f-(i*segmentWidth)-segmentWidth, refPosY, lineWidth, defaultColor, painter);
        }
    }
    
    void rotatePointClockWise(QPointF& p, float angle)
    {
        // Standard 2x2 rotation matrix, counter-clockwise
        //
        //   |  cos(phi)   sin(phi) |
        //   | -sin(phi)   cos(phi) |
        //
    
        //p.setX(cos(angle) * p.x() + sin(angle) * p.y());
        //p.setY(-sin(angle) * p.x() + cos(angle) * p.y());
    
    
        p.setX(cos(angle) * p.x() + sin(angle)* p.y());
        p.setY((-1.0f * sin(angle) * p.x()) + cos(angle) * p.y());
    }
    
    float HUD::refLineWidthToPen(float line)
    {
        return line * 2.50f;
    }
    
    /**
     * Rotate a polygon around a point
     *
     * @param p polygon to rotate
     * @param origin the rotation center
     * @param angle rotation angle, in radians
     * @return p Polygon p rotated by angle around the origin point
     */
    void HUD::rotatePolygonClockWiseRad(QPolygonF& p, float angle, QPointF origin)
    {
        // Standard 2x2 rotation matrix, counter-clockwise
        //
        //   |  cos(phi)   sin(phi) |
        //   | -sin(phi)   cos(phi) |
        //
    
        for (int i = 0; i < p.size(); i++) {
    
    pixhawk's avatar
    pixhawk committed
            QPointF curr = p.at(i);
    
            const float x = curr.x();
            const float y = curr.y();
    
            curr.setX(((cos(angle) * (x-origin.x())) + (-sin(angle) * (y-origin.y()))) + origin.x());
            curr.setY(((sin(angle) * (x-origin.x())) + (cos(angle) * (y-origin.y()))) + origin.y());
            p.replace(i, curr);
        }
    }
    
    void HUD::drawPolygon(QPolygonF refPolygon, QPainter* painter)
    {
        // Scale coordinates
        QPolygonF draw(refPolygon.size());
    
        for (int i = 0; i < refPolygon.size(); i++) {
    
    pixhawk's avatar
    pixhawk committed
            QPointF curr;
            curr.setX(refToScreenX(refPolygon.at(i).x()));
            curr.setY(refToScreenY(refPolygon.at(i).y()));
            draw.replace(i, curr);
        }
        painter->drawPolygon(draw);
    }
    
    void HUD::drawChangeRateStrip(float xRef, float yRef, float height, float minRate, float maxRate, float value, QPainter* painter)
    {
        QBrush brush(defaultColor, Qt::NoBrush);
        painter->setBrush(brush);
        QPen rectPen(Qt::SolidLine);
        rectPen.setWidth(0);
        rectPen.setColor(defaultColor);
        painter->setPen(rectPen);
    
        float scaledValue = value;
    
        // Saturate value
        if (value > maxRate) scaledValue = maxRate;
        if (value < minRate) scaledValue = minRate;
    
        //           x (Origin: xRef, yRef)
        //           -
        //           |
        //           |
        //           |
        //           =
        //           |
        //   -0.005 >|
        //           |
        //           -
    
        const float width = height / 8.0f;
        const float lineWidth = 0.5f;
    
        // Indicator lines
        // Top horizontal line
        drawLine(xRef, yRef, xRef+width, yRef, lineWidth, defaultColor, painter);
        // Vertical main line
        drawLine(xRef+width/2.0f, yRef, xRef+width/2.0f, yRef+height, lineWidth, defaultColor, painter);
        // Zero mark
        drawLine(xRef, yRef+height/2.0f, xRef+width, yRef+height/2.0f, lineWidth, defaultColor, painter);
        // Horizontal bottom line
        drawLine(xRef, yRef+height, xRef+width, yRef+height, lineWidth, defaultColor, painter);
    
        // Text
        QString label;
    
        label.sprintf("< %+06.2f", value);
    
    pixhawk's avatar
    pixhawk committed
        paintText(label, defaultColor, 3.0f, xRef+width/2.0f, yRef+height-((scaledValue - minRate)/(maxRate-minRate))*height - 1.6f, painter);
    }
    
    
    //void HUD::drawSystemIndicator(float xRef, float yRef, int maxNum, float maxWidth, float maxHeight, QPainter* painter)
    //{
    //    Q_UNUSED(maxWidth);
    //    Q_UNUSED(maxHeight);
    //    if (values.size() > 0)
    //    {
    //        QString selectedKey = values.begin().key();
    //        //   | | | | | |
    //        //   | | | | | |
    //        //   x speed: 2.54
    
    //        // One column per value
    //        QMapIterator<QString, float> value(values);
    
    //        float x = xRef;
    //        float y = yRef;
    
    //        const float vspacing = 1.0f;
    //        float width = 1.5f;
    //        float height = 1.5f;
    //        const float hspacing = 0.6f;
    
    //        // TODO ensure that instrument stays smaller than maxWidth and maxHeight
    
    
    //        int i = 0;
    //        while (value.hasNext() && i < maxNum)
    //        {
    //            value.next();
    //            QBrush brush(Qt::SolidPattern);
    
    
    //            if (value.value() < 0.01f && value.value() > -0.01f)
    //            {
    //                brush.setColor(Qt::gray);
    //            }
    //            else if (value.value() > 0.01f)
    //            {
    //                brush.setColor(Qt::blue);
    //            }
    //            else
    //            {
    //                brush.setColor(Qt::yellow);
    //            }
    
    //            painter->setBrush(brush);
    //            painter->setPen(Qt::NoPen);
    
    //            // Draw current value colormap
    //            painter->drawRect(refToScreenX(x), refToScreenY(y), refToScreenX(width), refToScreenY(height));
    
    //            // Draw change rate colormap
    //            painter->drawRect(refToScreenX(x), refToScreenY(y+height+hspacing), refToScreenX(width), refToScreenY(height));
    
    //            // Draw mean value colormap
    //            painter->drawRect(refToScreenX(x), refToScreenY(y+2.0f*(height+hspacing)), refToScreenX(width), refToScreenY(height));
    
    //            // Add spacing
    //            x += width+vspacing;
    
    //            // Iterate
    //            i++;
    //        }
    
    //        // Draw detail label
    //        QString detail = "NO DATA AVAILABLE";
    
    //        if (values.contains(selectedKey))
    //        {
    //            detail = values.find(selectedKey).key();
    //            detail.append(": ");
    //            detail.append(QString::number(values.find(selectedKey).value()));
    //        }
    //        paintText(detail, QColor(255, 255, 255), 3.0f, xRef, yRef+3.0f*(height+hspacing)+1.0f, painter);
    //    }
    //}
    
    pixhawk's avatar
    pixhawk committed
    
    void HUD::drawChangeIndicatorGauge(float xRef, float yRef, float radius, float expectedMaxChange, float value, const QColor& color, QPainter* painter, bool solid)
    {
        // Draw the circle
        QPen circlePen(Qt::SolidLine);
        if (!solid) circlePen.setStyle(Qt::DotLine);
        circlePen.setWidth(refLineWidthToPen(0.5f));
        circlePen.setColor(defaultColor);
        painter->setBrush(Qt::NoBrush);
        painter->setPen(circlePen);
        drawCircle(xRef, yRef, radius, 200.0f, 170.0f, 1.0f, color, painter);
    
        QString label;
        label.sprintf("%05.1f", value);
    
        // Draw the value
        paintText(label, color, 4.5f, xRef-7.5f, yRef-2.0f, painter);
    
        // Draw the needle
        // Scale the rotation so that the gauge does one revolution
        // per max. change
        const float rangeScale = (2.0f * M_PI) / expectedMaxChange;
        const float maxWidth = radius / 10.0f;
        const float minWidth = maxWidth * 0.3f;
    
        QPolygonF p(6);
    
        p.replace(0, QPointF(xRef-maxWidth/2.0f, yRef-radius * 0.5f));
        p.replace(1, QPointF(xRef-minWidth/2.0f, yRef-radius * 0.9f));
        p.replace(2, QPointF(xRef+minWidth/2.0f, yRef-radius * 0.9f));
        p.replace(3, QPointF(xRef+maxWidth/2.0f, yRef-radius * 0.5f));
        p.replace(4, QPointF(xRef,               yRef-radius * 0.46f));
        p.replace(5, QPointF(xRef-maxWidth/2.0f, yRef-radius * 0.5f));
    
        rotatePolygonClockWiseRad(p, value*rangeScale, QPointF(xRef, yRef));
    
        QBrush indexBrush;
        indexBrush.setColor(defaultColor);
        indexBrush.setStyle(Qt::SolidPattern);
        painter->setPen(Qt::SolidLine);
        painter->setPen(defaultColor);
        painter->setBrush(indexBrush);
        drawPolygon(p, painter);
    }
    
    void HUD::drawLine(float refX1, float refY1, float refX2, float refY2, float width, const QColor& color, QPainter* painter)
    {
        QPen pen(Qt::SolidLine);
        pen.setWidth(refLineWidthToPen(width));
        pen.setColor(color);
        painter->setPen(pen);
        painter->drawLine(QPoint(refToScreenX(refX1), refToScreenY(refY1)), QPoint(refToScreenX(refX2), refToScreenY(refY2)));
    }
    
    void HUD::drawEllipse(float refX, float refY, float radiusX, float radiusY, float startDeg, float endDeg, float lineWidth, const QColor& color, QPainter* painter)
    {
    
    lm's avatar
    lm committed
        Q_UNUSED(startDeg);
        Q_UNUSED(endDeg);
    
    pixhawk's avatar
    pixhawk committed
        QPen pen(painter->pen().style());
        pen.setWidth(refLineWidthToPen(lineWidth));
        pen.setColor(color);
        painter->setPen(pen);
        painter->drawEllipse(QPointF(refToScreenX(refX), refToScreenY(refY)), refToScreenX(radiusX), refToScreenY(radiusY));
    }
    
    void HUD::drawCircle(float refX, float refY, float radius, float startDeg, float endDeg, float lineWidth, const QColor& color, QPainter* painter)
    {
        drawEllipse(refX, refY, radius, radius, startDeg, endDeg, lineWidth, color, painter);
    }
    
    void HUD::resizeGL(int w, int h)
    {
        glViewport(0, 0, w, h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, w, 0, h, -1, 1);
        glMatrixMode(GL_MODELVIEW);
        glPolygonMode(GL_FRONT, GL_FILL);
    
    pixhawk's avatar
    pixhawk committed
    }
    
    
    void HUD::selectWaypoint(int uasId, int id)
    
    pixhawk's avatar
    pixhawk committed
    {
    
        Q_UNUSED(uasId);
        waypointName = tr("WP") + QString::number(id);
    
    pixhawk's avatar
    pixhawk committed
    }
    
    void HUD::setImageSize(int width, int height, int depth, int channels)
    {
        // Allocate raw image in correct size
    
        if (width != receivedWidth || height != receivedHeight || depth != receivedDepth || channels != receivedChannels || image == NULL) {
    
    pixhawk's avatar
    pixhawk committed
            // Set new size
            if (width > 0) receivedWidth  = width;
            if (height > 0) receivedHeight = height;
            if (depth > 1) receivedDepth = depth;
            if (channels > 1) receivedChannels = channels;
    
            rawExpectedBytes = (receivedWidth * receivedHeight * receivedDepth * receivedChannels) / 8;
            bytesPerLine = rawExpectedBytes / receivedHeight;
            // Delete old buffers if necessary
            rawImage = NULL;
            if (rawBuffer1 != NULL) delete rawBuffer1;
            if (rawBuffer2 != NULL) delete rawBuffer2;
    
            rawBuffer1 = (unsigned char*)malloc(rawExpectedBytes);
            rawBuffer2 = (unsigned char*)malloc(rawExpectedBytes);
            rawImage = rawBuffer1;
            // TODO check if old image should be deleted
    
            // Set image format
            // 8 BIT GREYSCALE IMAGE
    
            if (depth <= 8 && channels == 1) {
    
    pixhawk's avatar
    pixhawk committed
                image = new QImage(receivedWidth, receivedHeight, QImage::Format_Indexed8);
                // Create matching color table
                image->setNumColors(256);
    
                for (int i = 0; i < 256; i++) {
    
    pixhawk's avatar
    pixhawk committed
                    image->setColor(i, qRgb(i, i, i));
                    //qDebug() << __FILE__ << __LINE__ << std::hex << i;
                }
    
            }
            // 32 BIT COLOR IMAGE WITH ALPHA VALUES (#ARGB)
    
    pixhawk's avatar
    pixhawk committed
                image = new QImage(receivedWidth, receivedHeight, QImage::Format_ARGB32);
            }
    
            // Fill first channel of image with black pixels
            image->fill(0);
            glImage = QGLWidget::convertToGLFormat(*image);
    
            qDebug() << __FILE__ << __LINE__ << "Setting up image";
    
            // Set size once
            setFixedSize(receivedWidth, receivedHeight);
            setMinimumSize(receivedWidth, receivedHeight);
            setMaximumSize(receivedWidth, receivedHeight);
            // Lock down the size
            //setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
            //resize(receivedWidth, receivedHeight);
        }
    
    }
    
    void HUD::startImage(int imgid, int width, int height, int depth, int channels)
    {
    
    pixhawk's avatar
    pixhawk committed
        //qDebug() << "HUD: starting image (" << width << "x" << height << ", " << depth << "bits) with " << channels << "channels";
    
        // Copy previous image to screen if it hasn't been finished properly
        finishImage();
    
        // Reset image size if necessary
        setImageSize(width, height, depth, channels);
        imageStarted = true;
    }
    
    void HUD::finishImage()
    {
    
        if (imageStarted) {
    
    pixhawk's avatar
    pixhawk committed
            commitRawDataToGL();
            imageStarted = false;
        }
    }
    
    void HUD::commitRawDataToGL()
    {
    
        qDebug() << __FILE__ << __LINE__ << "Copying raw data to GL buffer:" << rawImage << receivedWidth << receivedHeight << image->format();
    
        if (image != NULL) {
    
    pixhawk's avatar
    pixhawk committed
            QImage::Format format = image->format();
            QImage* newImage = new QImage(rawImage, receivedWidth, receivedHeight, format);
    
            if (format == QImage::Format_Indexed8) {
    
    pixhawk's avatar
    pixhawk committed
                // Create matching color table
                newImage->setNumColors(256);
    
                for (int i = 0; i < 256; i++) {
    
    pixhawk's avatar
    pixhawk committed
                    newImage->setColor(i, qRgb(i, i, i));
                    //qDebug() << __FILE__ << __LINE__ << std::hex << i;
                }
            }
    
            glImage = QGLWidget::convertToGLFormat(*newImage);
            delete image;
            image = newImage;
            // Switch buffers
    
            if (rawImage == rawBuffer1) {
    
    pixhawk's avatar
    pixhawk committed
                rawImage = rawBuffer2;
                //qDebug() << "Now buffer 2";
    
    pixhawk's avatar
    pixhawk committed
                rawImage = rawBuffer1;
                //qDebug() << "Now buffer 1";
            }
        }
    
    pixhawk's avatar
    pixhawk committed
    }
    
    void HUD::saveImage(QString fileName)
    {
        image->save(fileName);
    }
    
    void HUD::saveImage()
    {
        //Bring up popup
        QString fileName = "output.png";
        saveImage(fileName);
    }
    
    
        if (videoEnabled && offlineDirectory != "") {
    
            // Load and diplay image file
            nextOfflineImage = QString(offlineDirectory + "/%1.bmp").arg(timestamp);
        }
    }
    
    void HUD::selectOfflineDirectory()
    {
        QString fileName = QFileDialog::getExistingDirectory(this, tr("Select image directory"), QDesktopServices::storageLocation(QDesktopServices::DesktopLocation));
    
        if (fileName != "") {
    
            offlineDirectory = fileName;
        }
    }
    
    void HUD::enableHUDInstruments(bool enabled)
    {
        hudInstrumentsEnabled = enabled;
    }
    
    void HUD::enableVideo(bool enabled)
    {
        videoEnabled = enabled;
    }
    
    
    pixhawk's avatar
    pixhawk committed
    void HUD::setPixels(int imgid, const unsigned char* imageData, int length, int startIndex)
    {
    
    pixhawk's avatar
    pixhawk committed
        //    qDebug() << "at" << __FILE__ << __LINE__ << ": Received startindex" << startIndex << "and length" << length << "(" << startIndex+length << "of" << rawExpectedBytes << "bytes)";
    
    
        if (imageStarted) {
    
    pixhawk's avatar
    pixhawk committed
            //if (rawLastIndex != startIndex) qDebug() << "PACKET LOSS!";
    
    
            if (startIndex+length > rawExpectedBytes) {
    
    pixhawk's avatar
    pixhawk committed
                qDebug() << "HUD: OVERFLOW! startIndex:" << startIndex << "length:" << length << "image raw size" << ((receivedWidth * receivedHeight * receivedChannels * receivedDepth) / 8) - 1;
    
    pixhawk's avatar
    pixhawk committed
                memcpy(rawImage+startIndex, imageData, length);
    
                rawLastIndex = startIndex+length;
    
                // Check if we just reached the end of the image
    
                if (startIndex+length == rawExpectedBytes) {
    
    pixhawk's avatar
    pixhawk committed
                    //qDebug() << "HUD: END OF IMAGE REACHED!";
                    finishImage();
                    rawLastIndex = 0;
                }
            }
    
            //        for (int i = 0; i < length; i++)
            //        {
            //            for (int j = 0; j < receivedChannels; j++)
            //            {
            //                unsigned int x = (startIndex+i) % receivedWidth;
            //                unsigned int y = (unsigned int)((startIndex+i) / receivedWidth);
            //                qDebug() << "Setting pixel" << x << "," << y << "to" << (unsigned int)*(rawImage+startIndex+i);
            //            }
            //        }
        }
    }
    
    LM's avatar
    LM committed
    void HUD::copyImage()
    
    LM's avatar
    LM committed
        qDebug() << "HUD::copyImage()";
    
    lm's avatar
    lm committed
        UAS* u = dynamic_cast<UAS*>(this->uas);
        if (u)
        {
            this->glImage = QGLWidget::convertToGLFormat(u->getImage());
        }