diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index 4234f1b44ebb6e65e839446351e8777fee91df79..181621741b86acada6d19f3c8865539ad033522d 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -19,6 +19,14 @@ src/ui/toolbar/TelemetryRSSIIndicator.qml src/ui/toolbar/VTOLModeIndicator.qml + + src/FlightDisplay/DefaultChecklist.qml + src/FlightDisplay/MultiRotorChecklist.qml + src/FlightDisplay/FixedWingChecklist.qml + src/FlightDisplay/VTOLChecklist.qml + src/FlightDisplay/RoverChecklist.qml + src/FlightDisplay/SubChecklist.qml + src/QmlControls/HeightIndicator.qml src/QmlControls/QGCDynamicObjectManager.qml @@ -65,6 +73,7 @@ src/PlanView/PlanToolBar.qml src/PlanView/PlanToolBarIndicators.qml src/PlanView/PlanView.qml + src/FlightDisplay/PreFlightCheckList.qml src/VehicleSetup/PX4FlowSensor.qml src/FlightMap/Widgets/QGCInstrumentWidget.qml src/FlightMap/Widgets/QGCInstrumentWidgetAlternate.qml diff --git a/src/FlightDisplay/DefaultChecklist.qml b/src/FlightDisplay/DefaultChecklist.qml new file mode 100644 index 0000000000000000000000000000000000000000..47ff95d159dc1ea9056dc1bc5322a285f4015bd1 --- /dev/null +++ b/src/FlightDisplay/DefaultChecklist.qml @@ -0,0 +1,92 @@ +/**************************************************************************** + * + * (c) 2009-2016 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQml.Models 2.1 + +import QGroundControl 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.FlightDisplay 1.0 +import QGroundControl.Vehicle 1.0 + +Item { + property var model: listModel + PreFlightCheckModel { + id: listModel + PreFlightCheckGroup { + name: qsTr("Generic Initial checks") + + PreFlightCheckButton { + name: qsTr("Hardware") + manualText: qsTr("Props mounted? Wings secured? Tail secured?") + } + + PreFlightBatteryCheck { + failurePercent: 40 + allowFailurePercentOverride: false + } + + PreFlightSensorsHealthCheck { + } + + PreFlightGPSCheck { + failureSatCount: 9 + allowOverrideSatCount: true + } + + PreFlightRCCheck { + } + } + + PreFlightCheckGroup { + name: qsTr("Please arm the vehicle here") + + PreFlightCheckButton { + name: qsTr("Actuators") + manualText: qsTr("Move all control surfaces. Did they work properly?") + } + + PreFlightCheckButton { + name: qsTr("Motors") + manualText: qsTr("Propellers free? Then throttle up gently. Working properly?") + } + + PreFlightCheckButton { + name: qsTr("Mission") + manualText: qsTr("Please confirm mission is valid (waypoints valid, no terrain collision).") + } + + PreFlightSoundCheck { + } + } + + PreFlightCheckGroup { + name: qsTr("Last preparations before launch") + + // Check list item group 2 - Final checks before launch + PreFlightCheckButton { + name: qsTr("Payload") + manualText: qsTr("Configured and started? Payload lid closed?") + } + + PreFlightCheckButton { + name: qsTr("Wind & weather") + manualText: qsTr("OK for your platform? Lauching into the wind?") + } + + PreFlightCheckButton { + name: qsTr("Flight area") + manualText: qsTr("Launch area and path free of obstacles/people?") + } + } + } +} + diff --git a/src/FlightDisplay/FixedWingChecklist.qml b/src/FlightDisplay/FixedWingChecklist.qml new file mode 100644 index 0000000000000000000000000000000000000000..895df23cfbfe2903fae832e9794956601b5859b3 --- /dev/null +++ b/src/FlightDisplay/FixedWingChecklist.qml @@ -0,0 +1,92 @@ +/**************************************************************************** + * + * (c) 2009-2016 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQml.Models 2.1 + +import QGroundControl 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.FlightDisplay 1.0 +import QGroundControl.Vehicle 1.0 + +Item { + property var model: listModel + PreFlightCheckModel { + id: listModel + PreFlightCheckGroup { + name: qsTr("Fixed Wing Initial Checks") + + PreFlightCheckButton { + name: qsTr("Hardware") + manualText: qsTr("Props mounted? Wings secured? Tail secured?") + } + + PreFlightBatteryCheck { + failurePercent: 40 + allowFailurePercentOverride: false + } + + PreFlightSensorsHealthCheck { + } + + PreFlightGPSCheck { + failureSatCount: 9 + allowOverrideSatCount: true + } + + PreFlightRCCheck { + } + } + + PreFlightCheckGroup { + name: qsTr("Please arm the vehicle here") + + PreFlightCheckButton { + name: qsTr("Actuators") + manualText: qsTr("Move all control surfaces. Did they work properly?") + } + + PreFlightCheckButton { + name: qsTr("Motors") + manualText: qsTr("Propellers free? Then throttle up gently. Working properly?") + } + + PreFlightCheckButton { + name: qsTr("Mission") + manualText: qsTr("Please confirm mission is valid (waypoints valid, no terrain collision).") + } + + PreFlightSoundCheck { + } + } + + PreFlightCheckGroup { + name: qsTr("Last preparations before launch") + + // Check list item group 2 - Final checks before launch + PreFlightCheckButton { + name: qsTr("Payload") + manualText: qsTr("Configured and started? Payload lid closed?") + } + + PreFlightCheckButton { + name: qsTr("Wind & weather") + manualText: qsTr("OK for your platform? Lauching into the wind?") + } + + PreFlightCheckButton { + name: qsTr("Flight area") + manualText: qsTr("Launch area and path free of obstacles/people?") + } + } + } +} + diff --git a/src/FlightDisplay/MultiRotorChecklist.qml b/src/FlightDisplay/MultiRotorChecklist.qml new file mode 100644 index 0000000000000000000000000000000000000000..6968e53c9313073130e43ae803775c8a0ae129d7 --- /dev/null +++ b/src/FlightDisplay/MultiRotorChecklist.qml @@ -0,0 +1,87 @@ +/**************************************************************************** + * + * (c) 2009-2016 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQml.Models 2.1 + +import QGroundControl 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.FlightDisplay 1.0 +import QGroundControl.Vehicle 1.0 + +Item { + property var model: listModel + PreFlightCheckModel { + id: listModel + PreFlightCheckGroup { + name: qsTr("Multirotor Initial Checks") + + PreFlightCheckButton { + name: qsTr("Hardware") + manualText: qsTr("Props mounted and secured?") + } + + PreFlightBatteryCheck { + failurePercent: 40 + allowFailurePercentOverride: false + } + + PreFlightSensorsHealthCheck { + } + + PreFlightGPSCheck { + failureSatCount: 9 + allowOverrideSatCount: true + } + + PreFlightRCCheck { + } + } + + PreFlightCheckGroup { + name: qsTr("Please arm the vehicle here") + + PreFlightCheckButton { + name: qsTr("Motors") + manualText: qsTr("Propellers free? Then throttle up gently. Working properly?") + } + + PreFlightCheckButton { + name: qsTr("Mission") + manualText: qsTr("Please confirm mission is valid (waypoints valid, no terrain collision).") + } + + PreFlightSoundCheck { + } + } + + PreFlightCheckGroup { + name: qsTr("Last preparations before launch") + + // Check list item group 2 - Final checks before launch + PreFlightCheckButton { + name: qsTr("Payload") + manualText: qsTr("Configured and started? Payload lid closed?") + } + + PreFlightCheckButton { + name: qsTr("Wind & weather") + manualText: qsTr("OK for your platform?") + } + + PreFlightCheckButton { + name: qsTr("Flight area") + manualText: qsTr("Launch area and path free of obstacles/people?") + } + } + } +} + diff --git a/src/FlightDisplay/PreFlightCheckList.qml b/src/FlightDisplay/PreFlightCheckList.qml new file mode 100644 index 0000000000000000000000000000000000000000..04b783a84fc4c8407c617b0007a08e46416ab21e --- /dev/null +++ b/src/FlightDisplay/PreFlightCheckList.qml @@ -0,0 +1,149 @@ +/**************************************************************************** + * + * (c) 2009-2016 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQml.Models 2.1 + +import QGroundControl 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.FlightDisplay 1.0 +import QGroundControl.Vehicle 1.0 + +Rectangle { + width: mainColumn.width + ScreenTools.defaultFontPixelWidth * 3 + height: mainColumn.height + ScreenTools.defaultFontPixelHeight + color: qgcPal.windowShade + radius: 3 + + Loader { + id: modelContainer + source: "/checklists/DefaultChecklist.qml" + } + + property bool _passed: false + + function _handleGroupPassedChanged(index, passed) { + if (passed) { + // Collapse current group + var group = checkListRepeater.itemAt(index) + group._checked = false + // Expand next group + if (index + 1 < checkListRepeater.count) { + group = checkListRepeater.itemAt(index + 1) + group.enabled = true + group._checked = true + } + } + _passed = passed + } + + //-- Pick a checklist model that matches the current airframe type (if any) + function _updateModel() { + if(activeVehicle) { + if(activeVehicle.multiRotor) { + modelContainer.source = "/checklists/MultiRotorChecklist.qml" + } else if(activeVehicle.vtol) { + modelContainer.source = "/checklists/VTOLChecklist.qml" + } else if(activeVehicle.rover) { + modelContainer.source = "/checklists/RoverChecklist.qml" + } else if(activeVehicle.sub) { + modelContainer.source = "/checklists/SubChecklist.qml" + } else if(activeVehicle.fixedWing) { + modelContainer.source = "/checklists/FixedWingChecklist.qml" + } else { + modelContainer.source = "/checklists/DefaultChecklist.qml" + } + return + } + modelContainer.source = "/checklists/DefaultChecklist.qml" + } + + Component.onCompleted: { + _updateModel() + } + + onVisibleChanged: { + if(activeVehicle) { + if(visible) { + _updateModel() + } else { + if(modelContainer.item.model.isPassed()) { + activeVehicle.checkListState = Vehicle.CheckListPassed + } else { + activeVehicle.checkListState = Vehicle.CheckListFailed + } + } + } + } + + // We delay the updates when a group passes so the user can see all items green for a moment prior to hiding + Timer { + id: delayedGroupPassed + interval: 750 + + property int index + + onTriggered: _handleGroupPassedChanged(index, true /* passed */) + } + + Column { + id: mainColumn + width: 40 * ScreenTools.defaultFontPixelWidth + spacing: 0.8 * ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.top: parent.top + anchors.topMargin: 0.6 * ScreenTools.defaultFontPixelWidth + anchors.leftMargin: 1.5 * ScreenTools.defaultFontPixelWidth + + function groupPassedChanged(index, passed) { + if (passed) { + delayedGroupPassed.index = index + delayedGroupPassed.restart() + } else { + _handleGroupPassedChanged(index, passed) + } + } + + // Header/title of checklist + Item { + width: parent.width + height: 1.75 * ScreenTools.defaultFontPixelHeight + + QGCLabel { + text: qsTr("Pre-Flight Checklist %1").arg(_passed ? qsTr("(passed)") : "") + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + font.pointSize: ScreenTools.mediumFontPointSize + } + QGCButton { + width: 1.2 * ScreenTools.defaultFontPixelHeight + height: 1.2 * ScreenTools.defaultFontPixelHeight + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + tooltip: qsTr("Reset the checklist (e.g. after a vehicle reboot)") + + onClicked: checkListRepeater.model.reset() + + QGCColoredImage { + source: "/qmlimages/MapSyncBlack.svg" + color: qgcPal.buttonText + anchors.fill: parent + } + } + } + + // All check list items + Repeater { + id: checkListRepeater + model: modelContainer.item.model + } + } +} diff --git a/src/FlightDisplay/RoverChecklist.qml b/src/FlightDisplay/RoverChecklist.qml new file mode 100644 index 0000000000000000000000000000000000000000..a17fbc4f97e74572bd5cc5f473acea07563d8265 --- /dev/null +++ b/src/FlightDisplay/RoverChecklist.qml @@ -0,0 +1,81 @@ +/**************************************************************************** + * + * (c) 2009-2016 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQml.Models 2.1 + +import QGroundControl 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.FlightDisplay 1.0 +import QGroundControl.Vehicle 1.0 + +Item { + property var model: listModel + PreFlightCheckModel { + id: listModel + PreFlightCheckGroup { + name: qsTr("Rover Initial Checks") + + PreFlightCheckButton { + name: qsTr("Hardware") + manualText: qsTr("Battery mounted and secured?") + } + + PreFlightBatteryCheck { + failurePercent: 40 + allowFailurePercentOverride: false + } + + PreFlightSensorsHealthCheck { + } + + PreFlightGPSCheck { + failureSatCount: 9 + allowOverrideSatCount: true + } + + PreFlightRCCheck { + } + } + + PreFlightCheckGroup { + name: qsTr("Please arm the vehicle here") + + PreFlightCheckButton { + name: qsTr("Mission") + manualText: qsTr("Please confirm mission is valid (waypoints valid, no terrain collision).") + } + + PreFlightSoundCheck { + } + } + + PreFlightCheckGroup { + name: qsTr("Last preparations before launch") + + // Check list item group 2 - Final checks before launch + PreFlightCheckButton { + name: qsTr("Payload") + manualText: qsTr("Configured and started? Payload lid closed?") + } + + PreFlightCheckButton { + name: qsTr("Wind & weather") + manualText: qsTr("OK for your platform?") + } + + PreFlightCheckButton { + name: qsTr("Mission area") + manualText: qsTr("Mission area and path free of obstacles/people?") + } + } + } +} diff --git a/src/FlightDisplay/SubChecklist.qml b/src/FlightDisplay/SubChecklist.qml new file mode 100644 index 0000000000000000000000000000000000000000..b777baf27168e85c5ee61cb2cf7ab7dc824cda94 --- /dev/null +++ b/src/FlightDisplay/SubChecklist.qml @@ -0,0 +1,82 @@ +/**************************************************************************** + * + * (c) 2009-2016 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQml.Models 2.1 + +import QGroundControl 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.FlightDisplay 1.0 +import QGroundControl.Vehicle 1.0 + +Item { + property var model: listModel + PreFlightCheckModel { + id: listModel + PreFlightCheckGroup { + name: qsTr("Submarine Initial checks") + + PreFlightCheckButton { + name: qsTr("Hardware") + manualText: qsTr("All seals in place?") + } + + PreFlightBatteryCheck { + failurePercent: 40 + allowFailurePercentOverride: false + } + + PreFlightSensorsHealthCheck { + } + + PreFlightGPSCheck { + failureSatCount: 9 + allowOverrideSatCount: true + } + + PreFlightRCCheck { + } + } + + PreFlightCheckGroup { + name: qsTr("Please arm the vehicle here") + + PreFlightCheckButton { + name: qsTr("Actuators") + manualText: qsTr("Move all control surfaces. Did they work properly?") + } + + PreFlightCheckButton { + name: qsTr("Motors") + manualText: qsTr("Propellers free? Then throttle up gently. Working properly?") + } + + PreFlightCheckButton { + name: qsTr("Mission") + manualText: qsTr("Please confirm mission is valid (waypoints valid, no terrain collision).") + } + + PreFlightSoundCheck { + } + } + + PreFlightCheckGroup { + name: qsTr("Last preparations before launch") + + // Check list item group 2 - Final checks before launch + PreFlightCheckButton { + name: qsTr("Payload") + manualText: qsTr("Configured and started? Payload lid closed?") + } + + } + } +} diff --git a/src/FlightDisplay/VTOLChecklist.qml b/src/FlightDisplay/VTOLChecklist.qml new file mode 100644 index 0000000000000000000000000000000000000000..40aa5ace41f5658bc6a7385709cb64d1c453f2cc --- /dev/null +++ b/src/FlightDisplay/VTOLChecklist.qml @@ -0,0 +1,119 @@ +/**************************************************************************** + * + * (c) 2009-2016 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQml.Models 2.1 + +import QGroundControl 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.FlightDisplay 1.0 +import QGroundControl.Vehicle 1.0 + +import CustomQuickInterface 1.0 + +Item { + property var model: listModel + PreFlightCheckModel { + id: listModel + PreFlightCheckGroup { + name: qsTr("VTOL Initial Checks") + + // Standard check list items (group 0) - Available from the start + Rectangle { + width: ScreenTools.defaultFontPixelWidth * 40 + height: testFlight.height + ScreenTools.defaultFontPixelHeight + color: qgcPal.button + property bool passed: true + function reset() { + if(activeVehicle) { + CustomQuickInterface.testFlight = false + activeVehicle.checkListState = Vehicle.CheckListNotSetup + } + } + QGCCheckBox { + id: testFlight + text: "Test Flight" + enabled: !CustomQuickInterface.debugBuild + checked: CustomQuickInterface.testFlight + anchors.centerIn: parent + onClicked: CustomQuickInterface.testFlight = checked + Component.onCompleted: { + CustomQuickInterface.testFlight = false + } + } + } + + PreFlightCheckButton { + name: qsTr("Hardware") + manualText: qsTr("Props mounted? Wings secured? Tail secured?") + } + + PreFlightBatteryCheck { + failurePercent: 40 + allowFailurePercentOverride: false + } + + PreFlightSensorsHealthCheck { + } + + PreFlightGPSCheck { + failureSatCount: 9 + allowOverrideSatCount: true + } + + PreFlightRCCheck { + } + } + + PreFlightCheckGroup { + name: qsTr("Please arm the vehicle here") + + PreFlightCheckButton { + name: qsTr("Actuators") + manualText: qsTr("Move all control surfaces. Did they work properly?") + } + + PreFlightCheckButton { + name: qsTr("Motors") + manualText: qsTr("Propellers free? Then throttle up gently. Working properly?") + } + + PreFlightCheckButton { + name: qsTr("Mission") + manualText: qsTr("Please confirm mission is valid (waypoints valid, no terrain collision).") + } + + PreFlightSoundCheck { + } + } + + PreFlightCheckGroup { + name: qsTr("Last preparations before launch") + + // Check list item group 2 - Final checks before launch + PreFlightCheckButton { + name: qsTr("Payload") + manualText: qsTr("Configured and started? Payload lid closed?") + } + + PreFlightCheckButton { + name: "Wind & weather" + manualText: qsTr("OK for your platform? Lauching into the wind?") + } + + PreFlightCheckButton { + name: qsTr("Flight area") + manualText: qsTr("Launch area and path free of obstacles/people?") + } + } + } +} + diff --git a/src/api/QGCOptions.h b/src/api/QGCOptions.h index acd72f9cbf4df2dd490799c72a81c3a6cadf7e0a..9099cdd6ddc6309dbb0f207e55b1503d7a3b7432 100644 --- a/src/api/QGCOptions.h +++ b/src/api/QGCOptions.h @@ -90,8 +90,8 @@ public: /// Allows access to the full fly view window virtual QUrl flyViewOverlay () const { return QUrl(); } - /// Provides an optional preflight checklist - virtual QUrl preFlightChecklistUrl () const { return QUrl(); } + /// Provides an optional, custom preflight checklist + virtual QUrl preFlightChecklistUrl () const { return QUrl::fromUserInput("qrc:/qml/PreFlightCheckList.qml"); } /// Allows replacing the Main toolbar virtual QUrl mainToolbarUrl () const;