允许多架同时起飞和降落

[FlightTask.cs]任务改为多架起飞降落
[FlightTask_ReturnToLand.cs]多架降落
[FlightTask_TakeOff.cs]多架起飞
This commit is contained in:
pxzleo 2017-03-11 23:03:12 +08:00
parent 94f366d011
commit fda55a6e45
3 changed files with 132 additions and 4 deletions

View File

@ -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();

View File

@ -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 () =>

View File

@ -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;