JoystickThumbPad.qml 7.56 KB
Newer Older
1
import QtQuick                  2.12
2
import QtQuick.Controls         1.2
Don Gagne's avatar
Don Gagne committed
3

4
import QGroundControl               1.0
Don Gagne's avatar
Don Gagne committed
5 6 7
import QGroundControl.Palette       1.0
import QGroundControl.ScreenTools   1.0

dogmaphobic's avatar
dogmaphobic committed
8
Item {
9
    id:             _joyRoot
Don Gagne's avatar
Don Gagne committed
10

Don Gagne's avatar
Don Gagne committed
11 12 13
    property real   xAxis:          0                   ///< Value range [-1,1], negative values left stick, positive values right stick
    property real   yAxis:          0                   ///< Value range [-1,1], negative values up stick, positive values down stick
    property bool   yAxisThrottle:  false               ///< true: yAxis used for throttle, range [1,0], positive value are stick up
14
    property bool   yAxisThrottleCentered: false        ///< false: center yAxis in throttle for reverser and forward
Don Gagne's avatar
Don Gagne committed
15
    property real   xPositionDelta: 0                   ///< Amount to move the control on x axis
16
    property real   yPositionDelta: 0                   ///< Amount to move the control on y axis
Gus Grubba's avatar
Gus Grubba committed
17
    property bool   springYToCenter:true                ///< true: Spring Y to center on release
Don Gagne's avatar
Don Gagne committed
18

Don Gagne's avatar
Don Gagne committed
19 20 21
    property real   _centerXY:              width / 2
    property bool   _processTouchPoints:    false
    property real   stickPositionX:         _centerXY
22
    property real   stickPositionY:         yAxisThrottleCentered ? _centerXY : height
23 24
    property color  _fgColor:               QGroundControl.globalPalette.text
    property color  _bgColor:               QGroundControl.globalPalette.window
Don Gagne's avatar
Don Gagne committed
25

26 27 28 29 30
    onWidthChanged: calculateXAxis()
    onStickPositionXChanged: calculateXAxis()
    onHeightChanged: calculateYAxis()
    onStickPositionYChanged: calculateYAxis()

31 32
    function calculateXAxis() {
        if(!_joyRoot.visible) {
33 34
            return;
        }
Don Gagne's avatar
Don Gagne committed
35
        var xAxisTemp = stickPositionX / width
Don Gagne's avatar
Don Gagne committed
36 37 38
        xAxisTemp *= 2.0
        xAxisTemp -= 1.0
        xAxis = xAxisTemp
Don Gagne's avatar
Don Gagne committed
39
    }
Don Gagne's avatar
Don Gagne committed
40

41 42
    function calculateYAxis() {
        if(!_joyRoot.visible) {
43 44
            return;
        }
45
        var yAxisTemp = stickPositionY / height
Don Gagne's avatar
Don Gagne committed
46 47 48 49 50 51 52 53
        yAxisTemp *= 2.0
        yAxisTemp -= 1.0
        if (yAxisThrottle) {
            yAxisTemp = ((yAxisTemp * -1.0) / 2.0) + 0.5
        }
        yAxis = yAxisTemp
    }

54
    function reCenter() {
Don Gagne's avatar
Don Gagne committed
55
        _processTouchPoints = false
56

Don Gagne's avatar
Don Gagne committed
57 58 59
        // Move control back to original position
        xPositionDelta = 0
        yPositionDelta = 0
60

Don Gagne's avatar
Don Gagne committed
61 62
        // Center sticks
        stickPositionX = _centerXY
63
        if (yAxisThrottleCentered) {
64 65
            stickPositionY = _centerXY
        }
Don Gagne's avatar
Don Gagne committed
66 67
    }

68
    function thumbDown(touchPoints) {
69
        // Position the control around the initial thumb position
Don Gagne's avatar
Don Gagne committed
70
        xPositionDelta = touchPoints[0].x - _centerXY
71 72 73 74 75
        if (yAxisThrottle) {
            yPositionDelta = touchPoints[0].y - stickPositionY
        } else {
            yPositionDelta = touchPoints[0].y - _centerXY
        }
Don Gagne's avatar
Don Gagne committed
76 77
        // We need to wait until we move the control to the right position before we process touch points
        _processTouchPoints = true
Don Gagne's avatar
Don Gagne committed
78 79
    }

Don Gagne's avatar
Don Gagne committed
80
    /*
Don Gagne's avatar
Don Gagne committed
81
    // Keep in for debugging
Don Gagne's avatar
Don Gagne committed
82 83 84 85
    Column {
        QGCLabel { text: xAxis }
        QGCLabel { text: yAxis }
    }
Don Gagne's avatar
Don Gagne committed
86
    */
Don Gagne's avatar
Don Gagne committed
87

dogmaphobic's avatar
dogmaphobic committed
88 89
    Image {
        anchors.fill:       parent
90
        source:             "/res/JoystickBezelLight.png"
dogmaphobic's avatar
dogmaphobic committed
91 92
        mipmap:             true
        smooth:             true
Don Gagne's avatar
Don Gagne committed
93 94
    }

95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
    Rectangle {
        anchors.fill:       parent
        radius:             width / 2
        color:              _bgColor
        opacity:            0.5

        Rectangle {
            anchors.margins:    parent.width / 4
            anchors.fill:       parent
            radius:             width / 2
            border.color:       _fgColor
            border.width:       2
            color:              "transparent"
        }

        Rectangle {
            anchors.fill:       parent
            radius:             width / 2
            border.color:       _fgColor
            border.width:       2
            color:              "transparent"
        }
    }

119
    QGCColoredImage {
120
        color:                      _fgColor
121
        visible:                    yAxisThrottle
122 123 124 125 126 127 128 129 130 131 132 133
        height:                     ScreenTools.defaultFontPixelHeight
        width:                      height
        sourceSize.height:          height
        mipmap:                     true
        fillMode:                   Image.PreserveAspectFit
        source:                     "/res/clockwise-arrow.svg"
        anchors.right:              parent.right
        anchors.rightMargin:        ScreenTools.defaultFontPixelWidth
        anchors.verticalCenter:     parent.verticalCenter
    }

    QGCColoredImage {
134
        color:                      _fgColor
135
        visible:                    yAxisThrottle
136 137 138 139 140 141 142 143 144 145 146 147
        height:                     ScreenTools.defaultFontPixelHeight
        width:                      height
        sourceSize.height:          height
        mipmap:                     true
        fillMode:                   Image.PreserveAspectFit
        source:                     "/res/counter-clockwise-arrow.svg"
        anchors.left:               parent.left
        anchors.leftMargin:         ScreenTools.defaultFontPixelWidth
        anchors.verticalCenter:     parent.verticalCenter
    }

    QGCColoredImage {
148
        color:                      _fgColor
149
        visible:                    yAxisThrottle
150 151 152 153 154 155 156 157 158 159 160 161
        height:                     ScreenTools.defaultFontPixelHeight
        width:                      height
        sourceSize.height:          height
        mipmap:                     true
        fillMode:                   Image.PreserveAspectFit
        source:                     "/res/chevron-up.svg"
        anchors.top:                parent.top
        anchors.topMargin:          ScreenTools.defaultFontPixelWidth
        anchors.horizontalCenter:   parent.horizontalCenter
    }

    QGCColoredImage {
162
        color:                      _fgColor
163
        visible:                    yAxisThrottle
164 165 166 167 168 169 170 171 172 173 174
        height:                     ScreenTools.defaultFontPixelHeight
        width:                      height
        sourceSize.height:          height
        mipmap:                     true
        fillMode:                   Image.PreserveAspectFit
        source:                     "/res/chevron-down.svg"
        anchors.bottom:             parent.bottom
        anchors.bottomMargin:       ScreenTools.defaultFontPixelWidth
        anchors.horizontalCenter:   parent.horizontalCenter
    }

Don Gagne's avatar
Don Gagne committed
175
    Rectangle {
176 177 178 179 180 181 182 183
        width:          hatWidth
        height:         hatWidth
        radius:         hatWidthHalf
        border.color:   _fgColor
        border.width:   1
        color:          Qt.rgba(_fgColor.r, _fgColor.g, _fgColor.b, 0.5)
        x:              stickPositionX - hatWidthHalf
        y:              stickPositionY - hatWidthHalf
Don Gagne's avatar
Don Gagne committed
184 185 186 187

        readonly property real hatWidth:        ScreenTools.defaultFontPixelHeight
        readonly property real hatWidthHalf:    ScreenTools.defaultFontPixelHeight / 2
    }
Don Gagne's avatar
Don Gagne committed
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208

    Connections {
        target: touchPoint

        onXChanged: {
            if (_processTouchPoints) {
                _joyRoot.stickPositionX = Math.max(Math.min(touchPoint.x, _joyRoot.width), 0)
            }
        }
        onYChanged: {
            if (_processTouchPoints) {
                _joyRoot.stickPositionY = Math.max(Math.min(touchPoint.y, _joyRoot.height), 0)
            }
        }
    }

    MultiPointTouchArea {
        anchors.fill:       parent
        minimumTouchPoints: 1
        maximumTouchPoints: 1
        touchPoints:        [ TouchPoint { id: touchPoint } ]
Gus Grubba's avatar
Gus Grubba committed
209 210 211 212 213
        onPressed:          _joyRoot.thumbDown(touchPoints)
        onReleased: {
            if(springYToCenter)
                _joyRoot.reCenter()
        }
Don Gagne's avatar
Don Gagne committed
214
    }
Don Gagne's avatar
Don Gagne committed
215
}