SensorsComponent.qml 13.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*=====================================================================

 QGroundControl Open Source Ground Control Station

 (c) 2009 - 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>

 This file is part of the QGROUNDCONTROL project

 QGROUNDCONTROL is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 QGROUNDCONTROL is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.

 ======================================================================*/

Don Gagne's avatar
Don Gagne committed
24 25 26 27 28 29 30 31
import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2

import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.Controls 1.0
32
import QGroundControl.ScreenTools 1.0
Don Gagne's avatar
Don Gagne committed
33 34 35

Rectangle {
    property QGCPalette qgcPal: QGCPalette { colorGroupEnabled: true }
36
    property ScreenTools screenTools: ScreenTools { }
Don Gagne's avatar
Don Gagne committed
37 38 39 40 41 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 72 73 74 75 76 77 78

    readonly property int rotationColumnWidth: 200
    readonly property var rotations: [
        "ROTATION_NONE",
        "ROTATION_YAW_45",
        "ROTATION_YAW_90",
        "ROTATION_YAW_135",
        "ROTATION_YAW_180",
        "ROTATION_YAW_225",
        "ROTATION_YAW_270",
        "ROTATION_YAW_315",
        "ROTATION_ROLL_180",
        "ROTATION_ROLL_180_YAW_45",
        "ROTATION_ROLL_180_YAW_90",
        "ROTATION_ROLL_180_YAW_135",
        "ROTATION_PITCH_180",
        "ROTATION_ROLL_180_YAW_225",
        "ROTATION_ROLL_180_YAW_270",
        "ROTATION_ROLL_180_YAW_315",
        "ROTATION_ROLL_90",
        "ROTATION_ROLL_90_YAW_45",
        "ROTATION_ROLL_90_YAW_90",
        "ROTATION_ROLL_90_YAW_135",
        "ROTATION_ROLL_270",
        "ROTATION_ROLL_270_YAW_45",
        "ROTATION_ROLL_270_YAW_90",
        "ROTATION_ROLL_270_YAW_135",
        "ROTATION_PITCH_90",
        "ROTATION_PITCH_270",
        "ROTATION_ROLL_270_YAW_270"
    ]

    color: qgcPal.window

    // We use this bogus loader just so we can get an onLoaded signal to hook to in order to
    // finish controller initialization.
    Component {
        id: loadSignal;
        Item { }
    }
    Loader {
        sourceComponent: loadSignal
79 80 81
        onLoaded: {
            controller.statusLog = statusTextArea
            controller.progressBar = progressBar
82 83 84 85 86 87 88 89
            controller.compassButton = compassButton
            controller.gyroButton = gyroButton
            controller.accelButton = accelButton
            controller.airspeedButton = airspeedButton
            controller.compass0RotationCombo = compass0RotationCombo
            controller.compass1RotationCombo = compass1RotationCombo
            controller.compass2RotationCombo = compass2RotationCombo
            controller.boardRotationCombo = boardRotationCombo
90
        }
Don Gagne's avatar
Don Gagne committed
91 92 93 94 95 96 97
    }

    Column {
        anchors.fill: parent

        QGCLabel {
            text: "SENSORS CONFIG"
98
            font.pointSize: screenTools.dpiAdjustedPointSize(20);
Don Gagne's avatar
Don Gagne committed
99 100 101 102
        }

        Item { height: 20; width: 10 } // spacer

103 104 105 106 107
        Row {
            readonly property int buttonWidth: 120

            spacing: 20

108
            QGCLabel { text: "Calibrate:"; anchors.baseline: compassButton.baseline }
109 110

            IndicatorButton {
111 112
                property Fact fact: Fact { name: "CAL_MAG0_ID" }

113
                id:             compassButton
114 115
                width:          parent.buttonWidth
                text:           "Compass"
116
                indicatorGreen: fact.value != 0
117 118 119 120
                onClicked: controller.calibrateCompass()
            }

            IndicatorButton {
121 122
                property Fact fact: Fact { name: "CAL_GYRO0_ID" }

123
                id:             gyroButton
124 125
                width:          parent.buttonWidth
                text:           "Gyroscope"
126
                indicatorGreen: fact.value != 0
127 128 129 130
                onClicked: controller.calibrateGyro()
            }

            IndicatorButton {
131 132
                property Fact fact: Fact { name: "CAL_ACC0_ID" }

133
                id:             accelButton
134
                width:          parent.buttonWidth
Don Gagne's avatar
Don Gagne committed
135
                text:           "Accelerometer"
136
                indicatorGreen: fact.value != 0
137 138 139 140
                onClicked: controller.calibrateAccel()
            }

            IndicatorButton {
141 142
                property Fact fact: Fact { name: "SENS_DPRES_OFF" }

143
                id:             airspeedButton
144 145 146
                width:          parent.buttonWidth
                text:           "Airspeed"
                visible:        controller.fixedWing
147 148
                indicatorGreen: fact.value != 0
                onClicked:      controller.calibrateAirspeed()
149 150 151 152 153 154 155 156 157 158 159 160
            }
        }

        Item { height: 20; width: 10 } // spacer

        ProgressBar {
            id: progressBar
            width: parent.width - rotationColumnWidth
        }

        Item { height: 10; width: 10 } // spacer

Don Gagne's avatar
Don Gagne committed
161 162
        Item {
            readonly property int calibrationAreaHeight: 300
163
            property int calDisplayAreaWidth: parent.width - rotationColumnWidth
Don Gagne's avatar
Don Gagne committed
164 165

            width:  parent.width
166
            height: parent.height - y
Don Gagne's avatar
Don Gagne committed
167 168 169

            TextArea {
                id:             statusTextArea
170
                width:          parent.calDisplayAreaWidth
Don Gagne's avatar
Don Gagne committed
171 172 173
                height:         parent.height
                readOnly:       true
                frameVisible:   false
174 175 176 177 178 179
                text:           "Sensor config is a work in progress. Not all visuals for all calibration types fully implemented.\n\n" +
                                "For Compass calibration you will need to rotate your vehicle through a number of positions. For this calibration is is best " +
                                "to be connected to you vehicle via radio instead of USB since the USB cable will likely get in the way.\n\n" +
                                "For Gyroscope calibration you will need to place your vehicle right side up on solid surface and leave it still.\n\n" +
                                "For Accelerometer calibration you will need to place your vehicle on all six sides and hold it there for a few seconds.\n\n" +
                                "For Airspeed calibration you will need to keep your airspeed sensor out of any wind.\n\n"
Don Gagne's avatar
Don Gagne committed
180 181 182 183 184 185 186

                style: TextAreaStyle {
                    textColor: qgcPal.text
                    backgroundColor: qgcPal.windowShade
                }
            }

187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
            Rectangle {
                id:         gyroCalArea
                width:      parent.calDisplayAreaWidth
                height:     parent.height
                visible:    controller.showGyroCalArea
                color:      qgcPal.windowShade

                Column {
                    width: parent.width

                    QGCLabel {
                        text: "Place your vehicle upright on a solid surface and hold it still."
                    }

                    VehicleRotationCal {
                        width:          200
                        height:         200
                        calValid:       true
                        calInProgress:  controller.gyroCalInProgress
                        imageSource:    "qrc:///qml/VehicleDown.png"
                    }

                }
            }

            Rectangle {
                id:         accelCalArea
                width:      parent.calDisplayAreaWidth
                height:     parent.height
                visible:    controller.showAccelCalArea
                color:      qgcPal.windowShade

                QGCLabel {
                    id:         calAreaLabel
                    width:      parent.width
                    wrapMode:   Text.WordWrap

                    text: "Place your vehicle into each of the positions below and hold still. Once that position is completed you can move to another."
                }

                Flow {
                    y:          calAreaLabel.height
                    width:      parent.width
                    height:     parent.height - calAreaLabel.implicitHeight
                    spacing:    5

                    VehicleRotationCal {
                        width:          200
                        height:         200
                        calValid:       controller.accelCalDownSideDone
                        calInProgress:  controller.accelCalDownSideInProgress
                        imageSource:    "qrc:///qml/VehicleDown.png"
                    }
                    VehicleRotationCal {
                        width:          200
                        height:         200
                        calValid:       controller.accelCalUpsideDownSideDone
                        calInProgress:  controller.accelCalUpsideDownSideInProgress
                        imageSource:    "qrc:///qml/VehicleUpsideDown.png"
                    }
                    VehicleRotationCal {
                        width:          200
                        height:         200
                        calValid:       controller.accelCalNoseDownSideDone
                        calInProgress:  controller.accelCalNoseDownSideInProgress
                        imageSource:    "qrc:///qml/VehicleNoseDown.png"
                    }
                    VehicleRotationCal {
                        width:          200
                        height:         200
                        calValid:       controller.accelCalTailDownSideDone
                        calInProgress:  controller.accelCalTailDownSideInProgress
                        imageSource:    "qrc:///qml/VehicleTailDown.png"
                    }
                    VehicleRotationCal {
                        width:          200
                        height:         200
                        calValid:       controller.accelCalLeftSideDone
                        calInProgress:  controller.accelCalLeftSideInProgress
                        imageSource:    "qrc:///qml/VehicleLeft.png"
                    }
                    VehicleRotationCal {
                        width:          200
                        height:         200
                        calValid:       controller.accelCalRightSideDone
                        calInProgress:  controller.accelCalRightSideInProgress
                        imageSource:    "qrc:///qml/VehicleRight.png"
                    }
                }
            }

Don Gagne's avatar
Don Gagne committed
278
            Column {
279 280 281 282
                property Fact cal_mag0_rot: Fact { name: "CAL_MAG0_ROT" }
                property Fact cal_mag1_rot: Fact { name: "CAL_MAG1_ROT" }
                property Fact cal_mag2_rot: Fact { name: "CAL_MAG2_ROT" }

Don Gagne's avatar
Don Gagne committed
283 284
                // Compass rotation parameter < 0 indicates either internal compass, or no compass. So in
                // both those cases we do not show a rotation combo.
285 286 287
                property bool showCompass0: cal_mag0_rot.value >= 0
                property bool showCompass1: cal_mag1_rot.value >= 0
                property bool showCompass2: cal_mag2_rot.value >= 0
Don Gagne's avatar
Don Gagne committed
288 289 290 291 292 293

                x: parent.width - rotationColumnWidth

                QGCLabel { text: "Autpilot Orientation" }

                FactComboBox {
294
                    id:     boardRotationCombo
Don Gagne's avatar
Don Gagne committed
295 296
                    width:  rotationColumnWidth;
                    model:  rotations
297
                    fact:   Fact { name: "SENS_BOARD_ROT" }
Don Gagne's avatar
Don Gagne committed
298 299 300 301 302 303 304 305 306 307 308 309
                }

                // Compass 0 rotation
                Component {
                    id: compass0ComponentLabel

                    QGCLabel { text: "Compass Orientation" }
                }
                Component {
                    id: compass0ComponentCombo

                    FactComboBox {
310
                        id:     compass0RotationCombo
Don Gagne's avatar
Don Gagne committed
311 312
                        width:  rotationColumnWidth
                        model:  rotations
313
                        fact:   Fact { name: "CAL_MAG0_ROT" }
Don Gagne's avatar
Don Gagne committed
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328
                    }
                }
                Loader { sourceComponent: parent.showCompass0 ? compass0ComponentLabel : null }
                Loader { sourceComponent: parent.showCompass0 ? compass0ComponentCombo : null }

                // Compass 1 rotation
                Component {
                    id: compass1ComponentLabel

                    QGCLabel { text: "Compass 1 Orientation" }
                }
                Component {
                    id: compass1ComponentCombo

                    FactComboBox {
329
                        id:     compass1RotationCombo
Don Gagne's avatar
Don Gagne committed
330 331
                        width:  rotationColumnWidth
                        model:  rotations
332
                        fact:   Fact { name: "CAL_MAG1_ROT" }
Don Gagne's avatar
Don Gagne committed
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
                    }
                }
                Loader { sourceComponent: parent.showCompass1 ? compass1ComponentLabel : null }
                Loader { sourceComponent: parent.showCompass1 ? compass1ComponentCombo : null }

                // Compass 2 rotation
                Component {
                    id: compass2ComponentLabel

                    QGCLabel { text: "Compass 2 Orientation" }
                }
                Component {
                    id: compass2ComponentCombo

                    FactComboBox {
348
                        id:     compass1RotationCombo
Don Gagne's avatar
Don Gagne committed
349 350
                        width:  rotationColumnWidth
                        model:  rotations
351
                        fact:   Fact { name: "CAL_MAG2_ROT" }
Don Gagne's avatar
Don Gagne committed
352 353 354 355 356 357 358 359 360
                    }
                }
                Loader { sourceComponent: parent.showCompass2 ? compass2ComponentLabel : null }
                Loader { sourceComponent: parent.showCompass2 ? compass2ComponentCombo : null }
            }
        }
    }
}