71#include "models/FGFCS.h"
72#include "input_output/FGXMLElement.h"
73#include "input_output/FGLog.h"
85FGAngles::FGAngles(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element)
89 source_angle_unit = 1.0;
90 target_angle_unit = 1.0;
93 auto PropertyManager = fcs->GetPropertyManager();
95 if (element->FindElement(
"target_angle") ) {
96 target_angle_pNode = PropertyManager->GetNode(element->FindElementValue(
"target_angle"));
97 if (element->FindElement(
"target_angle")->HasAttribute(
"unit")) {
98 if (element->FindElement(
"target_angle")->GetAttributeValue(
"unit") ==
"DEG") {
99 target_angle_unit = 0.017453293;
103 XMLLogException err(element);
104 err <<
"Target angle is required for Angles component: " << Name <<
"\n";
108 if (element->FindElement(
"source_angle") ) {
109 source_angle_pNode = PropertyManager->GetNode(element->FindElementValue(
"source_angle"));
110 if (element->FindElement(
"source_angle")->HasAttribute(
"unit")) {
111 if (element->FindElement(
"source_angle")->GetAttributeValue(
"unit") ==
"DEG") {
112 source_angle_unit = 0.017453293;
116 XMLLogException err(element);
117 err <<
"Source angle is required for Angles component: " << Name <<
"\n";
121 unit = element->GetAttributeValue(
"unit");
123 if (unit ==
"DEG") output_unit = 180.0/M_PI;
124 else if (unit ==
"RAD") output_unit = 1.0;
126 XMLLogException err(element);
127 err <<
"Unknown unit " << unit <<
" in angle component, " << Name <<
"\n";
134 bind(element, PropertyManager.get());
147bool FGAngles::Run(
void )
149 source_angle = source_angle_pNode->getDoubleValue() * source_angle_unit;
150 target_angle = target_angle_pNode->getDoubleValue() * target_angle_unit;
152 double x1 = cos(source_angle);
153 double y1 = sin(source_angle);
154 double x2 = cos(target_angle);
155 double y2 = sin(target_angle);
157 double x1x2_y1y2 = max(-1.0, min(x1*x2 + y1*y2, 1.0));
158 double angle_to_heading_rad = acos(x1x2_y1y2);
162 if (x1y2 >= x2y1) Output = angle_to_heading_rad * output_unit;
163 else Output = -angle_to_heading_rad * output_unit;
190void FGAngles::Debug(
int from)
192 if (debug_lvl <= 0)
return;
198 if (debug_lvl & 2 ) {
199 FGLogging log(LogLevel::DEBUG);
200 if (from == 0) log <<
"Instantiated: FGAngles\n";
201 if (from == 1) log <<
"Destroyed: FGAngles\n";
203 if (debug_lvl & 4 ) {
205 if (debug_lvl & 8 ) {
207 if (debug_lvl & 16) {
209 if (debug_lvl & 64) {
Main namespace for the JSBSim Flight Dynamics Model.