From fda55a6e45fc4fecb2e9cb6e29bb6cc9d06f6e89 Mon Sep 17 00:00:00 2001 From: pxzleo Date: Sat, 11 Mar 2017 23:03:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=81=E8=AE=B8=E5=A4=9A=E6=9E=B6=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E8=B5=B7=E9=A3=9E=E5=92=8C=E9=99=8D=E8=90=BD=20[Fligh?= =?UTF-8?q?tTask.cs]=E4=BB=BB=E5=8A=A1=E6=94=B9=E4=B8=BA=E5=A4=9A=E6=9E=B6?= =?UTF-8?q?=E8=B5=B7=E9=A3=9E=E9=99=8D=E8=90=BD=20[FlightTask=5FReturnToLa?= =?UTF-8?q?nd.cs]=E5=A4=9A=E6=9E=B6=E9=99=8D=E8=90=BD=20[FlightTask=5FTake?= =?UTF-8?q?Off.cs]=E5=A4=9A=E6=9E=B6=E8=B5=B7=E9=A3=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Formation/FlightTask.cs | 6 +- .../Formation/FlightTask_ReturnToLand.cs | 126 ++++++++++++++++++ .../Formation/FlightTask_TakeOff.cs | 4 +- 3 files changed, 132 insertions(+), 4 deletions(-) diff --git a/Plane.FormationCreator/Formation/FlightTask.cs b/Plane.FormationCreator/Formation/FlightTask.cs index bee05cf..92b720c 100644 --- a/Plane.FormationCreator/Formation/FlightTask.cs +++ b/Plane.FormationCreator/Formation/FlightTask.cs @@ -100,10 +100,12 @@ namespace Plane.FormationCreator.Formation await RunLoiterTimeTaskAsync().ConfigureAwait(false); break; case FlightTaskType.TakeOff: - await RunTakeOffTask2Async().ConfigureAwait(false); + //多架同时起飞 + await MutilRunTakeOffTaskAsync(2).ConfigureAwait(false); break; case FlightTaskType.ReturnToLand: // Added by ZJF - await RunReturnToLandTaskAsync().ConfigureAwait(false); + //多架同时返航 + await MutilRunReturnToLandTaskAsync(2).ConfigureAwait(false); break; default: throw new InvalidOperationException(); diff --git a/Plane.FormationCreator/Formation/FlightTask_ReturnToLand.cs b/Plane.FormationCreator/Formation/FlightTask_ReturnToLand.cs index 1d51279..091e253 100644 --- a/Plane.FormationCreator/Formation/FlightTask_ReturnToLand.cs +++ b/Plane.FormationCreator/Formation/FlightTask_ReturnToLand.cs @@ -49,7 +49,132 @@ namespace Plane.FormationCreator.Formation } } + public async Task MutilRunReturnToLandTaskAsync(int ReturnCount) + { + int TaskCount = _flightTaskManager.Tasks.Count(); + if (TaskCount > 1) + { + var infos = SingleCopterInfos; + int copterCount = infos.Count; + int integerPart = copterCount / ReturnCount; + int residualPart = copterCount % ReturnCount; + var tasksTmp = new Task[infos.Count]; + + for (int i = 0; i < integerPart; i++) + { + var tasksRetutn = new Task[ReturnCount]; + for (int j = ReturnCount * i; j < ReturnCount * (i + 1); j++) + { + var info = infos[j]; + + int indexTmp = j - ReturnCount * i; + + // var copter = info.Copter; + if (info.RTLStage <= 1) // 当前阶段小于等于1时进入 + { + tasksRetutn[indexTmp] = ReturnToLandTaskFlySingleCopterAsync(info); + } + else + { + tasksRetutn[indexTmp] = Task.Run(async () => { await Task.Delay(1).ConfigureAwait(false); }); + } + } + await Task.WhenAll(tasksRetutn).ConfigureAwait(false); + + + var tasksRetutn1 = new Task[ReturnCount]; + for (int j = ReturnCount * i; j < ReturnCount * (i + 1); j++) + { + var info = infos[j]; + + int indexTmp = j - ReturnCount * i; + + // var copter = info.Copter; + if (info.RTLStage == 2) // 当前阶段小于等于1时进入 + { + tasksRetutn1[indexTmp] = ReturnToLandSecondTaskAsync(info); + } + else + { + tasksRetutn1[indexTmp] = Task.Run(async () => { await Task.Delay(1).ConfigureAwait(false); }); + } + } + await Task.WhenAll(tasksRetutn1).ConfigureAwait(false); + + + + + if (_flightTaskManager.IsPaused == false) + { + + for (int j = ReturnCount * i; j < ReturnCount * (i + 1); j++) + { + var info = infos[j]; + info.RTLStage = 0; + } + + } + } + + + + if (residualPart > 0) + { + var tasksreturn = new Task[residualPart]; + + for (int j = integerPart * ReturnCount; j < ReturnCount * integerPart + residualPart; j++) + { + var info = infos[j]; + int indexTmp = j - ReturnCount * integerPart; + // var copter = info.Copter; + if (info.RTLStage <= 1) // 当前阶段小于等于1时进入 + { + tasksreturn[indexTmp] = ReturnToLandTaskFlySingleCopterAsync(info); + } + else + { + tasksreturn[indexTmp] = Task.Run(async () => { await Task.Delay(1).ConfigureAwait(false); }); + } + } + await Task.WhenAll(tasksreturn).ConfigureAwait(false); + + + var tasksRetutn1 = new Task[residualPart]; + for (int j = integerPart * ReturnCount; j < ReturnCount * integerPart + residualPart; j++) + { + var info = infos[j]; + int indexTmp = j - ReturnCount * integerPart; + // var copter = info.Copter; + if (info.RTLStage == 2) // 当前阶段小于等于1时进入 + { + tasksRetutn1[indexTmp] = ReturnToLandSecondTaskAsync(info); + } + else + { + tasksRetutn1[indexTmp] = Task.Run(async () => { await Task.Delay(1).ConfigureAwait(false); }); + } + } + await Task.WhenAll(tasksRetutn1).ConfigureAwait(false); + + if (_flightTaskManager.IsPaused == false) + { + + for (int j = integerPart * ReturnCount; j < ReturnCount * integerPart + residualPart; j++) + { + var info = infos[j]; + info.RTLStage = 0; + } + + } + } + + } + + } + + + //原地下降高度到15米,然后返回起飞点 private async Task ReturnToLandTaskFlySingleCopterAsync(FlightTaskSingleCopterInfo info) { float takeOffAlt = 15.0f; @@ -137,6 +262,7 @@ namespace Plane.FormationCreator.Formation } + //在起飞点上空从15米降落到4米,然后切land模式 private async Task ReturnToLandSecondTaskAsync(FlightTaskSingleCopterInfo info) { // await Task.Run(async () => diff --git a/Plane.FormationCreator/Formation/FlightTask_TakeOff.cs b/Plane.FormationCreator/Formation/FlightTask_TakeOff.cs index 6320551..1a62a41 100644 --- a/Plane.FormationCreator/Formation/FlightTask_TakeOff.cs +++ b/Plane.FormationCreator/Formation/FlightTask_TakeOff.cs @@ -49,14 +49,14 @@ namespace Plane.FormationCreator.Formation } // 几架飞机同时起飞,参数为takeOffCount - public async Task RunTakeOffTask2Async() + public async Task MutilRunTakeOffTaskAsync(int takeCount) { int TaskCount = _flightTaskManager.Tasks.Count(); if (TaskCount > 1) { var infos = SingleCopterInfos; - int takeOffCount = 5; + int takeOffCount = takeCount; int copterCount = infos.Count; int integerPart = copterCount / takeOffCount; int residualPart = copterCount % takeOffCount;