SensorsComponent.qml 13.5 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
            controller.compassButton = compassButton
            controller.gyroButton = gyroButton
            controller.accelButton = accelButton
            controller.airspeedButton = airspeedButton
86
        }
Don Gagne's avatar
Don Gagne committed
87 88 89 90 91 92 93
    }

    Column {
        anchors.fill: parent

        QGCLabel {
            text: "SENSORS CONFIG"
94
            font.pointSize: screenTools.dpiAdjustedPointSize(20);
Don Gagne's avatar
Don Gagne committed
95 96 97 98
        }

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

99 100 101 102 103
        Row {
            readonly property int buttonWidth: 120

            spacing: 20

104
            QGCLabel { text: "Calibrate:"; anchors.baseline: compassButton.baseline }
105 106

            IndicatorButton {
107 108
                property Fact fact: Fact { name: "CAL_MAG0_ID" }

109
                id:             compassButton
110 111
                width:          parent.buttonWidth
                text:           "Compass"
112
                indicatorGreen: fact.value != 0
113 114 115 116
                onClicked: controller.calibrateCompass()
            }

            IndicatorButton {
117 118
                property Fact fact: Fact { name: "CAL_GYRO0_ID" }

119
                id:             gyroButton
120 121
                width:          parent.buttonWidth
                text:           "Gyroscope"
122
                indicatorGreen: fact.value != 0
123 124 125 126
                onClicked: controller.calibrateGyro()
            }

            IndicatorButton {
127 128
                property Fact fact: Fact { name: "CAL_ACC0_ID" }

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

            IndicatorButton {
137 138
                property Fact fact: Fact { name: "SENS_DPRES_OFF" }

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

        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
157 158
        Item {
            readonly property int calibrationAreaHeight: 300
159
            property int calDisplayAreaWidth: parent.width - rotationColumnWidth
Don Gagne's avatar
Don Gagne committed
160 161

            width:  parent.width
162
            height: parent.height - y
Don Gagne's avatar
Don Gagne committed
163 164 165

            TextArea {
                id:             statusTextArea
166
                width:          parent.calDisplayAreaWidth
Don Gagne's avatar
Don Gagne committed
167 168 169
                height:         parent.height
                readOnly:       true
                frameVisible:   false
170 171 172 173 174 175
                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
176 177 178 179 180 181 182

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

183 184 185 186 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
            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
274
            Column {
275 276 277 278
                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
279 280
                // Compass rotation parameter < 0 indicates either internal compass, or no compass. So in
                // both those cases we do not show a rotation combo.
281 282 283
                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
284 285 286 287 288 289

                x: parent.width - rotationColumnWidth

                QGCLabel { text: "Autpilot Orientation" }

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

                // Compass 0 rotation
                Component {
                    id: compass0ComponentLabel

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

                    FactComboBox {
306
                        id:     compass0RotationCombo
Don Gagne's avatar
Don Gagne committed
307 308
                        width:  rotationColumnWidth
                        model:  rotations
309
                        fact:   Fact { name: "CAL_MAG0_ROT" }
Don Gagne's avatar
Don Gagne committed
310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
                    }
                }
                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 {
325
                        id:     compass1RotationCombo
Don Gagne's avatar
Don Gagne committed
326 327
                        width:  rotationColumnWidth
                        model:  rotations
328
                        fact:   Fact { name: "CAL_MAG1_ROT" }
Don Gagne's avatar
Don Gagne committed
329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
                    }
                }
                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 {
344
                        id:     compass1RotationCombo
Don Gagne's avatar
Don Gagne committed
345 346
                        width:  rotationColumnWidth
                        model:  rotations
347
                        fact:   Fact { name: "CAL_MAG2_ROT" }
Don Gagne's avatar
Don Gagne committed
348 349 350 351 352 353 354 355 356
                    }
                }
                Loader { sourceComponent: parent.showCompass2 ? compass2ComponentLabel : null }
                Loader { sourceComponent: parent.showCompass2 ? compass2ComponentCombo : null }
            }
        }
    }
}