Commit d68e5586 authored by DoinLakeFlyer's avatar DoinLakeFlyer

parent 29237694
......@@ -2,27 +2,26 @@
## Custom Build Example
To build this sample custom version, simply rename the directory from `custom-example` to `custom` before running `qmake` (or launching Qt Creator.) The build system will automatically find anything in `custom` and incorporate it into the build. If you had already run a build before renaming the directory, delete the build directory before running `qmake`. To restore the build to a stock QGroundControl one, rename the directory back to `custom-example` (making sure to clean the build directory again.)
To build this sample custom version:
### Custom Builds
* Clean you build directory of any previous build
* Rename the directory from `custom-example` to `custom`
* Change to the `custom` directory
* Run `python updateqrc.py`
* Build QGC
The root project file (`qgroundcontrol.pro`) will look and see if `custom/custom.pri` exists. If it does, it will load it before anything else is setup. This allows you to modify the build in any way necessary for a custom build. This example shows you how to:
![Custom Build Screenshot](README.jpg)
* Fully brand your build
* Define a single flight stack to avoid carrying over unnecessary code
* Implement your own, autopilot and firmware plugin overrides
* Implement your own camera manager and plugin overrides
* Implement your own QtQuick interface module
* Implement your own toolbar, toolbar indicators and UI navigation
* Implement your own Fly View overlay (and how to hide elements from QGC such as the flight widget)
* Implement your own, custom QtQuick camera control
* Implement your own, custom Pre-flight Checklist
* Define your own resources for all of the above
More details on what a custom build is and how to create your own can be found in the [QGC Dev Guide](https://dev.qgroundcontrol.com/en/custom_build/custom_build.html).
Note that within `qgroundcontrol.pro`, most main build steps are surrounded by flags, which you can define to override them. For example, if you want to have your own Android build, done in some completely different way, you simply:
The main features of this example:
```
DEFINES += DISABLE_BUILTIN_ANDROID
```
* Assumes an "Off The Shelf" purchased commercial vehicle. This means most vehicle setup is hidden from the user since they should mostly never need to adjust those things. They would be set up correctly by the vehicle producing company prior to sale.
* The above assumption cause the QGC UI to adjust and not show various things. Providing an even simpler experience to the user.
* The full experience continues to be available in "Advanced Mode".
* Brands the build with various custom images and custom color palette which matches corporate branding of the theoretical commercial company this build is for.
* Customizes portions of the interface such as you can see in the above screenshot which shows a custom instrument widget replacing the standard QGC ui.
* It also overrides various QGC Application settings to hide some settings the users shouldn't modify as well as adjusting defaults for others.
* The source code is fully commented to explain what and why it is doing things.
With this defined within your `custom.pri` file, it is up to you to define how to do the Android build. You can either replace the entire process or prepare it before invoking QGC’s own Android project file on your own. You would do this if you want to have your own branding within the Android manifest. The same applies to iOS (`DISABLE_BUILTIN_IOS`).
> Important Note: This custom build is not automatically built each time regular QGC code changes. This can mean that it may fall out of date with the latest changes in QGC code. This can show up as the `python updateqrc.py` steps failing due to upstream resource changes. Or possibly fail to compile because the plugin mechanism for custom builds has changed. If this happens please notify the QGC devs and they will bring it up to date. Or even better, submit a pull for the fix yourself!
\ No newline at end of file
......@@ -35,36 +35,32 @@ CONFIG += QGC_DISABLE_PX4_PLUGIN_FACTORY
DEFINES += CUSTOMHEADER=\"\\\"CustomPlugin.h\\\"\"
DEFINES += CUSTOMCLASS=CustomPlugin
TARGET = CustomQGC
DEFINES += QGC_APPLICATION_NAME=\"\\\"CustomQGC\\\"\"
TARGET = MyGroundStation
DEFINES += QGC_APPLICATION_NAME='"\\\"Custom QGroundControl\\\""'
DEFINES += QGC_ORG_NAME=\"\\\"qgroundcontrol.org\\\"\"
DEFINES += QGC_ORG_DOMAIN=\"\\\"org.qgroundcontrol\\\"\"
QGC_APP_NAME = "Custom GS"
QGC_BINARY_NAME = "CustomQGC"
QGC_APP_NAME = "Custom QGroundControl"
QGC_BINARY_NAME = "CustomQGroundControl"
QGC_ORG_NAME = "Custom"
QGC_ORG_DOMAIN = "org.qgroundcontrol"
QGC_APP_DESCRIPTION = "Custom QGC Ground Station"
QGC_APP_COPYRIGHT = "Copyright (C) 2019 QGroundControl Development Team. All rights reserved."
QGC_ORG_DOMAIN = "org.custom"
QGC_APP_DESCRIPTION = "Custom QGroundControl"
QGC_APP_COPYRIGHT = "Copyright (C) 2020 QGroundControl Development Team. All rights reserved."
# Our own, custom resources
RESOURCES += \
$$QGCROOT/custom/custom.qrc
$$PWD/custom.qrc
QML_IMPORT_PATH += \
$$QGCROOT/custom/res
$$PWD/res
# Our own, custom sources
SOURCES += \
$$PWD/src/CustomPlugin.cc \
$$PWD/src/CustomQuickInterface.cc \
$$PWD/src/CustomVideoManager.cc
HEADERS += \
$$PWD/src/CustomPlugin.h \
$$PWD/src/CustomQuickInterface.h \
$$PWD/src/CustomVideoManager.h
INCLUDEPATH += \
$$PWD/src \
......@@ -73,20 +69,16 @@ INCLUDEPATH += \
# Custom Firmware/AutoPilot Plugin
INCLUDEPATH += \
$$QGCROOT/custom/src/FirmwarePlugin \
$$QGCROOT/custom/src/AutoPilotPlugin
$$PWD/src/FirmwarePlugin \
$$PWD/src/AutoPilotPlugin
HEADERS+= \
$$QGCROOT/custom/src/AutoPilotPlugin/CustomAutoPilotPlugin.h \
$$QGCROOT/custom/src/FirmwarePlugin/CustomCameraControl.h \
$$QGCROOT/custom/src/FirmwarePlugin/CustomCameraManager.h \
$$QGCROOT/custom/src/FirmwarePlugin/CustomFirmwarePlugin.h \
$$QGCROOT/custom/src/FirmwarePlugin/CustomFirmwarePluginFactory.h \
$$PWD/src/AutoPilotPlugin/CustomAutoPilotPlugin.h \
$$PWD/src/FirmwarePlugin/CustomFirmwarePlugin.h \
$$PWD/src/FirmwarePlugin/CustomFirmwarePluginFactory.h \
SOURCES += \
$$QGCROOT/custom/src/AutoPilotPlugin/CustomAutoPilotPlugin.cc \
$$QGCROOT/custom/src/FirmwarePlugin/CustomCameraControl.cc \
$$QGCROOT/custom/src/FirmwarePlugin/CustomCameraManager.cc \
$$QGCROOT/custom/src/FirmwarePlugin/CustomFirmwarePlugin.cc \
$$QGCROOT/custom/src/FirmwarePlugin/CustomFirmwarePluginFactory.cc \
$$PWD/src/AutoPilotPlugin/CustomAutoPilotPlugin.cc \
$$PWD/src/FirmwarePlugin/CustomFirmwarePlugin.cc \
$$PWD/src/FirmwarePlugin/CustomFirmwarePluginFactory.cc \
<RCC>
<qresource prefix="/custom">
<file alias="CustomArmedIndicator.qml">res/MainToolbar/CustomArmedIndicator.qml</file>
<file alias="CustomBatteryIndicator.qml">res/MainToolbar/CustomBatteryIndicator.qml</file>
<file alias="CustomCameraControl.qml">res/CustomCameraControl.qml</file>
<file alias="CustomFlyView.qml">res/CustomFlyView.qml</file>
<file alias="CustomGPSIndicator.qml">res/MainToolbar/CustomGPSIndicator.qml</file>
<file alias="CustomMainToolBar.qml">res/MainToolbar/CustomMainToolBar.qml</file>
<file alias="CustomMainToolBarIndicators.qml">res/MainToolbar/CustomMainToolBarIndicators.qml</file>
<file alias="CustomModeIndicator.qml">res/MainToolbar/CustomModeIndicator.qml</file>
<file alias="CustomMultiVehicleSelector.qml">res/MainToolbar/CustomMultiVehicleSelector.qml</file>
<file alias="CustomRCRSSIIndicator.qml">res/MainToolbar/CustomRCRSSIIndicator.qml</file>
<file alias="PairingIndicator.qml">res/PairingIndicator.qml</file>
<file alias="PreFlightCheckList.qml">res/PreFlightCheckList.qml</file>
<file alias="CustomFlyViewOverlay.qml">res/CustomFlyViewOverlay.qml</file>
</qresource>
<qresource prefix="custom/img">
<file alias="altitude.svg">res/Images/altitude.svg</file>
<file alias="attitude_crosshair.svg">res/Images/attitude_crosshair.svg</file>
<file alias="attitude_dial.svg">res/Images/attitude_dial.svg</file>
<file alias="attitude_pointer.svg">res/Images/attitude_pointer.svg</file>
<file alias="camera_photo.svg">res/Images/camera_photo.svg</file>
<file alias="camera_settings.svg">res/Images/camera_settings.svg</file>
<file alias="camera_video.svg">res/Images/camera_video.svg</file>
<file alias="chronometer.svg">res/Images/chronometer.svg</file>
<file alias="compass_needle.svg">res/Images/compass_needle.svg</file>
<file alias="compass_pointer.svg">res/Images/compass_pointer.svg</file>
<file alias="distance.svg">res/Images/distance.svg</file>
<file alias="gimbal_icon.svg">res/Images/gimbal_icon.svg</file>
<file alias="gimbal_pitch_indoors.svg">res/Images/gimbal_pitch_indoors.svg</file>
<file alias="gimbal_pitch_outdoors.svg">res/Images/gimbal_pitch_outdoors.svg</file>
<file alias="gimbal_position.svg">res/Images/gimbal_position.svg</file>
<file alias="horizontal_speed.svg">res/Images/horizontal_speed.svg</file>
<file alias="microSD.svg">res/Images/microSD.svg</file>
<file alias="odometer.svg">res/Images/odometer.svg</file>
<file alias="PairingButton.svg">res/Images/PairingButton.svg</file>
<file alias="PairingConnected.svg">res/Images/PairingConnected.svg</file>
<file alias="PairingError.svg">res/Images/PairingError.svg</file>
<file alias="PairingIcon.svg">res/Images/PairingIcon.svg</file>
<file alias="thermal-brightness.svg">res/Images/thermal-brightness.svg</file>
<file alias="thermal-palette.svg">res/Images/thermal-palette.svg</file>
<file alias="thermal-pip.svg">res/Images/thermal-pip.svg</file>
<file alias="thermal-standard.svg">res/Images/thermal-standard.svg</file>
<file alias="vertical_speed.svg">res/Images/vertical_speed.svg</file>
<file alias="void.png">res/Images/void.png</file>
<file alias="CustomAppIcon.png">res/Images/CustomAppIcon.png</file>
</qresource>
<qresource prefix="/qmlimages">
<file alias="PaperPlane.svg">res/Images/CustomVehicleIcon.svg</file>
</qresource>
<qresource prefix="Custom/Widgets">
<file alias="Custom/Widgets/CustomArtificialHorizon.qml">res/Custom/Widgets/CustomArtificialHorizon.qml</file>
......@@ -54,8 +31,4 @@
<file alias="Custom/Widgets/CustomVehicleButton.qml">res/Custom/Widgets/CustomVehicleButton.qml</file>
<file alias="Custom/Widgets/qmldir">res/Custom/Widgets/qmldir</file>
</qresource>
<qresource prefix="Custom/Camera">
<file alias="Custom/Camera/qmldir">res/Custom/Camera/qmldir</file>
<file alias="Custom/Camera/ZoomControl.qml">res/Custom/Camera/ZoomControl.qml</file>
</qresource>
</RCC>
<file alias="PaperPlane.svg">src/ui/toolbar/Images/PaperPlane.svg</file>
<RCC>
<qresource prefix="/fonts">
<file alias="opensans">../resources/fonts/OpenSans-Regular.ttf</file>
<file alias="opensans-demibold">../resources/fonts/OpenSans-Semibold.ttf</file>
<file alias="NanumGothic-Regular">../resources/fonts/NanumGothic-Regular.ttf</file>
<file alias="NanumGothic-Bold">../resources/fonts/NanumGothic-Bold.ttf</file>
</qresource>
<qresource prefix="/res">
<file alias="action.svg">../resources/action.svg</file>
<file alias="AntennaRC">../resources/Antenna_RC.svg</file>
<file alias="AntennaT">../resources/Antenna_T.svg</file>
<file alias="ArrowDown.svg">../resources/ArrowDown.svg</file>
<file alias="ArrowRight.svg">../resources/ArrowRight.svg</file>
<file alias="buttonLeft.svg">../resources/buttonLeft.svg</file>
<file alias="buttonRight.svg">../resources/buttonRight.svg</file>
<file alias="cancel.svg">../resources/cancel.svg</file>
<file alias="clockwise-arrow.svg">../resources/clockwise-arrow.svg</file>
<file alias="counter-clockwise-arrow.svg">../resources/counter-clockwise-arrow.svg</file>
<file alias="chevron-down.svg">../resources/chevron-down.svg</file>
<file alias="chevron-up.svg">../resources/chevron-up.svg</file>
<file alias="DropArrow.svg">../resources/DropArrow.svg</file>
<file alias="gear-black.svg">../resources/gear-black.svg</file>
<file alias="gear-white.svg">../resources/gear-white.svg</file>
<file alias="helicoptericon.svg">../resources/helicoptericon.svg</file>
<file alias="JoystickBezel.png">../resources/JoystickBezel.png</file>
<file alias="JoystickBezelLight.png">../resources/JoystickBezelLight.png</file>
<file alias="land.svg">../resources/land.svg</file>
<file alias="LockClosed.svg">../resources/LockClosed.svg</file>
<file alias="LockOpen.svg">../resources/LockOpen.svg</file>
<file alias="notile.png">../resources/notile.png</file>
<file alias="Pause.svg">../resources/Pause.svg</file>
<file alias="pause-mission.svg">../resources/pause-mission.svg</file>
<file alias="Play">../resources/Play.svg</file>
<file alias="PowerButton">../resources/PowerButton.svg</file>
<file alias="QGCLogoBlack">../resources/QGCLogoBlack.svg</file>
<file alias="QGCLogoFull">../resources/QGCLogoFull.svg</file>
<file alias="QGCLogoWhite">../resources/QGCLogoWhite.svg</file>
<file alias="QGCLogoArrow">../resources/QGCLogoArrow.svg</file>
<file alias="QGroundControlConnect">../resources/QGroundControlConnect.svg</file>
<file alias="rtl.svg">../resources/rtl.svg</file>
<file alias="SplashScreen">../resources/SplashScreen.png</file>
<file alias="Stop">../resources/Stop.svg</file>
<file alias="takeoff.svg">../resources/takeoff.svg</file>
<file alias="TrashDelete.svg">../resources/TrashDelete.svg</file>
<file alias="waves.svg">../resources/waves.svg</file>
<file alias="wind-guru.svg">../resources/wind-guru.svg</file>
<file alias="wind-rose.svg">../resources/wind-rose.svg</file>
<file alias="wind-roseBlack.svg">../resources/wind-roseBlack.svg</file>
<file alias="wind-rose-arrow.svg">../resources/wind-rose-arrow.svg</file>
<file alias="XDelete.svg">../resources/XDelete.svg</file>
<file alias="XDeleteBlack.svg">../resources/XDeleteBlack.svg</file>
<file alias="waypoint.svg">../resources/waypoint.svg</file>
<file>../resources/icons/qgroundcontrol.ico</file>
</qresource>
<qresource prefix="/res/firmware">
<file alias="3drradio.png">../resources/firmware/3drradio.png</file>
<file alias="apm.png">../resources/firmware/apm.png</file>
<file alias="px4.png">../resources/firmware/px4.png</file>
</qresource>
<qresource prefix="/res/calibration">
<file alias="accel_back.png">../resources/calibration/accel_back.png</file>
<file alias="accel_down.png">../resources/calibration/accel_down.png</file>
<file alias="accel_front.png">../resources/calibration/accel_front.png</file>
<file alias="accel_left.png">../resources/calibration/accel_left.png</file>
<file alias="accel_right.png">../resources/calibration/accel_right.png</file>
<file alias="accel_up.png">../resources/calibration/accel_up.png</file>
</qresource>
<qresource prefix="/qml/calibration/mode1">
<file alias="radioCenter.png">../resources/calibration/mode1/radioCenter.png</file>
<file alias="radioHome.png">../resources/calibration/mode1/radioHome.png</file>
<file alias="radioPitchDown.png">../resources/calibration/mode1/radioPitchDown.png</file>
<file alias="radioPitchUp.png">../resources/calibration/mode1/radioPitchUp.png</file>
<file alias="radioRollLeft.png">../resources/calibration/mode1/radioRollLeft.png</file>
<file alias="radioRollRight.png">../resources/calibration/mode1/radioRollRight.png</file>
<file alias="radioSwitchMinMax.png">../resources/calibration/mode1/radioSwitchMinMax.png</file>
<file alias="radioThrottleDown.png">../resources/calibration/mode1/radioThrottleDown.png</file>
<file alias="radioThrottleUp.png">../resources/calibration/mode1/radioThrottleUp.png</file>
<file alias="radioYawLeft.png">../resources/calibration/mode1/radioYawLeft.png</file>
<file alias="radioYawRight.png">../resources/calibration/mode1/radioYawRight.png</file>
</qresource>
<qresource prefix="/qml/calibration/mode2">
<file alias="radioCenter.png">../resources/calibration/mode2/radioCenter.png</file>
<file alias="radioHome.png">../resources/calibration/mode2/radioHome.png</file>
<file alias="radioPitchDown.png">../resources/calibration/mode2/radioPitchDown.png</file>
<file alias="radioPitchUp.png">../resources/calibration/mode2/radioPitchUp.png</file>
<file alias="radioRollLeft.png">../resources/calibration/mode2/radioRollLeft.png</file>
<file alias="radioRollRight.png">../resources/calibration/mode2/radioRollRight.png</file>
<file alias="radioSwitchMinMax.png">../resources/calibration/mode2/radioSwitchMinMax.png</file>
<file alias="radioThrottleDown.png">../resources/calibration/mode2/radioThrottleDown.png</file>
<file alias="radioThrottleUp.png">../resources/calibration/mode2/radioThrottleUp.png</file>
<file alias="radioYawLeft.png">../resources/calibration/mode2/radioYawLeft.png</file>
<file alias="radioYawRight.png">../resources/calibration/mode2/radioYawRight.png</file>
</qresource>
<qresource prefix="/db/mapping/joystick">
<file alias="gamecontrollerdb.txt">../resources/SDL_GameControllerDB/gamecontrollerdb.txt</file>
</qresource>
<qresource prefix="/res/audio">
<file alias="Alert">../resources/audio/alert.wav</file>
</qresource>
<qresource prefix="/opengl">
<file>../resources/opengl/buglist.json</file>
</qresource>
</RCC>
This diff is collapsed.
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>
<g><g transform="translate(0.000000,511.000000) scale(0.100000,-0.100000)"><path d="M1411.9,2317.3c-26.8-28.7-32.6-92-36.4-365.9l-5.7-333.3l-84.3-24.9c-203.1-59.4-264.4-205-210.7-496.1c90-488.5,454-672.4,687.7-350.5c82.4,113,153.2,350.5,153.2,515.3V1394h773.9h772l47.9-109.2l47.9-109.2l-113-82.4c-295-216.5-521-542.1-630.2-906.1c-42.1-137.9-44.1-174.3-51.7-1021c-5.8-927.1-5.8-932.9,80.4-932.9c78.5,0,88.1,32.6,88.1,291.2v245.2h95.8h95.8v220.3v220.3h-97.7h-99.6l11.5,379.3c11.5,419.5,32.6,536.4,137.9,764.3C3183.8,591.3,3360,809.7,3565,961l70.9,51.7l34.5-72.8c21.1-40.2,57.5-82.4,84.3-95.8c69-34.5,2421.3-34.5,2490.2,0c26.8,13.4,63.2,55.6,84.3,95.8l34.5,72.8l70.9-51.7c203-151.3,381.2-369.7,488.5-605.3c109.2-237.5,128.3-348.6,139.8-766.2l11.5-379.3h-99.6H6877v-220.3v-220.3h95.8h95.8v-245.2c0-258.6,9.6-291.2,88.1-291.2c86.2,0,86.2,5.7,80.5,932.9c-7.6,846.7-9.6,883.1-51.7,1021c-111.1,367.8-335.2,687.7-636,909.9l-109.2,80.4l47.9,109.2l49.8,107.3H7308h772l7.7-166.7c23-415.7,243.3-699.2,494.2-632.1c84.3,23,149.4,72.8,214.5,168.6c116.8,174.3,185.8,542.1,124.5,662.8c-44.1,86.2-139.8,157.1-226,170.5l-74.7,13.4v339.1c0,304.6-3.8,342.9-34.5,369.7c-42.1,38.3-99.6,42.1-147.5,7.7c-30.6-24.9-34.5-57.5-32.6-364l1.9-339.1l-1093.8,3.8l-1095.7,5.7l-17.2,67c-30.7,116.9-21.1,114.9-461.7,114.9h-404.2l-46,67.1c-55.6,82.4-180.1,143.7-289.2,143.7c-109.2,0-241.4-65.1-293.1-145.6l-42.1-65.1h-404.2c-440.6,0-431,1.9-461.7-114.9l-17.2-67l-1095.7-5.7l-1095.7-3.8v344.8c0,319.9-1.9,344.8-36.4,364C1498.1,2361.3,1446.3,2355.6,1411.9,2317.3z"/><path d="M297,2102.7c-182-38.3-233.7-86.2-172.4-153.2c101.5-111.1,457.8-168.6,837.1-136c139.8,13.4,262.4,30.7,270.1,38.3c9.6,9.6,13.4,53.6,9.6,99.6c-5.7,80.4-7.7,84.3-72.8,90c-36.4,3.8-136,19.2-220.3,34.5C758.7,2110.4,400.4,2125.7,297,2102.7z"/><path d="M1925.2,2102.7c-82.4-9.6-162.8-23-176.2-26.8c-26.8-11.5-36.4-183.9-9.6-183.9c7.7,0,116.9-17.2,243.3-36.4c329.5-53.6,500-65.1,645.6-42.1c319.9,46,325.6,166.7,15.3,260.5C2517.1,2112.3,2143.6,2127.6,1925.2,2102.7z"/><path d="M7432.5,2093.1c-180.1-40.2-296.9-105.4-296.9-162.8c0-59.4,65.1-91.9,235.6-116.9c145.6-23,316.1-11.5,645.5,42.1c126.4,19.2,237.5,36.4,245.2,36.4c7.7,0,13.4,40.2,9.6,90c-5.7,90-7.6,91.9-82.4,105.4C8012.9,2118,7558.9,2121.9,7432.5,2093.1z"/><path d="M9281,2110.4c-30.6-3.8-134.1-21.1-229.9-36.4c-93.9-15.3-197.3-30.6-229.9-32.6c-55.6-5.7-57.5-9.6-63.2-105.4c-3.8-74.7,1.9-101.5,19.2-101.5c13.4,0,134.1-9.6,268.2-21.1c275.8-24.9,521-3.8,693.4,59.4c283.5,107.3,180.1,226-208.8,239.4C9424.7,2116.1,9313.6,2114.2,9281,2110.4z"/><path d="M4584,263.8c-34.5-19.2-74.7-61.3-90-91.9l-28.7-55.6l-386.9-1.9c-214.5-1.9-417.6-13.4-450.2-23c-82.4-26.8-191.6-151.3-216.5-243.3c-28.7-103.4-28.7-1626.3,0-1712.5c34.5-101.5,111.1-189.6,197.3-229.9c74.7-34.5,149.4-36.4,1390.7-36.4c1241.3,0,1316,1.9,1390.7,36.4c93.9,42.1,168.6,134.1,197.3,241.4c28.7,101.5,28.7,1599.5,0,1701c-24.9,90-120.7,203.1-205,237.5c-46,19.2-160.9,26.8-421.4,26.8c-197.3,0-377.4,3.8-398.4,9.6c-23,5.8-49.8,30.7-63.2,57.5c-11.5,24.9-47.9,63.2-82.4,84.3c-57.5,34.5-97.7,38.3-417.6,38.3C4681.7,302.1,4639.6,298.3,4584,263.8z M6246.7-232.4c65.1-67,70.9-130.3,15.3-201.1c-80.5-101.5-266.3-40.2-266.3,88.1C5995.8-190.2,6139.5-127,6246.7-232.4z M5329.2-280.2c327.5-157.1,519.1-515.3,457.8-852.4c-72.8-396.5-394.6-672.4-787.3-672.4c-390.8,0-724.1,283.5-791.1,676.2c-61.3,365.9,164.7,743.3,528.7,877.3C4890.5-194,5181.7-207.5,5329.2-280.2z"/><path d="M4831.2-538.8c-126.4-44.1-237.5-147.5-293.1-277.8c-76.6-180.1-24.9-425.3,120.7-561.3c170.5-159,461.6-164.7,660.9-13.4c160.9,122.6,224.1,383.1,139.8,578.5c-55.5,128.3-183.9,243.3-312.2,281.6C5022.7-494.8,4955.7-494.8,4831.2-538.8z"/></g></g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.6, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 288 288" style="enable-background:new 0 0 288 288;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<path class="st0" d="M106.783,143.429c-1.327-5.063-2.711-10.125-4.095-15.256c-29.464-2.025-52.834-26.495-52.834-56.465
c0-31.299,25.438-56.736,56.736-56.736s56.647,25.438,56.647,56.736c0,17.247-7.752,32.684-19.902,43.067
c0.675,1.744,1.373,3.499,2.048,5.209c1.496,3.792,2.576,6.345,3.814,9.394c17.641-13.062,29.116-34.032,29.116-57.669
c-0.011-39.614-32.108-71.71-71.722-71.71s-71.71,32.099-71.71,71.71c0,39.614,32.108,71.71,71.71,71.71
c0.068,0.011,0.124,0.011,0.191,0.011L106.783,143.429z"/>
<path class="st0" d="M231.879,162.801c-13.321-4.534-33.3-7.223-50.043-8.562c-16.932-1.35-30.42-1.485-30.42-1.485h-1.395
l-0.461-1.215c0,0-5.659-13.467-11.633-28.644c-5.974-15.177-12.274-31.86-13.669-39.536c-1.294-7.054-2.588-12.736-4.748-16.28
c-2.16-3.533-4.759-5.265-10.508-4.927c-2.599,0.157-4.039,1.181-5.209,2.88c-1.17,1.699-1.924,4.264-2.228,7.256
c-0.607,5.985,0.45,13.478,1.204,18.699c3.454,23.874,11.937,46.632,16.561,70.687c2.756,14.322,3.893,28.925,6.514,42.888
l0.743,4.185l-3.724-1.958c-1.766-0.923-3.015-2.531-4.275-4.467c-1.271-1.935-2.464-4.286-3.724-6.694
c-2.509-4.815-5.186-10.036-7.628-12.927c-3.78-4.478-8.449-9.473-13.388-12.466c-4.883-2.959-9.676-3.915-14.885-1.305
c-2.306,2.093-3.139,3.983-3.162,6.143c-0.022,2.25,0.889,4.86,2.329,7.628c2.869,5.535,7.752,11.397,9.203,17.483
c3.611,15.154,12.781,26.978,20.926,39.904c6.368,10.105,11.093,21.23,20.926,26.227c12.972,6.592,24.256,17.01,37.116,19.16
c15.616,2.61,33.076,3.397,48.084,1.394c14.873-1.981,27.103-6.851,32.828-14.604c12.297-49.862,4.534-82.32-15.335-109.468V162.801
z"/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.6, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 360 72" style="enable-background:new 0 0 360 72;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st1{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
.st2{fill:none;stroke:#FFFFFF;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.2573;stroke-dasharray:2,6,2,6;}
.st3{fill:#0CA678;}
</style>
<path class="st0" d="M349.779,17.419h-30.656c-5.646,0-10.221,4.605-10.221,10.288v20.571c0,2.827,2.299,5.141,5.107,5.141h5.107
l2.825-5.684c1.258-2.531,4.587-4.599,7.395-4.599h10.226c2.808,0,6.137,2.067,7.395,4.599l2.825,5.684h5.107
c2.808,0,5.107-2.314,5.107-5.141V27.708C360,22.03,355.426,17.419,349.779,17.419L349.779,17.419z M321.681,35.422
c-2.821,0-5.107-2.302-5.107-5.147c0-2.839,2.287-5.141,5.107-5.141c2.82,0,5.107,2.302,5.107,5.141
C326.788,33.12,324.506,35.422,321.681,35.422z M347.229,35.422c-2.821,0-5.107-2.302-5.107-5.147c0-2.839,2.287-5.141,5.107-5.141
c2.82,0,5.107,2.302,5.107,5.141C352.337,33.12,350.049,35.422,347.229,35.422z"/>
<path class="st1" d="M39.568,25.298l5.557-4.015c-1.334-2.006-2-4.237-2-6.913c0-6.691,5.336-12.042,12.003-12.042
c6.891,0,12.227,5.353,12.227,12.042c0,6.913-5.336,12.266-12.227,12.266c-2.223,0-4.447-0.668-6.225-1.784l-4.223,5.799v11.596
l3.778,5.129c1.779-1.338,4.223-2.006,6.67-2.006c6.67,0,12.003,5.575,12.003,12.266s-5.336,12.042-12.003,12.042
c-6.67,0-12.226-5.353-12.226-12.042c0-2.452,0.889-4.683,2-6.691l-5.781-4.015H27.784l-5.112,3.791
c1.334,2.006,2.223,4.237,2.223,6.913c0,6.691-5.557,12.042-12.227,12.042c-6.67,0-12.003-5.353-12.003-12.042
c0-6.691,5.336-12.266,12.003-12.266c2.444,0,4.668,0.668,6.446,2.006l4.002-5.575v-11.82l-4.223-5.353
c-2,1.114-4.223,2.006-6.891,2.006C5.333,26.631,0,21.277,0,14.364C0,7.673,5.336,2.323,12.003,2.323
c6.891,0,12.227,5.353,12.227,12.042c0,2.452-0.666,4.907-2,6.691l6.002,4.237h11.337L39.568,25.298z M49.793,49.16l3.778,5.353
l2.889,2.898c0.221,0.668-1.11,2.006-1.555,1.784l-3.113-3.344l-5.112-3.569c-0.889,1.56-1.555,3.344-1.555,5.353
c0,5.353,4.447,9.812,10.004,9.812c5.336,0,9.78-4.461,9.78-9.812c0-5.575-4.447-10.036-9.78-10.036
C53.129,47.599,51.351,48.267,49.793,49.16L49.793,49.16z M46.904,19.944l4.891-3.569l2.889-2.898c0.666-0.668,2,1.114,1.779,1.56
l-2.889,3.123l-3.334,4.907c1.334,0.892,3.113,1.338,4.891,1.338c5.557,0,10.004-4.461,10.004-10.036
c0-5.353-4.447-9.812-10.004-9.812c-5.336,0-9.78,4.461-9.78,9.812c0,2.006,0.666,4.015,1.555,5.575L46.904,19.944z M17.562,22.843
l-3.778-5.129l-2.889-2.677c-0.221-0.446,1.11-1.784,1.779-1.56l2.889,2.898l4.891,3.569c0.889-1.56,1.555-3.569,1.555-5.575
c0-5.353-4.447-9.812-10.004-9.812c-5.336,0-9.78,4.461-9.78,9.812c0,5.575,4.447,10.036,9.78,10.036
c2.223,0,4.002-0.668,5.557-1.56L17.562,22.843z M20.896,52.058l-5.336,3.79l-2.889,3.345c-0.666,0.222-2-1.114-1.779-1.784
l2.889-2.898l4.002-5.353c-1.555-0.892-3.113-1.56-5.112-1.56c-5.336,0-9.78,4.461-9.78,10.036c0,5.575,4.447,9.812,9.78,9.812
c5.557,0,10.004-4.237,10.004-9.812C22.675,55.627,22.009,53.618,20.896,52.058L20.896,52.058z"/>
<line class="st2" x1="81.29" y1="34.839" x2="297.29" y2="34.839"/>
<rect x="184.065" y="26.323" class="st0" width="19.355" height="18.387"/>
<path class="st3" d="M206.948,24.149l-13.7-7.298c-0.426-0.238-0.948-0.238-1.375,0l-13.271,7.298
c-0.474,0.238-0.758,0.711-0.758,1.232v10.334c0,8.105,4.833,15.5,12.277,18.769l1.849,0.806c0.188,0.094,0.379,0.094,0.568,0.094
c0.188,0,0.379-0.047,0.568-0.094l2.085-0.9c7.587-3.223,12.516-10.617,12.516-18.864V25.383
C207.706,24.861,207.422,24.387,206.948,24.149L206.948,24.149z M199.931,34.198l-8.389,6.826c-0.285,0.238-0.568,0.332-0.9,0.332
c-0.379,0-0.806-0.189-1.09-0.521l-3.601-4.219c-0.521-0.617-0.427-1.517,0.141-1.991c0.618-0.521,1.518-0.426,1.992,0.142
l2.701,3.175l7.3-5.971c0.617-0.474,1.517-0.426,1.99,0.189C200.642,32.825,200.548,33.725,199.931,34.198L199.931,34.198z"/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.6, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 288 288" style="enable-background:new 0 0 288 288;" xml:space="preserve">
<style type="text/css">
.st0{fill:#C92A30;}
</style>
<path class="st0" d="M279.208,90.739c-35.477-36.963-83.184-57.313-134.318-57.313c-51.541,0-101.247,21.676-136.384,59.487
l-8.503,9.142l142.983,152.52l145.017-154.67L279.208,90.739z M158.864,196.782h-29.737v-29.737h29.737V196.782z M158.864,150.006
h-29.737v-83.38h29.737V150.006z"/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.6, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 288 288" style="enable-background:new 0 0 288 288;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st1{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
</style>
<path class="st0" d="M95.992,203.994h-71.99c-13.259,0-24.001,10.743-24.001,24.001v47.988c0,6.594,5.399,11.993,11.993,11.993
h11.993l6.636-13.258c2.953-5.906,10.771-10.729,17.365-10.729h24.016c6.594,0,14.411,4.823,17.364,10.729l6.636,13.258H108
c6.594,0,11.993-5.399,11.993-11.993v-47.988C119.993,214.751,109.25,203.994,95.992,203.994L95.992,203.994z M30.006,245.993
c-6.623,0-11.993-5.37-11.993-12.007c0-6.623,5.37-11.993,11.993-11.993c6.622,0,11.994,5.37,11.994,11.993
C41.999,240.623,36.642,245.993,30.006,245.993z M90.002,245.993c-6.623,0-11.993-5.37-11.993-12.007
c0-6.623,5.37-11.993,11.993-11.993c6.622,0,11.993,5.37,11.993,11.993C101.996,240.623,96.624,245.993,90.002,245.993z"/>
<path class="st1" d="M287.974,0.034v24.001l-0.002-0.014h-29.991v24.001h5.99c13.274,0,24.001,10.743,24.001,24.001L288,96.025
c0,13.259-10.742,24.001-24.001,24.001h-19.586c12.443,25.38,19.586,53.81,19.586,83.983c0,19.868-16.128,35.995-35.995,35.995
h-35.995v-23.987h35.995c6.622,0,12.008-5.385,12.008-12.008c-0.029-30.426-8.296-58.884-22.526-83.49
c-5.722,1.013-11.853,3.712-15.114,6.96c-4.093,4.106-7.452,7.467-7.452,7.467c-5.849,5.864-12.767,10.658-20.36,14.214
c3.403,5.499,5.456,11.924,5.456,18.87c0,19.881-16.128,35.995-35.995,35.995c-19.896,0-36.009-16.114-36.009-35.995
c0-6.946,2.053-13.372,5.456-18.87c-7.594-3.571-14.511-8.352-20.374-14.229c0,0-3.361-3.346-7.452-7.452
c-3.234-3.234-9.323-5.933-15.003-6.96c-10.376,18.037-17.59,38.09-20.697,59.503H25.644c2.672-21.316,9.013-41.451,18.081-59.996
H24.014c-13.274,0-24.001-10.742-24.001-24.001V72.024C0.012,58.779,10.74,48.037,24,48.037h6.004V24.036H0.012V0.034L83.996,0.02
v24.001H54.005v24.001l0.182,0.014h11.994c6.594,0,15.34-3.346,19.446-7.452l7.452-7.452c13.037-13.034,31.032-21.091,50.915-21.091
s37.88,8.057,50.9,21.077c0,0,3.346,3.36,7.452,7.465c4.091,4.106,12.866,7.452,19.446,7.452h12.19V24.036h-29.991V0.034H287.974z
M132.001,168.015c0,6.623,5.357,11.993,11.993,11.993c6.622,0,12.008-5.37,11.993-11.993c0-6.636-5.372-12.008-11.993-12.008
S132.001,161.379,132.001,168.015z M195.332,70.369l-26.937-19.418c-2.131-1.46-4.936,0.338-4.49,2.806l2.245,13.022h-28.953
c-1.569,0-2.92,1.346-2.92,2.919v5.836c0,1.569,1.346,2.92,2.92,2.92h28.844l-2.245,13.021c-0.448,2.583,2.468,4.376,4.49,2.806
l27.05-19.418c1.68-1.013,1.68-3.372-0.004-4.493V70.369z M149.315,90.91h-28.953l2.245-13.022c0.446-2.582-2.468-4.376-4.49-2.806
L91.18,94.391c-1.571,1.122-1.571,3.59,0,4.713l27.05,19.418c2.131,1.46,4.937-0.338,4.49-2.806l-2.245-13.022h28.844
c1.569,0,2.92-1.346,2.92-2.919v-5.836c-0.119-1.683-1.351-3.03-2.925-3.03V90.91z"/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.6, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 288 288" style="enable-background:new 0 0 288 288;" xml:space="preserve">
<style type="text/css">
.st0{fill:#69BD48;}
.st1{fill:#231F20;}
</style>
<rect x="44.998" y="94.501" class="st0" width="128.109" height="136.125"/>
<path class="st1" d="M251.546,247.045H4.502c-1.346,0-2.251,0.452-3.156,1.345C0.453,249.296,0,250.652,0,251.999
c1.346,20.244,18.446,35.999,38.702,35.999h178.652c20.244,0,37.344-15.755,38.702-35.999c0-1.346-0.452-2.704-1.345-3.596
c-0.917-0.906-1.81-1.358-3.168-1.358H251.546z M137.7,272.255h-19.803c-2.703,0-4.501-2.251-4.501-4.502
c0-2.25,1.798-4.501,4.501-4.501H137.7c2.251,0,4.502,2.251,4.502,4.501C142.202,270.004,140.404,272.255,137.7,272.255z"/>
<path class="st1" d="M274.495,0.002h-74.689c-7.645,0-13.504,6.3-13.504,13.504v106.201L288,119.696V13.507
c0-7.205-6.299-13.504-13.504-13.504L274.495,0.002z"/>
<path class="st1" d="M186.296,147.156c0,7.645,5.847,13.504,13.505,13.504l74.689-0.011c7.645,0,13.504-6.3,13.504-13.505v-18.446
H186.296V147.156z M230.395,139.952h13.505c2.703,0,4.501,1.798,4.501,4.501c0,2.704-1.798,4.502-4.501,4.502h-13.505
c-2.703,0-4.501-1.798-4.501-4.502C225.894,141.75,227.703,139.952,230.395,139.952z"/>
<path class="st1" d="M18.899,238.054h218.247c2.704,0,4.502-2.251,4.502-4.502V169.65h-41.847c-12.6,0-22.495-10.349-22.495-22.495
V77.408L27.448,77.396c-7.205,0-13.052,5.847-13.052,13.052v143.106c0,2.704,1.798,4.502,4.501,4.502L18.899,238.054z
M102.606,135.45l26.997-12.146l-8.551-3.156c-2.25-0.905-3.596-3.597-2.703-5.848c0.905-2.251,3.596-3.596,5.847-2.703
l18.446,6.752c0.906,0.452,2.251,1.346,2.704,2.251c0.452,0.905,0.452,2.251,0,3.596l-6.752,18.446
c-0.906,2.251-3.597,3.596-5.848,2.704c-2.25-0.906-3.596-3.596-2.703-5.847l3.156-8.551l-26.997,12.147
c-2.251,0.905-4.954,0-5.847-2.251C98.997,139.046,100.355,136.354,102.606,135.45L102.606,135.45z M81.004,190.802l6.752-18.446
c0.905-2.251,3.596-3.596,5.847-2.704c2.251,0.906,3.596,3.597,2.703,5.847l-3.156,8.551l26.996-12.147
c2.251-0.905,4.954,0,5.847,2.251c0.906,2.251,0,4.954-2.25,5.847l-26.997,12.147l8.55,3.156c2.251,0.905,3.596,3.596,2.703,5.847
c-0.905,2.251-3.596,3.596-5.847,2.703l-18.446-6.752c-0.905-0.453-2.251-1.345-2.703-2.251
C81.445,193.946,80.551,193.053,81.004,190.802L81.004,190.802z"/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1"
id="Layer_1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 288 288"
style="enable-background:new 0 0 288 288;" xml:space="preserve">
<g transform="translate(0,-952.36218)">
<path d="M102.3,978.9c-3.2,0.1-5.5,2.1-6.7,4.1l-13.1,26.2H30.3c-16.7,0-30.3,13.7-30.3,30.3v144c0,16.7,13.7,30.3,30.3,30.3h227.4
c16.7,0,30.3-13.7,30.3-30.3v-144c0-16.7-13.7-30.3-30.3-30.3h-52.1L192.4,983c-1.3-2.5-4-4.1-6.7-4.1H102.3z M106.9,994h74.1
l13,26.1c1.2,2.5,3.9,4.2,6.7,4.3h56.8c8.5,0,15.2,6.6,15.2,15.2v144c0,8.5-6.6,15.2-15.2,15.2H30.3c-8.5,0-15.2-6.6-15.2-15.2
v-144c0-8.5,6.6-15.2,15.2-15.2h56.8c2.8,0,5.5-1.7,6.7-4.3L106.9,994z M144,1047.1c-35.5,0-64.4,28.9-64.4,64.4
c0,35.5,28.9,64.4,64.4,64.4c35.5,0,64.4-28.9,64.4-64.4C208.4,1076,179.5,1047.1,144,1047.1z M144,1062.3
c27.3,0,49.3,22,49.3,49.3c0,27.3-22,49.3-49.3,49.3c-27.3,0-49.3-22-49.3-49.3C94.7,1084.2,116.7,1062.3,144,1062.3z"/>
</g>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 72 72" style="enable-background:new 0 0 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;}
</style>
<path class="st0" d="M63.6,65.5h-5.5V40h5.5V65.5z M18.6,31.2H3.4c-4.5,0-4.5-9.1,0-9.1h15.2C23.2,22.1,23.2,31.2,18.6,31.2z
M8.2,65.5h5.7V35H8.2V65.5z M8.2,18.3V6.5h5.7v11.8H8.2z M28.4,51h15.2c4.5,0,4.5-9.3,0-9.3H28.4C23.9,41.7,23.9,51,28.4,51z
M38.6,65.5h-5.5V54.6h5.5V65.5z M33.2,6.5V38h5.5V6.4L33.2,6.5L33.2,6.5z M68.4,36.2h-15c-4.8,0-4.8-9.1,0-9.1h15
C73.2,27.1,73.2,36.2,68.4,36.2z M58.2,6.5v16.8h5.4V6.5H58.2z"/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 288 288" style="enable-background:new 0 0 288 288;" xml:space="preserve">
<g>
<path d="M21.2,215.3h168.7c11.7,0,21.2-9.5,21.2-21.2V93.9c0-11.7-9.5-21.2-21.2-21.2H21.2C9.5,72.7,0,82.2,0,93.9v100.2
C0,205.8,9.5,215.3,21.2,215.3z"/>
<polygon points="225.2,165.5 288,206.1 288,81.9 225.2,122.5 "/>
</g>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 72 72" style="enable-background:new 0 0 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
</style>
<title>670134</title>
<desc>Created with Sketch.</desc>
<path class="st0" d="M19.589,25.301L19.589,25.301c1.113-0.307,2.259,0.344,2.57,1.453c0.307,1.109-0.345,2.258-1.453,2.565
c-7.701,2.139-13.367,9.206-13.359,17.587c0,3.427,0.996,6.588,2.637,9.322l0.775-4.4c0.198-1.135,1.281-1.895,2.416-1.693
c1.135,0.198,1.895,1.281,1.693,2.416L13.26,61.67l-0.378,0.595c-0.09,0.157-0.067,0.352-0.202,0.487
c-0.041,0.041-0.101,0.022-0.146,0.06l-0.131,0.206l-0.79,0.176c-0.191,0.037-0.341,0.127-0.532,0.116l-0.236,0.052l-9.119-1.607
c-1.135-0.198-1.895-1.281-1.693-2.416c0.198-1.135,1.281-1.895,2.416-1.693l3.959,0.697c-2.007-3.36-3.232-7.247-3.232-11.438
C3.178,36.604,10.118,27.927,19.589,25.301z M69.549,57.648L69.549,57.648c1.135-0.202,2.218,0.554,2.42,1.689
c0.199,1.135-0.558,2.213-1.693,2.416l-9.119,1.607l-0.236-0.052c-0.191,0.015-0.345-0.075-0.532-0.116l-0.79-0.176l-0.131-0.206
c-0.041-0.037-0.105-0.019-0.146-0.06c-0.135-0.135-0.112-0.33-0.202-0.487l-0.378-0.595l-1.607-9.119
c-0.199-1.135,0.558-2.213,1.693-2.416c1.135-0.199,2.213,0.558,2.416,1.693l0.775,4.404c1.64-2.734,2.64-5.895,2.64-9.322
c0.003-8.385-5.663-15.453-13.363-17.587c-1.112-0.307-1.76-1.457-1.453-2.565c0.307-1.112,1.457-1.76,2.565-1.453
c9.471,2.625,16.411,11.303,16.415,21.605c0,4.191-1.225,8.079-3.232,11.438L69.549,57.648z M41.772,20.352l-4.565-4.566
l0.004,28.939l4.565-4.565c0.813-0.813,2.135-0.813,2.947,0c0.813,0.813,0.813,2.131,0,2.947L36.6,51.23
c-0.378,0.378-0.899,0.61-1.476,0.61c-0.577,0-1.097-0.232-1.476-0.61l-8.157-8.157c-0.813-0.813-0.813-2.135,0-2.947
c0.813-0.813,2.131-0.813,2.947,0l4.599,4.599V15.719l-4.599,4.599c-0.813,0.813-2.135,0.813-2.947,0
c-0.813-0.813-0.813-2.135,0-2.947l8.123-8.123c0.412-0.412,0.951-0.607,1.491-0.603c0.004,0,0.007-0.007,0.015-0.007
c0.599,0,1.12,0.262,1.498,0.667l8.101,8.101c0.813,0.813,0.813,2.135,0,2.947C43.907,21.164,42.585,21.164,41.772,20.352z"/>
</svg>
<svg width="72" height="756" viewBox="0 0 72 756" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M36 0V108" stroke="#9F0B10" stroke-width="3" stroke-miterlimit="10"/>
<path d="M18 108H54" stroke="white" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 324H54" stroke="white" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 540H54" stroke="white" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 753H54" stroke="white" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 3H54" stroke="#9F0B10" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 216H54" stroke="white" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 432H54" stroke="white" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 648H54" stroke="white" stroke-width="6" stroke-miterlimit="10"/>
</svg>
<svg width="72" height="756" viewBox="0 0 72 756" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M36 0V108" stroke="#C92A30" stroke-width="3" stroke-miterlimit="10"/>
<path d="M18 108H54" stroke="#212529" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 324H54" stroke="#212529" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 540H54" stroke="#212529" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 753H54" stroke="#212529" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 3H54" stroke="#9F0B10" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 216H54" stroke="#212529" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 432H54" stroke="#212529" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 648H54" stroke="#212529" stroke-width="6" stroke-miterlimit="10"/>
</svg>
<svg width="72" height="756" viewBox="0 0 72 756" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M36 0V108" stroke="#E03131" stroke-width="3" stroke-miterlimit="10"/>
<path d="M18 108H54" stroke="white" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 324H54" stroke="white" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 540H54" stroke="white" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 753H54" stroke="white" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 3H54" stroke="#E03131" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 216H54" stroke="white" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 432H54" stroke="white" stroke-width="6" stroke-miterlimit="10"/>
<path d="M18 648H54" stroke="white" stroke-width="6" stroke-miterlimit="10"/>
</svg>
<svg width="72" height="72" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M36 44.6C41.3478 44.6 45.683 40.4094 45.683 35.24C45.683 30.0706 41.3478 25.88 36 25.88C30.6522 25.88 26.317 30.0706 26.317 35.24C26.317 40.4094 30.6522 44.6 36 44.6Z" fill="#07916D"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.4 1.40002H57.6L45.387 37.548L26.585 37.434L14.4 1.40002Z" fill="url(#paint0_linear)"/>
<defs>
<linearGradient id="paint0_linear" x1="36.0008" y1="1.82077" x2="36.0008" y2="37.5507" gradientUnits="userSpaceOnUse">
<stop stop-color="#0CA678" stop-opacity="0"/>
<stop offset="1" stop-color="#07916D"/>
</linearGradient>
</defs>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 288 288" style="enable-background:new 0 0 288 288;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<g>
<path class="st0" d="M53.3,245.5c-3.1,3.1-7.7,3.1-10.8,0c-3.1-3.1-3.1-7.7,0-10.8l17-17C44,200,34,176.8,32.4,151.3H7.7
c-4.6,0-7.7-3.1-7.7-7.7c0-3.9,3.1-7.7,7.7-7.7h24.7C34,111.2,44,88,59.5,70.3l-17-17c-3.1-3.1-3.1-7.7,0-10.8
c3.1-3.1,7.7-3.1,10.8,0l17,17C88,44,111.2,34,135.9,32.4V7.7c0-4.6,3.9-7.7,7.7-7.7c4.6,0,7.7,3.1,7.7,7.7v24.7
c25.5,1.5,48.6,11.6,66.4,27l17-17c3.1-3.1,7.7-3.1,10.8,0c3.1,3.1,3.1,7.7,0,10.8l-17,17c15.4,17.8,25.5,40.9,27,65.6h24.7
c3.9,0,7.7,3.9,7.7,7.7c0,4.6-3.9,7.7-7.7,7.7h-24.7c-1.5,25.5-11.6,48.6-27,66.4l17,17c3.1,3.1,3.1,7.7,0,10.8
c-3.1,3.1-7.7,3.1-10.8,0l-17-17c-17.8,15.4-40.9,25.5-66.4,27v24.7c0,3.9-3.1,7.7-7.7,7.7c-3.9,0-7.7-3.9-7.7-7.7v-24.7
c-24.7-1.5-47.9-11.6-65.6-27L53.3,245.5z M143.6,47.9c-53.3,0-96.5,42.5-96.5,95.7c0,54,43.2,96.5,96.5,96.5
c54,0,96.5-42.5,96.5-96.5C240.1,90.3,197.7,47.9,143.6,47.9z"/>
<circle class="st0" cx="144" cy="144" r="72"/>
</g>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 288 288" style="enable-background:new 0 0 288 288;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<path class="st0" d="M79.2,0h-72C5.3,0,3.5,0.8,2.1,2.1C0.8,3.5,0,5.3,0,7.2v273.6c0,1.9,0.8,3.8,2.1,5.1c1.4,1.4,3.2,2.1,5.1,2.1
h72c1.9,0,3.7-0.8,5.1-2.1c1.4-1.3,2.1-3.2,2.1-5.1V7.2c0-1.9-0.8-3.8-2.1-5.1C82.9,0.8,81.1,0,79.2,0z M43.2,259.2
c-5.8,0-11.1-3.5-13.3-8.9c-2.2-5.4-1-11.6,3.1-15.7c4.1-4.1,10.3-5.3,15.7-3.1c5.4,2.2,8.9,7.5,8.9,13.3
C57.6,252.7,51.2,259.2,43.2,259.2L43.2,259.2z"/>
<path class="st0" d="M280.8,201.6h-63l-117,67.6V288h180c1.9,0,3.8-0.8,5.1-2.1c1.4-1.4,2.1-3.2,2.1-5.1v-72c0-1.9-0.8-3.7-2.1-5.1
C284.5,202.4,282.7,201.6,280.8,201.6L280.8,201.6z"/>
<path class="st0" d="M130.3,235.5L278,150.2c3.4-2,4.6-6.4,2.6-9.8l-36-62.4v0c-2-3.4-6.4-4.6-9.8-2.6l-18.1,10.4L130.3,235.5z"/>
<path class="st0" d="M219.6,37.6l-62.4-36c-3.4-2-7.8-0.8-9.8,2.6L100.8,85v172.8L222.2,47.5c1-1.6,1.2-3.6,0.7-5.5
C222.5,40.1,221.3,38.6,219.6,37.6L219.6,37.6z"/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 288 288" style="enable-background:new 0 0 288 288;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;stroke:#FFFFFF;stroke-width:8;}
.st1{fill:#FFFFFF;stroke:#FFFFFF;}
</style>
<rect x="3.6" y="40.7" class="st0" width="280.8" height="206.6"/>
<rect x="122.3" y="144.5" class="st1" width="162.1" height="102.8"/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 288 288" style="enable-background:new 0 0 288 288;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;stroke:#FFFFFF;stroke-width:8;}
</style>
<rect x="3.6" y="40.7" class="st0" width="280.8" height="206.6"/>
</svg>
/****************************************************************************
*
* (c) 2009-2019 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.
*
* @file
* @author Gus Grubba <gus@auterion.com>
*/
import QtQuick 2.11
import QtQuick.Controls 1.2
import QGroundControl 1.0
import QGroundControl.MultiVehicleManager 1.0
import QGroundControl.Controls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.ScreenTools 1.0
//-------------------------------------------------------------------------
//-- Armed Indicator
Rectangle {
anchors.top: parent.top
anchors.bottom: parent.bottom
width: labelRow.width + (ScreenTools.defaultFontPixelWidth * 6)
color: qgcPal.windowShade
property bool _armed: activeVehicle ? activeVehicle.armed : false
Row {
id: labelRow
spacing: ScreenTools.defaultFontPixelWidth
anchors.centerIn: parent
QGCLabel {
id: labelText
text: _armed ? qsTr("Armed") : qsTr("Disarmed")
color: qgcPal.text
font.pointSize: ScreenTools.defaultFontPointSize
anchors.verticalCenter: parent.verticalCenter
}
Rectangle {
height: ScreenTools.defaultFontPixelHeight * 0.5
width: height
radius: height * 0.5
color: _armed ? qgcPal.colorGreen : qgcPal.colorRed
border.color: qgcPal.window
border.width: 1
anchors.verticalCenter: parent.verticalCenter
}
}
QGCMouseArea {
fillItem: parent
onClicked: _armed ? mainWindow.disarmVehicle() : mainWindow.armVehicle()
}
}
/****************************************************************************
*
* (c) 2009-2019 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.
*
* @file
* @author Gus Grubba <gus@auterion.com>
*/
import QtQuick 2.11
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.11
import QGroundControl 1.0
import QGroundControl.Controls 1.0
import QGroundControl.MultiVehicleManager 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Palette 1.0
//-------------------------------------------------------------------------
//-- Battery Indicator
Item {
id: _root
width: batteryIndicatorRow.width
anchors.top: parent.top
anchors.bottom: parent.bottom
property var battery1: activeVehicle ? activeVehicle.battery : null
property var battery2: activeVehicle ? activeVehicle.battery2 : null
property bool hasSecondBattery: battery2 && battery2.voltage.value !== -1
function lowestBattery() {
if(activeVehicle) {
if(hasSecondBattery) {
if(activeVehicle.battery2.percentRemaining.value < activeVehicle.battery.percentRemaining.value) {
return activeVehicle.battery2
}
}
return activeVehicle.battery
}
return null
}
function getBatteryColor(battery) {
if(battery) {
if(battery.percentRemaining.value > 75) {
return qgcPal.text
}
if(battery.percentRemaining.value > 50) {
return qgcPal.colorOrange
}
if(battery.percentRemaining.value > 0.1) {
return qgcPal.colorRed
}
}
return qgcPal.colorGrey
}
function getBatteryPercentageText(battery) {
if(battery) {
if(battery.percentRemaining.value > 98.9) {
return "100%"
}
if(battery.percentRemaining.value > 0.1) {
return battery.percentRemaining.valueString + battery.percentRemaining.units
}
if(battery.voltage.value >= 0) {
return battery.voltage.valueString + battery.voltage.units
}
}
return "N/A"
}
Component {
id: batteryInfo
Rectangle {
width: battCol.width + ScreenTools.defaultFontPixelWidth * 3
height: battCol.height + ScreenTools.defaultFontPixelHeight * 2
radius: ScreenTools.defaultFontPixelHeight * 0.5
color: qgcPal.window
Column {
id: battCol
spacing: ScreenTools.defaultFontPixelHeight * 0.5
width: Math.max(battGrid.width, battLabel.width)
anchors.margins: ScreenTools.defaultFontPixelHeight
anchors.centerIn: parent
QGCLabel {
id: battLabel
text: qsTr("Battery Status")
font.family: ScreenTools.demiboldFontFamily
anchors.horizontalCenter: parent.horizontalCenter
}
GridLayout {
id: battGrid
anchors.margins: ScreenTools.defaultFontPixelHeight
columnSpacing: ScreenTools.defaultFontPixelWidth
columns: 2
anchors.horizontalCenter: parent.horizontalCenter
QGCLabel {
id: batteryLabel
text: qsTr("Battery 1")
Layout.alignment: Qt.AlignVCenter
}
QGCColoredImage {
height: batteryLabel.height
width: height
sourceSize.width: width
source: "/qmlimages/Battery.svg"
color: qgcPal.text
fillMode: Image.PreserveAspectFit
Rectangle {
color: getBatteryColor(activeVehicle ? activeVehicle.battery : null)
anchors.left: parent.left
anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.125
height: parent.height * 0.35
width: activeVehicle ? (activeVehicle.battery.percentRemaining.value / 100) * parent.width * 0.875 : 0
anchors.verticalCenter: parent.verticalCenter
}
}
QGCLabel { text: qsTr("Voltage:") }
QGCLabel { text: (battery1 && battery1.voltage.value !== -1) ? (battery1.voltage.valueString + " " + battery1.voltage.units) : "N/A" }
QGCLabel { text: qsTr("Accumulated Consumption:") }
QGCLabel { text: (battery1 && battery1.mahConsumed.value !== -1) ? (battery1.mahConsumed.valueString + " " + battery1.mahConsumed.units) : "N/A" }
Item {
width: 1
height: 1
visible: hasSecondBattery;
Layout.columnSpan: 2
}
QGCLabel {
text: qsTr("Battery 2")
visible: hasSecondBattery
Layout.alignment: Qt.AlignVCenter
}
QGCColoredImage {
height: batteryLabel.height
width: height
sourceSize.width: width
source: "/qmlimages/Battery.svg"
color: qgcPal.text
visible: hasSecondBattery
fillMode: Image.PreserveAspectFit
Rectangle {
color: getBatteryColor(activeVehicle ? activeVehicle.battery2 : null)
anchors.left: parent.left
anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.125
height: parent.height * 0.35
width: activeVehicle ? (activeVehicle.battery2.percentRemaining.value / 100) * parent.width * 0.875 : 0
anchors.verticalCenter: parent.verticalCenter
}
}
QGCLabel { text: qsTr("Voltage:"); visible: hasSecondBattery; }
QGCLabel { text: (battery2 && battery2.voltage.value !== -1) ? (battery2.voltage.valueString + " " + battery2.voltage.units) : "N/A"; visible: hasSecondBattery; }
QGCLabel { text: qsTr("Accumulated Consumption:"); visible: hasSecondBattery; }
QGCLabel { text: (battery2 && battery2.mahConsumed.value !== -1) ? (battery2.mahConsumed.valueString + " " + battery2.mahConsumed.units) : "N/A"; visible: hasSecondBattery; }
}
}
}
}
Row {
id: batteryIndicatorRow
anchors.top: parent.top
anchors.bottom: parent.bottom
opacity: (activeVehicle && activeVehicle.battery.voltage.value >= 0) ? 1 : 0.5
spacing: ScreenTools.defaultFontPixelWidth
QGCColoredImage {
anchors.top: parent.top
anchors.bottom: parent.bottom
width: height
sourceSize.width: width
source: "/qmlimages/Battery.svg"
color: qgcPal.text
fillMode: Image.PreserveAspectFit
Rectangle {
color: getBatteryColor(lowestBattery())
anchors.left: parent.left
anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.25
height: parent.height * 0.35
width: activeVehicle ? (activeVehicle.battery.percentRemaining.value / 100) * parent.width * 0.75 : 0
anchors.verticalCenter: parent.verticalCenter
}
}
QGCLabel {
text: getBatteryPercentageText(lowestBattery())
font.pointSize: ScreenTools.smallFontPointSize
color: getBatteryColor(lowestBattery())
anchors.verticalCenter: parent.verticalCenter
}
}
MouseArea {
anchors.fill: parent
onClicked: {
mainWindow.showPopUp(_root, batteryInfo)
}
}
}
/****************************************************************************
*
* (c) 2009-2019 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.
*
* @file
* @author Gus Grubba <gus@auterion.com>
*/
import QtQuick 2.11
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.11
import QGroundControl 1.0
import QGroundControl.Controls 1.0
import QGroundControl.MultiVehicleManager 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Palette 1.0
import Custom.Widgets 1.0
//-------------------------------------------------------------------------
//-- GPS Indicator
Item {
id: _root
width: gpsRow.width
anchors.top: parent.top
anchors.bottom: parent.bottom
function getGPSSignal() {
if(!activeVehicle || activeVehicle.gps.count.rawValue < 1 || activeVehicle.gps.hdop.rawValue > 1.4) {
return 0;
} else if(activeVehicle.gps.hdop.rawValue < 1.0) {
return 100;
} else if(activeVehicle.gps.hdop.rawValue < 1.1) {
return 75;
} else if(activeVehicle.gps.hdop.rawValue < 1.2) {
return 50;
} else {
return 25;
}
}
Component {
id: gpsInfo
Rectangle {
width: gpsCol.width + ScreenTools.defaultFontPixelWidth * 3
height: gpsCol.height + ScreenTools.defaultFontPixelHeight * 2
radius: ScreenTools.defaultFontPixelHeight * 0.5
color: qgcPal.window
Column {
id: gpsCol
spacing: ScreenTools.defaultFontPixelHeight * 0.5
width: Math.max(gpsGrid.width, gpsLabel.width)
anchors.margins: ScreenTools.defaultFontPixelHeight
anchors.centerIn: parent
QGCLabel {
id: gpsLabel
text: (activeVehicle && activeVehicle.gps.count.value >= 0) ? qsTr("GPS Status") : qsTr("GPS Data Unavailable")
font.family: ScreenTools.demiboldFontFamily
anchors.horizontalCenter: parent.horizontalCenter
}
GridLayout {
id: gpsGrid
visible: (activeVehicle && activeVehicle.gps.count.value >= 0)
anchors.margins: ScreenTools.defaultFontPixelHeight
columnSpacing: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
columns: 2
QGCLabel { text: qsTr("GPS Count:") }
QGCLabel { text: activeVehicle ? activeVehicle.gps.count.valueString : qsTr("N/A", "No data to display") }
QGCLabel { text: qsTr("GPS Lock:") }
QGCLabel { text: activeVehicle ? activeVehicle.gps.lock.enumStringValue : qsTr("N/A", "No data to display") }
QGCLabel { text: qsTr("HDOP:") }
QGCLabel { text: activeVehicle ? activeVehicle.gps.hdop.valueString : qsTr("--.--", "No data to display") }
QGCLabel { text: qsTr("VDOP:") }
QGCLabel { text: activeVehicle ? activeVehicle.gps.vdop.valueString : qsTr("--.--", "No data to display") }
QGCLabel { text: qsTr("Course Over Ground:") }
QGCLabel { text: activeVehicle ? activeVehicle.gps.courseOverGround.valueString : qsTr("--.--", "No data to display") }
}
}
}
}
Row {
id: gpsRow
anchors.top: parent.top
anchors.bottom: parent.bottom
spacing: ScreenTools.defaultFontPixelWidth * 0.25
QGCColoredImage {
width: height
anchors.top: parent.top
anchors.bottom: parent.bottom
sourceSize.height: height
source: "/qmlimages/Gps.svg"
color: qgcPal.text
fillMode: Image.PreserveAspectFit
opacity: getGPSSignal() > 0 ? 1 : 0.5
}
CustomSignalStrength {
anchors.verticalCenter: parent.verticalCenter
size: parent.height * 0.75
percent: getGPSSignal()
}
}
MouseArea {
anchors.fill: parent
onClicked: {
mainWindow.showPopUp(_root, gpsInfo)
}
}
}
This diff is collapsed.
/****************************************************************************
*
* (c) 2009-2019 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.
*
* @file
* @author Gus Grubba <gus@auterion.com>
*/
import QtQuick 2.11
import QtQuick.Controls 2.4
import QtQuick.Dialogs 1.3
import QtQuick.Layouts 1.11
import QGroundControl 1.0
import QGroundControl.Controls 1.0
import QGroundControl.MultiVehicleManager 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Palette 1.0
Item {
anchors.fill: parent
readonly property real _indicatorMargins: ScreenTools.defaultFontPixelHeight * 0.75
Component.onCompleted: {
if(QGroundControl.pairingManager) {
if(!activeVehicle) {
pairingTimer.start()
}
}
}
//-------------------------------------------------------------------------
//-- Launch pairing manager if nothing connected
Timer {
id: pairingTimer
interval: 5000
running: false;
repeat: false;
onTriggered: {
if(!activeVehicle) {
if(QGroundControl.pairingManager.firstBoot && pairingLoader.item) {
QGroundControl.pairingManager.firstBoot = false
pairingLoader.item.runPairing()
}
}
}
}
//-------------------------------------------------------------------------
//-- Waiting for a vehicle
Row {
id: waitForVehicle
spacing: ScreenTools.defaultFontPixelWidth
visible: !activeVehicle
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.left: parent.left
QGCColoredImage {
id: menuEdge
anchors.verticalCenter: parent.verticalCenter
height: ScreenTools.defaultFontPixelHeight
width: height
sourceSize.height: parent.height
fillMode: Image.PreserveAspectFit
source: "/qmlimages/PaperPlane.svg"
color: qgcPal.buttonText
}
QGCLabel {
anchors.verticalCenter: parent.verticalCenter
text: qsTr("Waiting for a vehicle")
font.pointSize: ScreenTools.mediumFontPointSize
font.family: ScreenTools.demiboldFontFamily
}
}
//-------------------------------------------------------------------------
//-- Pairing Indicator (not connected)
Row {
id: pairingRow
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 2
spacing: ScreenTools.defaultFontPixelWidth * 2
visible: !indicatorRow.visible
Loader {
id: pairingLoader
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.margins: _indicatorMargins
source: "/custom/PairingIndicator.qml"
}
}
//-------------------------------------------------------------------------
//-- Toolbar Indicators
Row {
id: indicatorRow
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 2
spacing: ScreenTools.defaultFontPixelWidth * 2
visible: activeVehicle && !communicationLost
Repeater {
model: activeVehicle ? activeVehicle.toolBarIndicators : []
Loader {
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.margins: _indicatorMargins
source: modelData;
}
}
Item {
width: 1
height: 1
}
Loader {
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.margins: _indicatorMargins
source: "/toolbar/MessageIndicator.qml"
}
}
}
/****************************************************************************
*
* (c) 2009-2019 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.
*
* @file
* @author Gus Grubba <gus@auterion.com>
*/
import QtQuick 2.11
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.11
import QtQuick.Dialogs 1.3
import QGroundControl 1.0
import QGroundControl.Controls 1.0
import QGroundControl.MultiVehicleManager 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Palette 1.0
//-------------------------------------------------------------------------
//-- Mode Indicator
Item {
anchors.top: parent.top
anchors.bottom: parent.bottom
width: selectorRow.width
Row {
id: selectorRow
spacing: ScreenTools.defaultFontPixelWidth
anchors.verticalCenter: parent.verticalCenter
QGCLabel {
id: flightModeSelector
text: activeVehicle ? activeVehicle.flightMode : qsTr("N/A")
color: qgcPal.text
font.pointSize: ScreenTools.defaultFontPointSize
anchors.verticalCenter: parent.verticalCenter
}
QGCColoredImage {
anchors.verticalCenter: parent.verticalCenter
height: ScreenTools.defaultFontPixelHeight * 0.5
width: height
sourceSize.height: parent.height
fillMode: Image.PreserveAspectFit
source: "/res/DropArrow.svg"
color: qgcPal.text
}
}
MouseArea {
visible: activeVehicle && activeVehicle.flightModeSetAvailable
anchors.fill: parent
onClicked: flightModesMenu.open()
}
//-------------------------------------------------------------------------
//-- Flight Modes
Popup {
id: flightModesMenu
width: Math.min(mainWindow.width * 0.666, ScreenTools.defaultFontPixelWidth * 40)
height: mainWindow.height * 0.5
modal: true
focus: true
parent: Overlay.overlay
x: Math.round((mainWindow.width - width) * 0.5)
y: Math.round((mainWindow.height - height) * 0.5)
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
property int selectedIndex: 0
background: Rectangle {
anchors.fill: parent
color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75)
border.color: qgcPal.text
radius: ScreenTools.defaultFontPixelWidth
}
ColumnLayout {
id: comboListCol
spacing: ScreenTools.defaultFontPixelHeight
anchors.centerIn: parent
QGCLabel {
text: qsTr("Flight Modes")
Layout.alignment: Qt.AlignHCenter
}
Repeater {
model: activeVehicle ? activeVehicle.flightModes : [ ]
QGCButton {
text: modelData
Layout.minimumHeight: ScreenTools.defaultFontPixelHeight * 3
Layout.minimumWidth: ScreenTools.defaultFontPixelWidth * 30
Layout.fillHeight: true
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter
onClicked: {
activeVehicle.flightMode = modelData
flightModesMenu.close()
}
}
}
}
}
}
/****************************************************************************
*
* (c) 2009-2019 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.
*
* @file
* @author Gus Grubba <gus@auterion.com>
*/
import QtQuick 2.11
import QtQuick.Controls 1.4
import QGroundControl 1.0
import QGroundControl.Controls 1.0
import QGroundControl.MultiVehicleManager 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Palette 1.0
//-------------------------------------------------------------------------
//-- Multi Vehicle Selector
Item {
anchors.top: parent.top
anchors.bottom: parent.bottom
width: selectorRow.width
property bool _multiVehicles: QGroundControl.multiVehicleManager.vehicles.count > 1
Component.onCompleted: {
updatemultiVehiclesMenu()
}
Connections {
target: QGroundControl.multiVehicleManager.vehicles
onCountChanged: updatemultiVehiclesMenu()
}
Row {
id: selectorRow
spacing: ScreenTools.defaultFontPixelWidth
anchors.verticalCenter: parent.verticalCenter
QGCColoredImage {
anchors.verticalCenter: parent.verticalCenter
height: ScreenTools.defaultFontPixelHeight
width: height
sourceSize.height: parent.height
fillMode: Image.PreserveAspectFit
source: "/qmlimages/PaperPlane.svg"
color: qgcPal.text
}
QGCLabel {
id: multiVehicleSelector
text: "Vehicle " + (activeVehicle ? activeVehicle.id : "None")
color: qgcPal.buttonText
anchors.verticalCenter: parent.verticalCenter
}
QGCColoredImage {
visible: _multiVehicles
anchors.verticalCenter: parent.verticalCenter
height: ScreenTools.defaultFontPixelHeight * 0.5
width: height
sourceSize.height: parent.height
fillMode: Image.PreserveAspectFit
source: "/res/DropArrow.svg"
color: qgcPal.text
}
}
Menu {
id: multiVehiclesMenu
}
Component {
id: multiVehicleMenuItemComponent
MenuItem {
onTriggered: QGroundControl.multiVehicleManager.activeVehicle = vehicle
property int vehicleId: Number(text.split(" ")[1])
property var vehicle: QGroundControl.multiVehicleManager.getVehicleById(vehicleId)
}
}
property var multiVehiclesMenuItems: []
function updatemultiVehiclesMenu() {
if (_multiVehicles) {
// Remove old menu items
for (var i = 0; i < multiVehiclesMenuItems.length; i++) {
multiVehiclesMenu.removeItem(multiVehiclesMenuItems[i])
}
multiVehiclesMenuItems.length = 0
// Add new items
for (i = 0; i < QGroundControl.multiVehicleManager.vehicles.count; i++) {
var vehicle = QGroundControl.multiVehicleManager.vehicles.get(i)
var menuItem = multiVehicleMenuItemComponent.createObject(null, { "text": "Vehicle " + vehicle.id })
multiVehiclesMenuItems.push(menuItem)
multiVehiclesMenu.insertItem(i, menuItem)
console.log("Vehicle " + vehicle.id)
}
} else {
console.log('No multiple vehicles: ' + QGroundControl.multiVehicleManager.vehicles.count)
}
}
MouseArea {
visible: _multiVehicles
anchors.fill: parent
onClicked: {
console.log('Clicked')
multiVehiclesMenu.popup()
}
}
}
/****************************************************************************
*
* (c) 2009-2019 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.
*
* @file
* @author Gus Grubba <gus@auterion.com>
*/
import QtQuick 2.11
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.11
import QGroundControl 1.0
import QGroundControl.Controls 1.0
import QGroundControl.MultiVehicleManager 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Palette 1.0
import Custom.Widgets 1.0
//-------------------------------------------------------------------------
//-- RC RSSI Indicator
Item {
id: _root
width: visible ? rssiRow.width : 0
anchors.top: parent.top
anchors.bottom: parent.bottom
visible: activeVehicle ? activeVehicle.supportsRadio : true
property bool _rcRSSIAvailable: activeVehicle ? activeVehicle.rcRSSI > 0 && activeVehicle.rcRSSI <= 100 : false
Component {
id: rcRSSIInfo
Rectangle {
width: rcrssiCol.width + ScreenTools.defaultFontPixelWidth * 3
height: rcrssiCol.height + ScreenTools.defaultFontPixelHeight * 2
radius: ScreenTools.defaultFontPixelHeight * 0.5
color: qgcPal.window
Column {
id: rcrssiCol
spacing: ScreenTools.defaultFontPixelHeight * 0.5
width: Math.max(rcrssiGrid.width, rssiLabel.width)
anchors.margins: ScreenTools.defaultFontPixelHeight
anchors.centerIn: parent
QGCLabel {
id: rssiLabel
text: activeVehicle ? (activeVehicle.rcRSSI !== 255 ? qsTr("RC RSSI Status") : qsTr("RC RSSI Data Unavailable")) : qsTr("N/A", "No data available")
font.family: ScreenTools.demiboldFontFamily
anchors.horizontalCenter: parent.horizontalCenter
}
GridLayout {
id: rcrssiGrid
visible: _rcRSSIAvailable
anchors.margins: ScreenTools.defaultFontPixelHeight
columnSpacing: ScreenTools.defaultFontPixelWidth
columns: 2
anchors.horizontalCenter: parent.horizontalCenter
QGCLabel { text: qsTr("RSSI:") }
QGCLabel { text: activeVehicle ? (activeVehicle.rcRSSI + "%") : 0 }
}
}
}
}
Row {
id: rssiRow
anchors.top: parent.top
anchors.bottom: parent.bottom
spacing: ScreenTools.defaultFontPixelWidth * 0.25
QGCColoredImage {
width: height
anchors.top: parent.top
anchors.bottom: parent.bottom
sourceSize.height: height
source: "/custom/img/menu_rc.svg"
color: qgcPal.text
fillMode: Image.PreserveAspectFit
opacity: _rcRSSIAvailable ? 1 : 0.5
}
CustomSignalStrength {
anchors.verticalCenter: parent.verticalCenter
size: parent.height * 0.75
percent: _rcRSSIAvailable ? activeVehicle.rcRSSI : 0
}
}
MouseArea {
anchors.fill: parent
onClicked: {
mainWindow.showPopUp(_root, rcRSSIInfo)
}
}
}
This diff is collapsed.
/****************************************************************************
*
* (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.
*
****************************************************************************/
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQml.Models 2.1
import QGroundControl 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Controls 1.0
import QGroundControl.FlightDisplay 1.0
Rectangle {
width: mainColumn.width + ScreenTools.defaultFontPixelWidth * 3
height: mainColumn.height + ScreenTools.defaultFontPixelHeight
color: qgcPal.windowShade
radius: 3
PreFlightCheckModel {
id: listModel
PreFlightCheckGroup {
name: qsTr("Initial checks")
// Standard check list items (group 0) - Available from the start
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?")
}
}
}
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
}
// 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: model.reset()
QGCColoredImage {
source: "/qmlimages/MapSyncBlack.svg"
color: qgcPal.buttonText
anchors.fill: parent
}
}
}
// All check list items
Repeater {
id: checkListRepeater
model: listModel
}
}
}
......@@ -15,41 +15,36 @@
#include "QGCApplication.h"
#include "QGCCorePlugin.h"
//-----------------------------------------------------------------------------
CustomAutoPilotPlugin::CustomAutoPilotPlugin(Vehicle* vehicle, QObject* parent)
: PX4AutoPilotPlugin(vehicle, parent)
{
// Whenever we go on/out of advanced mode the available list of settings pages will change
connect(qgcApp()->toolbox()->corePlugin(), &QGCCorePlugin::showAdvancedUIChanged, this, &CustomAutoPilotPlugin::_advancedChanged);
}
//-----------------------------------------------------------------------------
void
CustomAutoPilotPlugin::_advancedChanged(bool)
// This signals that when Advanced Mode changes the list of Vehicle Settings page also changed
void CustomAutoPilotPlugin::_advancedChanged(bool)
{
_components.clear();
emit vehicleComponentsChanged();
}
//-----------------------------------------------------------------------------
const QVariantList&
CustomAutoPilotPlugin::vehicleComponents()
// This allows us to hide most Vehicle Setup pages unless we are in Advanced Mmode
const QVariantList& CustomAutoPilotPlugin::vehicleComponents()
{
if (_components.count() == 0 && !_incorrectParameterVersion) {
if (_vehicle) {
bool showAdvanced = qgcApp()->toolbox()->corePlugin()->showAdvancedUI();
qDebug() << "Loading components:" << showAdvanced;
if (_vehicle->parameterManager()->parametersReady()) {
if(showAdvanced) {
_airframeComponent = new AirframeComponent(_vehicle, this);
_airframeComponent->setupTriggerSignals();
_components.append(QVariant::fromValue(reinterpret_cast<VehicleComponent*>(_airframeComponent)));
}
if (!_vehicle->hilMode()) {
if (showAdvanced) {
_airframeComponent = new AirframeComponent(_vehicle, this);
_airframeComponent->setupTriggerSignals();
_components.append(QVariant::fromValue(reinterpret_cast<VehicleComponent*>(_airframeComponent)));
_sensorsComponent = new SensorsComponent(_vehicle, this);
_sensorsComponent->setupTriggerSignals();
_components.append(QVariant::fromValue(reinterpret_cast<VehicleComponent*>(_sensorsComponent)));
}
if(showAdvanced) {
_radioComponent = new PX4RadioComponent(_vehicle, this);
_radioComponent->setupTriggerSignals();
_components.append(QVariant::fromValue(reinterpret_cast<VehicleComponent*>(_radioComponent)));
......@@ -71,7 +66,7 @@ CustomAutoPilotPlugin::vehicleComponents()
_safetyComponent->setupTriggerSignals();
_components.append(QVariant::fromValue(reinterpret_cast<VehicleComponent*>(_safetyComponent)));
if(showAdvanced) {
if (showAdvanced) {
_tuningComponent = new PX4TuningComponent(_vehicle, this);
_tuningComponent->setupTriggerSignals();
_components.append(QVariant::fromValue(reinterpret_cast<VehicleComponent*>(_tuningComponent)));
......@@ -83,22 +78,9 @@ CustomAutoPilotPlugin::vehicleComponents()
_components.append(QVariant::fromValue(reinterpret_cast<VehicleComponent*>(_cameraComponent)));
}
}
//-- Is there an ESP8266 Connected?
if(_vehicle->parameterManager()->parameterExists(MAV_COMP_ID_UDP_BRIDGE, "SW_VER")) {
_esp8266Component = new ESP8266Component(_vehicle, this);
_esp8266Component->setupTriggerSignals();
_components.append(QVariant::fromValue(reinterpret_cast<VehicleComponent*>(_esp8266Component)));
}
} else {
qWarning() << "Call to vehicleCompenents prior to parametersReady";
}
if(_vehicle->parameterManager()->parameterExists(_vehicle->id(), "SLNK_RADIO_CHAN")) {
_syslinkComponent = new SyslinkComponent(_vehicle, this);
_syslinkComponent->setupTriggerSignals();
_components.append(QVariant::fromValue(reinterpret_cast<VehicleComponent*>(_syslinkComponent)));
}
} else {
qWarning() << "Internal error";
}
......
......@@ -15,15 +15,17 @@
#include "PX4AutoPilotPlugin.h"
#include "Vehicle.h"
/// Custom overrides from standard PX4AutoPilotPlugin implementation
class CustomAutoPilotPlugin : public PX4AutoPilotPlugin
{
Q_OBJECT
public:
CustomAutoPilotPlugin(Vehicle* vehicle, QObject* parent);
const QVariantList& vehicleComponents() override;
const QVariantList& vehicleComponents() final;
private slots:
void _advancedChanged (bool advanced);
private:
QVariantList _components;
......
This diff is collapsed.
......@@ -24,48 +24,21 @@ class CustomSettings;
Q_DECLARE_LOGGING_CATEGORY(CustomLog)
//-- Our own, custom video receiver
class CustomVideoReceiver : public GstVideoReceiver
{
Q_OBJECT
public:
explicit CustomVideoReceiver(QObject* parent = nullptr);
~CustomVideoReceiver();
};
//-----------------------------------------------------------------------------
//-- Our own, custom options
class CustomOptions : public QGCOptions
{
public:
CustomOptions(CustomPlugin*, QObject* parent = nullptr);
bool wifiReliableForCalibration () const final { return true; }
#if defined(Q_OS_LINUX)
double toolbarHeightMultiplier () final { return 1.25; }
#endif
QUrl flyViewOverlay () const final { return QUrl::fromUserInput("qrc:/custom/CustomFlyView.qml"); }
QUrl preFlightChecklistUrl () const final { return QUrl::fromUserInput("qrc:/custom/PreFlightCheckList.qml"); }
//-- We have our own toolbar
QUrl mainToolbarUrl () const final { return QUrl::fromUserInput("qrc:/custom/CustomMainToolBar.qml"); }
QUrl planToolbarUrl () const final { return QUrl::fromUserInput("qrc:/custom/CustomMainToolBar.qml"); }
//-- Don't show instrument widget
CustomInstrumentWidget* instrumentWidget () final { return nullptr; }
bool showMavlinkLogOptions () const final { return false; }
bool showFirmwareUpgrade () const final;
//-- We handle multiple vehicles in a custom way
bool enableMultiVehicleList () const final { return false; }
//-- We handle our own map scale
bool enableMapScale () const final { return false; }
// TODO: Can't access QGCPalette without some workarounds, change this upstream
QColor toolbarBackgroundLight () const final;
QColor toolbarBackgroundDark () const final;
// Overrides from QGCOptions
bool wifiReliableForCalibration (void) const final;
QUrl flyViewOverlay (void) const final;
CustomInstrumentWidget* instrumentWidget (void) final;
bool showFirmwareUpgrade (void) const final;
bool enableMultiVehicleList (void) const final;
};
//-----------------------------------------------------------------------------
class CustomPlugin : public QGCCorePlugin
{
Q_OBJECT
......@@ -74,33 +47,25 @@ public:
~CustomPlugin();
// Overrides from QGCCorePlugin
QVariantList& settingsPages () final;
QGCOptions* options () final;
QString brandImageIndoor () const final;
QString brandImageOutdoor () const final;
QVariantList& settingsPages (void) final;
QGCOptions* options (void) final;
QString brandImageIndoor (void) const final;
QString brandImageOutdoor (void) const final;
bool overrideSettingsGroupVisibility (QString name) final;
VideoManager* createVideoManager (QGCApplication* app, QGCToolbox* toolbox) final;
VideoReceiver* createVideoReceiver (QObject* parent) final;
QQmlApplicationEngine* createRootWindow (QObject* parent) final;
bool adjustSettingMetaData (const QString& settingsGroup, FactMetaData& metaData) final;
void paletteOverride (QString colorName, QGCPalette::PaletteColorInfo_t& colorInfo) final;
QQmlApplicationEngine* createQmlApplicationEngine (QObject* parent) final;
// Overrides from QGCTool
void setToolbox (QGCToolbox* toolbox);
const static QColor _windowShadeEnabledLightColor;
const static QColor _windowShadeEnabledDarkColor;
private slots:
void _advancedChanged (bool advanced);
void _advancedChanged(bool advanced);
private:
void
addSettingsEntry(
const QString& title,
const char* qmlFile,
const char* iconFile = nullptr);
void _addSettingsEntry(const QString& title, const char* qmlFile, const char* iconFile = nullptr);
private:
CustomOptions* _pOptions = nullptr;
QVariantList _customSettingsList; // Not to be mixed up with QGCCorePlugin implementation
CustomOptions* _options = nullptr;
QVariantList _customSettingsList; // Not to be mixed up with QGCCorePlugin implementation
};
/****************************************************************************
*
* (c) 2009-2019 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.
*
* @file
* @brief Custom QtQuick Interface
* @author Gus Grubba <gus@auterion.com>
*/
#include "QGCApplication.h"
#include "AppSettings.h"
#include "SettingsManager.h"
#include "MAVLinkLogManager.h"
#include "QGCMapEngine.h"
#include "QGCApplication.h"
#include "PositionManager.h"
#include "CustomPlugin.h"
#include "CustomQuickInterface.h"
#include <QSettings>
static const char* kGroupName = "CustomSettings";
static const char* kShowGimbalCtl = "ShowGimbalCtl";
static const char* kShowAttitudeWidget = "ShowAttitudeWidget";
//-----------------------------------------------------------------------------
CustomQuickInterface::CustomQuickInterface(QObject* parent)
: QObject(parent)
{
qCDebug(CustomLog) << "CustomQuickInterface Created";
}
//-----------------------------------------------------------------------------
CustomQuickInterface::~CustomQuickInterface()
{
qCDebug(CustomLog) << "CustomQuickInterface Destroyed";
}
//-----------------------------------------------------------------------------
void
CustomQuickInterface::init()
{
QSettings settings;
settings.beginGroup(kGroupName);
_showGimbalControl = settings.value(kShowGimbalCtl, false).toBool();
_showAttitudeWidget = settings.value(kShowAttitudeWidget, false).toBool();
}
//-----------------------------------------------------------------------------
void
CustomQuickInterface::setShowGimbalControl(bool set)
{
if(_showGimbalControl != set) {
_showGimbalControl = set;
QSettings settings;
settings.beginGroup(kGroupName);
settings.setValue(kShowGimbalCtl,set);
emit showGimbalControlChanged();
}
}
//-----------------------------------------------------------------------------
void
CustomQuickInterface::setShowAttitudeWidget(bool set)
{
if(_showAttitudeWidget != set) {
_showAttitudeWidget = set;
QSettings settings;
settings.beginGroup(kGroupName);
settings.setValue(kShowAttitudeWidget,set);
emit showAttitudeWidgetChanged();
}
}
/****************************************************************************
*
* (c) 2009-2019 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.
*
* @file
* @brief Custom QtQuick Interface
* @author Gus Grubba <gus@auterion.com>
*/
#pragma once
#include "Vehicle.h"
#include <QObject>
#include <QTimer>
#include <QColor>
#include <QGeoPositionInfo>
#include <QGeoPositionInfoSource>
//-----------------------------------------------------------------------------
// QtQuick Interface (UI)
class CustomQuickInterface : public QObject
{
Q_OBJECT
public:
CustomQuickInterface(QObject* parent = nullptr);
~CustomQuickInterface();
Q_PROPERTY(bool showGimbalControl READ showGimbalControl WRITE setShowGimbalControl NOTIFY showGimbalControlChanged)
Q_PROPERTY(bool showAttitudeWidget READ showAttitudeWidget WRITE setShowAttitudeWidget NOTIFY showAttitudeWidgetChanged)
bool showGimbalControl () { return _showGimbalControl; }
void setShowGimbalControl (bool set);
void init ();
bool showAttitudeWidget () { return _showAttitudeWidget; }
void setShowAttitudeWidget (bool set);
signals:
void showGimbalControlChanged ();
void showAttitudeWidgetChanged();
private:
bool _showGimbalControl = true;
bool _showAttitudeWidget = false;
};
/****************************************************************************
*
* (c) 2009-2019 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.
*
****************************************************************************/
#include "CustomVideoManager.h"
#include "MultiVehicleManager.h"
#include "CustomCameraManager.h"
#include "CustomCameraControl.h"
//-----------------------------------------------------------------------------
CustomVideoManager::CustomVideoManager(QGCApplication* app, QGCToolbox* toolbox)
: VideoManager(app, toolbox)
{
}
//-----------------------------------------------------------------------------
void
CustomVideoManager::_updateSettings(unsigned id)
{
if(!_videoSettings || !_videoReceiver)
return;
VideoManager::_updateSettings(id);
}
/****************************************************************************
*
* (c) 2009-2019 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.
*
****************************************************************************/
#pragma once
#include <QObject>
#include <QTimer>
#include <QTime>
#include <QUrl>
#include "VideoManager.h"
class CustomVideoManager : public VideoManager
{
Q_OBJECT
public:
CustomVideoManager (QGCApplication* app, QGCToolbox* toolbox);
protected:
void _updateSettings (unsigned id);
};
/****************************************************************************
*
* (c) 2009-2019 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.
*
* @file
* @brief Camera Controller
* @author Gus Grubba <gus@auterion.com>
*
*/
#include "CustomCameraControl.h"
#include "QGCCameraIO.h"
QGC_LOGGING_CATEGORY(CustomCameraLog, "CustomCameraLog")
QGC_LOGGING_CATEGORY(CustomCameraVerboseLog, "CustomCameraVerboseLog")
static const char* kCAM_IRPALETTE = "CAM_IRPALETTE";
static const char* kCAM_NEXTVISION_IRPALETTE = "IR_SENS_POL";
//-----------------------------------------------------------------------------
CustomCameraControl::CustomCameraControl(const mavlink_camera_information_t *info, Vehicle* vehicle, int compID, QObject* parent)
: QGCCameraControl(info, vehicle, compID, parent)
{
}
//-----------------------------------------------------------------------------
bool
CustomCameraControl::takePhoto()
{
bool res = false;
res = QGCCameraControl::takePhoto();
return res;
}
//-----------------------------------------------------------------------------
bool
CustomCameraControl::stopTakePhoto()
{
bool res = QGCCameraControl::stopTakePhoto();
return res;
}
//-----------------------------------------------------------------------------
bool
CustomCameraControl::startVideo()
{
bool res = QGCCameraControl::startVideo();
return res;
}
//-----------------------------------------------------------------------------
bool
CustomCameraControl::stopVideo()
{
bool res = QGCCameraControl::stopVideo();
return res;
}
//-----------------------------------------------------------------------------
void
CustomCameraControl::setVideoMode()
{
if(cameraMode() != CAM_MODE_VIDEO) {
qCDebug(CustomCameraLog) << "setVideoMode()";
Fact* pFact = getFact(kCAM_MODE);
if(pFact) {
pFact->setRawValue(CAM_MODE_VIDEO);
_setCameraMode(CAM_MODE_VIDEO);
}
}
}
//-----------------------------------------------------------------------------
void
CustomCameraControl::setPhotoMode()
{
if(cameraMode() != CAM_MODE_PHOTO) {
qCDebug(CustomCameraLog) << "setPhotoMode()";
Fact* pFact = getFact(kCAM_MODE);
if(pFact) {
pFact->setRawValue(CAM_MODE_PHOTO);
_setCameraMode(CAM_MODE_PHOTO);
}
}
}
//-----------------------------------------------------------------------------
void
CustomCameraControl::_setVideoStatus(VideoStatus status)
{
QGCCameraControl::_setVideoStatus(status);
}
//-----------------------------------------------------------------------------
void
CustomCameraControl::handleCaptureStatus(const mavlink_camera_capture_status_t& cap)
{
QGCCameraControl::handleCaptureStatus(cap);
}
//-----------------------------------------------------------------------------
Fact*
CustomCameraControl::irPalette()
{
if(_paramComplete) {
if(_activeSettings.contains(kCAM_IRPALETTE)) {
return getFact(kCAM_IRPALETTE);
}
else if(_activeSettings.contains(kCAM_NEXTVISION_IRPALETTE)) {
return getFact(kCAM_NEXTVISION_IRPALETTE);
}
}
return nullptr;
}
//-----------------------------------------------------------------------------
void
CustomCameraControl::setThermalMode(ThermalViewMode mode)
{
if(_paramComplete) {
if(vendor() == "NextVision" && _activeSettings.contains("CAM_SENSOR")) {
if(mode == THERMAL_FULL) {
getFact("CAM_SENSOR")->setRawValue(1);
}
else if(mode == THERMAL_OFF) {
getFact("CAM_SENSOR")->setRawValue(0);
}
}
}
QGCCameraControl::setThermalMode(mode);
}
This diff is collapsed.
......@@ -584,7 +584,8 @@ bool QGCApplication::_initForNormalAppBoot()
QSettings settings;
_qmlAppEngine = toolbox()->corePlugin()->createRootWindow(this);
_qmlAppEngine = toolbox()->corePlugin()->createQmlApplicationEngine(this);
toolbox()->corePlugin()->createRootWindow(_qmlAppEngine);
// Image provider for PX4 Flow
QQuickImageProvider* pImgProvider = dynamic_cast<QQuickImageProvider*>(qgcApp()->toolbox()->imageProvider());
......
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment