ProximityRadarMapView.qml 4.38 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/****************************************************************************
 *
 * (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/

import QtQuick                  2.12
import QtLocation               5.3
import QtPositioning            5.3
import QtGraphicalEffects       1.0

import QGroundControl               1.0
import QGroundControl.ScreenTools   1.0
import QGroundControl.Vehicle       1.0
import QGroundControl.Controls      1.0
19
import QGroundControl.FlightDisplay 1.0
20 21 22

MapQuickItem {
    id:             _root
23 24
    visible:        proximityValues.telemetryAvailable && coordinate.isValid

25 26
    property var    vehicle                                                         /// Vehicle object, undefined for ADSB vehicle
    property var    map
27
    property double heading:    vehicle ? vehicle.heading.value : Number.NaN    ///< Vehicle heading, NAN for none
28 29 30 31

    anchorPoint.x:  vehicleItem.width  / 2
    anchorPoint.y:  vehicleItem.height / 2

32 33
    property real   _ratio: 1
    property real   _maxDistance:   isNaN(proximityValues.maxDistance)
34

35 36 37 38 39 40 41
    function calcSize() {
        var scaleLinePixelLength    = 100
        var leftCoord               = map.toCoordinate(Qt.point(0, 0), false /* clipToViewPort */)
        var rightCoord              = map.toCoordinate(Qt.point(scaleLinePixelLength, 0), false /* clipToViewPort */)
        var scaleLineMeters         = Math.round(leftCoord.distanceTo(rightCoord))
        _ratio = scaleLinePixelLength / scaleLineMeters;
    }
42

43 44 45 46 47
    ProximityRadarValues {
        id:                     proximityValues
        vehicle:                _root.vehicle
        onRotationValueChanged: vehicleSensors.requestPaint()
    }
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

    Connections {
        target:             map
        onWidthChanged:     scaleTimer.restart()
        onHeightChanged:    scaleTimer.restart()
        onZoomLevelChanged: scaleTimer.restart()
    }

    Timer {
        id:                 scaleTimer
        interval:           100
        running:            false
        repeat:             false
        onTriggered:        calcSize()
    }

    sourceItem: Item {
        id:         vehicleItem
        width:      detectionLimitCircle.width
        height:     detectionLimitCircle.height
        opacity:    0.5

70 71
        Component.onCompleted: calcSize()

72 73 74
        Canvas{
            id:                 vehicleSensors
            anchors.fill:       detectionLimitCircle
75

76 77 78 79 80
            transform: Rotation {
                origin.x:       detectionLimitCircle.width  / 2
                origin.y:       detectionLimitCircle.height / 2
                angle:          isNaN(heading) ? 0 : heading
            }
81 82 83 84

            function deg2rad(degrees) {
                var pi = Math.PI;
                return degrees * (pi/180);
85
            }
86

87
            onPaint: {
88 89 90 91 92 93 94 95 96 97 98 99 100 101
                var ctx = getContext("2d");
                ctx.reset();
                ctx.translate(width/2, height/2)
                ctx.rotate(-Math.PI/2);
                ctx.lineWidth = 5;
                ctx.strokeStyle = Qt.rgba(1, 0, 0, 1);
                for(var i=0; i<proximityValues.rgRotationValues.length; i++){
                    var rotationValue = proximityValues.rgRotationValues[i]
                    if (!isNaN(rotationValue)) {
                        var a=deg2rad(360-22.5)+Math.PI/4*i;
                        ctx.beginPath();
                        ctx.arc(0, 0, rotationValue * _ratio, a, a + Math.PI/4,false);
                        ctx.stroke();
                    }
102
                }
103
            }
104 105 106 107
        }

        Rectangle {
            id:                 detectionLimitCircle
108 109
            width:              proximityValues.maxDistance * 2 *_ratio
            height:             proximityValues.maxDistance * 2 *_ratio
110 111 112 113
            anchors.fill:       detectionLimitCircle
            color:              Qt.rgba(1,1,1,0)
            border.color:       Qt.rgba(1,1,1,1)
            border.width:       5
114 115
            radius:             width * 0.5

116 117 118 119 120 121 122 123 124 125
            transform: Rotation {
                origin.x:       detectionLimitCircle.width  / 2
                origin.y:       detectionLimitCircle.height / 2
                angle:          isNaN(heading) ? 0 : heading
            }
        }

    }
}