JoystickConfig.qml 42.2 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
    Component {
        id: pageComponent

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

            property bool controllerCompleted:      false
            property bool controllerAndViewReady:   false

            readonly property real labelToMonitorMargin: defaultTextWidth * 3

            property var _activeVehicle:    QGroundControl.multiVehicleManager.activeVehicle
            property var _activeJoystick:   joystickManager.activeJoystick

            JoystickConfigController {
                id:             controller
                factPanel:      joystickPage.viewPanel
                statusText:     statusText
                cancelButton:   cancelButton
                nextButton:     nextButton
                skipButton:     skipButton

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

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

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

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

Don Gagne's avatar
Don Gagne committed
91
                    property color          __barColor:             qgcPal.windowShade
92

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

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

                        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
117 118 119 120 121 122 123
                    // Center point
                    Rectangle {
                        anchors.horizontalCenter:   parent.horizontalCenter
                        width:                      defaultTextWidth / 2
                        height:                     parent.height
                        color:                      qgcPal.window
                    }
124

Don Gagne's avatar
Don Gagne committed
125 126 127
                    // Indicator
                    Rectangle {
                        anchors.verticalCenter: parent.verticalCenter
128 129
                        width:                  parent.narrowIndicator ?  height/6 : height
                        height:                 parent.height * 0.75
Don Gagne's avatar
Don Gagne committed
130 131 132 133 134 135 136 137
                        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
                    }
138

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

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

Gregory Dymarek's avatar
Gregory Dymarek committed
156

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

165
                }
Don Gagne's avatar
Don Gagne committed
166
            } // Component - axisMonitorDisplayComponent
167

Don Gagne's avatar
Don Gagne committed
168 169 170 171 172 173 174 175 176
            // 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
177

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

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

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

Don Gagne's avatar
Don Gagne committed
189 190 191
                        QGCLabel {
                            id:     rollLabel
                            width:  defaultTextWidth * 10
192
                            text:   _activeVehicle.sub ? qsTr("Lateral") : qsTr("Roll")
Don Gagne's avatar
Don Gagne committed
193
                        }
194

Don Gagne's avatar
Don Gagne committed
195 196 197 198 199 200 201 202 203 204 205 206
                        Loader {
                            id:                 rollLoader
                            anchors.left:       rollLabel.right
                            anchors.right:      parent.right
                            height:             ScreenTools.defaultFontPixelHeight
                            width:              100
                            sourceComponent:    axisMonitorDisplayComponent

                            property real defaultTextWidth: ScreenTools.defaultFontPixelWidth
                            property bool mapped:           controller.rollAxisMapped
                            property bool reversed:         controller.rollAxisReversed
                        }
207

208 209 210 211 212
                        Connections {
                            target: _activeJoystick

                            onManualControl: rollLoader.item.axisValue = roll*32768.0
                        }
213 214
                    }

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

Don Gagne's avatar
Don Gagne committed
219 220 221
                        QGCLabel {
                            id:     pitchLabel
                            width:  defaultTextWidth * 10
222
                            text:   _activeVehicle.sub ? qsTr("Forward") : qsTr("Pitch")
Don Gagne's avatar
Don Gagne committed
223
                        }
224

Don Gagne's avatar
Don Gagne committed
225 226 227 228 229 230 231 232 233 234 235 236
                        Loader {
                            id:                 pitchLoader
                            anchors.left:       pitchLabel.right
                            anchors.right:      parent.right
                            height:             ScreenTools.defaultFontPixelHeight
                            width:              100
                            sourceComponent:    axisMonitorDisplayComponent

                            property real defaultTextWidth: ScreenTools.defaultFontPixelWidth
                            property bool mapped:           controller.pitchAxisMapped
                            property bool reversed:         controller.pitchAxisReversed
                        }
237

238 239 240 241 242
                        Connections {
                            target: _activeJoystick

                            onManualControl: pitchLoader.item.axisValue = pitch*32768.0
                        }
243 244
                    }

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

Don Gagne's avatar
Don Gagne committed
249 250 251 252 253
                        QGCLabel {
                            id:     yawLabel
                            width:  defaultTextWidth * 10
                            text:   qsTr("Yaw")
                        }
254

Don Gagne's avatar
Don Gagne committed
255 256 257 258 259 260 261 262 263 264 265 266
                        Loader {
                            id:                 yawLoader
                            anchors.left:       yawLabel.right
                            anchors.right:      parent.right
                            height:             ScreenTools.defaultFontPixelHeight
                            width:              100
                            sourceComponent:    axisMonitorDisplayComponent

                            property real defaultTextWidth: ScreenTools.defaultFontPixelWidth
                            property bool mapped:           controller.yawAxisMapped
                            property bool reversed:         controller.yawAxisReversed
                        }
267

268 269 270 271 272
                        Connections {
                            target: _activeJoystick

                            onManualControl: yawLoader.item.axisValue = yaw*32768.0
                        }
273 274
                    }

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

Don Gagne's avatar
Don Gagne committed
279 280 281 282 283
                        QGCLabel {
                            id:     throttleLabel
                            width:  defaultTextWidth * 10
                            text:   qsTr("Throttle")
                        }
284

Don Gagne's avatar
Don Gagne committed
285 286 287 288 289 290 291 292 293 294 295 296
                        Loader {
                            id:                 throttleLoader
                            anchors.left:       throttleLabel.right
                            anchors.right:      parent.right
                            height:             ScreenTools.defaultFontPixelHeight
                            width:              100
                            sourceComponent:    axisMonitorDisplayComponent

                            property real defaultTextWidth: ScreenTools.defaultFontPixelWidth
                            property bool mapped:           controller.throttleAxisMapped
                            property bool reversed:         controller.throttleAxisReversed
                        }
297

298 299 300
                        Connections {
                            target: _activeJoystick

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

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

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

Don Gagne's avatar
Don Gagne committed
315
                        onClicked: controller.skipButtonClicked()
316 317
                    }

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

Don Gagne's avatar
Don Gagne committed
322 323
                        onClicked: controller.cancelButtonClicked()
                    }
324

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

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

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

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

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

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

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

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


Don Gagne's avatar
Don Gagne committed
365
                            QGCCheckBox {
Jacob Walser's avatar
Jacob Walser committed
366
                                id:         enabledCheckBox
367 368
                                enabled:    _activeJoystick ? _activeJoystick.calibrated : false
                                text:       _activeJoystick ? _activeJoystick.calibrated ? qsTr("Enable joystick input") : qsTr("Enable not allowed (Calibrate First)") : ""
369
                                onClicked:  _activeVehicle.joystickEnabled = checked
370 371 372 373 374 375 376 377 378
                                Component.onCompleted: checked = _activeVehicle.joystickEnabled

                                Connections {
                                    target: _activeVehicle

                                    onJoystickEnabledChanged: {
                                        enabledCheckBox.checked = _activeVehicle.joystickEnabled
                                    }
                                }
379

Jacob Walser's avatar
Jacob Walser committed
380 381 382 383
                                Connections {
                                    target: joystickManager

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

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

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

Don Gagne's avatar
Don Gagne committed
401 402 403 404 405 406 407 408 409 410 411 412 413 414
                                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
                                        }
415
                                    }
Jacob Walser's avatar
Jacob Walser committed
416 417 418 419 420

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

Don Gagne's avatar
Don Gagne committed
429 430 431
                            Column {
                                spacing: ScreenTools.defaultFontPixelHeight / 3
                                visible: _activeVehicle.supportsThrottleModeCenterZero
432

Don Gagne's avatar
Don Gagne committed
433
                                ExclusiveGroup { id: throttleModeExclusiveGroup }
434

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

Don Gagne's avatar
Don Gagne committed
440 441
                                    onClicked: _activeJoystick.throttleMode = 0
                                }
442

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

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

                                        onClicked:  _activeJoystick.accumulator = checked
                                    }
                                }

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

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

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

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

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

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

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

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

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

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

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

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

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

Don Gagne's avatar
Don Gagne committed
530 531
                                    onActivated: _activeVehicle.joystickMode = index
                                }
532
                            }
533

534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551
                            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)
                                    }
                                }
                            }

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

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

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

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

                                    onClicked:  controller.deadbandToggle = checked
                                }
                            }
581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
                            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
                                }
                            }
596
                        }
Don Gagne's avatar
Don Gagne committed
597
                    } // Column - left column
598

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

Don Gagne's avatar
Don Gagne committed
604 605
                        Connections {
                            target: _activeJoystick
606

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

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

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

Don Gagne's avatar
Don Gagne committed
623 624 625
                            QGCLabel {
                                visible: _activeVehicle.manualControlReservedButtonCount != 0
                                text: qsTr("Buttons 0-%1 reserved for firmware use").arg(reservedButtonCount)
626

Don Gagne's avatar
Don Gagne committed
627 628
                                property int reservedButtonCount: _activeVehicle.manualControlReservedButtonCount == -1 ? _activeJoystick.totalButtonCount : _activeVehicle.manualControlReservedButtonCount
                            }
629

Don Gagne's avatar
Don Gagne committed
630 631
                            Repeater {
                                id:     buttonActionRepeater
dheideman's avatar
dheideman committed
632
                                model:  _activeJoystick ? Math.min(_activeJoystick.totalButtonCount, _maxButtons) : 0
633

Don Gagne's avatar
Don Gagne committed
634 635 636
                                Row {
                                    spacing: ScreenTools.defaultFontPixelWidth
                                    visible: (_activeVehicle.manualControlReservedButtonCount == -1 ? false : modelData >= _activeVehicle.manualControlReservedButtonCount) && !_activeVehicle.supportsJSButton
637

Don Gagne's avatar
Don Gagne committed
638
                                    property bool pressed
639

Don Gagne's avatar
Don Gagne committed
640 641
                                    QGCCheckBox {
                                        anchors.verticalCenter:     parent.verticalCenter
642
                                        checked:                    _activeJoystick ? _activeJoystick.buttonActions[modelData] != "" : false
643

Don Gagne's avatar
Don Gagne committed
644 645
                                        onClicked: _activeJoystick.setButtonAction(modelData, checked ? buttonActionCombo.textAt(buttonActionCombo.currentIndex) : "")
                                    }
646

Don Gagne's avatar
Don Gagne committed
647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662
                                    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
                                        }
663 664
                                    }

Don Gagne's avatar
Don Gagne committed
665 666 667
                                    QGCComboBox {
                                        id:             buttonActionCombo
                                        width:          ScreenTools.defaultFontPixelWidth * 20
668
                                        model:          _activeJoystick ? _activeJoystick.actions : 0
669

Don Gagne's avatar
Don Gagne committed
670 671 672
                                        onActivated:            _activeJoystick.setButtonAction(modelData, textAt(index))
                                        Component.onCompleted:  currentIndex = find(_activeJoystick.buttonActions[modelData])
                                    }
673
                                }
Don Gagne's avatar
Don Gagne committed
674
                            } // Repeater
675 676 677

                            Row {
                                spacing: ScreenTools.defaultFontPixelWidth
678
                                visible: _activeVehicle.supportsJSButton
679

Don Gagne's avatar
Don Gagne committed
680 681 682 683
                                QGCLabel {
                                    horizontalAlignment:    Text.AlignHCenter
                                    width:                  ScreenTools.defaultFontPixelHeight * 1.5
                                    text:                   qsTr("#")
684 685
                                }

Don Gagne's avatar
Don Gagne committed
686 687 688
                                QGCLabel {
                                    width:                  ScreenTools.defaultFontPixelWidth * 15
                                    text:                   qsTr("Function: ")
689 690
                                }

Don Gagne's avatar
Don Gagne committed
691 692 693
                                QGCLabel {
                                    width:                  ScreenTools.defaultFontPixelWidth * 15
                                    text:                   qsTr("Shift Function: ")
694 695
                                }
                            } // Row
696

Don Gagne's avatar
Don Gagne committed
697 698
                            Repeater {
                                id:     jsButtonActionRepeater
dheideman's avatar
dheideman committed
699
                                model:  _activeJoystick ? Math.min(_activeJoystick.totalButtonCount, _maxButtons) : 0
Don Gagne's avatar
Don Gagne committed
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 737 738 739 740 741 742 743 744 745

                                Row {
                                    spacing: ScreenTools.defaultFontPixelWidth
                                    visible: _activeVehicle.supportsJSButton

                                    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
746
            Column {
Don Gagne's avatar
Don Gagne committed
747 748 749
                id:             rightColumn
                anchors.top:    parent.top
                anchors.right:  parent.right
750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765
                width:          Math.min(joystickPage.defaultTextWidth * 35, availableWidth * 0.4)
                spacing:        ScreenTools.defaultFontPixelHeight / 2

                Row {
                    spacing: ScreenTools.defaultFontPixelWidth

                    ExclusiveGroup { id: modeGroup }

                    QGCLabel {
                        text: "TX Mode:"
                    }

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

                        onClicked: controller.transmitterMode = 1
                    }

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

                        onClicked: controller.transmitterMode = 2
                    }

                    QGCRadioButton {
                        exclusiveGroup: modeGroup
                        text:           "3"
                        checked:        controller.transmitterMode == 3
784
                        enabled:        !controller.calibrating
785 786 787 788 789 790 791 792

                        onClicked: controller.transmitterMode = 3
                    }

                    QGCRadioButton {
                        exclusiveGroup: modeGroup
                        text:           "4"
                        checked:        controller.transmitterMode == 4
793
                        enabled:        !controller.calibrating
794 795 796 797

                        onClicked: controller.transmitterMode = 4
                    }
                }
Don Gagne's avatar
Don Gagne committed
798 799

                Image {
800
                    width:      parent.width
Don Gagne's avatar
Don Gagne committed
801 802 803 804
                    fillMode:   Image.PreserveAspectFit
                    smooth:     true
                    source:     controller.imageHelp
                }
805

Don Gagne's avatar
Don Gagne committed
806 807 808 809
                // Axis monitor
                Column {
                    width:      parent.width
                    spacing:    5
810

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

Don Gagne's avatar
Don Gagne committed
813 814 815 816 817 818 819
                    Connections {
                        target: controller

                        onAxisValueChanged: {
                            if (axisMonitorRepeater.itemAt(axis)) {
                                axisMonitorRepeater.itemAt(axis).loader.item.axisValue = value
                            }
820
                        }
821 822 823 824 825 826

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

Don Gagne's avatar
Don Gagne committed
829 830
                    Repeater {
                        id:     axisMonitorRepeater
831
                        model:  _activeJoystick ? _activeJoystick.axisCount : 0
Don Gagne's avatar
Don Gagne committed
832
                        width:  parent.width
833

Don Gagne's avatar
Don Gagne committed
834 835
                        Row {
                            spacing:    5
836

Don Gagne's avatar
Don Gagne committed
837 838
                            // Need this to get to loader from Connections above
                            property Item loader: theLoader
839

Don Gagne's avatar
Don Gagne committed
840 841 842 843
                            QGCLabel {
                                id:     axisLabel
                                text:   modelData
                            }
844

Don Gagne's avatar
Don Gagne committed
845 846 847 848 849 850
                            Loader {
                                id:                     theLoader
                                anchors.verticalCenter: axisLabel.verticalCenter
                                height:                 ScreenTools.defaultFontPixelHeight
                                width:                  200
                                sourceComponent:        axisMonitorDisplayComponent
851
                                Component.onCompleted:  item.narrowIndicator = true
Don Gagne's avatar
Don Gagne committed
852 853 854 855

                                property real defaultTextWidth:     ScreenTools.defaultFontPixelWidth
                                property bool mapped:               true
                                readonly property bool reversed:    false
856 857 858 859 860


                                MouseArea {
                                    id:             deadbandMouseArea
                                    anchors.fill:   parent.item
861
                                    enabled:        controller.deadbandToggle
862 863 864 865 866

                                    property real startY

                                    onPressed: {
                                        startY = mouseY
867
                                        parent.item.deadbandColor = "#3C6315"
868 869 870 871 872 873 874 875
                                    }
                                    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)
876
                                        parent.item.deadbandColor = "#8c161a"
877 878
                                    }
                                }
Don Gagne's avatar
Don Gagne committed
879
                            }
880

881 882
                        }
                    }
Don Gagne's avatar
Don Gagne committed
883
                } // Column - Axis Monitor
884

Don Gagne's avatar
Don Gagne committed
885 886 887 888
                // Button monitor
                Column {
                    width:      parent.width
                    spacing:    ScreenTools.defaultFontPixelHeight
889

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

Don Gagne's avatar
Don Gagne committed
892 893
                    Connections {
                        target: _activeJoystick
894

Don Gagne's avatar
Don Gagne committed
895 896 897 898
                        onRawButtonPressedChanged: {
                            if (buttonMonitorRepeater.itemAt(index)) {
                                buttonMonitorRepeater.itemAt(index).pressed = pressed
                            }
899 900 901
                        }
                    }

Don Gagne's avatar
Don Gagne committed
902 903 904
                    Flow {
                        width:      parent.width
                        spacing:    -1
905

Don Gagne's avatar
Don Gagne committed
906 907
                        Repeater {
                            id:     buttonMonitorRepeater
908
                            model:  _activeJoystick ? _activeJoystick.totalButtonCount : 0
909

Don Gagne's avatar
Don Gagne committed
910 911 912 913 914 915
                            Rectangle {
                                width:          ScreenTools.defaultFontPixelHeight * 1.2
                                height:         width
                                border.width:   1
                                border.color:   qgcPal.text
                                color:          pressed ? qgcPal.buttonHighlight : qgcPal.button
916

Don Gagne's avatar
Don Gagne committed
917
                                property bool pressed
918

Don Gagne's avatar
Don Gagne committed
919 920 921 922 923 924 925
                                QGCLabel {
                                    anchors.fill:           parent
                                    color:                  pressed ? qgcPal.buttonHighlightText : qgcPal.buttonText
                                    horizontalAlignment:    Text.AlignHCenter
                                    verticalAlignment:      Text.AlignVCenter
                                    text:                   modelData
                                }
926
                            }
Don Gagne's avatar
Don Gagne committed
927 928 929 930 931 932 933
                        } // Repeater
                    } // Row
                } // Column - Axis Monitor
            } // Column - Right Column
        } // Item
    } // Component - pageComponent
} // SetupPage
Gregory Dymarek's avatar
Gregory Dymarek committed
934 935