JoystickConfig.qml 41.7 KB
Newer Older
1 2 3 4 5 6 7 8
/****************************************************************************
 *
 *   (c) 2009-2016 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.
 *
 ****************************************************************************/
9 10


11 12
import QtQuick          2.3
import QtQuick.Controls 1.2
13 14
import QtQuick.Dialogs  1.2

15
import QGroundControl               1.0
16 17 18 19
import QGroundControl.Palette       1.0
import QGroundControl.Controls      1.0
import QGroundControl.ScreenTools   1.0
import QGroundControl.Controllers   1.0
20
import QGroundControl.FactSystem    1.0
21
import QGroundControl.FactControls  1.0
22 23

/// Joystick Config
Don Gagne's avatar
Don Gagne committed
24 25 26 27 28 29
SetupPage {
    id:                 joystickPage
    pageComponent:      pageComponent
    pageName:           qsTr("Joystick")
    pageDescription:    qsTr("Joystick Setup is used to configure a calibrate joysticks.")

dheideman's avatar
dheideman committed
30 31
    readonly property real _maxButtons: 16

Jacob Walser's avatar
Jacob Walser committed
32 33 34 35 36 37 38 39 40 41
    Connections {
        target: joystickManager
        onAvailableJoysticksChanged: {
            if( joystickManager.joysticks.length == 0 ) {
                summaryButton.checked = true
                setupView.showSummaryPanel()
            }
        }
    }

Don Gagne's avatar
Don Gagne committed
42 43 44 45 46 47 48 49 50 51
    Component {
        id: pageComponent

        Item {
            width:  availableWidth
            height: Math.max(leftColumn.height, rightColumn.height)

            property bool controllerCompleted:      false
            property bool controllerAndViewReady:   false

52
            readonly property real labelToMonitorMargin: ScreenTools.defaultFontPixelWidth * 3
Don Gagne's avatar
Don Gagne committed
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

            property var _activeJoystick:   joystickManager.activeJoystick

            JoystickConfigController {
                id:             controller
                statusText:     statusText
                cancelButton:   cancelButton
                nextButton:     nextButton
                skipButton:     skipButton

                Component.onCompleted: {
                    controllerCompleted = true
                    if (joystickPage.completedSignalled) {
                        controllerAndViewReady = true
                        controller.start()
                    }
                }
70 71
            }

Don Gagne's avatar
Don Gagne committed
72 73 74 75 76 77
            Component.onCompleted: {
                if (controllerCompleted) {
                    controllerAndViewReady = true
                    controller.start()
                }
            }
78

Don Gagne's avatar
Don Gagne committed
79 80 81
            // Live axis monitor control component
            Component {
                id: axisMonitorDisplayComponent
82

Don Gagne's avatar
Don Gagne committed
83 84
                Item {
                    property int axisValue: 0
Gregory Dymarek's avatar
Gregory Dymarek committed
85
                    property int deadbandValue: 0
86
                    property bool narrowIndicator: false
87
                    property color deadbandColor: "#8c161a"
88

Don Gagne's avatar
Don Gagne committed
89
                    property color          __barColor:             qgcPal.windowShade
90

Don Gagne's avatar
Don Gagne committed
91 92 93 94 95 96 97 98
                    // Bar
                    Rectangle {
                        id:                     bar
                        anchors.verticalCenter: parent.verticalCenter
                        width:                  parent.width
                        height:                 parent.height / 2
                        color:                  __barColor
                    }
99

Gregory Dymarek's avatar
Gregory Dymarek committed
100 101 102 103 104 105 106
                    // Deadband
                    Rectangle {
                        id:                     deadbandBar
                        anchors.verticalCenter: parent.verticalCenter
                        x:                      _deadbandPosition
                        width:                  _deadbandWidth
                        height:                 parent.height / 2
107
                        color:                  deadbandColor
108
                        visible:                controller.deadbandToggle
Gregory Dymarek's avatar
Gregory Dymarek committed
109 110 111 112 113 114

                        property real _percentDeadband:    ((2 * deadbandValue) / (32768.0 * 2))
                        property real _deadbandWidth:   parent.width * _percentDeadband
                        property real _deadbandPosition:   (parent.width - _deadbandWidth) / 2
                    }

Don Gagne's avatar
Don Gagne committed
115 116 117
                    // Center point
                    Rectangle {
                        anchors.horizontalCenter:   parent.horizontalCenter
118
                        width:                      ScreenTools.defaultFontPixelWidth / 2
Don Gagne's avatar
Don Gagne committed
119 120 121
                        height:                     parent.height
                        color:                      qgcPal.window
                    }
122

Don Gagne's avatar
Don Gagne committed
123 124 125
                    // Indicator
                    Rectangle {
                        anchors.verticalCenter: parent.verticalCenter
126 127
                        width:                  parent.narrowIndicator ?  height/6 : height
                        height:                 parent.height * 0.75
Don Gagne's avatar
Don Gagne committed
128 129 130 131 132 133 134 135
                        x:                      (reversed ? (parent.width - _indicatorPosition) : _indicatorPosition) - (width / 2)
                        radius:                 width / 2
                        color:                  qgcPal.text
                        visible:                mapped

                        property real _percentAxisValue:    ((axisValue + 32768.0) / (32768.0 * 2))
                        property real _indicatorPosition:   parent.width * _percentAxisValue
                    }
136

Don Gagne's avatar
Don Gagne committed
137 138 139 140 141 142 143
                    QGCLabel {
                        anchors.fill:           parent
                        horizontalAlignment:    Text.AlignHCenter
                        verticalAlignment:      Text.AlignVCenter
                        text:                   qsTr("Not Mapped")
                        visible:                !mapped
                    }
144

Don Gagne's avatar
Don Gagne committed
145 146 147 148 149 150 151 152
                    ColorAnimation {
                        id:         barAnimation
                        target:     bar
                        property:   "color"
                        from:       "yellow"
                        to:         __barColor
                        duration:   1500
                    }
153

Gregory Dymarek's avatar
Gregory Dymarek committed
154

Don Gagne's avatar
Don Gagne committed
155
                    // Axis value debugger
Gregory Dymarek's avatar
Gregory Dymarek committed
156
                    /*
Don Gagne's avatar
Don Gagne committed
157 158 159 160 161
                    QGCLabel {
                        anchors.fill: parent
                        text: axisValue
                    }
                    */
Gregory Dymarek's avatar
Gregory Dymarek committed
162

163
                }
Don Gagne's avatar
Don Gagne committed
164
            } // Component - axisMonitorDisplayComponent
165

Don Gagne's avatar
Don Gagne committed
166 167 168 169 170 171 172 173 174
            // Main view Qml starts here

            // Left side column
            Column {
                id:                     leftColumn
                anchors.rightMargin:    ScreenTools.defaultFontPixelWidth
                anchors.left:           parent.left
                anchors.right:          rightColumn.left
                spacing:                10
175

Don Gagne's avatar
Don Gagne committed
176 177 178 179
                // Attitude Controls
                Column {
                    width:      parent.width
                    spacing:    5
180

Don Gagne's avatar
Don Gagne committed
181
                    QGCLabel { text: qsTr("Attitude Controls") }
182

Don Gagne's avatar
Don Gagne committed
183 184 185
                    Item {
                        width:  parent.width
                        height: defaultTextHeight * 2
186

Don Gagne's avatar
Don Gagne committed
187 188
                        QGCLabel {
                            id:     rollLabel
189
                            width:  ScreenTools.defaultFontPixelWidth * 10
190
                            text:   activeVehicle.sub ? qsTr("Lateral") : qsTr("Roll")
Don Gagne's avatar
Don Gagne committed
191
                        }
192

Don Gagne's avatar
Don Gagne committed
193 194 195 196 197 198 199 200
                        Loader {
                            id:                 rollLoader
                            anchors.left:       rollLabel.right
                            anchors.right:      parent.right
                            height:             ScreenTools.defaultFontPixelHeight
                            width:              100
                            sourceComponent:    axisMonitorDisplayComponent

201
                            property real ScreenTools.defaultFontPixelWidth: ScreenTools.defaultFontPixelWidth
Don Gagne's avatar
Don Gagne committed
202 203 204
                            property bool mapped:           controller.rollAxisMapped
                            property bool reversed:         controller.rollAxisReversed
                        }
205

206 207 208 209 210
                        Connections {
                            target: _activeJoystick

                            onManualControl: rollLoader.item.axisValue = roll*32768.0
                        }
211 212
                    }

Don Gagne's avatar
Don Gagne committed
213 214 215
                    Item {
                        width:  parent.width
                        height: defaultTextHeight * 2
216

Don Gagne's avatar
Don Gagne committed
217 218
                        QGCLabel {
                            id:     pitchLabel
219
                            width:  ScreenTools.defaultFontPixelWidth * 10
220
                            text:   activeVehicle.sub ? qsTr("Forward") : qsTr("Pitch")
Don Gagne's avatar
Don Gagne committed
221
                        }
222

Don Gagne's avatar
Don Gagne committed
223 224 225 226 227 228 229 230
                        Loader {
                            id:                 pitchLoader
                            anchors.left:       pitchLabel.right
                            anchors.right:      parent.right
                            height:             ScreenTools.defaultFontPixelHeight
                            width:              100
                            sourceComponent:    axisMonitorDisplayComponent

231
                            property real ScreenTools.defaultFontPixelWidth: ScreenTools.defaultFontPixelWidth
Don Gagne's avatar
Don Gagne committed
232 233 234
                            property bool mapped:           controller.pitchAxisMapped
                            property bool reversed:         controller.pitchAxisReversed
                        }
235

236 237 238 239 240
                        Connections {
                            target: _activeJoystick

                            onManualControl: pitchLoader.item.axisValue = pitch*32768.0
                        }
241 242
                    }

Don Gagne's avatar
Don Gagne committed
243 244 245
                    Item {
                        width:  parent.width
                        height: defaultTextHeight * 2
246

Don Gagne's avatar
Don Gagne committed
247 248
                        QGCLabel {
                            id:     yawLabel
249
                            width:  ScreenTools.defaultFontPixelWidth * 10
Don Gagne's avatar
Don Gagne committed
250 251
                            text:   qsTr("Yaw")
                        }
252

Don Gagne's avatar
Don Gagne committed
253 254 255 256 257 258 259 260
                        Loader {
                            id:                 yawLoader
                            anchors.left:       yawLabel.right
                            anchors.right:      parent.right
                            height:             ScreenTools.defaultFontPixelHeight
                            width:              100
                            sourceComponent:    axisMonitorDisplayComponent

261
                            property real ScreenTools.defaultFontPixelWidth: ScreenTools.defaultFontPixelWidth
Don Gagne's avatar
Don Gagne committed
262 263 264
                            property bool mapped:           controller.yawAxisMapped
                            property bool reversed:         controller.yawAxisReversed
                        }
265

266 267 268 269 270
                        Connections {
                            target: _activeJoystick

                            onManualControl: yawLoader.item.axisValue = yaw*32768.0
                        }
271 272
                    }

Don Gagne's avatar
Don Gagne committed
273 274 275
                    Item {
                        width:  parent.width
                        height: defaultTextHeight * 2
276

Don Gagne's avatar
Don Gagne committed
277 278
                        QGCLabel {
                            id:     throttleLabel
279
                            width:  ScreenTools.defaultFontPixelWidth * 10
Don Gagne's avatar
Don Gagne committed
280 281
                            text:   qsTr("Throttle")
                        }
282

Don Gagne's avatar
Don Gagne committed
283 284 285 286 287 288 289 290
                        Loader {
                            id:                 throttleLoader
                            anchors.left:       throttleLabel.right
                            anchors.right:      parent.right
                            height:             ScreenTools.defaultFontPixelHeight
                            width:              100
                            sourceComponent:    axisMonitorDisplayComponent

291
                            property real ScreenTools.defaultFontPixelWidth: ScreenTools.defaultFontPixelWidth
Don Gagne's avatar
Don Gagne committed
292 293 294
                            property bool mapped:           controller.throttleAxisMapped
                            property bool reversed:         controller.throttleAxisReversed
                        }
295

296 297 298
                        Connections {
                            target: _activeJoystick

299
                            onManualControl: throttleLoader.item.axisValue = _activeJoystick.negativeThrust ? -throttle*32768.0 : (-2*throttle+1)*32768.0
300
                        }
301
                    }
Don Gagne's avatar
Don Gagne committed
302
                } // Column - Attitude Control labels
303

Don Gagne's avatar
Don Gagne committed
304 305 306
                // Command Buttons
                Row {
                    spacing: 10
307
                    visible: _activeJoystick.requiresCalibration
Don Gagne's avatar
Don Gagne committed
308 309 310 311

                    QGCButton {
                        id:     skipButton
                        text:   qsTr("Skip")
312

Don Gagne's avatar
Don Gagne committed
313
                        onClicked: controller.skipButtonClicked()
314 315
                    }

Don Gagne's avatar
Don Gagne committed
316 317 318
                    QGCButton {
                        id:     cancelButton
                        text:   qsTr("Cancel")
319

Don Gagne's avatar
Don Gagne committed
320 321
                        onClicked: controller.cancelButtonClicked()
                    }
322

Don Gagne's avatar
Don Gagne committed
323 324 325 326
                    QGCButton {
                        id:         nextButton
                        primary:    true
                        text:       qsTr("Calibrate")
327

Don Gagne's avatar
Don Gagne committed
328 329 330
                        onClicked: controller.nextButtonClicked()
                    }
                } // Row - Buttons
331

Don Gagne's avatar
Don Gagne committed
332 333 334 335 336
                // Status Text
                QGCLabel {
                    id:         statusText
                    width:      parent.width
                    wrapMode:   Text.WordWrap
337 338
                }

Don Gagne's avatar
Don Gagne committed
339 340 341 342 343
                Rectangle {
                    width:          parent.width
                    height:         1
                    border.color:   qgcPal.text
                    border.width:   1
344 345
                }

Don Gagne's avatar
Don Gagne committed
346 347 348 349
                // Settings
                Row {
                    width:      parent.width
                    spacing:    ScreenTools.defaultFontPixelWidth
350

Don Gagne's avatar
Don Gagne committed
351
                    // Left column settings
352
                    Column {
Don Gagne's avatar
Don Gagne committed
353
                        width:      parent.width / 2
354 355
                        spacing:    ScreenTools.defaultFontPixelHeight

Don Gagne's avatar
Don Gagne committed
356
                        QGCLabel { text: qsTr("Additional Joystick settings:") }
357

Don Gagne's avatar
Don Gagne committed
358 359 360
                        Column {
                            width:      parent.width
                            spacing:    ScreenTools.defaultFontPixelHeight
361 362


Don Gagne's avatar
Don Gagne committed
363
                            QGCCheckBox {
Jacob Walser's avatar
Jacob Walser committed
364
                                id:         enabledCheckBox
365 366
                                enabled:    _activeJoystick ? _activeJoystick.calibrated : false
                                text:       _activeJoystick ? _activeJoystick.calibrated ? qsTr("Enable joystick input") : qsTr("Enable not allowed (Calibrate First)") : ""
367 368
                                onClicked:  activeVehicle.joystickEnabled = checked
                                Component.onCompleted: checked = activeVehicle.joystickEnabled
369 370

                                Connections {
371
                                    target: activeVehicle
372 373

                                    onJoystickEnabledChanged: {
374
                                        enabledCheckBox.checked = activeVehicle.joystickEnabled
375 376
                                    }
                                }
377

Jacob Walser's avatar
Jacob Walser committed
378 379 380 381
                                Connections {
                                    target: joystickManager

                                    onActiveJoystickChanged: {
382
                                        if(_activeJoystick) {
383
                                            enabledCheckBox.checked = Qt.binding(function() { return _activeJoystick.calibrated && activeVehicle.joystickEnabled })
384
                                        }
Jacob Walser's avatar
Jacob Walser committed
385 386
                                    }
                                }
387 388
                            }

Don Gagne's avatar
Don Gagne committed
389 390 391
                            Row {
                                width:      parent.width
                                spacing:    ScreenTools.defaultFontPixelWidth
392

Don Gagne's avatar
Don Gagne committed
393 394 395 396 397
                                QGCLabel {
                                    id:                 activeJoystickLabel
                                    anchors.baseline:   joystickCombo.baseline
                                    text:               qsTr("Active joystick:")
                                }
398

Don Gagne's avatar
Don Gagne committed
399 400 401 402 403 404 405 406 407 408 409 410 411 412
                                QGCComboBox {
                                    id:                 joystickCombo
                                    width:              parent.width - activeJoystickLabel.width - parent.spacing
                                    model:              joystickManager.joystickNames

                                    onActivated: joystickManager.activeJoystickName = textAt(index)

                                    Component.onCompleted: {
                                        var index = joystickCombo.find(joystickManager.activeJoystickName)
                                        if (index == -1) {
                                            console.warn(qsTr("Active joystick name not in combo"), joystickManager.activeJoystickName)
                                        } else {
                                            joystickCombo.currentIndex = index
                                        }
413
                                    }
Jacob Walser's avatar
Jacob Walser committed
414 415 416 417 418

                                    Connections {
                                        target: joystickManager
                                        onAvailableJoysticksChanged: {
                                            var index = joystickCombo.find(joystickManager.activeJoystickName)
419
                                            if (index >= 0) {
Jacob Walser's avatar
Jacob Walser committed
420 421 422 423
                                                joystickCombo.currentIndex = index
                                            }
                                        }
                                    }
424
                                }
425 426
                            }

Don Gagne's avatar
Don Gagne committed
427 428
                            Column {
                                spacing: ScreenTools.defaultFontPixelHeight / 3
429
                                visible: activeVehicle.supportsThrottleModeCenterZero
430

Don Gagne's avatar
Don Gagne committed
431
                                ExclusiveGroup { id: throttleModeExclusiveGroup }
432

Don Gagne's avatar
Don Gagne committed
433 434 435
                                QGCRadioButton {
                                    exclusiveGroup: throttleModeExclusiveGroup
                                    text:           qsTr("Center stick is zero throttle")
436
                                    checked:        _activeJoystick ? _activeJoystick.throttleMode == 0 : false
437

Don Gagne's avatar
Don Gagne committed
438 439
                                    onClicked: _activeJoystick.throttleMode = 0
                                }
440

441
                                Row {
Gregory Dymarek's avatar
Gregory Dymarek committed
442
                                    x:          20
443 444
                                    width:      parent.width
                                    spacing:    ScreenTools.defaultFontPixelWidth
445
                                    visible:    _activeJoystick ? _activeJoystick.throttleMode == 0 : false
446 447 448

                                    QGCCheckBox {
                                        id:         accumulator
449
                                        checked:    _activeJoystick ? _activeJoystick.accumulator : false
Gregory Dymarek's avatar
Gregory Dymarek committed
450
                                        text:       qsTr("Spring loaded throttle smoothing")
451 452 453 454 455

                                        onClicked:  _activeJoystick.accumulator = checked
                                    }
                                }

Don Gagne's avatar
Don Gagne committed
456 457 458
                                QGCRadioButton {
                                    exclusiveGroup: throttleModeExclusiveGroup
                                    text:           qsTr("Full down stick is zero throttle")
459
                                    checked:        _activeJoystick ? _activeJoystick.throttleMode == 1 : false
460

Don Gagne's avatar
Don Gagne committed
461 462
                                    onClicked: _activeJoystick.throttleMode = 1
                                }
463 464

                                QGCCheckBox {
465
                                    visible:        activeVehicle.supportsNegativeThrust
466 467
                                    id:             negativeThrust
                                    text:           qsTr("Allow negative Thrust")
468
                                    enabled:        _activeJoystick.negativeThrust = activeVehicle.supportsNegativeThrust
469
                                    checked:        _activeJoystick ? _activeJoystick.negativeThrust : false
470
                                    onClicked:      _activeJoystick.negativeThrust = checked
471
                                }
472 473
                            }

Don Gagne's avatar
Don Gagne committed
474 475
                            Column {
                                spacing: ScreenTools.defaultFontPixelHeight / 3
476

477 478 479 480 481 482 483 484 485 486 487
                                QGCLabel {
                                    id:                 expoSliderLabel
                                    text:               qsTr("Exponential:")
                                }

                                Row {
                                    QGCSlider {
                                        id: expoSlider
                                        minimumValue: 0
                                        maximumValue: 0.75

nanthony21's avatar
nanthony21 committed
488 489
                                        Component.onCompleted: value=-_activeJoystick.exponential
                                        onValueChanged: _activeJoystick.exponential=-value
490 491 492 493 494
                                     }

                                    QGCLabel {
                                        id:     expoSliderIndicator
                                        text:   expoSlider.value.toFixed(2)
495
                                    }
Don Gagne's avatar
Don Gagne committed
496
                                }
497 498
                            }

Don Gagne's avatar
Don Gagne committed
499 500
                            QGCCheckBox {
                                id:         advancedSettings
501
                                checked:    activeVehicle.joystickMode != 0
Don Gagne's avatar
Don Gagne committed
502
                                text:       qsTr("Advanced settings (careful!)")
503

Don Gagne's avatar
Don Gagne committed
504 505
                                onClicked: {
                                    if (!checked) {
506
                                        activeVehicle.joystickMode = 0
Don Gagne's avatar
Don Gagne committed
507
                                    }
508 509 510
                                }
                            }

Don Gagne's avatar
Don Gagne committed
511 512 513 514 515 516 517 518 519 520
                            Row {
                                width:      parent.width
                                spacing:    ScreenTools.defaultFontPixelWidth
                                visible:    advancedSettings.checked

                                QGCLabel {
                                    id:                 joystickModeLabel
                                    anchors.baseline:   joystickModeCombo.baseline
                                    text:               qsTr("Joystick mode:")
                                }
521

Don Gagne's avatar
Don Gagne committed
522 523
                                QGCComboBox {
                                    id:             joystickModeCombo
524
                                    currentIndex:   activeVehicle.joystickMode
Don Gagne's avatar
Don Gagne committed
525
                                    width:          ScreenTools.defaultFontPixelWidth * 20
526
                                    model:          activeVehicle.joystickModes
527

528
                                    onActivated: activeVehicle.joystickMode = index
Don Gagne's avatar
Don Gagne committed
529
                                }
530
                            }
531

532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549
                            Row {
                                width:      parent.width
                                spacing:    ScreenTools.defaultFontPixelWidth
                                visible:    advancedSettings.checked
                                QGCLabel {
                                    text:       qsTr("Message frequency (Hz):")
                                    anchors.verticalCenter: parent.verticalCenter
                                }
                                QGCTextField {
                                    text:       _activeJoystick.frequency
                                    validator:  DoubleValidator { bottom: 0.25; top: 100.0; }
                                    inputMethodHints: Qt.ImhFormattedNumbersOnly
                                    onEditingFinished: {
                                        _activeJoystick.frequency = parseFloat(text)
                                    }
                                }
                            }

550 551 552 553 554 555
                            Row {
                                width:      parent.width
                                spacing:    ScreenTools.defaultFontPixelWidth
                                visible:    advancedSettings.checked
                                QGCCheckBox {
                                    id:         joystickCircleCorrection
556
                                    checked:    activeVehicle.joystickMode != 0
557 558 559 560 561 562 563 564 565
                                    text:       qsTr("Enable circle correction")

                                    Component.onCompleted: checked = _activeJoystick.circleCorrection
                                    onClicked: {
                                        _activeJoystick.circleCorrection = checked
                                    }
                                }
                            }

566 567 568 569 570 571 572 573 574 575 576 577 578
                            Row {
                                width:      parent.width
                                spacing:    ScreenTools.defaultFontPixelWidth
                                visible:    advancedSettings.checked

                                QGCCheckBox {
                                    id:         deadband
                                    checked:    controller.deadbandToggle
                                    text:       qsTr("Deadbands")

                                    onClicked:  controller.deadbandToggle = checked
                                }
                            }
579 580 581 582 583 584 585 586 587 588 589 590 591 592 593
                            Row{
                                width: parent.width
                                spacing: ScreenTools.defaultFontPixelWidth
                                visible: advancedSettings.checked
                                QGCLabel{
                                    width:       parent.width * 0.85
                                    font.pointSize:     ScreenTools.smallFontPointSize
                                    wrapMode:           Text.WordWrap
                                    text:   qsTr("Deadband can be set during the first ") +
                                            qsTr("step of calibration by gently wiggling each axis. ") +
                                            qsTr("Deadband can also be adjusted by clicking and ") +
                                            qsTr("dragging vertically on the corresponding axis monitor.")
                                    visible: controller.deadbandToggle
                                }
                            }
594
                        }
Don Gagne's avatar
Don Gagne committed
595
                    } // Column - left column
596

Don Gagne's avatar
Don Gagne committed
597 598 599 600
                    // Right column settings
                    Column {
                        width:      parent.width / 2
                        spacing:    ScreenTools.defaultFontPixelHeight
601

Don Gagne's avatar
Don Gagne committed
602 603
                        Connections {
                            target: _activeJoystick
604

Don Gagne's avatar
Don Gagne committed
605 606 607 608 609 610 611
                            onRawButtonPressedChanged: {
                                if (buttonActionRepeater.itemAt(index)) {
                                    buttonActionRepeater.itemAt(index).pressed = pressed
                                }
                                if (jsButtonActionRepeater.itemAt(index)) {
                                    jsButtonActionRepeater.itemAt(index).pressed = pressed
                                }
612
                            }
613 614
                        }

Don Gagne's avatar
Don Gagne committed
615
                        QGCLabel { text: qsTr("Button actions:") }
616

Don Gagne's avatar
Don Gagne committed
617 618 619
                        Column {
                            width:      parent.width
                            spacing:    ScreenTools.defaultFontPixelHeight / 3
620

Don Gagne's avatar
Don Gagne committed
621 622
                            Repeater {
                                id:     buttonActionRepeater
dheideman's avatar
dheideman committed
623
                                model:  _activeJoystick ? Math.min(_activeJoystick.totalButtonCount, _maxButtons) : 0
624

Don Gagne's avatar
Don Gagne committed
625 626
                                Row {
                                    spacing: ScreenTools.defaultFontPixelWidth
627
                                    visible: !activeVehicle.supportsJSButton
628

Don Gagne's avatar
Don Gagne committed
629
                                    property bool pressed
630

Don Gagne's avatar
Don Gagne committed
631 632
                                    QGCCheckBox {
                                        anchors.verticalCenter:     parent.verticalCenter
633
                                        checked:                    _activeJoystick ? _activeJoystick.buttonActions[modelData] != "" : false
634

Don Gagne's avatar
Don Gagne committed
635 636
                                        onClicked: _activeJoystick.setButtonAction(modelData, checked ? buttonActionCombo.textAt(buttonActionCombo.currentIndex) : "")
                                    }
637

Don Gagne's avatar
Don Gagne committed
638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653
                                    Rectangle {
                                        anchors.verticalCenter:     parent.verticalCenter
                                        width:                      ScreenTools.defaultFontPixelHeight * 1.5
                                        height:                     width
                                        border.width:               1
                                        border.color:               qgcPal.text
                                        color:                      pressed ? qgcPal.buttonHighlight : qgcPal.button


                                        QGCLabel {
                                            anchors.fill:           parent
                                            color:                  pressed ? qgcPal.buttonHighlightText : qgcPal.buttonText
                                            horizontalAlignment:    Text.AlignHCenter
                                            verticalAlignment:      Text.AlignVCenter
                                            text:                   modelData
                                        }
654 655
                                    }

Don Gagne's avatar
Don Gagne committed
656 657 658
                                    QGCComboBox {
                                        id:             buttonActionCombo
                                        width:          ScreenTools.defaultFontPixelWidth * 20
659
                                        model:          _activeJoystick ? _activeJoystick.actions : 0
660

Don Gagne's avatar
Don Gagne committed
661 662 663
                                        onActivated:            _activeJoystick.setButtonAction(modelData, textAt(index))
                                        Component.onCompleted:  currentIndex = find(_activeJoystick.buttonActions[modelData])
                                    }
664
                                }
Don Gagne's avatar
Don Gagne committed
665
                            } // Repeater
666 667 668

                            Row {
                                spacing: ScreenTools.defaultFontPixelWidth
669
                                visible: activeVehicle.supportsJSButton
670

Don Gagne's avatar
Don Gagne committed
671 672 673 674
                                QGCLabel {
                                    horizontalAlignment:    Text.AlignHCenter
                                    width:                  ScreenTools.defaultFontPixelHeight * 1.5
                                    text:                   qsTr("#")
675 676
                                }

Don Gagne's avatar
Don Gagne committed
677 678 679
                                QGCLabel {
                                    width:                  ScreenTools.defaultFontPixelWidth * 15
                                    text:                   qsTr("Function: ")
680 681
                                }

Don Gagne's avatar
Don Gagne committed
682 683 684
                                QGCLabel {
                                    width:                  ScreenTools.defaultFontPixelWidth * 15
                                    text:                   qsTr("Shift Function: ")
685 686
                                }
                            } // Row
687

Don Gagne's avatar
Don Gagne committed
688 689
                            Repeater {
                                id:     jsButtonActionRepeater
dheideman's avatar
dheideman committed
690
                                model:  _activeJoystick ? Math.min(_activeJoystick.totalButtonCount, _maxButtons) : 0
Don Gagne's avatar
Don Gagne committed
691 692 693

                                Row {
                                    spacing: ScreenTools.defaultFontPixelWidth
694
                                    visible: activeVehicle.supportsJSButton
Don Gagne's avatar
Don Gagne committed
695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736

                                    property bool pressed

                                    Rectangle {
                                        anchors.verticalCenter:     parent.verticalCenter
                                        width:                      ScreenTools.defaultFontPixelHeight * 1.5
                                        height:                     width
                                        border.width:               1
                                        border.color:               qgcPal.text
                                        color:                      pressed ? qgcPal.buttonHighlight : qgcPal.button


                                        QGCLabel {
                                            anchors.fill:           parent
                                            color:                  pressed ? qgcPal.buttonHighlightText : qgcPal.buttonText
                                            horizontalAlignment:    Text.AlignHCenter
                                            verticalAlignment:      Text.AlignVCenter
                                            text:                   modelData
                                        }
                                    }

                                    FactComboBox {
                                        id:         mainJSButtonActionCombo
                                        width:      ScreenTools.defaultFontPixelWidth * 15
                                        fact:       controller.parameterExists(-1, "BTN"+index+"_FUNCTION") ? controller.getParameterFact(-1, "BTN" + index + "_FUNCTION") : null;
                                        indexModel: false
                                    }

                                    FactComboBox {
                                        id:         shiftJSButtonActionCombo
                                        width:      ScreenTools.defaultFontPixelWidth * 15
                                        fact:       controller.parameterExists(-1, "BTN"+index+"_SFUNCTION") ? controller.getParameterFact(-1, "BTN" + index + "_SFUNCTION") : null;
                                        indexModel: false
                                    }
                                } // Row
                            } // Repeater
                        } // Column
                    } // Column - right setting column
                } // Row - Settings
            } // Column - Left Main Column

            // Right side column
737
            Column {
Don Gagne's avatar
Don Gagne committed
738 739 740
                id:             rightColumn
                anchors.top:    parent.top
                anchors.right:  parent.right
741
                width:          Math.min(joystickPage.ScreenTools.defaultFontPixelWidth * 35, availableWidth * 0.4)
742 743 744 745 746 747 748 749 750 751 752 753 754 755 756
                spacing:        ScreenTools.defaultFontPixelHeight / 2

                Row {
                    spacing: ScreenTools.defaultFontPixelWidth

                    ExclusiveGroup { id: modeGroup }

                    QGCLabel {
                        text: "TX Mode:"
                    }

                    QGCRadioButton {
                        exclusiveGroup: modeGroup
                        text:           "1"
                        checked:        controller.transmitterMode == 1
757
                        enabled:        !controller.calibrating
758 759 760 761 762 763 764 765

                        onClicked: controller.transmitterMode = 1
                    }

                    QGCRadioButton {
                        exclusiveGroup: modeGroup
                        text:           "2"
                        checked:        controller.transmitterMode == 2
766
                        enabled:        !controller.calibrating
767 768 769 770 771 772 773 774

                        onClicked: controller.transmitterMode = 2
                    }

                    QGCRadioButton {
                        exclusiveGroup: modeGroup
                        text:           "3"
                        checked:        controller.transmitterMode == 3
775
                        enabled:        !controller.calibrating
776 777 778 779 780 781 782 783

                        onClicked: controller.transmitterMode = 3
                    }

                    QGCRadioButton {
                        exclusiveGroup: modeGroup
                        text:           "4"
                        checked:        controller.transmitterMode == 4
784
                        enabled:        !controller.calibrating
785 786 787 788

                        onClicked: controller.transmitterMode = 4
                    }
                }
Don Gagne's avatar
Don Gagne committed
789 790

                Image {
791
                    width:      parent.width
Don Gagne's avatar
Don Gagne committed
792 793 794 795
                    fillMode:   Image.PreserveAspectFit
                    smooth:     true
                    source:     controller.imageHelp
                }
796

Don Gagne's avatar
Don Gagne committed
797 798 799 800
                // Axis monitor
                Column {
                    width:      parent.width
                    spacing:    5
801

Don Gagne's avatar
Don Gagne committed
802
                    QGCLabel { text: qsTr("Axis Monitor") }
803

Don Gagne's avatar
Don Gagne committed
804 805 806 807 808 809 810
                    Connections {
                        target: controller

                        onAxisValueChanged: {
                            if (axisMonitorRepeater.itemAt(axis)) {
                                axisMonitorRepeater.itemAt(axis).loader.item.axisValue = value
                            }
811
                        }
812 813 814 815 816 817

                        onAxisDeadbandChanged: {
                            if (axisMonitorRepeater.itemAt(axis)) {
                                axisMonitorRepeater.itemAt(axis).loader.item.deadbandValue = value
                            }
                        }
818 819
                    }

Don Gagne's avatar
Don Gagne committed
820 821
                    Repeater {
                        id:     axisMonitorRepeater
822
                        model:  _activeJoystick ? _activeJoystick.axisCount : 0
Don Gagne's avatar
Don Gagne committed
823
                        width:  parent.width
824

Don Gagne's avatar
Don Gagne committed
825 826
                        Row {
                            spacing:    5
827

Don Gagne's avatar
Don Gagne committed
828 829
                            // Need this to get to loader from Connections above
                            property Item loader: theLoader
830

Don Gagne's avatar
Don Gagne committed
831 832 833 834
                            QGCLabel {
                                id:     axisLabel
                                text:   modelData
                            }
835

Don Gagne's avatar
Don Gagne committed
836 837 838 839 840 841
                            Loader {
                                id:                     theLoader
                                anchors.verticalCenter: axisLabel.verticalCenter
                                height:                 ScreenTools.defaultFontPixelHeight
                                width:                  200
                                sourceComponent:        axisMonitorDisplayComponent
842
                                Component.onCompleted:  item.narrowIndicator = true
Don Gagne's avatar
Don Gagne committed
843

844
                                property real ScreenTools.defaultFontPixelWidth:     ScreenTools.defaultFontPixelWidth
Don Gagne's avatar
Don Gagne committed
845 846
                                property bool mapped:               true
                                readonly property bool reversed:    false
847 848 849 850 851


                                MouseArea {
                                    id:             deadbandMouseArea
                                    anchors.fill:   parent.item
852
                                    enabled:        controller.deadbandToggle
853 854 855 856 857

                                    property real startY

                                    onPressed: {
                                        startY = mouseY
858
                                        parent.item.deadbandColor = "#3C6315"
859 860 861 862 863 864 865 866
                                    }
                                    onPositionChanged: {
                                        var newValue = parent.item.deadbandValue + (startY - mouseY)*15
                                        if ((newValue > 0) && (newValue <32768)){parent.item.deadbandValue=newValue;}
                                        startY = mouseY
                                    }
                                    onReleased: {
                                        controller.setDeadbandValue(modelData,parent.item.deadbandValue)
867
                                        parent.item.deadbandColor = "#8c161a"
868 869
                                    }
                                }
Don Gagne's avatar
Don Gagne committed
870
                            }
871

872 873
                        }
                    }
Don Gagne's avatar
Don Gagne committed
874
                } // Column - Axis Monitor
875

Don Gagne's avatar
Don Gagne committed
876 877 878 879
                // Button monitor
                Column {
                    width:      parent.width
                    spacing:    ScreenTools.defaultFontPixelHeight
880

Don Gagne's avatar
Don Gagne committed
881
                    QGCLabel { text: qsTr("Button Monitor") }
882

Don Gagne's avatar
Don Gagne committed
883 884
                    Connections {
                        target: _activeJoystick
885

Don Gagne's avatar
Don Gagne committed
886 887 888 889
                        onRawButtonPressedChanged: {
                            if (buttonMonitorRepeater.itemAt(index)) {
                                buttonMonitorRepeater.itemAt(index).pressed = pressed
                            }
890 891 892
                        }
                    }

Don Gagne's avatar
Don Gagne committed
893 894 895
                    Flow {
                        width:      parent.width
                        spacing:    -1
896

Don Gagne's avatar
Don Gagne committed
897 898
                        Repeater {
                            id:     buttonMonitorRepeater
899
                            model:  _activeJoystick ? _activeJoystick.totalButtonCount : 0
900

Don Gagne's avatar
Don Gagne committed
901 902 903 904 905 906
                            Rectangle {
                                width:          ScreenTools.defaultFontPixelHeight * 1.2
                                height:         width
                                border.width:   1
                                border.color:   qgcPal.text
                                color:          pressed ? qgcPal.buttonHighlight : qgcPal.button
907

Don Gagne's avatar
Don Gagne committed
908
                                property bool pressed
909

Don Gagne's avatar
Don Gagne committed
910 911 912 913 914 915 916
                                QGCLabel {
                                    anchors.fill:           parent
                                    color:                  pressed ? qgcPal.buttonHighlightText : qgcPal.buttonText
                                    horizontalAlignment:    Text.AlignHCenter
                                    verticalAlignment:      Text.AlignVCenter
                                    text:                   modelData
                                }
917
                            }
Don Gagne's avatar
Don Gagne committed
918 919 920 921 922 923 924
                        } // Repeater
                    } // Row
                } // Column - Axis Monitor
            } // Column - Right Column
        } // Item
    } // Component - pageComponent
} // SetupPage
Gregory Dymarek's avatar
Gregory Dymarek committed
925 926