def paintEvent(self, event): unused(event) if self.isVisible(): # Read out most important values to limit hash table lookups # Low-pass roll, pitch and yaw self.rollLP = self.roll#rollLP * 0.2f + 0.8f * roll self.pitchLP = self.pitch#pitchLP * 0.2f + 0.8f * pitch self.yawLP = self.yaw if isinf(self.yaw) == False and isnan(self.yaw) == False else self.yawLP#yawLP * 0.2f + 0.8f * yaw # Translate for yaw maxYawTrans = 60.0 newYawDiff = self.yawDiff if isinf(newYawDiff): newYawDiff = self.yawDiff if newYawDiff > M_PI: newYawDiff = newYawDiff - M_PI if newYawDiff < -M_PI: newYawDiff = newYawDiff + M_PI newYawDiff = self.yawDiff * 0.8 + newYawDiff * 0.2 self.yawDiff = newYawDiff self.yawInt += newYawDiff if self.yawInt > M_PI: self.yawInt = M_PI if self.yawInt < -M_PI: self.yawInt = -M_PI yawTrans = self.yawInt * maxYawTrans self.yawInt *= 0.6 if (yawTrans < 5.0) and (yawTrans > -5.0): yawTrans = 0 # Negate to correct direction yawTrans = -yawTrans yawTrans = 0 #qDebug() << "yaw translation" << yawTrans << "integral" << yawInt << "difference" << yawDiff << "yaw" << yaw # And if either video or the data stream is enabled, draw the next frame. if self.videoEnabled: self.xImageFactor = self.width() / float(self.glImage.width()) self.yImageFactor = self.height() / float(self.glImage.height()) painter = QPainter() painter.begin(self) painter.setRenderHint(QPainter.Antialiasing, True) painter.setRenderHint(QPainter.HighQualityAntialiasing, True) pmap = QPixmap.fromImage(self.glImage).scaledToWidth(self.width()) painter.drawPixmap(0, (self.height() - pmap.height()) / 2, pmap) # END OF OPENGL PAINTING if self.HUDInstrumentsEnabled: #glEnable(GL_MULTISAMPLE) # QT PAINTING #makeCurrent() painter.translate((self.vwidth/2.0+self.xCenterOffset)*self.scalingFactor, (self.vheight/2.0+self.yCenterOffset)*self.scalingFactor) # COORDINATE FRAME IS NOW (0,0) at CENTER OF WIDGET # Draw all fixed indicators # BATTERY self.paintText(self.fuelStatus, self.fuelColor, 6.0, (-self.vwidth/2.0) + 10, -self.vheight/2.0 + 6, painter) # Waypoint self.paintText(self.waypointName, self.defaultColor, 6.0, (-self.vwidth/3.0) + 10, +self.vheight/3.0 + 15, painter) linePen = QPen(Qt.SolidLine) linePen.setWidth(self.refLineWidthToPen(1.0)) linePen.setColor(self.defaultColor) painter.setBrush(Qt.NoBrush) painter.setPen(linePen) # YAW INDICATOR # # . # . . # ....... # _yawIndicatorWidth = 12.0 _yawIndicatorY = self.vheight/2.0 - 15.0 yawIndicator = QPolygon(4) yawIndicator.setPoint(0, QPoint(self.refToScreenX(0.0), self.refToScreenY(_yawIndicatorY))) yawIndicator.setPoint(1, QPoint(self.refToScreenX(_yawIndicatorWidth/2.0), self.refToScreenY(_yawIndicatorY+_yawIndicatorWidth))) yawIndicator.setPoint(2, QPoint(self.refToScreenX(-_yawIndicatorWidth/2.0), self.refToScreenY(_yawIndicatorY+_yawIndicatorWidth))) yawIndicator.setPoint(3, QPoint(self.refToScreenX(0.0), self.refToScreenY(_yawIndicatorY))) painter.drawPolyline(yawIndicator) painter.setPen(linePen) # CENTER # HEADING INDICATOR # # __ __ # \/\/ # _hIndicatorWidth = 20.0 _hIndicatorY = -25.0 _hIndicatorYLow = _hIndicatorY + _hIndicatorWidth / 6.0 _hIndicatorSegmentWidth = _hIndicatorWidth / 7.0 hIndicator = QPolygon(7) hIndicator.setPoint(0, QPoint(self.refToScreenX(0.0-_hIndicatorWidth/2.0), self.refToScreenY(_hIndicatorY))) hIndicator.setPoint(1, QPoint(self.refToScreenX(0.0-_hIndicatorWidth/2.0+_hIndicatorSegmentWidth*1.75), self.refToScreenY(_hIndicatorY))) hIndicator.setPoint(2, QPoint(self.refToScreenX(0.0-_hIndicatorSegmentWidth*1.0), self.refToScreenY(_hIndicatorYLow))) hIndicator.setPoint(3, QPoint(self.refToScreenX(0.0), self.refToScreenY(_hIndicatorY))) hIndicator.setPoint(4, QPoint(self.refToScreenX(0.0+_hIndicatorSegmentWidth*1.0), self.refToScreenY(_hIndicatorYLow))) hIndicator.setPoint(5, QPoint(self.refToScreenX(0.0+_hIndicatorWidth/2.0-_hIndicatorSegmentWidth*1.75), self.refToScreenY(_hIndicatorY))) hIndicator.setPoint(6, QPoint(self.refToScreenX(0.0+_hIndicatorWidth/2.0), self.refToScreenY(_hIndicatorY))) painter.drawPolyline(hIndicator) # SETPOINT _centerWidth = 8.0 painter.drawEllipse( QPointF(self.refToScreenX(min(10.0, self.desiredRoll * 10.0)), self.refToScreenY(min(10.0, self.desiredPitch * 10.0))), self.refToScreenX(_centerWidth/2.0), self.refToScreenX(_centerWidth/2.0)) _centerCrossWidth = 20.0 # left painter.drawLine(QPointF(self.refToScreenX(-_centerWidth / 2.0), self.refToScreenY(0.0)), QPointF(self.refToScreenX(-_centerCrossWidth / 2.0), self.refToScreenY(0.0))) # right painter.drawLine(QPointF(self.refToScreenX(_centerWidth / 2.0), self.refToScreenY(0.0)), QPointF(self.refToScreenX(_centerCrossWidth / 2.0), self.refToScreenY(0.0))) # top painter.drawLine(QPointF(self.refToScreenX(0.0), self.refToScreenY(-_centerWidth / 2.0)), QPointF(self.refToScreenX(0.0), self.refToScreenY(-_centerCrossWidth / 2.0))) # COMPASS _compassY = -self.vheight/2.0 + 6.0 compassRect = QRectF(QPointF(self.refToScreenX(-12.0), self.refToScreenY(_compassY)), QSizeF(self.refToScreenX(24.0), self.refToScreenY(12.0))) painter.setBrush(Qt.NoBrush) painter.setPen(linePen) painter.drawRoundedRect(compassRect, 3, 3) # YAW is in compass-human readable format, so 0 .. 360 deg. _yawDeg = (self.yawLP / M_PI) * 180.0 if _yawDeg < 0: _yawDeg += 360 if _yawDeg > 360: _yawDeg -= 360 # final safeguard for really stupid systems _yawAngle = '{:3d}'.format(int(_yawDeg) % 360) self.paintText(_yawAngle, self.defaultColor, 8.5, -9.8, _compassY + 1.7, painter) painter.setBrush(Qt.NoBrush) painter.setPen(linePen) # CHANGE RATE STRIPS self.drawChangeRateStrip(-95.0, -60.0, 40.0, -10.0, 10.0, self.zSpeed, painter) # CHANGE RATE STRIPS self.drawChangeRateStrip(95.0, -60.0, 40.0, -10.0, 10.0, self.totalAcc, painter,True) # GAUGES # Left altitude gauge _gaugeAltitude = self.alt if self.alt != 0 else -self.zPos painter.setBrush(Qt.NoBrush) painter.setPen(linePen) self.drawChangeIndicatorGauge(-self.vGaugeSpacing, 35.0, 15.0, 10.0, _gaugeAltitude, self.defaultColor, painter, False) self.paintText('alt m', self.defaultColor, 5.5, -73.0, 50, painter) # Right speed gauge self.drawChangeIndicatorGauge(self.vGaugeSpacing, 35.0, 15.0, 10.0, self.totalSpeed, self.defaultColor, painter, False) self.paintText('v m/s', self.defaultColor, 5.5, 55.0, 50, painter) # Waypoint name if self.waypointName != '': self.paintText(self.waypointName, self.defaultColor, 2.0, (-self.vwidth/3.0) + 10, +self.vheight/3.0 + 15, painter) # MOVING PARTS painter.translate(self.refToScreenX(yawTrans), 0) attColor = painter.pen().color() # Draw multi-component attitude for key in self.attitudes: att = self.attitudes[key] attColor = attColor.darker(200) painter.setPen(attColor) # Rotate view and draw all roll-dependent indicators painter.rotate((att.x()/M_PI)* -180.0) painter.translate(0, (-att.y()/M_PI)* -180.0 * self.refToScreenY(1.8)) #qDebug() << "ROLL" << roll << "PITCH" << pitch << "YAW DIFF" << valuesDot.value("roll", 0.0) # PITCH self.paintPitchLines(att.y(), painter) painter.translate(0, -(-att.y()/M_PI)* -180.0 * self.refToScreenY(1.8)) painter.rotate(-(att.x()/M_PI)* -180.0) painter.end()