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"
57 FGWaypoint::FGWaypoint(FGFCS* fcs, Element* element)
58 : FGFCSComponent(fcs, element)
60 if (Type ==
"WAYPOINT_HEADING") WaypointType = eHeading;
61 else if (Type ==
"WAYPOINT_DISTANCE") WaypointType = eDistance;
63 target_latitude_unit = 1.0;
64 target_longitude_unit = 1.0;
65 source_latitude_unit = 1.0;
66 source_longitude_unit = 1.0;
67 source = fcs->GetExec()->GetIC()->GetPosition();
69 if (element->FindElement(
"target_latitude") ) {
70 target_latitude.reset(
new FGPropertyValue(element->FindElementValue(
"target_latitude"),
72 if (element->FindElement(
"target_latitude")->HasAttribute(
"unit")) {
73 if (element->FindElement(
"target_latitude")->GetAttributeValue(
"unit") ==
"DEG") {
74 target_latitude_unit = 0.017453293;
78 cerr << element->ReadFrom() << endl
79 <<
"Target latitude is required for waypoint component: " << Name
81 throw(
"Malformed waypoint definition");
84 if (element->FindElement(
"target_longitude") ) {
85 target_longitude.reset(
new FGPropertyValue(element->FindElementValue(
"target_longitude"),
87 if (element->FindElement(
"target_longitude")->HasAttribute(
"unit")) {
88 if (element->FindElement(
"target_longitude")->GetAttributeValue(
"unit") ==
"DEG") {
89 target_longitude_unit = 0.017453293;
93 cerr << element->ReadFrom() << endl
94 <<
"Target longitude is required for waypoint component: " << Name
96 throw(
"Malformed waypoint definition");
99 if (element->FindElement(
"source_latitude") ) {
100 source_latitude.reset(
new FGPropertyValue(element->FindElementValue(
"source_latitude"),
102 if (element->FindElement(
"source_latitude")->HasAttribute(
"unit")) {
103 if (element->FindElement(
"source_latitude")->GetAttributeValue(
"unit") ==
"DEG") {
104 source_latitude_unit = 0.017453293;
108 cerr << element->ReadFrom() << endl
109 <<
"Source latitude is required for waypoint component: " << Name
111 throw(
"Malformed waypoint definition");
114 if (element->FindElement(
"source_longitude") ) {
115 source_longitude.reset(
new FGPropertyValue(element->FindElementValue(
"source_longitude"),
117 if (element->FindElement(
"source_longitude")->HasAttribute(
"unit")) {
118 if (element->FindElement(
"source_longitude")->GetAttributeValue(
"unit") ==
"DEG") {
119 source_longitude_unit = 0.017453293;
123 cerr << element->ReadFrom() << endl
124 <<
"Source longitude is required for waypoint component: " << Name
126 throw(
"Malformed waypoint definition");
129 if (element->FindElement(
"radius"))
130 radius = element->FindElementValueAsNumberConvertTo(
"radius",
"FT");
132 radius = 20925646.32546;
135 unit = element->GetAttributeValue(
"unit");
136 if (WaypointType == eHeading) {
138 if (unit ==
"DEG") eUnit = eDeg;
139 else if (unit ==
"RAD") eUnit = eRad;
141 cerr << element->ReadFrom() << endl
142 <<
"Unknown unit " << unit <<
" in HEADING waypoint component, "
144 throw(
"Malformed waypoint definition");
151 if (unit ==
"FT") eUnit = eFeet;
152 else if (unit ==
"M") eUnit = eMeters;
154 cerr << element->ReadFrom() << endl
155 <<
"Unknown unit " << unit <<
" in DISTANCE waypoint component, "
157 throw(
"Malformed waypoint definition");
170 FGWaypoint::~FGWaypoint()
177 bool FGWaypoint::Run(
void )
179 double source_latitude_rad = source_latitude->GetValue() * source_latitude_unit;
180 double source_longitude_rad = source_longitude->GetValue() * source_longitude_unit;
181 double target_latitude_rad = target_latitude->GetValue() * target_latitude_unit;
182 double target_longitude_rad = target_longitude->GetValue() * target_longitude_unit;
183 source.
SetPosition(source_longitude_rad, source_latitude_rad, radius);
185 if (fabs(target_latitude_rad) > M_PI/2.0) {
187 cerr <<
"Target latitude in waypoint \"" << Name <<
"\" must be less than or equal to 90 degrees." << endl;
188 cerr <<
"(is longitude being mistakenly supplied?)" << endl;
190 throw(
"Waypoint target latitude exceeded 90 degrees.");
193 if (fabs(source_latitude_rad) > M_PI/2.0) {
195 cerr <<
"Source latitude in waypoint \"" << Name <<
"\" must be less than or equal to 90 degrees." << endl;
196 cerr <<
"(is longitude being mistakenly supplied?)" << endl;
198 throw(
"Source latitude exceeded 90 degrees.");
201 if (WaypointType == eHeading) {
203 double heading_to_waypoint_rad = source.
GetHeadingTo(target_longitude_rad,
204 target_latitude_rad);
206 if (eUnit == eDeg) Output = heading_to_waypoint_rad * radtodeg;
207 else Output = heading_to_waypoint_rad;
211 double wp_distance = source.
GetDistanceTo(target_longitude_rad,
212 target_latitude_rad);
213 if (eUnit == eMeters) Output =
FeetToMeters(wp_distance);
214 else Output = wp_distance;
243 void FGWaypoint::Debug(
int from)
245 if (debug_lvl <= 0)
return;
251 if (debug_lvl & 2 ) {
252 if (from == 0) cout <<
"Instantiated: FGWaypoint" << endl;
253 if (from == 1) cout <<
"Destroyed: FGWaypoint" << endl;
255 if (debug_lvl & 4 ) {
257 if (debug_lvl & 8 ) {
259 if (debug_lvl & 16) {
261 if (debug_lvl & 64) {