diff --git a/CMakeLists.txt b/CMakeLists.txt index ed3bc7fbdfc157b51228f96f76c40a8b76e745ea..bd0bb09f1afb7aa14bb1c49ed6071c4cfc0409ef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,8 +63,8 @@ execute_process( ) add_definitions( - -DQGC_APPLICATION_NAME="QGroundControl" - -DQGC_ORG_NAME="QGroundControl.org" + -DQGC_APPLICATION_NAME="QGCWima" + -DQGC_ORG_NAME="QGCWima.org" -DQGC_ORG_DOMAIN="org.qgroundcontrol" ) diff --git a/HackFileDialog.qrc b/HackFileDialog.qrc index a7436f2702a0771ab125b90438e11cae8c0883d2..49898d599a8bb9af9c26dceed2e0c791722470f0 100644 --- a/HackFileDialog.qrc +++ b/HackFileDialog.qrc @@ -2,4 +2,5 @@ src/QmlControls/HackFileDialog.qml + diff --git a/Paths/KlingenbachTest.wima b/Paths/KlingenbachTest.wima index 98a1e5e7e5ee0791b8473de2d386e332562187b4..5db0c77e552bc5a2767eaae1eaafe61647a23c1f 100644 --- a/Paths/KlingenbachTest.wima +++ b/Paths/KlingenbachTest.wima @@ -4,18 +4,18 @@ "AreaType": "Service Area", "BorderPolygonOffset": 6, "DepotAltitude": 0, - "DepotLatitude": 47.76798743982897, - "DepotLongitude": 16.529971617189517, + "DepotLatitude": 47.76779586216649, + "DepotLongitude": 16.530510396830728, "ShowBorderPolygon": 0, "maxAltitude": 30, "polygon": [ [ - 47.767969216951194, - 16.52966542475528 + 47.76780094967389, + 16.530343715825353 ], [ - 47.768300890394606, - 16.530430381687438 + 47.76788238112663, + 16.530625096151965 ], [ 47.767783696604035, @@ -59,10 +59,6 @@ 47.7677855557718, 16.530403347547246 ], - [ - 47.76800516387784, - 16.530513932174728 - ], [ 47.76799814678123, 16.530388491662848 @@ -95,19 +91,19 @@ 0, 0, null, - 47.76794255683365, - 16.53029214577345, + 47.76779586216649, + 16.530510396830728, 5 ], "type": "SimpleItem" }, { - "DeltaAlpha": 3, - "DeltaR": 10, + "Alpha": 23, + "MinLength": 5, "ReferencePointAlt": 0, - "ReferencePointLat": 47.77087170283815, - "ReferencePointLong": 16.53120355954269, - "TransectMinLength": 1, + "ReferencePointLat": 47.76807182520187, + "ReferencePointLong": 16.530610531894183, + "TransectDistance": 2, "TransectStyleComplexItem": { "CameraCalc": { "AdjustedFootprintFrontal": 25, @@ -132,8 +128,8 @@ 0, 0, null, - 47.76786965695791, - 16.5304471058032, + 47.76780546458091, + 16.530404628981014, 15 ], "type": "SimpleItem" @@ -148,8 +144,8 @@ 0, 0, null, - 47.767852121581285, - 16.530624995372722, + 47.7680176218918, + 16.531145995840845, 15 ], "type": "SimpleItem" @@ -164,8 +160,8 @@ 0, 0, null, - 47.768280070477275, - 16.531012421511814, + 47.76803465648041, + 16.53113723392403, 15 ], "type": "SimpleItem" @@ -180,8 +176,8 @@ 0, 0, null, - 47.76828174772784, - 16.53094964311624, + 47.76782462170033, + 16.530403289516762, 15 ], "type": "SimpleItem" @@ -196,8 +192,8 @@ 0, 0, null, - 47.768293889869426, - 16.530755276539708, + 47.767843780618456, + 16.530401950051516, 15 ], "type": "SimpleItem" @@ -212,8 +208,8 @@ 0, 0, null, - 47.7682219391165, - 16.530560469333935, + 47.76805169016891, + 16.53112847333554, 15 ], "type": "SimpleItem" @@ -228,8 +224,8 @@ 0, 0, null, - 47.76820508527868, - 16.5307314416142, + 47.768068723856686, + 16.531119712741326, 15 ], "type": "SimpleItem" @@ -244,8 +240,8 @@ 0, 0, null, - 47.76819200424394, - 16.53094084541531, + 47.767862938637116, + 16.53040061191935, 15 ], "type": "SimpleItem" @@ -260,8 +256,8 @@ 0, 0, null, - 47.76818883948184, - 16.531059344799864, + 47.76788209665569, + 16.53039927245214, 15 ], "type": "SimpleItem" @@ -276,8 +272,8 @@ 0, 0, null, - 47.76809760666698, - 16.53110626925785, + 47.76808575754375, + 16.53111095080734, 15 ], "type": "SimpleItem" @@ -292,8 +288,8 @@ 0, 0, null, - 47.76810225985858, - 16.5309320464106, + 47.76810279212948, + 16.53110218886764, 15 ], "type": "SimpleItem" @@ -308,8 +304,8 @@ 0, 0, null, - 47.76811577885341, - 16.530715631144773, + 47.76790125467419, + 16.530397934318007, 15 ], "type": "SimpleItem" @@ -324,8 +320,8 @@ 0, 0, null, - 47.768136979184064, - 16.530500573736578, + 47.767920412692604, + 16.530396594848835, 15 ], "type": "SimpleItem" @@ -340,8 +336,8 @@ 0, 0, null, - 47.7681521944103, - 16.530388084190108, + 47.76811982671451, + 16.531093428256273, 15 ], "type": "SimpleItem" @@ -356,8 +352,8 @@ 0, 0, null, - 47.76807542298544, - 16.53027770936353, + 47.768136860399416, + 16.53108466630512, 15 ], "type": "SimpleItem" @@ -372,8 +368,8 @@ 0, 0, null, - 47.76804836071953, - 16.53047779455375, + 47.76793957161033, + 16.530395256712723, 15 ], "type": "SimpleItem" @@ -388,8 +384,8 @@ 0, 0, null, - 47.76802647332397, - 16.530699820729467, + 47.767958730527994, + 16.53039391724158, 15 ], "type": "SimpleItem" @@ -404,8 +400,8 @@ 0, 0, null, - 47.768012516370526, - 16.530923248770208, + 47.768153894983, + 16.53107590568231, 15 ], "type": "SimpleItem" @@ -420,8 +416,8 @@ 0, 0, null, - 47.76800654291486, - 16.531146891465884, + 47.76817092866645, + 16.531067145053775, 15 ], "type": "SimpleItem" @@ -436,8 +432,8 @@ 0, 0, null, - 47.76792538641036, - 16.530872608510265, + 47.76797788764677, + 16.530392579103516, 15 ], "type": "SimpleItem" @@ -452,8 +448,8 @@ 0, 0, null, - 47.76793716779096, - 16.530684010368297, + 47.767997046564254, + 16.530391239630404, 15 ], "type": "SimpleItem" @@ -468,8 +464,328 @@ 0, 0, null, - 47.767956224940995, - 16.530490697489185, + 47.7681879623492, + 16.53105838308546, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 24, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76820499693062, + 16.531049622445487, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 25, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768011359505685, + 16.530372972324884, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 26, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76802514809256, + 16.530352870682762, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 27, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76822203061193, + 16.531040860465723, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 28, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7682390651919, + 16.53103209981431, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 29, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768038937575305, + 16.530332769030014, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 30, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76805272615508, + 16.53031266736664, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 31, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768256098871774, + 16.531023337823104, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 32, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768273133450315, + 16.531014577160242, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 33, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768066514731295, + 16.53029256569264, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 34, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76808030330396, + 16.530272464008018, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 35, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76829016802814, + 16.531005815157602, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 36, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76830720170584, + 16.530997054483304, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 37, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76809409187308, + 16.530252363646827, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 38, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76815568462939, + 16.530399306029828, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 39, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768324235382835, + 16.53098829246921, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 40, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76831125036794, + 16.530806343268754, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 41, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76835830363405, + 16.530970769757932, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 42, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7683412699585, + 16.53097953178347, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 43, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768222452326334, + 16.530564330637993, 15 ], "type": "SimpleItem" @@ -479,96 +795,177 @@ "TurnAroundDistance": 10, "VisualTransectPoints": [ [ - 47.76786965695791, - 16.5304471058032 + 47.76780546458091, + 16.530404628981014 + ], + [ + 47.7680176218918, + 16.531145995840845 + ], + [ + 47.76803465648041, + 16.53113723392403 ], [ - 47.767852121581285, - 16.530624995372722 + 47.76782462170033, + 16.530403289516762 ], [ - 47.768280070477275, - 16.531012421511814 + 47.767843780618456, + 16.530401950051516 ], [ - 47.76828174772784, - 16.53094964311624 + 47.76805169016891, + 16.53112847333554 ], [ - 47.768293889869426, - 16.530755276539708 + 47.768068723856686, + 16.531119712741326 ], [ - 47.7682219391165, - 16.530560469333935 + 47.767862938637116, + 16.53040061191935 ], [ - 47.76820508527868, - 16.5307314416142 + 47.76788209665569, + 16.53039927245214 ], [ - 47.76819200424394, - 16.53094084541531 + 47.76808575754375, + 16.53111095080734 ], [ - 47.76818883948184, - 16.531059344799864 + 47.76810279212948, + 16.53110218886764 ], [ - 47.76809760666698, - 16.53110626925785 + 47.76790125467419, + 16.530397934318007 ], [ - 47.76810225985858, - 16.5309320464106 + 47.767920412692604, + 16.530396594848835 ], [ - 47.76811577885341, - 16.530715631144773 + 47.76811982671451, + 16.531093428256273 ], [ - 47.768136979184064, - 16.530500573736578 + 47.768136860399416, + 16.53108466630512 ], [ - 47.7681521944103, - 16.530388084190108 + 47.76793957161033, + 16.530395256712723 ], [ - 47.76807542298544, - 16.53027770936353 + 47.767958730527994, + 16.53039391724158 ], [ - 47.76804836071953, - 16.53047779455375 + 47.768153894983, + 16.53107590568231 ], [ - 47.76802647332397, - 16.530699820729467 + 47.76817092866645, + 16.531067145053775 ], [ - 47.768012516370526, - 16.530923248770208 + 47.76797788764677, + 16.530392579103516 ], [ - 47.76800654291486, - 16.531146891465884 + 47.767997046564254, + 16.530391239630404 ], [ - 47.76792538641036, - 16.530872608510265 + 47.7681879623492, + 16.53105838308546 ], [ - 47.76793716779096, - 16.530684010368297 + 47.76820499693062, + 16.531049622445487 ], [ - 47.767956224940995, - 16.530490697489185 + 47.768011359505685, + 16.530372972324884 + ], + [ + 47.76802514809256, + 16.530352870682762 + ], + [ + 47.76822203061193, + 16.531040860465723 + ], + [ + 47.7682390651919, + 16.53103209981431 + ], + [ + 47.768038937575305, + 16.530332769030014 + ], + [ + 47.76805272615508, + 16.53031266736664 + ], + [ + 47.768256098871774, + 16.531023337823104 + ], + [ + 47.768273133450315, + 16.531014577160242 + ], + [ + 47.768066514731295, + 16.53029256569264 + ], + [ + 47.76808030330396, + 16.530272464008018 + ], + [ + 47.76829016802814, + 16.531005815157602 + ], + [ + 47.76830720170584, + 16.530997054483304 + ], + [ + 47.76809409187308, + 16.530252363646827 + ], + [ + 47.76815568462939, + 16.530399306029828 + ], + [ + 47.768324235382835, + 16.53098829246921 + ], + [ + 47.76831125036794, + 16.530806343268754 + ], + [ + 47.76835830363405, + 16.530970769757932 + ], + [ + 47.7683412699585, + 16.53097953178347 + ], + [ + 47.768222452326334, + 16.530564330637993 ] ], "version": 1 }, + "Type": 1, "complexItemType": "CircularSurvey", "polygon": [ [ @@ -592,11 +989,7 @@ 16.530403347547246 ], [ - 47.76800516387783, - 16.530513932174728 - ], - [ - 47.767998146781224, + 47.76799814678123, 16.530388491662848 ] ], @@ -609,23 +1002,23 @@ "AltitudeMode": 1, "autoContinue": true, "command": 21, - "doJumpId": 27, + "doJumpId": 47, "frame": 3, "params": [ 0, 0, 0, null, - 47.76794255683365, - 16.53029214577345, + 47.76779586216649, + 16.530510396830728, 0 ], "type": "SimpleItem" } ], "plannedHomePosition": [ - 47.76794255683365, - 16.53029214577345, + 47.76779586216649, + 16.530510396830728, 178 ], "vehicleType": 2, diff --git a/Paths/temp5.plan b/Paths/temp5.plan new file mode 100644 index 0000000000000000000000000000000000000000..03e1feb5f744cc88c850bc470c377f30368fb2d2 --- /dev/null +++ b/Paths/temp5.plan @@ -0,0 +1,568 @@ +{ + "fileType": "Plan", + "geoFence": { + "circles": [ + ], + "polygons": [ + ], + "version": 2 + }, + "groundStation": "QGroundControl", + "mission": { + "cruiseSpeed": 15, + "firmwareType": 3, + "hoverSpeed": 1, + "items": [ + { + "autoContinue": true, + "command": 22, + "doJumpId": 1, + "frame": 3, + "params": [ + 15, + 0, + 0, + null, + 47.76794255683365, + 16.53029214577345, + 5 + ], + "type": "SimpleItem" + }, + { + "DeltaAlpha": 3, + "DeltaR": 10, + "ReferencePointAlt": 0, + "ReferencePointLat": 47.77087170283815, + "ReferencePointLong": 16.53120355954269, + "TransectMinLength": 1, + "TransectStyleComplexItem": { + "CameraCalc": { + "AdjustedFootprintFrontal": 25, + "AdjustedFootprintSide": 25, + "CameraName": "Manual (no camera specs)", + "DistanceToSurface": 15, + "DistanceToSurfaceRelative": true, + "version": 1 + }, + "CameraShots": 0, + "CameraTriggerInTurnAround": true, + "FollowTerrain": false, + "HoverAndCapture": false, + "Items": [ + { + "autoContinue": true, + "command": 16, + "doJumpId": 2, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76786965695791, + 16.5304471058032, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 3, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767852121581285, + 16.530624995372722, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 4, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768280070477275, + 16.531012421511814, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 5, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76828174772784, + 16.53094964311624, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 6, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768293889869426, + 16.530755276539708, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 7, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7682219391165, + 16.530560469333935, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 8, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76820508527868, + 16.5307314416142, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 9, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76819200424394, + 16.53094084541531, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 10, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76818883948184, + 16.531059344799864, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 11, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76809760666698, + 16.53110626925785, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 12, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76810225985858, + 16.5309320464106, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 13, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76811577885341, + 16.530715631144773, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 14, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768136979184064, + 16.530500573736578, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 15, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7681521944103, + 16.530388084190108, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 16, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76807542298544, + 16.53027770936353, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 17, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76804836071953, + 16.53047779455375, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 18, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76802647332397, + 16.530699820729467, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 19, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768012516370526, + 16.530923248770208, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 20, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76800654291486, + 16.531146891465884, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 21, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76792538641036, + 16.530872608510265, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 22, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76793716779096, + 16.530684010368297, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 23, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767956224940995, + 16.530490697489185, + 15 + ], + "type": "SimpleItem" + } + ], + "Refly90Degrees": false, + "TurnAroundDistance": 10, + "VisualTransectPoints": [ + [ + 47.76786965695791, + 16.5304471058032 + ], + [ + 47.767852121581285, + 16.530624995372722 + ], + [ + 47.768280070477275, + 16.531012421511814 + ], + [ + 47.76828174772784, + 16.53094964311624 + ], + [ + 47.768293889869426, + 16.530755276539708 + ], + [ + 47.7682219391165, + 16.530560469333935 + ], + [ + 47.76820508527868, + 16.5307314416142 + ], + [ + 47.76819200424394, + 16.53094084541531 + ], + [ + 47.76818883948184, + 16.531059344799864 + ], + [ + 47.76809760666698, + 16.53110626925785 + ], + [ + 47.76810225985858, + 16.5309320464106 + ], + [ + 47.76811577885341, + 16.530715631144773 + ], + [ + 47.768136979184064, + 16.530500573736578 + ], + [ + 47.7681521944103, + 16.530388084190108 + ], + [ + 47.76807542298544, + 16.53027770936353 + ], + [ + 47.76804836071953, + 16.53047779455375 + ], + [ + 47.76802647332397, + 16.530699820729467 + ], + [ + 47.768012516370526, + 16.530923248770208 + ], + [ + 47.76800654291486, + 16.531146891465884 + ], + [ + 47.76792538641036, + 16.530872608510265 + ], + [ + 47.76793716779096, + 16.530684010368297 + ], + [ + 47.767956224940995, + 16.530490697489185 + ] + ], + "version": 1 + }, + "complexItemType": "CircularSurvey", + "polygon": [ + [ + 47.76809580679245, + 16.530246122817612 + ], + [ + 47.76823933601322, + 16.53060087654427 + ], + [ + 47.7683711160486, + 16.530967006195464 + ], + [ + 47.7680076482754, + 16.531153949077463 + ], + [ + 47.7677855557718, + 16.530403347547246 + ], + [ + 47.76800516387783, + 16.530513932174728 + ], + [ + 47.767998146781224, + 16.530388491662848 + ] + ], + "type": "ComplexItem", + "version": 1 + }, + { + "AMSLAltAboveTerrain": null, + "Altitude": 0, + "AltitudeMode": 1, + "autoContinue": true, + "command": 21, + "doJumpId": 27, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76794255683365, + 16.53029214577345, + 0 + ], + "type": "SimpleItem" + } + ], + "plannedHomePosition": [ + 47.76794255683365, + 16.53029214577345, + 178 + ], + "vehicleType": 2, + "version": 2 + }, + "rallyPoints": { + "points": [ + ], + "version": 2 + }, + "version": 1 +} diff --git a/Paths/temp6.plan b/Paths/temp6.plan new file mode 100644 index 0000000000000000000000000000000000000000..03e1feb5f744cc88c850bc470c377f30368fb2d2 --- /dev/null +++ b/Paths/temp6.plan @@ -0,0 +1,568 @@ +{ + "fileType": "Plan", + "geoFence": { + "circles": [ + ], + "polygons": [ + ], + "version": 2 + }, + "groundStation": "QGroundControl", + "mission": { + "cruiseSpeed": 15, + "firmwareType": 3, + "hoverSpeed": 1, + "items": [ + { + "autoContinue": true, + "command": 22, + "doJumpId": 1, + "frame": 3, + "params": [ + 15, + 0, + 0, + null, + 47.76794255683365, + 16.53029214577345, + 5 + ], + "type": "SimpleItem" + }, + { + "DeltaAlpha": 3, + "DeltaR": 10, + "ReferencePointAlt": 0, + "ReferencePointLat": 47.77087170283815, + "ReferencePointLong": 16.53120355954269, + "TransectMinLength": 1, + "TransectStyleComplexItem": { + "CameraCalc": { + "AdjustedFootprintFrontal": 25, + "AdjustedFootprintSide": 25, + "CameraName": "Manual (no camera specs)", + "DistanceToSurface": 15, + "DistanceToSurfaceRelative": true, + "version": 1 + }, + "CameraShots": 0, + "CameraTriggerInTurnAround": true, + "FollowTerrain": false, + "HoverAndCapture": false, + "Items": [ + { + "autoContinue": true, + "command": 16, + "doJumpId": 2, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76786965695791, + 16.5304471058032, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 3, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767852121581285, + 16.530624995372722, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 4, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768280070477275, + 16.531012421511814, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 5, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76828174772784, + 16.53094964311624, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 6, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768293889869426, + 16.530755276539708, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 7, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7682219391165, + 16.530560469333935, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 8, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76820508527868, + 16.5307314416142, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 9, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76819200424394, + 16.53094084541531, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 10, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76818883948184, + 16.531059344799864, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 11, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76809760666698, + 16.53110626925785, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 12, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76810225985858, + 16.5309320464106, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 13, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76811577885341, + 16.530715631144773, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 14, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768136979184064, + 16.530500573736578, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 15, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7681521944103, + 16.530388084190108, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 16, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76807542298544, + 16.53027770936353, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 17, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76804836071953, + 16.53047779455375, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 18, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76802647332397, + 16.530699820729467, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 19, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768012516370526, + 16.530923248770208, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 20, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76800654291486, + 16.531146891465884, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 21, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76792538641036, + 16.530872608510265, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 22, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76793716779096, + 16.530684010368297, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 23, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767956224940995, + 16.530490697489185, + 15 + ], + "type": "SimpleItem" + } + ], + "Refly90Degrees": false, + "TurnAroundDistance": 10, + "VisualTransectPoints": [ + [ + 47.76786965695791, + 16.5304471058032 + ], + [ + 47.767852121581285, + 16.530624995372722 + ], + [ + 47.768280070477275, + 16.531012421511814 + ], + [ + 47.76828174772784, + 16.53094964311624 + ], + [ + 47.768293889869426, + 16.530755276539708 + ], + [ + 47.7682219391165, + 16.530560469333935 + ], + [ + 47.76820508527868, + 16.5307314416142 + ], + [ + 47.76819200424394, + 16.53094084541531 + ], + [ + 47.76818883948184, + 16.531059344799864 + ], + [ + 47.76809760666698, + 16.53110626925785 + ], + [ + 47.76810225985858, + 16.5309320464106 + ], + [ + 47.76811577885341, + 16.530715631144773 + ], + [ + 47.768136979184064, + 16.530500573736578 + ], + [ + 47.7681521944103, + 16.530388084190108 + ], + [ + 47.76807542298544, + 16.53027770936353 + ], + [ + 47.76804836071953, + 16.53047779455375 + ], + [ + 47.76802647332397, + 16.530699820729467 + ], + [ + 47.768012516370526, + 16.530923248770208 + ], + [ + 47.76800654291486, + 16.531146891465884 + ], + [ + 47.76792538641036, + 16.530872608510265 + ], + [ + 47.76793716779096, + 16.530684010368297 + ], + [ + 47.767956224940995, + 16.530490697489185 + ] + ], + "version": 1 + }, + "complexItemType": "CircularSurvey", + "polygon": [ + [ + 47.76809580679245, + 16.530246122817612 + ], + [ + 47.76823933601322, + 16.53060087654427 + ], + [ + 47.7683711160486, + 16.530967006195464 + ], + [ + 47.7680076482754, + 16.531153949077463 + ], + [ + 47.7677855557718, + 16.530403347547246 + ], + [ + 47.76800516387783, + 16.530513932174728 + ], + [ + 47.767998146781224, + 16.530388491662848 + ] + ], + "type": "ComplexItem", + "version": 1 + }, + { + "AMSLAltAboveTerrain": null, + "Altitude": 0, + "AltitudeMode": 1, + "autoContinue": true, + "command": 21, + "doJumpId": 27, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76794255683365, + 16.53029214577345, + 0 + ], + "type": "SimpleItem" + } + ], + "plannedHomePosition": [ + 47.76794255683365, + 16.53029214577345, + 178 + ], + "vehicleType": 2, + "version": 2 + }, + "rallyPoints": { + "points": [ + ], + "version": 2 + }, + "version": 1 +} diff --git a/Paths/temp7.plan b/Paths/temp7.plan new file mode 100644 index 0000000000000000000000000000000000000000..03e1feb5f744cc88c850bc470c377f30368fb2d2 --- /dev/null +++ b/Paths/temp7.plan @@ -0,0 +1,568 @@ +{ + "fileType": "Plan", + "geoFence": { + "circles": [ + ], + "polygons": [ + ], + "version": 2 + }, + "groundStation": "QGroundControl", + "mission": { + "cruiseSpeed": 15, + "firmwareType": 3, + "hoverSpeed": 1, + "items": [ + { + "autoContinue": true, + "command": 22, + "doJumpId": 1, + "frame": 3, + "params": [ + 15, + 0, + 0, + null, + 47.76794255683365, + 16.53029214577345, + 5 + ], + "type": "SimpleItem" + }, + { + "DeltaAlpha": 3, + "DeltaR": 10, + "ReferencePointAlt": 0, + "ReferencePointLat": 47.77087170283815, + "ReferencePointLong": 16.53120355954269, + "TransectMinLength": 1, + "TransectStyleComplexItem": { + "CameraCalc": { + "AdjustedFootprintFrontal": 25, + "AdjustedFootprintSide": 25, + "CameraName": "Manual (no camera specs)", + "DistanceToSurface": 15, + "DistanceToSurfaceRelative": true, + "version": 1 + }, + "CameraShots": 0, + "CameraTriggerInTurnAround": true, + "FollowTerrain": false, + "HoverAndCapture": false, + "Items": [ + { + "autoContinue": true, + "command": 16, + "doJumpId": 2, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76786965695791, + 16.5304471058032, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 3, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767852121581285, + 16.530624995372722, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 4, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768280070477275, + 16.531012421511814, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 5, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76828174772784, + 16.53094964311624, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 6, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768293889869426, + 16.530755276539708, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 7, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7682219391165, + 16.530560469333935, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 8, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76820508527868, + 16.5307314416142, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 9, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76819200424394, + 16.53094084541531, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 10, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76818883948184, + 16.531059344799864, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 11, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76809760666698, + 16.53110626925785, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 12, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76810225985858, + 16.5309320464106, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 13, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76811577885341, + 16.530715631144773, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 14, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768136979184064, + 16.530500573736578, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 15, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7681521944103, + 16.530388084190108, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 16, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76807542298544, + 16.53027770936353, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 17, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76804836071953, + 16.53047779455375, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 18, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76802647332397, + 16.530699820729467, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 19, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768012516370526, + 16.530923248770208, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 20, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76800654291486, + 16.531146891465884, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 21, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76792538641036, + 16.530872608510265, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 22, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76793716779096, + 16.530684010368297, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 23, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767956224940995, + 16.530490697489185, + 15 + ], + "type": "SimpleItem" + } + ], + "Refly90Degrees": false, + "TurnAroundDistance": 10, + "VisualTransectPoints": [ + [ + 47.76786965695791, + 16.5304471058032 + ], + [ + 47.767852121581285, + 16.530624995372722 + ], + [ + 47.768280070477275, + 16.531012421511814 + ], + [ + 47.76828174772784, + 16.53094964311624 + ], + [ + 47.768293889869426, + 16.530755276539708 + ], + [ + 47.7682219391165, + 16.530560469333935 + ], + [ + 47.76820508527868, + 16.5307314416142 + ], + [ + 47.76819200424394, + 16.53094084541531 + ], + [ + 47.76818883948184, + 16.531059344799864 + ], + [ + 47.76809760666698, + 16.53110626925785 + ], + [ + 47.76810225985858, + 16.5309320464106 + ], + [ + 47.76811577885341, + 16.530715631144773 + ], + [ + 47.768136979184064, + 16.530500573736578 + ], + [ + 47.7681521944103, + 16.530388084190108 + ], + [ + 47.76807542298544, + 16.53027770936353 + ], + [ + 47.76804836071953, + 16.53047779455375 + ], + [ + 47.76802647332397, + 16.530699820729467 + ], + [ + 47.768012516370526, + 16.530923248770208 + ], + [ + 47.76800654291486, + 16.531146891465884 + ], + [ + 47.76792538641036, + 16.530872608510265 + ], + [ + 47.76793716779096, + 16.530684010368297 + ], + [ + 47.767956224940995, + 16.530490697489185 + ] + ], + "version": 1 + }, + "complexItemType": "CircularSurvey", + "polygon": [ + [ + 47.76809580679245, + 16.530246122817612 + ], + [ + 47.76823933601322, + 16.53060087654427 + ], + [ + 47.7683711160486, + 16.530967006195464 + ], + [ + 47.7680076482754, + 16.531153949077463 + ], + [ + 47.7677855557718, + 16.530403347547246 + ], + [ + 47.76800516387783, + 16.530513932174728 + ], + [ + 47.767998146781224, + 16.530388491662848 + ] + ], + "type": "ComplexItem", + "version": 1 + }, + { + "AMSLAltAboveTerrain": null, + "Altitude": 0, + "AltitudeMode": 1, + "autoContinue": true, + "command": 21, + "doJumpId": 27, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76794255683365, + 16.53029214577345, + 0 + ], + "type": "SimpleItem" + } + ], + "plannedHomePosition": [ + 47.76794255683365, + 16.53029214577345, + 178 + ], + "vehicleType": 2, + "version": 2 + }, + "rallyPoints": { + "points": [ + ], + "version": 2 + }, + "version": 1 +} diff --git a/Paths/temp8.plan b/Paths/temp8.plan new file mode 100644 index 0000000000000000000000000000000000000000..03e1feb5f744cc88c850bc470c377f30368fb2d2 --- /dev/null +++ b/Paths/temp8.plan @@ -0,0 +1,568 @@ +{ + "fileType": "Plan", + "geoFence": { + "circles": [ + ], + "polygons": [ + ], + "version": 2 + }, + "groundStation": "QGroundControl", + "mission": { + "cruiseSpeed": 15, + "firmwareType": 3, + "hoverSpeed": 1, + "items": [ + { + "autoContinue": true, + "command": 22, + "doJumpId": 1, + "frame": 3, + "params": [ + 15, + 0, + 0, + null, + 47.76794255683365, + 16.53029214577345, + 5 + ], + "type": "SimpleItem" + }, + { + "DeltaAlpha": 3, + "DeltaR": 10, + "ReferencePointAlt": 0, + "ReferencePointLat": 47.77087170283815, + "ReferencePointLong": 16.53120355954269, + "TransectMinLength": 1, + "TransectStyleComplexItem": { + "CameraCalc": { + "AdjustedFootprintFrontal": 25, + "AdjustedFootprintSide": 25, + "CameraName": "Manual (no camera specs)", + "DistanceToSurface": 15, + "DistanceToSurfaceRelative": true, + "version": 1 + }, + "CameraShots": 0, + "CameraTriggerInTurnAround": true, + "FollowTerrain": false, + "HoverAndCapture": false, + "Items": [ + { + "autoContinue": true, + "command": 16, + "doJumpId": 2, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76786965695791, + 16.5304471058032, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 3, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767852121581285, + 16.530624995372722, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 4, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768280070477275, + 16.531012421511814, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 5, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76828174772784, + 16.53094964311624, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 6, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768293889869426, + 16.530755276539708, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 7, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7682219391165, + 16.530560469333935, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 8, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76820508527868, + 16.5307314416142, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 9, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76819200424394, + 16.53094084541531, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 10, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76818883948184, + 16.531059344799864, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 11, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76809760666698, + 16.53110626925785, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 12, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76810225985858, + 16.5309320464106, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 13, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76811577885341, + 16.530715631144773, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 14, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768136979184064, + 16.530500573736578, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 15, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7681521944103, + 16.530388084190108, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 16, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76807542298544, + 16.53027770936353, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 17, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76804836071953, + 16.53047779455375, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 18, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76802647332397, + 16.530699820729467, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 19, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768012516370526, + 16.530923248770208, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 20, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76800654291486, + 16.531146891465884, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 21, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76792538641036, + 16.530872608510265, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 22, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76793716779096, + 16.530684010368297, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 23, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767956224940995, + 16.530490697489185, + 15 + ], + "type": "SimpleItem" + } + ], + "Refly90Degrees": false, + "TurnAroundDistance": 10, + "VisualTransectPoints": [ + [ + 47.76786965695791, + 16.5304471058032 + ], + [ + 47.767852121581285, + 16.530624995372722 + ], + [ + 47.768280070477275, + 16.531012421511814 + ], + [ + 47.76828174772784, + 16.53094964311624 + ], + [ + 47.768293889869426, + 16.530755276539708 + ], + [ + 47.7682219391165, + 16.530560469333935 + ], + [ + 47.76820508527868, + 16.5307314416142 + ], + [ + 47.76819200424394, + 16.53094084541531 + ], + [ + 47.76818883948184, + 16.531059344799864 + ], + [ + 47.76809760666698, + 16.53110626925785 + ], + [ + 47.76810225985858, + 16.5309320464106 + ], + [ + 47.76811577885341, + 16.530715631144773 + ], + [ + 47.768136979184064, + 16.530500573736578 + ], + [ + 47.7681521944103, + 16.530388084190108 + ], + [ + 47.76807542298544, + 16.53027770936353 + ], + [ + 47.76804836071953, + 16.53047779455375 + ], + [ + 47.76802647332397, + 16.530699820729467 + ], + [ + 47.768012516370526, + 16.530923248770208 + ], + [ + 47.76800654291486, + 16.531146891465884 + ], + [ + 47.76792538641036, + 16.530872608510265 + ], + [ + 47.76793716779096, + 16.530684010368297 + ], + [ + 47.767956224940995, + 16.530490697489185 + ] + ], + "version": 1 + }, + "complexItemType": "CircularSurvey", + "polygon": [ + [ + 47.76809580679245, + 16.530246122817612 + ], + [ + 47.76823933601322, + 16.53060087654427 + ], + [ + 47.7683711160486, + 16.530967006195464 + ], + [ + 47.7680076482754, + 16.531153949077463 + ], + [ + 47.7677855557718, + 16.530403347547246 + ], + [ + 47.76800516387783, + 16.530513932174728 + ], + [ + 47.767998146781224, + 16.530388491662848 + ] + ], + "type": "ComplexItem", + "version": 1 + }, + { + "AMSLAltAboveTerrain": null, + "Altitude": 0, + "AltitudeMode": 1, + "autoContinue": true, + "command": 21, + "doJumpId": 27, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76794255683365, + 16.53029214577345, + 0 + ], + "type": "SimpleItem" + } + ], + "plannedHomePosition": [ + 47.76794255683365, + 16.53029214577345, + 178 + ], + "vehicleType": 2, + "version": 2 + }, + "rallyPoints": { + "points": [ + ], + "version": 2 + }, + "version": 1 +} diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index 176b25cd2c9014623a90c0e0321123ffe92065ac..d0e75dde4acc1faa3feba79167c76b34911df093 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -29,6 +29,7 @@ DebugBuild { DESTDIR = $${OUT_PWD}/debug DEFINES += DEBUG DEFINES += SNAKE_SHOW_TIME + DEFINES += DEBUG_SRTL #DEFINES += SNAKE_DEBUG DEFINES += SHOW_CIRCULAR_SURVEY_TIME DEFINES += DEBUG_CIRCULAR_SURVEY @@ -37,7 +38,9 @@ DebugBuild { else { DESTDIR = $${OUT_PWD}/release #DEFINES += ROS_BRIDGE_DEBUG - DEFINES += SNAKE_SHOW_TIME + #DEFINES += SHOW_CIRCULAR_SURVEY_TIME + #DEFINES += SNAKE_SHOW_TIME + DEFINES += DEBUG_SRTL DEFINES += NDEBUG } @@ -66,9 +69,9 @@ WindowsBuild { # Branding # -QGC_APP_NAME = "QGroundControl" -QGC_ORG_NAME = "QGroundControl.org" -QGC_ORG_DOMAIN = "org.qgroundcontrol" +QGC_APP_NAME = "QGCWima" +QGC_ORG_NAME = "QGCWima.org" +QGC_ORG_DOMAIN = "org.qgcwima" QGC_APP_DESCRIPTION = "Open source ground control app provided by QGroundControl dev team" QGC_APP_COPYRIGHT = "Copyright (C) 2017 QGroundControl Development Team. All rights reserved." @@ -317,9 +320,9 @@ CustomBuild { RESOURCES += $$PWD/qgcresources.qrc } } else { - DEFINES += QGC_APPLICATION_NAME=\"\\\"QGroundControl\\\"\" - DEFINES += QGC_ORG_NAME=\"\\\"QGroundControl.org\\\"\" - DEFINES += QGC_ORG_DOMAIN=\"\\\"org.qgroundcontrol\\\"\" + DEFINES += QGC_APPLICATION_NAME=\"\\\"QGCWima\\\"\" + DEFINES += QGC_ORG_NAME=\"\\\"QGCWima.org\\\"\" + DEFINES += QGC_ORG_DOMAIN=\"\\\"org.qgcwima\\\"\" RESOURCES += \ $$PWD/qgroundcontrol.qrc \ $$PWD/qgcresources.qrc @@ -413,9 +416,9 @@ FORMS += \ # HEADERS += \ - src/Wima/CSWorker.h \ src/Wima/CircularSurvey.h \ src/Wima/Geometry/GenericCircle.h \ + src/Wima/RoutingThread.h \ src/Wima/Snake/clipper/clipper.hpp \ src/Wima/Snake/mapbox/feature.hpp \ src/Wima/Snake/mapbox/geometry.hpp \ @@ -503,8 +506,8 @@ HEADERS += \ src/comm/ros_bridge/include/topic_subscriber.h \ src/comm/utilities.h SOURCES += \ - src/Wima/CSWorker.cpp \ src/Wima/CircularSurvey.cc \ + src/Wima/RoutingThread.cpp \ src/Wima/Snake/clipper/clipper.cpp \ src/Wima/Snake/snake.cpp \ src/Wima/Geometry/GeoPoint3D.cpp \ diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index c90fdf78a81a4d6312045144daaa75aaeec05336..537b434dad0e1e266dc68f0b57b602067c411d94 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -231,6 +231,7 @@ src/FlightDisplay/FlightDisplayWimaMenu.qml src/WimaView/CircularSurveyMapVisual.qml src/FlightDisplay/SmallValue.qml + src/WimaView/ProgressIndicator.qml src/Settings/APMMavlinkStreamRate.SettingsGroup.json diff --git a/src/FlightDisplay/FlightDisplayViewMap.qml b/src/FlightDisplay/FlightDisplayViewMap.qml index fcb3e48b718c638568742a13e74aa6b4e06bc0b1..24ee217d04ad586f83f0cdea9d902106fcc65c6a 100644 --- a/src/FlightDisplay/FlightDisplayViewMap.qml +++ b/src/FlightDisplay/FlightDisplayViewMap.qml @@ -247,22 +247,20 @@ FlightMap { && wimaController.enableSnake.value model: _enable ? wimaController.snakeTileCenterPoints : 0 - delegate: MapCircle{ - center: modelData - border.color: "transparent" - border.width: 1 - color: getColor(wimaController.nemoProgress[index]) - radius: 0.6 - opacity: 1 + delegate: ProgressIndicator{ + coordinate: modelData + currentValue: getProgress() + width: 10 + height: 10 z: 1 - function getColor(progress) { - if (progress < 50) - return "red" - if (progress < 100) - return "orange" - - return "green" + function getProgress() { + var progress = wimaController.nemoProgress[index] + if (progress < 0) + progress = 0 + if (progress > 100) + progress = 100 + return progress } } } diff --git a/src/QmlControls/QGroundControl.Controls.qmldir b/src/QmlControls/QGroundControl.Controls.qmldir index b4bf5211b6dc25588123a510b6a23f77b0d918fb..0ea43058f06df7e456c88d7ca2e16c991951540b 100644 --- a/src/QmlControls/QGroundControl.Controls.qmldir +++ b/src/QmlControls/QGroundControl.Controls.qmldir @@ -100,5 +100,6 @@ CircularSurveyMapVisual 1.0 CircularSurveyMapVisual.qml DragCoordinate 1.0 DragCoordinate.qml CoordinateIndicator 1.0 CoordinateIndicator.qml CoordinateIndicatorDrag 1.0 CoordinateIndicatorDrag.qml +ProgressIndicator 1.0 ProgressIndicator.qml diff --git a/src/QmlControls/QmlObjectListModel.h b/src/QmlControls/QmlObjectListModel.h index 42d0b5a9f5fce0ff00fe268e7841abe2a93ebc21..14a40df9bd490521fc758fec7ad1ac80923c5114 100644 --- a/src/QmlControls/QmlObjectListModel.h +++ b/src/QmlControls/QmlObjectListModel.h @@ -7,85 +7,90 @@ * ****************************************************************************/ - #ifndef QmlObjectListModel_H #define QmlObjectListModel_H #include -class QmlObjectListModel : public QAbstractListModel -{ - Q_OBJECT - +class QmlObjectListModel : public QAbstractListModel { + Q_OBJECT + public: - QmlObjectListModel(QObject* parent = NULL); - ~QmlObjectListModel(); - - Q_PROPERTY(int count READ count NOTIFY countChanged) - - /// Returns true if any of the items in the list are dirty. Requires each object to have - /// a dirty property and dirtyChanged signal. - Q_PROPERTY(bool dirty READ dirty WRITE setDirty NOTIFY dirtyChanged) - - Q_INVOKABLE QObject* get(int index) { return _objectList[index]; } - - // Property accessors - - int count () const; - bool dirty () const { return _dirty; } - void setDirty (bool dirty); - void append (QObject* object); - void append (QList objects); - QObjectList swapObjectList (const QObjectList& newlist); - void clear (); - QObject* removeAt (int i); - QObject* removeOne (QObject* object) { return removeAt(indexOf(object)); } - void insert (int i, QObject* object); - void insert (int i, QList objects); - bool contains (QObject* object) { return _objectList.indexOf(object) != -1; } - int indexOf (QObject* object) { return _objectList.indexOf(object); } - - QObject* operator[] (int i); - const QObject* operator[] (int i) const; - template T value (int index) const { return qobject_cast(_objectList[index]); } - QList* objectList () { return &_objectList; } - - /// Calls deleteLater on all items and this itself. - void deleteListAndContents (); - - /// Clears the list and calls deleteLater on each entry - void clearAndDeleteContents (); - - void beginReset () { beginResetModel(); } - void endReset () { endResetModel(); } - - // Friends - friend void swap(QmlObjectListModel& list1, QmlObjectListModel& list2); + QmlObjectListModel(QObject *parent = NULL); + ~QmlObjectListModel(); + + Q_PROPERTY(int count READ count NOTIFY countChanged) + + /// Returns true if any of the items in the list are dirty. Requires each + /// object to have a dirty property and dirtyChanged signal. + Q_PROPERTY(bool dirty READ dirty WRITE setDirty NOTIFY dirtyChanged) + + Q_INVOKABLE QObject *get(int index) { return _objectList[index]; } + Q_INVOKABLE const QObject *get(int index) const { return _objectList[index]; } + + // Property accessors + + int count() const; + bool dirty() const { return _dirty; } + void setDirty(bool dirty); + void append(QObject *object); + void append(QList objects); + QObjectList swapObjectList(const QObjectList &newlist); + void clear(); + QObject *removeAt(int i); + QObject *removeOne(QObject *object) { return removeAt(indexOf(object)); } + void insert(int i, QObject *object); + void insert(int i, QList objects); + bool contains(QObject *object) { return _objectList.indexOf(object) != -1; } + int indexOf(QObject *object) { return _objectList.indexOf(object); } + + QObject *operator[](int i); + const QObject *operator[](int i) const; + template T value(int index) const { + return qobject_cast(_objectList[index]); + } + QList *objectList() { return &_objectList; } + + /// Calls deleteLater on all items and this itself. + void deleteListAndContents(); + + /// Clears the list and calls deleteLater on each entry + void clearAndDeleteContents(); + + void beginReset() { beginResetModel(); } + void endReset() { endResetModel(); } + + // Friends + friend void swap(QmlObjectListModel &list1, QmlObjectListModel &list2); signals: - void countChanged (int count); - void dirtyChanged (bool dirtyChanged); - + void countChanged(int count); + void dirtyChanged(bool dirtyChanged); + private slots: - void _childDirtyChanged (bool dirty); - + void _childDirtyChanged(bool dirty); + private: - // Overrides from QAbstractListModel - int rowCount (const QModelIndex & parent = QModelIndex()) const override; - QVariant data (const QModelIndex & index, int role = Qt::DisplayRole) const override; - bool insertRows (int position, int rows, const QModelIndex &index = QModelIndex()) override; - bool removeRows (int position, int rows, const QModelIndex &index = QModelIndex()) override; - bool setData (const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; - QHash roleNames(void) const override; + // Overrides from QAbstractListModel + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, + int role = Qt::DisplayRole) const override; + bool insertRows(int position, int rows, + const QModelIndex &index = QModelIndex()) override; + bool removeRows(int position, int rows, + const QModelIndex &index = QModelIndex()) override; + bool setData(const QModelIndex &index, const QVariant &value, + int role = Qt::EditRole) override; + QHash roleNames(void) const override; private: - QList _objectList; - - bool _dirty; - bool _skipDirtyFirstItem; - - static const int ObjectRole; - static const int TextRole; + QList _objectList; + + bool _dirty; + bool _skipDirtyFirstItem; + + static const int ObjectRole; + static const int TextRole; }; #endif diff --git a/src/Wima/CircularSurvey.cc b/src/Wima/CircularSurvey.cc index 78f49f5dd5ac4e25c34cdb3196b5ae25d121db26..87beb9518d3dc43b1ea0508df855735cf7933b4b 100644 --- a/src/Wima/CircularSurvey.cc +++ b/src/Wima/CircularSurvey.cc @@ -1,5 +1,5 @@ #include "CircularSurvey.h" -#include "CSWorker.h" +#include "RoutingThread.h" // QGC #include "JsonHelper.h" #include "QGCApplication.h" @@ -60,7 +60,7 @@ CircularSurvey::CircularSurvey(Vehicle *vehicle, bool flyView, _alpha(settingsGroup, _metaDataMap[alphaName]), _minLength(settingsGroup, _metaDataMap[minLengthName]), _type(settingsGroup, _metaDataMap[typeName]), - _pWorker(std::make_unique()), _needsStoring(false), + _pWorker(std::make_unique()), _needsStoring(false), _needsReversal(false), _hidePolygon(false) { Q_UNUSED(kmlOrShpFile) _editorQml = "qrc:/qml/CircularSurveyItemEditor.qml"; @@ -81,9 +81,9 @@ CircularSurvey::CircularSurvey(Vehicle *vehicle, bool flyView, connect(&this->_type, &Fact::rawValueChanged, this, &CircularSurvey::_rebuildTransects); // Connect worker. - connect(this->_pWorker.get(), &RoutingWorker::result, this, + connect(this->_pWorker.get(), &RoutingThread::result, this, &CircularSurvey::_setTransects); - connect(this->_pWorker.get(), &RoutingWorker::calculatingChanged, this, + connect(this->_pWorker.get(), &RoutingThread::calculatingChanged, this, &CircularSurvey::calculatingChanged); this->_transectsDirty = false; } @@ -287,7 +287,7 @@ void CircularSurvey::_appendLoadedMissionItems(QList &items, void CircularSurvey::_buildAndAppendMissionItems(QList &items, QObject *missionItemParent) { - if (_transectsDirty) + if (_transectsDirty || _transects.count() == 0) return; MissionItem *item; diff --git a/src/Wima/CircularSurvey.h b/src/Wima/CircularSurvey.h index 5aecd7152c1b5843ddc6151d712a987a5bf4ab71..a9dcf3f4196f968a429a78922a02aca1d5eb9a84 100644 --- a/src/Wima/CircularSurvey.h +++ b/src/Wima/CircularSurvey.h @@ -6,7 +6,7 @@ #include "SettingsFact.h" #include "TransectStyleComplexItem.h" -class RoutingWorker; +class RoutingThread; class RoutingData; class CircularSurvey : public TransectStyleComplexItem { @@ -119,7 +119,7 @@ private: SettingsFact _type; // Worker - using PtrWorker = std::shared_ptr; + using PtrWorker = std::shared_ptr; PtrWorker _pWorker; PtrRoutingData _workerOutput; QList> _rawTransects; diff --git a/src/Wima/CSWorker.cpp b/src/Wima/RoutingThread.cpp similarity index 91% rename from src/Wima/CSWorker.cpp rename to src/Wima/RoutingThread.cpp index 932b949cdf492827d6b505e5e624eced5c7737da..4c25fed3ad1e6a99e1cab9750ed1e7b870c2b084 100644 --- a/src/Wima/CSWorker.cpp +++ b/src/Wima/RoutingThread.cpp @@ -1,10 +1,10 @@ -#include "CSWorker.h" +#include "RoutingThread.h" // std #include // Qt #include -RoutingWorker::RoutingWorker(QObject *parent) +RoutingThread::RoutingThread(QObject *parent) : QThread(parent), _calculating(false), _stop(false), _restart(false) { static std::once_flag flag; @@ -12,7 +12,7 @@ RoutingWorker::RoutingWorker(QObject *parent) [] { qRegisterMetaType("PtrRoutingData"); }); } -RoutingWorker::~RoutingWorker() { +RoutingThread::~RoutingThread() { this->_stop = true; Lock lk(this->_mutex); this->_restart = true; @@ -21,10 +21,10 @@ RoutingWorker::~RoutingWorker() { this->wait(); } -bool RoutingWorker::calculating() { return this->_calculating; } +bool RoutingThread::calculating() { return this->_calculating; } -void RoutingWorker::route(const snake::BoostPolygon &safeArea, - const RoutingWorker::Generator &generator) { +void RoutingThread::route(const snake::BoostPolygon &safeArea, + const RoutingThread::Generator &generator) { // Sample input. Lock lk(this->_mutex); this->_safeArea = safeArea; @@ -40,7 +40,7 @@ void RoutingWorker::route(const snake::BoostPolygon &safeArea, } } -void RoutingWorker::run() { +void RoutingThread::run() { qWarning() << "RoutingWorker::run(): thread start."; while (!this->_stop) { #ifdef DEBUG_CIRCULAR_SURVEY diff --git a/src/Wima/CSWorker.h b/src/Wima/RoutingThread.h similarity index 91% rename from src/Wima/CSWorker.h rename to src/Wima/RoutingThread.h index 9df3ce64e64fe40a63de333a7bce959cd2d7a53a..963941c929f49c5462536ac03993c85bdd367f4b 100644 --- a/src/Wima/CSWorker.h +++ b/src/Wima/RoutingThread.h @@ -20,7 +20,7 @@ struct RoutingData { //! \brief The CSWorker class //! \note Don't call QThread::start, QThread::quit, etc. onyl use Worker //! members! -class RoutingWorker : public QThread { +class RoutingThread : public QThread { Q_OBJECT using Lock = std::unique_lock; @@ -28,8 +28,8 @@ public: using PtrRoutingData = QSharedPointer; using Generator = std::function; - RoutingWorker(QObject *parent = nullptr); - ~RoutingWorker() override; + RoutingThread(QObject *parent = nullptr); + ~RoutingThread() override; bool calculating(); diff --git a/src/Wima/Snake/snake.cpp b/src/Wima/Snake/snake.cpp index fe8a4a8cfd47e04fb245fc26b1acca42ddf8bd35..71dee537857b2d1ba11c6b99eed83ef9615438b6 100644 --- a/src/Wima/Snake/snake.cpp +++ b/src/Wima/Snake/snake.cpp @@ -326,7 +326,7 @@ bool dijkstraAlgorithm( return true; } -void toDistanceMatrix(Matrix &graph) { +bool toDistanceMatrix(Matrix &graph) { size_t n = graph.getN(); auto distance = [graph](size_t i, size_t j) { return graph.get(i, j); }; @@ -338,9 +338,9 @@ void toDistanceMatrix(Matrix &graph) { if (!std::isinf(d)) continue; path.clear(); - bool ret = dijkstraAlgorithm(n, i, j, path, distance); - assert(ret); - (void)ret; + if (!dijkstraAlgorithm(n, i, j, path, distance)) { + return false; + } // cout << "(" << i << "," << j << ") d: " << d << endl; // cout << "Path size: " << path.size() << endl; // for (auto idx : path) @@ -360,6 +360,7 @@ void toDistanceMatrix(Matrix &graph) { graph.set(j, i, d); } } + return true; } void shortestPathFromGraph(const Matrix &graph, size_t startIndex, @@ -740,7 +741,7 @@ struct RoutingDataModel { RoutingIndexManager::NodeIndex depot; }; -void generateRoutingModel(const BoostLineString &vertices, +bool generateRoutingModel(const BoostLineString &vertices, const BoostPolygon &polygonOffset, size_t n0, RoutingDataModel &dataModel, Matrix &graph) { @@ -758,7 +759,9 @@ void generateRoutingModel(const BoostLineString &vertices, #ifdef SNAKE_SHOW_TIME start = std::chrono::high_resolution_clock::now(); #endif - toDistanceMatrix(distanceMatrix); + if (!toDistanceMatrix(distanceMatrix)) { + return false; + } #ifdef SNAKE_SHOW_TIME delta = std::chrono::duration_cast( std::chrono::high_resolution_clock::now() - start); @@ -778,6 +781,7 @@ void generateRoutingModel(const BoostLineString &vertices, } dataModel.numVehicles = 1; dataModel.depot = 0; + return true; } bool route(const BoostPolygon &area, const Transects &transects, @@ -836,7 +840,11 @@ bool route(const BoostPolygon &area, const Transects &transects, #ifdef SNAKE_SHOW_TIME auto start = std::chrono::high_resolution_clock::now(); #endif - generateRoutingModel(vertices, areaOffset, n0, dataModel, connectionGraph); + if (!generateRoutingModel(vertices, areaOffset, n0, dataModel, + connectionGraph)) { + errorString = "Routing model generation failed."; + return false; + } #ifdef SNAKE_SHOW_TIME auto delta = std::chrono::duration_cast( std::chrono::high_resolution_clock::now() - start); diff --git a/src/Wima/Snake/snake.h b/src/Wima/Snake/snake.h index 7f8b844af30b99120a6c443e2b6a847b6aeaad0d..34279a896ffaa7e450c6302cf9a58b5cc8de21c9 100644 --- a/src/Wima/Snake/snake.h +++ b/src/Wima/Snake/snake.h @@ -149,7 +149,7 @@ void offsetPolygon(const BoostPolygon &polygon, BoostPolygon &polygonOffset, double offset); void graphFromPolygon(const BoostPolygon &polygon, const BoostLineString &vertices, Matrix &graph); -void toDistanceMatrix(Matrix &graph); +bool toDistanceMatrix(Matrix &graph); bool dijkstraAlgorithm( const size_t numElements, size_t startIndex, size_t endIndex, std::vector &elementPath, diff --git a/src/Wima/WaypointManager/RTLManager.cpp b/src/Wima/WaypointManager/RTLManager.cpp index 21ef5773a0705d33d525efe33b2f0147d58b49ba..3218e74f5d40dcee2593e6fd111b6d4cb5d473ba 100644 --- a/src/Wima/WaypointManager/RTLManager.cpp +++ b/src/Wima/WaypointManager/RTLManager.cpp @@ -5,242 +5,215 @@ #include "MissionSettingsItem.h" #include "SimpleMissionItem.h" - WaypointManager::RTLManager::RTLManager(Settings &settings, AreaInterface &interface) - : ManagerBase(settings) - , _areaInterface(&interface) -{ - -} + : ManagerBase(settings), _areaInterface(&interface) {} -void WaypointManager::RTLManager::setWaypoints(const QVector &waypoints) -{ - (void)waypoints; - return; +void WaypointManager::RTLManager::setWaypoints( + const QVector &waypoints) { + (void)waypoints; + return; } -void WaypointManager::RTLManager::push_back(const QGeoCoordinate &wp) -{ - (void)wp; - return; +void WaypointManager::RTLManager::push_back(const QGeoCoordinate &wp) { + (void)wp; + return; } -void WaypointManager::RTLManager::push_front(const QGeoCoordinate &wp) -{ - (void)wp; - return; +void WaypointManager::RTLManager::push_front(const QGeoCoordinate &wp) { + (void)wp; + return; } -void WaypointManager::RTLManager::clear() -{ - _dirty = true; - _waypoints.clear(); - _currentWaypoints.clear(); - _missionItems.clearAndDeleteContents(); - _currentMissionItems.clearAndDeleteContents(); - _waypointsVariant.clear(); - _currentWaypointsVariant.clear(); +void WaypointManager::RTLManager::clear() { + _dirty = true; + _waypoints.clear(); + _currentWaypoints.clear(); + _missionItems.clearAndDeleteContents(); + _currentMissionItems.clearAndDeleteContents(); + _waypointsVariant.clear(); + _currentWaypointsVariant.clear(); } -void WaypointManager::RTLManager::insert(std::size_t i, const QGeoCoordinate &wp) -{ - (void)i; - (void)wp; - return; +void WaypointManager::RTLManager::insert(std::size_t i, + const QGeoCoordinate &wp) { + (void)i; + (void)wp; + return; } -std::size_t WaypointManager::RTLManager::size() const -{ - return 0; -} +std::size_t WaypointManager::RTLManager::size() const { return 0; } -void WaypointManager::RTLManager::remove(std::size_t i) -{ - (void)i; -} +void WaypointManager::RTLManager::remove(std::size_t i) { (void)i; } -bool WaypointManager::RTLManager::update() -{ - this->clear(); - return _worker(); +bool WaypointManager::RTLManager::update() { + this->clear(); + return _worker(); } -bool WaypointManager::RTLManager::next() -{ - return true; -} +bool WaypointManager::RTLManager::next() { return true; } -bool WaypointManager::RTLManager::previous() -{ - return true; -} +bool WaypointManager::RTLManager::previous() { return true; } -bool WaypointManager::RTLManager::reset() -{ - return true; -} +bool WaypointManager::RTLManager::reset() { return true; } -bool WaypointManager::RTLManager::checkPrecondition(QString &errorString) -{ - // Be aware of the error message order! - Vehicle *managerVehicle = _settings->masterController()->managerVehicle(); +bool WaypointManager::RTLManager::checkPrecondition(QString &errorString) { + // Be aware of the error message order! + Vehicle *managerVehicle = _settings->masterController()->managerVehicle(); - if ( managerVehicle->isOfflineEditingVehicle() ) { - errorString.append("No vehicle connected. Smart RTL not available."); - return false; - } + if (managerVehicle->isOfflineEditingVehicle()) { + errorString.append("No vehicle connected. Smart RTL not available."); + return false; + } - if ( !managerVehicle->flying() ) { - errorString.append("Vehicle is not flying. Smart RTL not available."); - return false; - } + if (!managerVehicle->flying()) { + errorString.append("Vehicle is not flying. Smart RTL not available."); + return false; + } - if ( !_areaInterface->joinedArea()->containsCoordinate( - managerVehicle->coordinate()) ) { - errorString.append("Vehicle not inside save area. Smart RTL not available."); - return false; - } + if (!_areaInterface->joinedArea()->containsCoordinate( + managerVehicle->coordinate())) { + errorString.append( + "Vehicle not inside save area. Smart RTL not available."); + return false; + } - return true; + return true; } bool WaypointManager::RTLManager::_insertMissionItem(const QGeoCoordinate &c, - size_t index, - QmlObjectListModel &list, - bool doUpdate) -{ - using namespace WaypointManager::Utils; - - if ( !insertMissionItem(c, - index /*insertion index*/, - list, - _settings->vehicle(), - _settings->isFlyView(), - &list /*parent*/, - doUpdate /*do update*/) ) - { - qWarning("WaypointManager::RTLManager::next(): insertMissionItem failed."); - Q_ASSERT(false); - return false; - } - return true; + size_t index, + QmlObjectListModel &list, + bool doUpdate) { + using namespace WaypointManager::Utils; + + if (!insertMissionItem(c, index /*insertion index*/, list, + _settings->vehicle(), _settings->isFlyView(), + &list /*parent*/, doUpdate /*do update*/)) { + qWarning("WaypointManager::RTLManager::next(): insertMissionItem failed."); + Q_ASSERT(false); + return false; + } + return true; } bool WaypointManager::RTLManager::_insertMissionItem(const QGeoCoordinate &c, - size_t index, - bool doUpdate) -{ - return _insertMissionItem(c, index, _currentMissionItems, doUpdate); + size_t index, + bool doUpdate) { + return _insertMissionItem(c, index, _currentMissionItems, doUpdate); } bool WaypointManager::RTLManager::_calcShortestPath( - const QGeoCoordinate &start, - const QGeoCoordinate &destination, - QVector &path) -{ - using namespace GeoUtilities; - using namespace PolygonCalculus; - QPolygonF joinedArea2D; - toCartesianList(_areaInterface->joinedArea()->coordinateList(), /*origin*/ start, joinedArea2D); - QPointF start2D(0,0); - QPointF end2D; - toCartesian(destination, start, end2D); - QVector path2DOut; - - bool retVal = PolygonCalculus::shortestPath(joinedArea2D, start2D, end2D, path2DOut); - toGeoList(path2DOut, /*origin*/ start, path); - - return retVal; -} - -bool WaypointManager::RTLManager::_worker() -{ - // Precondition: settings must be valid. - - using namespace WaypointManager::Utils; - - if (!_settings->valid()) { - return false; - } - - initialize(_currentMissionItems, _settings->vehicle(), _settings->isFlyView()); - - // Calculate path from vehicle to home position. - QVector returnPath; - auto vehicleCoordinate = _settings->masterController()->managerVehicle()->coordinate(); - if ( !_calcShortestPath(vehicleCoordinate, _settings->homePosition(), returnPath) ) { - qWarning("WaypointManager::RTLManager::next(): Not able to calc path from vehicle to home position."); - return false; - } - - // Create mission items. - // Set home position of MissionSettingsItem. - MissionSettingsItem* settingsItem = _currentMissionItems.value(0); - if (settingsItem == nullptr) { - Q_ASSERT(false); - qWarning("WaypointManager::RTLManager::next(): nullptr."); - return false; - } - settingsItem->setCoordinate(_settings->homePosition()); - - // Create change speed item. - _insertMissionItem(_settings->homePosition(), - _currentMissionItems.count() /*insertion index*/, + const QGeoCoordinate &start, const QGeoCoordinate &destination, + QVector &path) { + using namespace GeoUtilities; + using namespace PolygonCalculus; + QPolygonF joinedArea2D; + toCartesianList(_areaInterface->joinedArea()->coordinateList(), + /*origin*/ start, joinedArea2D); + QPointF start2D(0, 0); + QPointF end2D; + toCartesian(destination, start, end2D); + QVector path2DOut; + + bool retVal = + PolygonCalculus::shortestPath(joinedArea2D, start2D, end2D, path2DOut); + toGeoList(path2DOut, /*origin*/ start, path); + + return retVal; +} + +bool WaypointManager::RTLManager::_worker() { + // Precondition: settings must be valid. + + using namespace WaypointManager::Utils; + + if (!_settings->valid()) { + return false; + } + + _currentMissionItems.clearAndDeleteContents(); + initialize(_currentMissionItems, _settings->vehicle(), + _settings->isFlyView()); + + // Calculate path from vehicle to home position. + QVector returnPath; + auto vehicleCoordinate = + _settings->masterController()->managerVehicle()->coordinate(); + if (!_calcShortestPath(vehicleCoordinate, _settings->homePosition(), + returnPath)) { + qWarning("WaypointManager::RTLManager::next(): Not able to calc path from " + "vehicle to home position."); + return false; + } + + // Create mission items. + // Set home position of MissionSettingsItem. + MissionSettingsItem *settingsItem = + _currentMissionItems.value(0); + if (settingsItem == nullptr) { + Q_ASSERT(false); + qWarning("WaypointManager::RTLManager::next(): nullptr."); + return false; + } + settingsItem->setCoordinate(vehicleCoordinate); + + // Create change speed item. + int index = _currentMissionItems.count(); + _insertMissionItem(vehicleCoordinate, index /*insertion index*/, + false /*do update*/); + SimpleMissionItem *speedItem = + _currentMissionItems.value(index); + if (speedItem == nullptr) { + qWarning("WaypointManager::RTLManager::next(): nullptr."); + Q_ASSERT(speedItem != nullptr); + return false; + } + makeSpeedCmd(speedItem, _settings->arrivalReturnSpeed()); + + // Insert return path coordinates. + for (auto coordinate : returnPath) { + index = _currentMissionItems.count(); + _insertMissionItem(coordinate, index /*insertion index*/, false /*do update*/); - SimpleMissionItem *speedItem = _currentMissionItems.value(2); - if (speedItem == nullptr) { - qWarning("WaypointManager::RTLManager::next(): nullptr."); - Q_ASSERT(speedItem != nullptr); - return false; + } + // Set land command for last mission item. + index = _currentMissionItems.count(); + _insertMissionItem(_settings->homePosition(), index /*insertion index*/, + false /*do update*/); + SimpleMissionItem *landItem = + _currentMissionItems.value(index); + if (landItem == nullptr) { + Q_ASSERT(false); + qWarning("WaypointManager::RTLManager::next(): nullptr."); + return false; + } + makeLandCmd(landItem, _settings->masterController()->managerVehicle()); + + // Set altitude. + for (int i = 1; i < _currentMissionItems.count(); ++i) { + SimpleMissionItem *item = + _currentMissionItems.value(i); + if (item == nullptr) { + Q_ASSERT(false); + qWarning("WimaController::updateAltitude(): nullptr"); + return false; } - makeSpeedCmd(speedItem, _settings->arrivalReturnSpeed()); - - // Insert return path coordinates. - for (auto coordinate : returnPath) { - _insertMissionItem(coordinate, - _currentMissionItems.count() /*insertion index*/, - false /*do update*/); - } - - // Set land command for last mission item. - int index = _currentMissionItems.count(); - _insertMissionItem(_settings->homePosition(), - index /*insertion index*/, - false /*do update*/); - SimpleMissionItem *landItem = _currentMissionItems.value(index); - if (landItem == nullptr) { - Q_ASSERT(false); - qWarning("WaypointManager::RTLManager::next(): nullptr."); - return false; - } - makeLandCmd(landItem, _settings->masterController()->managerVehicle()); - - - // Set altitude. - for (int i = 1; i < _currentMissionItems.count(); ++i) { - SimpleMissionItem *item = _currentMissionItems.value(i); - if (item == nullptr) { - Q_ASSERT(false); - qWarning("WimaController::updateAltitude(): nullptr"); - return false; - } - item->altitude()->setRawValue(_settings->altitude()); - } - - // Update list _currentMissionItems. - updateHirarchy(_currentMissionItems); - updateSequenceNumbers(_currentMissionItems); + item->altitude()->setRawValue(_settings->altitude()); + } + // Update list _currentMissionItems. + updateHirarchy(_currentMissionItems); + updateSequenceNumbers(_currentMissionItems); - // Append return path to _currentWaypoints. - for ( auto c : returnPath ) - _currentWaypoints.push_back(c); + // Append return path to _currentWaypoints. + for (auto c : returnPath) + _currentWaypoints.push_back(c); - // Create variant list. - _currentWaypointsVariant.clear(); - for ( auto c : _currentWaypoints) - _currentWaypointsVariant.push_back(QVariant::fromValue(c)); + // Create variant list. + _currentWaypointsVariant.clear(); + for (auto c : _currentWaypoints) + _currentWaypointsVariant.push_back(QVariant::fromValue(c)); - return true; + return true; } diff --git a/src/Wima/WimaController.cc b/src/Wima/WimaController.cc index 48747eea96ab971e53adf311e27cec3dc1acae6d..2377f38dfc94d6ba773b8f0257c7843b1c5a3ae3 100644 --- a/src/Wima/WimaController.cc +++ b/src/Wima/WimaController.cc @@ -270,8 +270,11 @@ void WimaController::resetPhase() { } void WimaController::requestSmartRTL() { - QString errorString("Smart RTL requested. "); - if (!_checkSmartRTLPreCondition(errorString)) { +#ifdef DEBUG_SRTL + qWarning() << "WimaController::requestSmartRTL() called"; +#endif + QString errorString("Smart RTL requested."); + if (!_SRTLPrecondition(errorString)) { qgcApp()->showMessage(errorString); return; } @@ -279,59 +282,85 @@ void WimaController::requestSmartRTL() { } bool WimaController::upload() { - auto ¤tMissionItems = _defaultWM.currentMissionItems(); - if (!_serviceArea.containsCoordinate( - _masterController->managerVehicle()->coordinate()) && - currentMissionItems.count() > 0) { - emit forceUploadConfirm(); + auto &items = _currentWM->currentMissionItems(); + if (_masterController && _masterController->managerVehicle() && + items.count() > 0) { + if (!_joinedArea.containsCoordinate( + _masterController->managerVehicle()->coordinate())) { + emit forceUploadConfirm(); + return false; + } else { + return forceUpload(); + } + } else { return false; } - - return forceUpload(); } bool WimaController::forceUpload() { - auto ¤tMissionItems = _defaultWM.currentMissionItems(); - if (currentMissionItems.count() < 1) - return false; - - _missionController->removeAll(); - // Set homeposition of settingsItem. - QmlObjectListModel *visuals = _missionController->visualItems(); - MissionSettingsItem *settingsItem = visuals->value(0); - if (settingsItem == nullptr) { - Q_ASSERT(false); - qWarning("WimaController::updateCurrentMissionItems(): nullptr"); + auto ¤tMissionItems = _currentWM->currentMissionItems(); + if (currentMissionItems.count() < 1 || !_missionController || + !_masterController) { + qWarning() << "WimaController::forceUpload(): error:"; + qWarning() << "currentMissionItems.count(): " + << currentMissionItems.count(); + qWarning() << "_missionController: " << _missionController; + qWarning() << "_masterController: " << _masterController; return false; - } - settingsItem->setCoordinate(_WMSettings.homePosition()); + } else { + _missionController->removeAll(); + // Set homeposition of settingsItem. + QmlObjectListModel *visuals = _missionController->visualItems(); + MissionSettingsItem *settingsItem = + visuals->value(0); + if (settingsItem == nullptr) { + Q_ASSERT(false); + qWarning("WimaController::updateCurrentMissionItems(): nullptr"); + return false; + } else { + settingsItem->setCoordinate(_WMSettings.homePosition()); - // Copy mission items to _missionController. - for (int i = 1; i < currentMissionItems.count(); i++) { - auto *item = currentMissionItems.value(i); - _missionController->insertSimpleMissionItem(*item, visuals->count()); + // Copy mission items to _missionController and send them. + for (int i = 1; i < currentMissionItems.count(); i++) { + auto *item = currentMissionItems.value(i); + _missionController->insertSimpleMissionItem(*item, visuals->count()); + } + _masterController->sendToVehicle(); + return true; + } } - - _masterController->sendToVehicle(); - - return true; } void WimaController::removeFromVehicle() { - _masterController->removeAllFromVehicle(); - _missionController->removeAll(); + if (_masterController && _missionController) { + _masterController->removeAllFromVehicle(); + _missionController->removeAll(); + } } void WimaController::executeSmartRTL() { - forceUpload(); - masterController()->managerVehicle()->startMission(); +#ifdef DEBUG_SRTL + qWarning() << "WimaController::executeSmartRTL() called"; +#endif + if (_masterController && _masterController->managerVehicle()) { + forceUpload(); + _masterController->managerVehicle()->startMission(); + } } -void WimaController::initSmartRTL() { _initSmartRTL(); } +void WimaController::initSmartRTL() { +#ifdef DEBUG_SRTL + qWarning() << "WimaController::initSmartRTL() called"; +#endif + _initSmartRTL(); +} void WimaController::removeVehicleTrajectoryHistory() { - Vehicle *managerVehicle = masterController()->managerVehicle(); - managerVehicle->trajectoryPoints()->clear(); + if (_masterController && _masterController->managerVehicle()) { + _masterController->managerVehicle() + ->trajectoryPoints() + ->clearAndDeleteContents(); + } } bool WimaController::_calcShortestPath(const QGeoCoordinate &start, @@ -371,8 +400,8 @@ bool WimaController::setWimaPlanData(QSharedPointer planData) { QList areaList = planData->areaList(); int areaCounter = 0; - const int numAreas = 4; // extract only numAreas Areas, if there are more they - // are invalid and ignored + const int numAreas = 4; // extract only numAreas Areas, if there are more + // they are invalid and ignored for (int i = 0; i < areaList.size(); i++) { const WimaAreaData *areaData = areaList[i]; @@ -586,33 +615,35 @@ void WimaController::_updateAltitude() { } void WimaController::_checkBatteryLevel() { - Vehicle *managerVehicle = masterController()->managerVehicle(); - WimaSettings *wimaSettings = - qgcApp()->toolbox()->settingsManager()->wimaSettings(); - int batteryThreshold = - wimaSettings->lowBatteryThreshold()->rawValue().toInt(); - bool enabled = _enableWimaController.rawValue().toBool(); - unsigned int minTime = - wimaSettings->minimalRemainingMissionTime()->rawValue().toUInt(); - - if (managerVehicle != nullptr && enabled == true) { - Fact *battery1percentRemaining = - managerVehicle->battery1FactGroup()->getFact( - VehicleBatteryFactGroup::_percentRemainingFactName); - Fact *battery2percentRemaining = - managerVehicle->battery2FactGroup()->getFact( - VehicleBatteryFactGroup::_percentRemainingFactName); - - if (battery1percentRemaining->rawValue().toDouble() < batteryThreshold && - battery2percentRemaining->rawValue().toDouble() < batteryThreshold) { - if (!_lowBatteryHandlingTriggered) { - _lowBatteryHandlingTriggered = true; - if (!(_missionController->remainingTime() <= minTime)) { - requestSmartRTL(); + if (_missionController && _masterController && + _masterController->managerVehicle()) { + Vehicle *managerVehicle = masterController()->managerVehicle(); + WimaSettings *wimaSettings = + qgcApp()->toolbox()->settingsManager()->wimaSettings(); + int threshold = wimaSettings->lowBatteryThreshold()->rawValue().toInt(); + bool enabled = _enableWimaController.rawValue().toBool(); + unsigned int minTime = + wimaSettings->minimalRemainingMissionTime()->rawValue().toUInt(); + + if (enabled) { + Fact *battery1percentRemaining = + managerVehicle->battery1FactGroup()->getFact( + VehicleBatteryFactGroup::_percentRemainingFactName); + Fact *battery2percentRemaining = + managerVehicle->battery2FactGroup()->getFact( + VehicleBatteryFactGroup::_percentRemainingFactName); + + if (battery1percentRemaining->rawValue().toDouble() < threshold && + battery2percentRemaining->rawValue().toDouble() < threshold) { + if (!_lowBatteryHandlingTriggered) { + _lowBatteryHandlingTriggered = true; + if (!(_missionController->remainingTime() <= minTime)) { + requestSmartRTL(); + } } + } else { + _lowBatteryHandlingTriggered = false; } - } else { - _lowBatteryHandlingTriggered = false; } } } @@ -630,9 +661,8 @@ void WimaController::_eventTimerHandler() { } void WimaController::_smartRTLCleanUp(bool flying) { - if (!flying) { // vehicle has landed + if (!flying && _missionController) { // vehicle has landed _switchWaypointManager(_defaultWM); - _missionController->removeAllFromVehicle(); _missionController->removeAll(); disconnect(masterController()->managerVehicle(), &Vehicle::flyingChanged, this, &WimaController::_smartRTLCleanUp); @@ -657,7 +687,7 @@ void WimaController::_setPhaseDuration(double duration) { // } } -bool WimaController::_checkSmartRTLPreCondition(QString &errorString) { +bool WimaController::_SRTLPrecondition(QString &errorString) { if (!_localPlanDataValid) { errorString.append(tr("No WiMA data available. Please define at least a " "measurement and a service area.")); @@ -695,25 +725,28 @@ void WimaController::_switchWaypointManager( emit waypointPathChanged(); emit currentWaypointPathChanged(); - qWarning() - << "WimaController::_switchWaypointManager: statistics update missing."; + qWarning() << "WimaController::_switchWaypointManager: statistics update " + "missing."; } } void WimaController::_initSmartRTL() { - QString errorString; static int attemptCounter = 0; attemptCounter++; + QString errorString; - if (_checkSmartRTLPreCondition(errorString)) { - _masterController->managerVehicle()->pauseVehicle(); - connect(masterController()->managerVehicle(), &Vehicle::flyingChanged, this, - &WimaController::_smartRTLCleanUp); - if (_rtlWM.update()) { // Calculate return path. - _switchWaypointManager(_rtlWM); - attemptCounter = 0; - emit smartRTLPathConfirm(); - return; + if (_SRTLPrecondition(errorString)) { + if (_missionController && _masterController && + _masterController->managerVehicle()) { + _masterController->managerVehicle()->pauseVehicle(); + connect(_masterController->managerVehicle(), &Vehicle::flyingChanged, + this, &WimaController::_smartRTLCleanUp); + if (_rtlWM.update()) { // Calculate return path. + _switchWaypointManager(_rtlWM); + removeFromVehicle(); + attemptCounter = 0; + emit smartRTLPathConfirm(); + } } } else if (attemptCounter > SMART_RTL_MAX_ATTEMPTS) { errorString.append( diff --git a/src/Wima/WimaController.h b/src/Wima/WimaController.h index 5302f943b2d8a5861c0a71abcf3c2a897005036d..26dba002f5a026a9e16454760d1f5da66138d6a4 100644 --- a/src/Wima/WimaController.h +++ b/src/Wima/WimaController.h @@ -138,7 +138,6 @@ public: QString nemoStatusString(void) const; bool snakeCalcInProgress(void) const; - // Smart RTL. bool uploadOverrideRequired(void) const; bool vehicleHasLowBattery(void) const; // Waypoint statistics. @@ -234,7 +233,7 @@ private slots: void _setPhaseDuration(double duration); // SMART RTL void _checkBatteryLevel(void); - bool _checkSmartRTLPreCondition(QString &errorString); + bool _SRTLPrecondition(QString &errorString); void _initSmartRTL(); void _smartRTLCleanUp(bool flying); // Snake. diff --git a/src/Wima/WimaPlaner.cc b/src/Wima/WimaPlaner.cc index cdb307cde7fa28996f91cde40c10a33686f7122f..7a03198ebf5cb92ef15eb665bed739242071c868 100644 --- a/src/Wima/WimaPlaner.cc +++ b/src/Wima/WimaPlaner.cc @@ -742,12 +742,14 @@ QSharedPointer WimaPlaner::toPlanData() { // convert mission items to mavlink commands QList missionItems; - _TSComplexItem->appendMissionItems(missionItems, nullptr); - // store mavlink commands - qWarning() << "WimaPlaner"; - for (auto *item : missionItems) { - qWarning() << item->coordinate(); + if (_missionController && _missionController->visualItems()) { + int surveyIndex = + _missionController->visualItems()->indexOf(_TSComplexItem); + if (surveyIndex > 0) { + _TSComplexItem->appendMissionItems(missionItems, nullptr); + } } + // store mavlink commands planData->append(missionItems); return planData; } diff --git a/src/WimaView/ProgressIndicator.qml b/src/WimaView/ProgressIndicator.qml new file mode 100644 index 0000000000000000000000000000000000000000..3b6d39495e55614aa457fc26b72bbbf81fbc2205 --- /dev/null +++ b/src/WimaView/ProgressIndicator.qml @@ -0,0 +1,119 @@ +import QtQml 2.2 +import QtQuick 2.0 +import QtLocation 5.3 + +MapQuickItem { + id: root + + width: 20 + height: 20 + anchorPoint.x: width/2 + anchorPoint.y: height/2 + + property color primaryColor: "orange" + property color secondaryColor: "lightblue" + + property real centerWidth: width / 2 + property real centerHeight: height / 2 + property real radius: Math.min(canvas.width, canvas.height) / 2 + + property real minimumValue: 0 + property real maximumValue: 100 + property real currentValue: 33 + + // this is the angle that splits the circle in two arcs + // first arc is drawn from 0 radians to angle radians + // second arc is angle radians to 2*PI radians + property real angle: (currentValue - minimumValue) / (maximumValue - minimumValue) * 2 * Math.PI + + // we want both circle to start / end at 12 o'clock + // without this offset we would start / end at 9 o'clock + property real angleOffset: -Math.PI / 2 + + property string text: "" + + signal clicked() + + onPrimaryColorChanged: canvas.requestPaint() + onSecondaryColorChanged: canvas.requestPaint() + onMinimumValueChanged: canvas.requestPaint() + onMaximumValueChanged: canvas.requestPaint() + onCurrentValueChanged: canvas.requestPaint() + + // draws two arcs (portion of a circle) + // fills the circle with a lighter secondary color + // when pressed + sourceItem: Canvas { + id: canvas + width: root.width + height: root.height + antialiasing: true + + onPaint: { + var ctx = getContext("2d"); + ctx.save(); + + ctx.clearRect(0, 0, canvas.width, canvas.height); + + // fills the mouse area when pressed + // the fill color is a lighter version of the + // secondary color + + if (mouseArea.pressed) { + ctx.beginPath(); + ctx.lineWidth = 1; + ctx.fillStyle = Qt.lighter(root.secondaryColor, 1.25); + ctx.arc(root.centerWidth, + root.centerHeight, + root.radius, + 0, + 2*Math.PI); + ctx.fill(); + } + + // First, thinner arc + // From angle to 2*PI + + ctx.beginPath(); + ctx.lineWidth = 1; + ctx.strokeStyle = primaryColor; + ctx.arc(root.centerWidth, + root.centerHeight, + root.radius, + angleOffset + root.angle, + angleOffset + 2*Math.PI); + ctx.stroke(); + + + // Second, thicker arc + // From 0 to angle + + ctx.beginPath(); + ctx.lineWidth = 3; + ctx.strokeStyle = root.secondaryColor; + ctx.arc(root.centerWidth, + root.centerHeight, + root.radius, + root.angleOffset, + root.angleOffset + root.angle); + ctx.stroke(); + + ctx.restore(); + } + + Text { + anchors.centerIn: parent + + text: root.text + color: root.primaryColor + } + + MouseArea { + id: mouseArea + + anchors.fill: parent + onClicked: root.clicked() + onPressedChanged: canvas.requestPaint() + } + } +}