允许多架同时起飞和降落
[FlightTask.cs]任务改为多架起飞降落 [FlightTask_ReturnToLand.cs]多架降落 [FlightTask_TakeOff.cs]多架起飞
This commit is contained in:
parent
94f366d011
commit
fda55a6e45
@ -100,10 +100,12 @@ namespace Plane.FormationCreator.Formation
|
|||||||
await RunLoiterTimeTaskAsync().ConfigureAwait(false);
|
await RunLoiterTimeTaskAsync().ConfigureAwait(false);
|
||||||
break;
|
break;
|
||||||
case FlightTaskType.TakeOff:
|
case FlightTaskType.TakeOff:
|
||||||
await RunTakeOffTask2Async().ConfigureAwait(false);
|
//多架同时起飞
|
||||||
|
await MutilRunTakeOffTaskAsync(2).ConfigureAwait(false);
|
||||||
break;
|
break;
|
||||||
case FlightTaskType.ReturnToLand: // Added by ZJF
|
case FlightTaskType.ReturnToLand: // Added by ZJF
|
||||||
await RunReturnToLandTaskAsync().ConfigureAwait(false);
|
//多架同时返航
|
||||||
|
await MutilRunReturnToLandTaskAsync(2).ConfigureAwait(false);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new InvalidOperationException();
|
throw new InvalidOperationException();
|
||||||
|
@ -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)
|
private async Task ReturnToLandTaskFlySingleCopterAsync(FlightTaskSingleCopterInfo info)
|
||||||
{
|
{
|
||||||
float takeOffAlt = 15.0f;
|
float takeOffAlt = 15.0f;
|
||||||
@ -137,6 +262,7 @@ namespace Plane.FormationCreator.Formation
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//在起飞点上空从15米降落到4米,然后切land模式
|
||||||
private async Task ReturnToLandSecondTaskAsync(FlightTaskSingleCopterInfo info)
|
private async Task ReturnToLandSecondTaskAsync(FlightTaskSingleCopterInfo info)
|
||||||
{
|
{
|
||||||
// await Task.Run(async () =>
|
// await Task.Run(async () =>
|
||||||
|
@ -49,14 +49,14 @@ namespace Plane.FormationCreator.Formation
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 几架飞机同时起飞,参数为takeOffCount
|
// 几架飞机同时起飞,参数为takeOffCount
|
||||||
public async Task RunTakeOffTask2Async()
|
public async Task MutilRunTakeOffTaskAsync(int takeCount)
|
||||||
{
|
{
|
||||||
int TaskCount = _flightTaskManager.Tasks.Count();
|
int TaskCount = _flightTaskManager.Tasks.Count();
|
||||||
if (TaskCount > 1)
|
if (TaskCount > 1)
|
||||||
{
|
{
|
||||||
var infos = SingleCopterInfos;
|
var infos = SingleCopterInfos;
|
||||||
|
|
||||||
int takeOffCount = 5;
|
int takeOffCount = takeCount;
|
||||||
int copterCount = infos.Count;
|
int copterCount = infos.Count;
|
||||||
int integerPart = copterCount / takeOffCount;
|
int integerPart = copterCount / takeOffCount;
|
||||||
int residualPart = copterCount % takeOffCount;
|
int residualPart = copterCount % takeOffCount;
|
||||||
|
Loading…
Reference in New Issue
Block a user