CheckList.qml 9.18 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 24 25 26 27 28 29 30 31 32 33 34 35 36 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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
import QtQuick                      2.3
import QtQml.Models                 2.1

import QGroundControl               1.0
import QGroundControl.FlightDisplay 1.0
import QGroundControl.ScreenTools   1.0
import QGroundControl.Controls      1.0
import QGroundControl.Palette       1.0
import QGroundControl.Vehicle       1.0

// This class stores the data and functions of the check list but NOT the GUI (which is handled somewhere else).
Item {
    // Properties
    property int            unhealthySensors:       _activeVehicle ? _activeVehicle.sensorsUnhealthyBits : 0
    property bool           gpsLock:                _activeVehicle ? _activeVehicle.gps.lock.rawValue>=3 : 0
    property var            batPercentRemaining:    _activeVehicle ? _activeVehicle.battery.percentRemaining.value : 0
    property bool           audioMuted:             QGroundControl.settingsManager.appSettings.audioMuted.rawValue
    property ObjectModel    checkListItems:         _checkListItems
    property var            _activeVehicle:         QGroundControl.multiVehicleManager.activeVehicle
    property int            _checkState:            _activeVehicle ? (_activeVehicle.armed ? 1 + (buttonActuators._state + buttonMotors._state + buttonMission._state + buttonSoundOutput._state) / 4 / 4 : 0) : 0 ; // Shows progress of checks inside the checklist - unlocks next check steps in groups

    // Connections
    onBatPercentRemainingChanged:   buttonBattery.updateItem();
    onGpsLockChanged:               buttonSensors.updateItem();
    onAudioMutedChanged:            buttonSoundOutput.updateItem();
    onUnhealthySensorsChanged:      updateVehicleDependentItems();

    Connections {
        target: QGroundControl.multiVehicleManager
        onActiveVehicleChanged: onActiveVehicleChanged();
    }
    Component.onCompleted: {
        if(QGroundControl.multiVehicleManager.vehicles.count > 0) {
            onActiveVehicleChanged();
        }
    }

    // Functions
    function updateVehicleDependentItems() {
        buttonSensors.updateItem();
        buttonBattery.updateItem();
        buttonRC.updateItem();
        buttonEstimator.updateItem();
    }
    function onActiveVehicleChanged() {
        buttonSoundOutput.updateItem();     // Just updated here for initialization once we connect to a vehicle
        updateVehicleDependentItems();
    }
    function resetNrClicks() {
        buttonHardware.resetNrClicks();
        buttonBattery.resetNrClicks();
        buttonRC.resetNrClicks();
        buttonActuators.resetNrClicks();
        buttonMotors.resetNrClicks();
        buttonMission.resetNrClicks();
        buttonSoundOutput.resetNrClicks();
        buttonPayload.resetNrClicks();
        buttonWeather.resetNrClicks();
        buttonFlightAreaFree.resetNrClicks();
    }

    // Check list item data
    ObjectModel {
        id: _checkListItems

        // Standard check list items (group 0) - Available from the start
        QGCCheckListItem {
            id: buttonHardware
            name: "Hardware"
            defaulttext: "Props mounted? Wings secured? Tail secured?"
        }
        QGCCheckListItem {
             id: buttonBattery
             name: "Battery"
             pendingtext: "Healthy & charged > 40%. Battery connector firmly plugged?"
             function updateItem() {
                 if (!_activeVehicle) {
                     _state = 0;
                 } else {
                     if (!(unhealthySensors & Vehicle.SysStatusSensorBattery) && batPercentRemaining>=40.0) _state = 1+3*(_nrClicked>0);
                     else {
                         if(unhealthySensors & Vehicle.SysStatusSensorBattery) failuretext="Not healthy. Check console.";
                         else if(batPercentRemaining<40.0) failuretext="Low (below 40%). Please recharge.";
                         _state = 3;
                     }
                 }
             }
        }
        QGCCheckListItem {
             id: buttonSensors
             name: "Sensors"
             function updateItem() {
                 if (!_activeVehicle) {
                     _state = 0;
                 } else {
                     if(!(unhealthySensors & Vehicle.SysStatusSensor3dMag) &&
                        !(unhealthySensors & Vehicle.SysStatusSensor3dAccel) &&
                        !(unhealthySensors & Vehicle.SysStatusSensor3dGyro) &&
                        !(unhealthySensors & Vehicle.SysStatusSensorAbsolutePressure) &&
                        !(unhealthySensors & Vehicle.SysStatusSensorDifferentialPressure) &&
                        !(unhealthySensors & Vehicle.SysStatusSensorGPS)) {
                         if(!gpsLock) {
                             pendingtext="Pending. Waiting for GPS lock.";
                             _state=1;
                         } else {
                             _state = 4; // All OK
                         }
                     } else {
                         if(unhealthySensors & Vehicle.SysStatusSensor3dMag)                        failuretext="Failure. Magnetometer issues. Check console.";
                         else if(unhealthySensors & Vehicle.SysStatusSensor3dAccel)                 failuretext="Failure. Accelerometer issues. Check console.";
                         else if(unhealthySensors & Vehicle.SysStatusSensor3dGyro)                  failuretext="Failure. Gyroscope issues. Check console.";
                         else if(unhealthySensors & Vehicle.SysStatusSensorAbsolutePressure)        failuretext="Failure. Barometer issues. Check console.";
                         else if(unhealthySensors & Vehicle.SysStatusSensorDifferentialPressure)    failuretext="Failure. Airspeed sensor issues. Check console.";
                         else if(unhealthySensors & Vehicle.SysStatusSensorGPS)                     failuretext="Failure. No valid or low quality GPS signal. Check console.";
                         _state = 3;
                     }
                 }
             }
        }
        QGCCheckListItem {
            id: buttonRC
            name: "Radio Control"
            pendingtext: "Receiving signal. Perform range test & confirm."
            failuretext: "No signal or invalid autopilot-RC config. Check RC and console."
            function updateItem() {
                if (!_activeVehicle) {
                    _state = 0;
                } else {
                    if (unhealthySensors & Vehicle.SysStatusSensorRCReceiver) {_state = 3}
                    else {_state = 1+3*(_nrClicked>0);}
                }
            }
        }
        QGCCheckListItem {
            id: buttonEstimator
            name: "Global position estimate"
            function updateItem() {
                if (!_activeVehicle) {
                    _state = 0;
                } else {
                    if (unhealthySensors & Vehicle.SysStatusSensorAHRS) {_state = 3;}
                    else {_state = 4;}
                }
            }
        }

        // Check list item group 1 - Require arming
        QGCLabel {text:qsTr("<i>Please arm the vehicle here.</i>") ; opacity: 0.2+0.8*(QGroundControl.multiVehicleManager.vehicles.count > 0) ; anchors.horizontalCenter:buttonHardware.horizontalCenter ; anchors.topMargin:40 ; anchors.bottomMargin:40;}
        QGCCheckListItem {
           id: buttonActuators
           name: "Actuators"
           group: 1
           defaulttext: "Move all control surfaces. Did they work properly?"
        }
        QGCCheckListItem {
           id: buttonMotors
           name: "Motors"
           group: 1
           defaulttext: "Propellers free? Then throttle up gently. Working properly?"
        }
        QGCCheckListItem {
           id: buttonMission
           name: "Mission"
           group: 1
           defaulttext: "Please confirm mission is valid (waypoints valid, no terrain collision)."
        }
        QGCCheckListItem {
           id: buttonSoundOutput
           name: "Sound output"
           group: 1
           pendingtext: "QGC audio output enabled. System audio output enabled, too?"
           failuretext: "Failure, QGC audio output is disabled. Please enable it under application settings->general to hear audio warnings!"
           function updateItem() {
               if (!_activeVehicle) {
                   _state = 0;
               } else {
                   if (audioMuted) {_state = 3 ; _nrClicked=0;}
                   else {_state = 1+3*(_nrClicked>0);}
               }
           }
        }

        // Check list item group 2 - Final checks before launch
        QGCLabel {text:qsTr("<i>Last preparations before launch</i>") ; opacity : 0.2+0.8*(_checkState >= 2); anchors.horizontalCenter:buttonHardware.horizontalCenter}
        QGCCheckListItem {
           id: buttonPayload
           name: "Payload"
           group: 2
           defaulttext: "Configured and started?"
           pendingtext: "Payload lid closed?"
        }
        QGCCheckListItem {
           id: buttonWeather
           name: "Wind & weather"
           group: 2
           defaulttext: "OK for your platform?"
           pendingtext: "Launching into the wind?"
        }
        QGCCheckListItem {
           id: buttonFlightAreaFree
           name: "Flight area"
           group: 2
           defaulttext: "Launch area and path free of obstacles/people?"
        }
    } // Object Model
}