40#include "FGWaypoint.h"
41#include "input_output/FGXMLElement.h"
42#include "math/FGLocation.h"
43#include "models/FGFCS.h"
44#include "models/FGInertial.h"
45#include "initialization/FGInitialCondition.h"
46#include "input_output/FGLog.h"
58FGWaypoint::FGWaypoint(FGFCS* fcs, Element* element)
59 : FGFCSComponent(fcs, element)
61 if (Type ==
"WAYPOINT_HEADING") WaypointType = eHeading;
62 else if (Type ==
"WAYPOINT_DISTANCE") WaypointType = eDistance;
64 target_latitude_unit = 1.0;
65 target_longitude_unit = 1.0;
66 source_latitude_unit = 1.0;
67 source_longitude_unit = 1.0;
68 source = fcs->GetExec()->GetIC()->GetPosition();
70 auto PropertyManager = fcs->GetPropertyManager();
72 if (element->FindElement(
"target_latitude") ) {
73 target_latitude = std::make_unique<FGPropertyValue>(element->FindElementValue(
"target_latitude"),
74 PropertyManager, element);
75 if (element->FindElement(
"target_latitude")->HasAttribute(
"unit")) {
76 if (element->FindElement(
"target_latitude")->GetAttributeValue(
"unit") ==
"DEG") {
77 target_latitude_unit = 0.017453293;
81 XMLLogException err(element);
82 err <<
"Target latitude is required for waypoint component: " << Name <<
"\n";
86 if (element->FindElement(
"target_longitude") ) {
87 target_longitude = std::make_unique<FGPropertyValue>(element->FindElementValue(
"target_longitude"),
88 PropertyManager, element);
89 if (element->FindElement(
"target_longitude")->HasAttribute(
"unit")) {
90 if (element->FindElement(
"target_longitude")->GetAttributeValue(
"unit") ==
"DEG") {
91 target_longitude_unit = 0.017453293;
95 XMLLogException err(element);
96 err <<
"Target longitude is required for waypoint component: " << Name <<
"\n";
100 if (element->FindElement(
"source_latitude") ) {
101 source_latitude = std::make_unique<FGPropertyValue>(element->FindElementValue(
"source_latitude"),
102 PropertyManager, element);
103 if (element->FindElement(
"source_latitude")->HasAttribute(
"unit")) {
104 if (element->FindElement(
"source_latitude")->GetAttributeValue(
"unit") ==
"DEG") {
105 source_latitude_unit = 0.017453293;
109 XMLLogException err(element);
110 err <<
"Source latitude is required for waypoint component: " << Name <<
"\n";
114 if (element->FindElement(
"source_longitude") ) {
115 source_longitude = std::make_unique<FGPropertyValue>(element->FindElementValue(
"source_longitude"),
116 PropertyManager, element);
117 if (element->FindElement(
"source_longitude")->HasAttribute(
"unit")) {
118 if (element->FindElement(
"source_longitude")->GetAttributeValue(
"unit") ==
"DEG") {
119 source_longitude_unit = 0.017453293;
123 XMLLogException err(element);
124 err <<
"Source longitude is required for waypoint component: " << Name <<
"\n";
128 unit = element->GetAttributeValue(
"unit");
129 if (WaypointType == eHeading) {
131 if (unit ==
"DEG") eUnit = eDeg;
132 else if (unit ==
"RAD") eUnit = eRad;
134 XMLLogException err(element);
135 err <<
"Unknown unit " << unit <<
" in HEADING waypoint component, " <<
"\n";
143 if (unit ==
"FT") eUnit = eFeet;
144 else if (unit ==
"M") eUnit = eMeters;
146 XMLLogException err(element);
147 err <<
"Unknown unit " << unit <<
" in DISTANCE waypoint component, "
156 bind(element, PropertyManager.get());
162FGWaypoint::~FGWaypoint()
169bool FGWaypoint::Run(
void )
171 double source_latitude_rad = source_latitude->GetValue() * source_latitude_unit;
172 double source_longitude_rad = source_longitude->GetValue() * source_longitude_unit;
173 double target_latitude_rad = target_latitude->GetValue() * target_latitude_unit;
174 double target_longitude_rad = target_longitude->GetValue() * target_longitude_unit;
175 source.SetPositionGeodetic(source_longitude_rad, source_latitude_rad, 0.0);
177 if (fabs(target_latitude_rad) > M_PI/2.0) {
179 err <<
"\nTarget latitude in waypoint \"" << Name
180 <<
"\" must be less than or equal to 90 degrees.\n"
181 <<
"(is longitude being mistakenly supplied?)\n\n";
185 if (fabs(source_latitude_rad) > M_PI/2.0) {
187 err <<
"\nSource latitude in waypoint \"" << Name
188 <<
"\" must be less than or equal to 90 degrees.\n"
189 <<
"(is longitude being mistakenly supplied?)\n\n";
193 if (WaypointType == eHeading) {
195 double heading_to_waypoint_rad = source.GetHeadingTo(target_longitude_rad,
196 target_latitude_rad);
198 if (eUnit == eDeg) Output = heading_to_waypoint_rad * radtodeg;
199 else Output = heading_to_waypoint_rad;
203 double wp_distance = source.GetDistanceTo(target_longitude_rad,
204 target_latitude_rad);
205 if (eUnit == eMeters) Output = FeetToMeters(wp_distance);
206 else Output = wp_distance;
235void FGWaypoint::Debug(
int from)
237 if (debug_lvl <= 0)
return;
243 if (debug_lvl & 2 ) {
244 FGLogging log(LogLevel::DEBUG);
245 if (from == 0) log <<
"Instantiated: FGWaypoint\n";
246 if (from == 1) log <<
"Destroyed: FGWaypoint\n";
248 if (debug_lvl & 4 ) {
250 if (debug_lvl & 8 ) {
252 if (debug_lvl & 16) {
254 if (debug_lvl & 64) {
Main namespace for the JSBSim Flight Dynamics Model.