Commit fe59583d authored by Gus Grubba's avatar Gus Grubba

UI/UX Rework

parent b4784c40
......@@ -23,6 +23,29 @@ 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 {
......@@ -60,6 +83,7 @@ Item {
spacing: ScreenTools.defaultFontPixelWidth * 2
visible: !indicatorRow.visible
Loader {
id: pairingLoader
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.margins: _indicatorMargins
......
......@@ -66,11 +66,11 @@
<file alias="CameraTrigger.svg">src/AutoPilotPlugins/PX4/Images/CameraTrigger.svg</file>
<file alias="check.svg">resources/check.svg</file>
<file alias="checkbox-check.svg">src/QmlControls/checkbox-check.svg</file>
<file alias="cOGPointer.svg">src/FlightMap/Images/cOGPointer.svg</file>
<file alias="CogWheel.svg">src/MissionManager/CogWheel.svg</file>
<file alias="compassDottedLine.svg">src/FlightMap/Images/compassDottedLine.svg</file>
<file alias="compassInstrumentArrow.svg">src/FlightMap/Images/compassInstrumentArrow.svg</file>
<file alias="compassInstrumentDial.svg">src/FlightMap/Images/compassInstrumentDial.svg</file>
<file alias="compassDottedLine.svg">src/FlightMap/Images/compassDottedLine.svg</file>
<file alias="cOGPointer.svg">src/FlightMap/Images/cOGPointer.svg</file>
<file alias="Connect.svg">src/ui/toolbar/Images/Connect.svg</file>
<file alias="crossHair.svg">src/FlightMap/Images/crossHair.svg</file>
<file alias="DatalinkLoss.svg">src/AutoPilotPlugins/PX4/Images/DatalinkLoss.svg</file>
......@@ -121,6 +121,10 @@
<file alias="no-logging-light.svg">src/AutoPilotPlugins/PX4/Images/no-logging-light.svg</file>
<file alias="no-logging.svg">src/AutoPilotPlugins/PX4/Images/no-logging.svg</file>
<file alias="ObjectAvoidance.svg">src/AutoPilotPlugins/PX4/Images/ObjectAvoidance.svg</file>
<file alias="PairingButton.svg">src/PairingManager/Images/PairingButton.svg</file>
<file alias="PairingConnected.svg">src/PairingManager/Images/PairingConnected.svg</file>
<file alias="PairingError.svg">src/PairingManager/Images/PairingError.svg</file>
<file alias="PairingIcon.svg">src/PairingManager/Images/PairingIcon.svg</file>
<file alias="PaperPlane.svg">src/ui/toolbar/Images/PaperPlane.svg</file>
<file alias="PiP.svg">src/FlightMap/Images/PiP.svg</file>
<file alias="pipHide.svg">src/FlightMap/Images/pipHide.svg</file>
......@@ -181,9 +185,5 @@
<file alias="Yield.svg">src/ui/toolbar/Images/Yield.svg</file>
<file alias="ZoomMinus.svg">src/FlightMap/Images/ZoomMinus.svg</file>
<file alias="ZoomPlus.svg">src/FlightMap/Images/ZoomPlus.svg</file>
<file alias="PairingIcon.svg">src/PairingManager/Images/PairingIcon.svg</file>
<file alias="PairingIconLight.svg">src/PairingManager/Images/PairingIconLight.svg</file>
</qresource>
</RCC>
<?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>
......@@ -3,21 +3,29 @@
<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:#07916D;}
.st1{fill:#FFFFFF;}
.st0{fill:#FFFFFF;}
.st1{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
</style>
<rect x="45" y="94.5" class="st0" width="128.1" height="136.1"/>
<path class="st1" d="M251.5,247H4.5c-1.3,0-2.3,0.5-3.2,1.3C0.5,249.3,0,250.7,0,252c1.3,20.2,18.4,36,38.7,36h178.7
c20.2,0,37.3-15.8,38.7-36c0-1.3-0.5-2.7-1.3-3.6C253.8,247.5,252.9,247,251.5,247L251.5,247z M137.7,272.3h-19.8
c-2.7,0-4.5-2.3-4.5-4.5c0-2.2,1.8-4.5,4.5-4.5h19.8c2.3,0,4.5,2.3,4.5,4.5C142.2,270,140.4,272.3,137.7,272.3z"/>
<path class="st1" d="M274.5,0h-74.7c-7.6,0-13.5,6.3-13.5,13.5v106.2l101.7,0V13.5C288,6.3,281.7,0,274.5,0L274.5,0z"/>
<path class="st1" d="M186.3,147.2c0,7.6,5.8,13.5,13.5,13.5l74.7,0c7.6,0,13.5-6.3,13.5-13.5v-18.4H186.3V147.2z M230.4,140h13.5
c2.7,0,4.5,1.8,4.5,4.5c0,2.7-1.8,4.5-4.5,4.5h-13.5c-2.7,0-4.5-1.8-4.5-4.5C225.9,141.7,227.7,140,230.4,140z"/>
<path class="st1" d="M18.9,238.1h218.2c2.7,0,4.5-2.3,4.5-4.5v-63.9h-41.8c-12.6,0-22.5-10.3-22.5-22.5V77.4l-149.9,0
c-7.2,0-13.1,5.8-13.1,13.1v143.1C14.4,236.3,16.2,238.1,18.9,238.1L18.9,238.1z M102.6,135.4l27-12.1l-8.6-3.2
c-2.3-0.9-3.6-3.6-2.7-5.8c0.9-2.3,3.6-3.6,5.8-2.7l18.4,6.8c0.9,0.5,2.3,1.3,2.7,2.3c0.5,0.9,0.5,2.3,0,3.6l-6.8,18.4
c-0.9,2.3-3.6,3.6-5.8,2.7c-2.2-0.9-3.6-3.6-2.7-5.8l3.2-8.6l-27,12.1c-2.3,0.9-5,0-5.8-2.3C99,139,100.4,136.4,102.6,135.4
L102.6,135.4z M81,190.8l6.8-18.4c0.9-2.3,3.6-3.6,5.8-2.7c2.3,0.9,3.6,3.6,2.7,5.8l-3.2,8.6l27-12.1c2.3-0.9,5,0,5.8,2.3
c0.9,2.3,0,5-2.2,5.8l-27,12.1l8.6,3.2c2.3,0.9,3.6,3.6,2.7,5.8c-0.9,2.3-3.6,3.6-5.8,2.7l-18.4-6.8c-0.9-0.5-2.3-1.3-2.7-2.3
C81.4,193.9,80.6,193.1,81,190.8L81,190.8z"/>
<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>
......@@ -70,7 +70,9 @@ PairingManager::_pairingCompleted(QString name)
{
_writeJson(_jsonDoc, _pairingCacheFile(name));
_remotePairingMap["NM"] = name;
_lastPaired = name;
emit pairedListChanged();
emit pairedVehicleChanged();
_app->informationMessageBoxOnMainThread("", tr("Paired with %1").arg(name));
setPairingStatus(PairingSuccess, tr("Pairing Successfull"));
}
......@@ -154,7 +156,7 @@ PairingManager::_uploadFinished(void)
} else {
if(++_pairRetryCount > 3) {
qCDebug(PairingManagerLog) << "Giving up";
setPairingStatus(PairingError, tr("Too Many Errors"));
setPairingStatus(PairingError, tr("No Response From Vehicle"));
_uploadManager->deleteLater();
_uploadManager = nullptr;
} else {
......@@ -190,6 +192,15 @@ PairingManager::connectToPairedDevice(QString name)
jsonReceived(json);
}
//-----------------------------------------------------------------------------
void
PairingManager::removePairedDevice(QString name)
{
QFile file(_pairingCacheFile(name));
file.remove();
emit pairedListChanged();
}
//-----------------------------------------------------------------------------
QStringList
PairingManager::pairedDeviceNameList(void)
......
......@@ -61,18 +61,23 @@ public:
Q_ENUM(PairingStatus)
QStringList pairingLinkTypeStrings(void);
QString pairingStatusStr(void) const;
QStringList pairedDeviceNameList(void);
PairingStatus pairingStatus() { return _status; }
int nfcIndex(void) { return _nfcIndex; }
int microhardIndex(void) { return _microhardIndex; }
void setStatusMessage(PairingStatus status, QString statusStr) { emit setPairingStatus(status, statusStr); }
void jsonReceived(QString json) { emit parsePairingJson(json); }
QStringList pairingLinkTypeStrings (void);
QString pairingStatusStr (void) const;
QStringList pairedDeviceNameList (void);
PairingStatus pairingStatus () { return _status; }
QString pairedVehicle () { return _lastPaired; }
int nfcIndex (void) { return _nfcIndex; }
int microhardIndex (void) { return _microhardIndex; }
bool firstBoot () { return _firstBoot; }
bool errorState () { return _status == PairingRejected || _status == PairingConnectionRejected || _status == PairingError; }
void setStatusMessage (PairingStatus status, QString statusStr) { emit setPairingStatus(status, statusStr); }
void jsonReceived (QString json) { emit parsePairingJson(json); }
void setFirstBoot (bool set) { _firstBoot = set; emit firstBootChanged(); }
#ifdef __android__
static void setNativeMethods(void);
static void setNativeMethods (void);
#endif
Q_INVOKABLE void connectToPairedDevice(QString name);
Q_INVOKABLE void connectToPairedDevice (QString name);
Q_INVOKABLE void removePairedDevice (QString name);
#if defined QGC_ENABLE_NFC || defined QGC_ENABLE_QTNFC
Q_INVOKABLE void startNFCScan();
......@@ -86,8 +91,11 @@ public:
Q_PROPERTY(PairingStatus pairingStatus READ pairingStatus NOTIFY pairingStatusChanged)
Q_PROPERTY(QStringList pairedDeviceNameList READ pairedDeviceNameList NOTIFY pairedListChanged)
Q_PROPERTY(QStringList pairingLinkTypeStrings READ pairingLinkTypeStrings CONSTANT)
Q_PROPERTY(QString pairedVehicle READ pairedVehicle NOTIFY pairedVehicleChanged)
Q_PROPERTY(bool errorState READ errorState NOTIFY pairingStatusChanged)
Q_PROPERTY(int nfcIndex READ nfcIndex CONSTANT)
Q_PROPERTY(int microhardIndex READ microhardIndex CONSTANT)
Q_PROPERTY(bool firstBoot READ firstBoot WRITE setFirstBoot NOTIFY firstBootChanged)
signals:
void startUpload(QString pairURL, QJsonDocument);
......@@ -98,6 +106,8 @@ signals:
void parsePairingJson(QString json);
void setPairingStatus(PairingStatus status, QString pairingStatus);
void pairedListChanged();
void pairedVehicleChanged();
void firstBootChanged();
private slots:
void _startUpload(QString pairURL, QJsonDocument);
......@@ -109,6 +119,7 @@ private slots:
private:
QString _statusString;
QString _jsonFileName;
QString _lastPaired;
QVariantMap _remotePairingMap;
int _nfcIndex = -1;
int _microhardIndex = -1;
......@@ -121,20 +132,21 @@ private:
QString _uploadURL{};
QString _uploadData{};
void _parsePairingJsonFile();
QJsonDocument _createZeroTierConnectJson(QString cert2);
QJsonDocument _createMicrohardConnectJson(QString cert2);
QJsonDocument _createZeroTierPairingJson(QString cert1);
QJsonDocument _createMicrohardPairingJson(QString pwd, QString cert1);
QString _assumeMicrohardPairingJson();
void _writeJson(QJsonDocument &jsonDoc, QString fileName);
QString _getLocalIPInNetwork(QString remoteIP, int num);
void _uploadFinished(void);
void _uploadError(QNetworkReply::NetworkError code);
void _pairingCompleted(QString name);
void _connectionCompleted(QString name);
QDir _pairingCacheDir();
QString _pairingCacheFile(QString uavName);
void _parsePairingJsonFile();
QJsonDocument _createZeroTierConnectJson(QString cert2);
QJsonDocument _createMicrohardConnectJson(QString cert2);
QJsonDocument _createZeroTierPairingJson(QString cert1);
QJsonDocument _createMicrohardPairingJson(QString pwd, QString cert1);
QString _assumeMicrohardPairingJson();
void _writeJson(QJsonDocument &jsonDoc, QString fileName);
QString _getLocalIPInNetwork(QString remoteIP, int num);
void _uploadFinished(void);
void _uploadError(QNetworkReply::NetworkError code);
void _pairingCompleted(QString name);
void _connectionCompleted(QString name);
QDir _pairingCacheDir();
QString _pairingCacheFile(QString uavName);
bool _firstBoot = true;
#if defined QGC_ENABLE_NFC || defined QGC_ENABLE_QTNFC
PairingNFC pairingNFC;
......
......@@ -484,14 +484,14 @@ Rectangle {
}
FactCheckBox {
text: qsTr("Show additional heading indicators on Compass")
visible: _showAdditionalIndicatorsCompass.visible
visible: _showAdditionalIndicatorsCompass ? _showAdditionalIndicatorsCompass.visible : false
fact: _showAdditionalIndicatorsCompass
property Fact _showAdditionalIndicatorsCompass: QGroundControl.settingsManager.flyViewSettings.showAdditionalIndicatorsCompass
}
FactCheckBox {
text: qsTr("Lock Compass Nose-Up")
visible: _lockNoseUpCompass.visible
visible: _lockNoseUpCompass ? _lockNoseUpCompass.visible : false
fact: _lockNoseUpCompass
property Fact _lockNoseUpCompass: QGroundControl.settingsManager.flyViewSettings.lockNoseUpCompass
......
......@@ -10,6 +10,7 @@
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
......@@ -26,24 +27,46 @@ Item {
anchors.bottom: parent.bottom
property bool _light: qgcPal.globalTheme === QGCPalette.Light && !activeVehicle
property real _contentWidth: ScreenTools.defaultFontPixelWidth * 40
property real _contentWidth: ScreenTools.defaultFontPixelWidth * 34
property real _contentSpacing: ScreenTools.defaultFontPixelHeight * 0.5
property real _rectWidth: _contentWidth
property real _rectHeight: _contentWidth * 0.75
property string kPairingManager: qsTr("Pairing Manager")
function runPairing() {
QGroundControl.pairingManager.firstBoot = false
if(QGroundControl.pairingManager.pairedDeviceNameList.length > 0) {
connectionPopup.open()
} else {
mhPopup.open()
}
}
Connections {
target: QGroundControl.pairingManager
//-- Connect automatically once paired
onPairingStatusChanged: {
if(QGroundControl.pairingManager.pairingStatus === PairingManager.PairingSuccess) {
if(QGroundControl.pairingManager.pairedVehicle !== "") {
QGroundControl.pairingManager.connectToPairedDevice(QGroundControl.pairingManager.pairedVehicle)
}
}
}
}
Row {
id: pairingRow
spacing: ScreenTools.defaultFontPixelWidth
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
Image {
QGCColoredImage {
id: pairingIcon
height: parent.height
width: height
source: _light ? "/qmlimages/PairingIconLight.svg" : "/qmlimages/PairingIcon.svg"
color: qgcPal.text
source: "/qmlimages/PairingIcon.svg"
sourceSize.width: width
fillMode: Image.PreserveAspectFit
smooth: true
......@@ -62,89 +85,7 @@ Item {
MouseArea {
anchors.fill: parent
onClicked: {
if(QGroundControl.pairingManager.pairedDeviceNameList.length > 1) {
connectionPopup.open()
} else {
if(QGroundControl.pairingManager.pairingLinkTypeStrings.length > 1)
pairingPopup.open()
else {
mhPopup.open()
}
}
}
}
//-------------------------------------------------------------------------
//-- Pairing
Popup {
id: pairingPopup
width: pairingBody.width
height: pairingBody.height
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
background: Rectangle {
anchors.fill: parent
color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75)
radius: ScreenTools.defaultFontPixelWidth * 0.25
}
Item {
id: pairingBody
width: comboListCol.width + (ScreenTools.defaultFontPixelWidth * 8)
height: comboListCol.height + (ScreenTools.defaultFontPixelHeight * 2)
anchors.centerIn: parent
Column {
id: comboListCol
spacing: _contentSpacing
anchors.centerIn: parent
Item { width: 1; height: 1; }
QGCLabel {
text: kPairingManager
font.family: ScreenTools.demiboldFontFamily
anchors.horizontalCenter: parent.horizontalCenter
}
Item { width: 1; height: 1; }
Rectangle {
width: _rectWidth
height: _rectHeight
color: Qt.rgba(0,0,0,0)
border.color: qgcPal.text
border.width: 1
anchors.horizontalCenter: parent.horizontalCenter
QGCLabel {
text: "Pair Graphic"
anchors.centerIn: parent
}
}
Item { width: 1; height: 1; }
QGCLabel {
text: qsTr("Please choose a pairing method in order to connect to a nearby device")
width: _contentWidth
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
anchors.horizontalCenter: parent.horizontalCenter
}
Item { width: 1; height: 1; }
Repeater {
model: QGroundControl.pairingManager ? QGroundControl.pairingManager.pairingLinkTypeStrings : []
delegate: QGCButton {
text: modelData
width: _contentWidth
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
pairingPopup.close()
if (index === QGroundControl.pairingManager.nfcIndex) {
nfcPopup.open()
} else if (index === QGroundControl.pairingManager.microhardIndex) {
mhPopup.open()
}
}
}
}
Item { width: 1; height: 1; }
}
runPairing()
}
}
//-------------------------------------------------------------------------
......@@ -177,37 +118,42 @@ Item {
QGCLabel {
text: kPairingManager
font.family: ScreenTools.demiboldFontFamily
font.pointSize: ScreenTools.mediumFontPointSize
anchors.horizontalCenter: parent.horizontalCenter
}
Rectangle {
width: _contentWidth
height: 1
color: qgcPal.globalTheme !== QGCPalette.Light ? Qt.rgba(1,1,1,0.25) : Qt.rgba(0,0,0,0.25)
}
Item { width: 1; height: 1; }
QGCLabel {
text: qsTr("To connect to your vehicle, please click 3 times on the button in order to put the vehicle in a discovery mode")
text: qsTr("To connect to your vehicle, please click on the pairing button in order to put the vehicle in discovery mode")
width: _contentWidth
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
anchors.horizontalCenter: parent.horizontalCenter
}
Item { width: 1; height: 1; }
Rectangle {
width: _rectWidth
height: _rectHeight
color: Qt.rgba(0,0,0,0)
border.color: qgcPal.text
border.width: 1
Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 2; }
QGCColoredImage {
height: ScreenTools.defaultFontPixelHeight * 6
width: height
source: "/qmlimages/PairingButton.svg"
sourceSize.height: height
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
color: qgcPal.text
anchors.horizontalCenter: parent.horizontalCenter
QGCLabel {
text: "Button Positioning Graphic"
anchors.centerIn: parent
}
}
Item { width: 1; height: 1; }
Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 2; }
QGCButton {
text: qsTr("Pair Via Microhard")
text: qsTr("Pair a Vehicle")
width: _contentWidth
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
mhPopup.close()
connectionPopup.open()
progressPopup.open()
QGroundControl.pairingManager.startMicrohardPairing();
}
}
......@@ -245,8 +191,14 @@ Item {
QGCLabel {
text: kPairingManager
font.family: ScreenTools.demiboldFontFamily
font.pointSize: ScreenTools.mediumFontPointSize
anchors.horizontalCenter: parent.horizontalCenter
}
Rectangle {
width: _contentWidth
height: 1
color: qgcPal.globalTheme !== QGCPalette.Light ? Qt.rgba(1,1,1,0.25) : Qt.rgba(0,0,0,0.25)
}
Item { width: 1; height: 1; }
Rectangle {
width: _rectWidth
......@@ -275,7 +227,7 @@ Item {
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
nfcPopup.close()
connectionPopup.open()
progressPopup.open()
QGroundControl.pairingManager.startNFCScan();
}
}
......@@ -284,11 +236,11 @@ Item {
}
}
//-------------------------------------------------------------------------
//-- Connection Manager
//-- Pairing/Connection Progress
Popup {
id: connectionPopup
width: connectionBody.width
height: connectionBody.height
id: progressPopup
width: progressBody.width
height: progressBody.height
modal: true
focus: true
parent: Overlay.overlay
......@@ -301,22 +253,24 @@ Item {
radius: ScreenTools.defaultFontPixelWidth * 0.25
}
Item {
id: connectionBody
width: connectionCol.width + (ScreenTools.defaultFontPixelWidth * 8)
height: connectionCol.height + (ScreenTools.defaultFontPixelHeight * 2)
id: progressBody
width: progressCol.width + (ScreenTools.defaultFontPixelWidth * 8)
height: progressCol.height + (ScreenTools.defaultFontPixelHeight * 2)
anchors.centerIn: parent
Column {
id: connectionCol
id: progressCol
spacing: _contentSpacing
anchors.centerIn: parent
Item { width: 1; height: 1; }
QGCLabel {
text: kPairingManager
font.family: ScreenTools.demiboldFontFamily
font.pointSize: ScreenTools.mediumFontPointSize
anchors.horizontalCenter: parent.horizontalCenter
}
QGCLabel {
text: QGroundControl.pairingManager ? QGroundControl.pairingManager.pairingStatusStr : ""
visible: !connectedIndicator.visible
anchors.horizontalCenter: parent.horizontalCenter
}
Rectangle {
......@@ -325,9 +279,11 @@ Item {
color: qgcPal.globalTheme !== QGCPalette.Light ? Qt.rgba(1,1,1,0.25) : Qt.rgba(0,0,0,0.25)
}
Item { width: 1; height: 1; }
//-- Pairing/Connecting
Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 3; visible: busyIndicator.visible; }
QGCColoredImage {
id: busyIndicator
height: ScreenTools.defaultFontPixelHeight * 2
height: ScreenTools.defaultFontPixelHeight * 4
width: height
source: "/qmlimages/MapSync.svg"
sourceSize.height: height
......@@ -335,7 +291,7 @@ Item {
mipmap: true
smooth: true
color: qgcPal.text
visible: cancelButton.visible
visible: QGroundControl.pairingManager.pairingStatus === PairingManager.PairingActive || QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnecting
anchors.horizontalCenter: parent.horizontalCenter
RotationAnimation on rotation {
loops: Animation.Infinite
......@@ -345,6 +301,132 @@ Item {
running: busyIndicator.visible
}
}
Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 3; visible: busyIndicator.visible; }
//-- Error State
Image {
height: ScreenTools.defaultFontPixelHeight * 4
width: height
source: "/qmlimages/PairingError.svg"
sourceSize.height: height
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
visible: QGroundControl.pairingManager.errorState
anchors.horizontalCenter: parent.horizontalCenter
}
//-- Connection Successful
Image {
id: connectedIndicator
height: width * 0.2
width: _contentWidth
source: "/qmlimages/PairingConnected.svg"
sourceSize.height: height
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
visible: QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnected
anchors.horizontalCenter: parent.horizontalCenter
}
Item { width: 1; height: _contentSpacing; visible: connectedIndicator.visible; }
QGCLabel {
text: QGroundControl.pairingManager.pairedVehicle
visible: connectedIndicator.visible
anchors.horizontalCenter: parent.horizontalCenter
}
QGCLabel {
text: qsTr("Connection Successful")
visible: connectedIndicator.visible
anchors.horizontalCenter: parent.horizontalCenter
}
Item { width: 1; height: _contentSpacing; }
//-- Buttons
QGCButton {
width: _contentWidth
visible: QGroundControl.pairingManager ? (QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnected) : false
text: qsTr("Done")
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
progressPopup.close()
}
}
QGCButton {
text: qsTr("Pair Another")
width: _contentWidth
visible: QGroundControl.pairingManager ? (QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnected) : false
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
progressPopup.close()
mhPopup.open()
}
}
QGCButton {
text: qsTr("Try Again")