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

Fix VATSIM-UK#429
  • Loading branch information
AndyTWF committed Feb 11, 2022
1 parent ed2b5e5 commit 5a4cc4a
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 4 deletions.
13 changes: 11 additions & 2 deletions src/plugin/initialheading/InitialHeadingEventHandler.cpp
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
61 changes: 59 additions & 2 deletions test/plugin/initialheading/InitialHeadingEventHandlerTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -528,9 +528,12 @@ 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 +559,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 +584,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 +643,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 +666,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 5a4cc4a

Please sign in to comment.