Skip to content

Commit

Permalink
fix(initialheading): Dont allow initial heading recycle on aircraft o…
Browse files Browse the repository at this point in the history
…ut of range (#431)

* fix(initialheading): Dont allow initial heading recycle on aircraft out of range

Fix #429

* Format
  • Loading branch information
AndyTWF committed Feb 12, 2022
1 parent cd3fd0e commit e4fd211
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 4 deletions.
13 changes: 11 additions & 2 deletions src/plugin/initialheading/InitialHeadingEventHandler.cpp
Expand Up @@ -158,24 +158,33 @@ namespace UKControllerPlugin::InitialHeading {
auto InitialHeadingEventHandler::MeetsAssignmentConditions(
EuroScopeCFlightPlanInterface& flightPlan, EuroScopeCRadarTargetInterface& radarTarget) const -> bool
{
return radarTarget.GetFlightLevel() != 0 && flightPlan.GetDistanceFromOrigin() != 0.0 &&
return IsNotOutOfRange(flightPlan, radarTarget) &&
radarTarget.GetFlightLevel() <= this->assignmentMaxAltitude &&
flightPlan.GetDistanceFromOrigin() <= this->assignmentMaxDistanceFromOrigin &&
radarTarget.GetGroundSpeed() <= this->assignmentMaxSpeed && !flightPlan.HasControllerAssignedHeading() &&
!flightPlan.IsTracked() && !flightPlan.IsSimulated() &&
this->airfieldOwnership.DeliveryControlProvidedByUser(flightPlan.GetOrigin());
}

auto InitialHeadingEventHandler::IsNotOutOfRange(
EuroScopeCFlightPlanInterface& flightplan, EuroScopeCRadarTargetInterface& radarTarget) -> bool
{
return radarTarget.GetFlightLevel() != 0 && flightplan.GetDistanceFromOrigin() != 0.0;
;
}

/*
* Force assignments are allowed if the aircraft is:
*
* 1. Not tracked
* 2. Tracked by the current user
* 3. Not got the all zero values, because EuroScope
*/
auto InitialHeadingEventHandler::MeetsForceAssignmentConditions(
EuroScopeCFlightPlanInterface& flightplan, EuroScopeCRadarTargetInterface& radarTarget) -> bool
{
return !flightplan.IsTracked() || flightplan.IsTrackedByUser();
return (!flightplan.IsTracked() || flightplan.IsTrackedByUser()) && IsNotOutOfRange(flightplan, radarTarget) &&
flightplan.GetDistanceFromOrigin() < forceAssignmentMaxDistanceFromOrigin;
}

/*
Expand Down
5 changes: 5 additions & 0 deletions src/plugin/initialheading/InitialHeadingEventHandler.h
Expand Up @@ -71,6 +71,10 @@ namespace UKControllerPlugin::InitialHeading {
Euroscope::EuroScopeCFlightPlanInterface& flightplan,
Euroscope::EuroScopeCRadarTargetInterface& radarTarget) -> bool;

static auto IsNotOutOfRange(
Euroscope::EuroScopeCFlightPlanInterface& flightplan,
Euroscope::EuroScopeCRadarTargetInterface& radarTarget) -> bool;

// Used to generate initial headings.
const Sid::SidMapperInterface& sidMapper;

Expand All @@ -95,6 +99,7 @@ namespace UKControllerPlugin::InitialHeading {
// The maximum distance from the airfield that an aircraft can be untracked
// to be considered for an heading update.
const double assignmentMaxDistanceFromOrigin = 3.0;
inline static const double forceAssignmentMaxDistanceFromOrigin = 10.0;

// Then maximum speed that for assigning initial headings.
const int assignmentMaxSpeed = 40;
Expand Down
60 changes: 58 additions & 2 deletions test/plugin/initialheading/InitialHeadingEventHandlerTest.cpp
Expand Up @@ -528,9 +528,11 @@ namespace UKControllerPluginTest {

ON_CALL(this->mockFlightPlan, IsTracked()).WillByDefault(Return(false));

EXPECT_CALL(this->mockFlightPlan, SetHeading(125)).Times(1);
ON_CALL(this->mockFlightPlan, GetDistanceFromOrigin()).WillByDefault(Return(5));

ON_CALL(this->mockRadarTarget, GetFlightLevel()).WillByDefault(Return(500));

EXPECT_CALL(mockFlightPlan, GetDistanceFromOrigin()).Times(0);
EXPECT_CALL(this->mockFlightPlan, SetHeading(125)).Times(1);

EXPECT_CALL(mockFlightPlan, HasControllerAssignedHeading()).Times(0);

Expand All @@ -556,6 +558,10 @@ namespace UKControllerPluginTest {

ON_CALL(this->mockFlightPlan, IsTracked()).WillByDefault(Return(false));

ON_CALL(this->mockFlightPlan, GetDistanceFromOrigin()).WillByDefault(Return(5));

ON_CALL(this->mockRadarTarget, GetFlightLevel()).WillByDefault(Return(500));

EXPECT_CALL(this->mockFlightPlan, SetHeading(125)).Times(1);

handler.RecycleInitialHeading(this->mockFlightPlan, this->mockRadarTarget, "", POINT());
Expand All @@ -577,11 +583,53 @@ namespace UKControllerPluginTest {

ON_CALL(this->mockFlightPlan, IsTrackedByUser()).WillByDefault(Return(true));

ON_CALL(this->mockFlightPlan, GetDistanceFromOrigin()).WillByDefault(Return(5));

ON_CALL(this->mockRadarTarget, GetFlightLevel()).WillByDefault(Return(500));

EXPECT_CALL(this->mockFlightPlan, SetHeading(125)).Times(1);

handler.RecycleInitialHeading(this->mockFlightPlan, this->mockRadarTarget, "", POINT());
}

TEST_F(InitialHeadingEventHandlerTest, RecycleDoesNothingIfAircraftOutOfRange)
{
ON_CALL(this->mockFlightPlan, GetSidName()).WillByDefault(Return("ADMAG2X"));

ON_CALL(this->mockFlightPlan, GetOrigin()).WillByDefault(Return("EGKK"));

ON_CALL(this->mockFlightPlan, GetCallsign()).WillByDefault(Return("BAW123"));

ON_CALL(this->mockFlightPlan, IsTracked()).WillByDefault(Return(false));

ON_CALL(this->mockFlightPlan, GetDistanceFromOrigin()).WillByDefault(Return(0));

ON_CALL(this->mockRadarTarget, GetFlightLevel()).WillByDefault(Return(0));

EXPECT_CALL(this->mockFlightPlan, SetHeading(_)).Times(0);

handler.RecycleInitialHeading(this->mockFlightPlan, this->mockRadarTarget, "", POINT());
}

TEST_F(InitialHeadingEventHandlerTest, RecycleDoesNothingIfAircraftNotInAirportProximity)
{
ON_CALL(this->mockFlightPlan, GetSidName()).WillByDefault(Return("ADMAG2X"));

ON_CALL(this->mockFlightPlan, GetOrigin()).WillByDefault(Return("EGKK"));

ON_CALL(this->mockFlightPlan, GetCallsign()).WillByDefault(Return("BAW123"));

ON_CALL(this->mockFlightPlan, IsTracked()).WillByDefault(Return(false));

ON_CALL(this->mockFlightPlan, GetDistanceFromOrigin()).WillByDefault(Return(11));

ON_CALL(this->mockRadarTarget, GetFlightLevel()).WillByDefault(Return(500));

EXPECT_CALL(this->mockFlightPlan, SetHeading(_)).Times(0);

handler.RecycleInitialHeading(this->mockFlightPlan, this->mockRadarTarget, "", POINT());
}

TEST_F(InitialHeadingEventHandlerTest, RecycleDoesNothingIfAircraftTrackedByAnotherUser)
{
ON_CALL(this->mockFlightPlan, GetSidName()).WillByDefault(Return("ADMAG2X"));
Expand All @@ -594,6 +642,10 @@ namespace UKControllerPluginTest {

ON_CALL(this->mockFlightPlan, IsTrackedByUser()).WillByDefault(Return(false));

ON_CALL(this->mockFlightPlan, GetDistanceFromOrigin()).WillByDefault(Return(5));

ON_CALL(this->mockRadarTarget, GetFlightLevel()).WillByDefault(Return(500));

EXPECT_CALL(this->mockFlightPlan, SetHeading(_)).Times(0);

handler.RecycleInitialHeading(this->mockFlightPlan, this->mockRadarTarget, "", POINT());
Expand All @@ -613,6 +665,10 @@ namespace UKControllerPluginTest {

ON_CALL(this->mockFlightPlan, IsTracked()).WillByDefault(Return(false));

ON_CALL(this->mockFlightPlan, GetDistanceFromOrigin()).WillByDefault(Return(5));

ON_CALL(this->mockRadarTarget, GetFlightLevel()).WillByDefault(Return(500));

EXPECT_CALL(this->mockFlightPlan, SetHeading(_)).Times(0);

handler.RecycleInitialHeading(this->mockFlightPlan, this->mockRadarTarget, "", POINT());
Expand Down

0 comments on commit e4fd211

Please sign in to comment.