1
0
Fork 0

GPS/FP radial-intercept tests

By Jonathan Redpath, with some additions from me. Starting to exercise
both GPS and route-path for radial intercepts
This commit is contained in:
James Turner 2020-04-20 10:45:20 +01:00
parent 492c6daeca
commit b016c4b489
6 changed files with 84 additions and 7 deletions

View file

@ -1215,3 +1215,61 @@ void GPSTests::testTurnAnticipation()
{ {
} }
void GPSTests::testRadialIntercept()
{
//FGTestApi::setUp::logPositionToKML("gps_radial_intercept");
auto rm = globals->get_subsystem<FGRouteMgr>();
auto fp = new FlightPlan;
rm->setFlightPlan(fp);
FGTestApi::setUp::populateFPWithoutNasal(fp, "LFKC", "36", "LIRF", "25", "BUNAX BEBEV AJO");
// insert KC502 manually
fp->insertWayptAtIndex(new BasicWaypt(SGGeod::fromDeg(8.78333, 42.566), "KC502", fp), 1);
SGGeod pos = SGGeod::fromDeg(8.445556,42.216944);
auto intc = new RadialIntercept(fp, "INTC", pos, 230, 5);
fp->insertWayptAtIndex(intc, 3);
// FGTestApi::writeFlightPlanToKML(fp);
// position slightly before BUNAX
SGGeod initPos = fp->pointAlongRoute(2, -3.0);
// takes the place of the Nasal delegates
auto testDelegate = new TestFPDelegate;
testDelegate->thePlan = fp;
CPPUNIT_ASSERT(rm->activate());
fp->addDelegate(testDelegate);
auto gps = setupStandardGPS();
FGTestApi::setPositionAndStabilise(initPos);
auto gpsNode = globals->get_props()->getNode("instrumentation/gps");
gpsNode->setBoolValue("config/delegate-sequencing", true);
gpsNode->setStringValue("command", "leg");
fp->setCurrentIndex(2);
CPPUNIT_ASSERT_EQUAL(string{"BUNAX"}, string{gpsNode->getStringValue("wp/wp[1]/ID")});
CPPUNIT_ASSERT_DOUBLES_EQUAL(312, gpsNode->getDoubleValue("wp/leg-true-course-deg"), 1.0);
auto pilot = SGSharedPtr<FGTestApi::TestPilot>(new FGTestApi::TestPilot);
pilot->resetAtPosition(initPos);
pilot->setCourseTrue(fp->legAtIndex(2)->courseDeg());
pilot->setSpeedKts(300); // decent speed to make things tougher
pilot->flyGPSCourse(gps);
bool ok = FGTestApi::runForTimeWithCheck(600.0, [fp]() {
return fp->currentIndex() == 4;
});
CPPUNIT_ASSERT(ok);
// flying to BEBEV now
CPPUNIT_ASSERT_DOUBLES_EQUAL(185, gpsNode->getDoubleValue("wp/leg-true-course-deg"), 1.0);
FGTestApi::runForTime(30.0);
}

View file

@ -52,6 +52,7 @@ class GPSTests : public CppUnit::TestFixture
CPPUNIT_TEST(testLegIntercept); CPPUNIT_TEST(testLegIntercept);
CPPUNIT_TEST(testDirectToLegOnFlightplanAndResumeBuiltin); CPPUNIT_TEST(testDirectToLegOnFlightplanAndResumeBuiltin);
CPPUNIT_TEST(testBuiltinRevertToOBSAtEnd); CPPUNIT_TEST(testBuiltinRevertToOBSAtEnd);
CPPUNIT_TEST(testRadialIntercept);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
@ -84,6 +85,7 @@ public:
void testLegIntercept(); void testLegIntercept();
void testDirectToLegOnFlightplanAndResumeBuiltin(); void testDirectToLegOnFlightplanAndResumeBuiltin();
void testBuiltinRevertToOBSAtEnd(); void testBuiltinRevertToOBSAtEnd();
void testRadialIntercept();
}; };
#endif // _FG_GPS_UNIT_TESTS_HXX #endif // _FG_GPS_UNIT_TESTS_HXX

View file

@ -177,7 +177,7 @@ void RNAVProcedureTests::testBasic()
void RNAVProcedureTests::testHeadingToAlt() void RNAVProcedureTests::testHeadingToAlt()
{ {
auto vhhh = FGAirport::findByIdent("VHHH"); auto vhhh = FGAirport::findByIdent("VHHH");
FGTestApi::setUp::logPositionToKML("heading_to_alt"); // FGTestApi::setUp::logPositionToKML("heading_to_alt");
auto rm = globals->get_subsystem<FGRouteMgr>(); auto rm = globals->get_subsystem<FGRouteMgr>();
auto fp = new FlightPlan; auto fp = new FlightPlan;
@ -195,7 +195,7 @@ void RNAVProcedureTests::testHeadingToAlt()
wp->setAltitude(4000, RESTRICT_ABOVE); wp->setAltitude(4000, RESTRICT_ABOVE);
fp->insertWayptAtIndex(wp, 1); // between the runway WP and HAZEL fp->insertWayptAtIndex(wp, 1); // between the runway WP and HAZEL
FGTestApi::writeFlightPlanToKML(fp); // FGTestApi::writeFlightPlanToKML(fp);
auto depRwy = fp->departureRunway(); auto depRwy = fp->departureRunway();
@ -267,7 +267,7 @@ void RNAVProcedureTests::testHeadingToAlt()
void RNAVProcedureTests::testUglyHeadingToAlt() void RNAVProcedureTests::testUglyHeadingToAlt()
{ {
auto vhhh = FGAirport::findByIdent("VHHH"); auto vhhh = FGAirport::findByIdent("VHHH");
FGTestApi::setUp::logPositionToKML("heading_to_alt_ugly"); // FGTestApi::setUp::logPositionToKML("heading_to_alt_ugly");
auto rm = globals->get_subsystem<FGRouteMgr>(); auto rm = globals->get_subsystem<FGRouteMgr>();
auto fp = new FlightPlan; auto fp = new FlightPlan;
@ -285,7 +285,7 @@ void RNAVProcedureTests::testUglyHeadingToAlt()
wp->setAltitude(4000, RESTRICT_ABOVE); wp->setAltitude(4000, RESTRICT_ABOVE);
fp->insertWayptAtIndex(wp, 1); // between the runway WP and HAZEL fp->insertWayptAtIndex(wp, 1); // between the runway WP and HAZEL
FGTestApi::writeFlightPlanToKML(fp); // FGTestApi::writeFlightPlanToKML(fp);
auto depRwy = fp->departureRunway(); auto depRwy = fp->departureRunway();
@ -363,7 +363,7 @@ void RNAVProcedureTests::testEGPH_TLA6C()
if (!sid) if (!sid)
return; return;
FGTestApi::setUp::logPositionToKML("procedure_egph_tla6c"); // FGTestApi::setUp::logPositionToKML("procedure_egph_tla6c");
auto rm = globals->get_subsystem<FGRouteMgr>(); auto rm = globals->get_subsystem<FGRouteMgr>();
auto fp = new FlightPlan; auto fp = new FlightPlan;
@ -388,7 +388,7 @@ void RNAVProcedureTests::testEGPH_TLA6C()
CPPUNIT_ASSERT_EQUAL(std::string{"D346T"}, fp->legAtIndex(3)->waypoint()->ident()); CPPUNIT_ASSERT_EQUAL(std::string{"D346T"}, fp->legAtIndex(3)->waypoint()->ident());
FGTestApi::writeFlightPlanToKML(fp); // FGTestApi::writeFlightPlanToKML(fp);
CPPUNIT_ASSERT(rm->activate()); CPPUNIT_ASSERT(rm->activate());

View file

@ -489,3 +489,18 @@ void FlightplanTests::testLeadingWPDynamic()
// distance will be invalid, but shouldn;t assert or crash :) // distance will be invalid, but shouldn;t assert or crash :)
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, f->totalDistanceNm(), 0.001); CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, f->totalDistanceNm(), 0.001);
} }
void FlightplanTests::testRadialIntercept()
{
// replicate AJO1R departure
FlightPlanRef f = makeTestFP("LFKC", "36", "LIRF", "25", "BUNAX BEBEV AJO");
f->insertWayptAtIndex(new BasicWaypt(SGGeod::fromDeg(8.78333, 42.566), "KC502", f), 1);
SGGeod pos = SGGeod::fromDeg(8.445556,42.216944);
auto intc = new RadialIntercept(f, "INTC", pos, 230, 5);
f->insertWayptAtIndex(intc, 3); // between BUNAX and BEBEV
RoutePath rtepath(f);
CPPUNIT_ASSERT_DOUBLES_EQUAL(232, f->legAtIndex(3)->courseDeg(), 1.0);
}

View file

@ -44,6 +44,7 @@ class FlightplanTests : public CppUnit::TestFixture
CPPUNIT_TEST(testOnlyDiscontinuityRoute); CPPUNIT_TEST(testOnlyDiscontinuityRoute);
CPPUNIT_TEST(testBasicDiscontinuity); CPPUNIT_TEST(testBasicDiscontinuity);
CPPUNIT_TEST(testLeadingWPDynamic); CPPUNIT_TEST(testLeadingWPDynamic);
CPPUNIT_TEST(testRadialIntercept);
// CPPUNIT_TEST(testParseICAORoute); // CPPUNIT_TEST(testParseICAORoute);
// CPPUNIT_TEST(testParseICANLowLevelRoute); // CPPUNIT_TEST(testParseICANLowLevelRoute);
@ -72,6 +73,7 @@ public:
void testBasicDiscontinuity(); void testBasicDiscontinuity();
void testOnlyDiscontinuityRoute(); void testOnlyDiscontinuityRoute();
void testLeadingWPDynamic(); void testLeadingWPDynamic();
void testRadialIntercept();
}; };
#endif // FG_FLIGHTPLAN_UNIT_TESTS_HXX #endif // FG_FLIGHTPLAN_UNIT_TESTS_HXX

View file

@ -281,7 +281,7 @@ void RouteManagerTests::testDirectToLegOnFlightplanAndResume()
void RouteManagerTests::testSequenceDiscontinuityAndResume() void RouteManagerTests::testSequenceDiscontinuityAndResume()
{ {
FGTestApi::setUp::logPositionToKML("rm_seq_discon_resume_leg"); // FGTestApi::setUp::logPositionToKML("rm_seq_discon_resume_leg");
FlightPlanRef fp1 = makeTestFP("LIRF", "16R", "LEBL", "07L", FlightPlanRef fp1 = makeTestFP("LIRF", "16R", "LEBL", "07L",
"GITRI BALEN MUREN TOSNU"); "GITRI BALEN MUREN TOSNU");