1 /**********************************************************************
3 FILENAME: uiuc_wrapper.cpp
5 ----------------------------------------------------------------------
7 DESCRIPTION: A wrapper(interface) between the UIUC Aeromodel (C++ files)
8 and the LaRCsim FDM (C files)
10 ----------------------------------------------------------------------
14 ----------------------------------------------------------------------
18 ----------------------------------------------------------------------
20 HISTORY: 01/26/2000 initial release
21 03/09/2001 (DPM) added support for gear
22 06/18/2001 (RD) Made uiuc_recorder its own routine.
23 07/19/2001 (RD) Added uiuc_vel_init() to initialize
25 08/27/2001 (RD) Added uiuc_initial_init() to help
26 in starting an A/C at an initial condition
28 ----------------------------------------------------------------------
30 AUTHOR(S): Bipin Sehgal <bsehgal@uiuc.edu>
31 Robert Deters <rdeters@uiuc.edu>
32 David Megginson <david@megginson.com>
34 ----------------------------------------------------------------------
38 ----------------------------------------------------------------------
42 ----------------------------------------------------------------------
46 ----------------------------------------------------------------------
50 ----------------------------------------------------------------------
54 ----------------------------------------------------------------------
56 COPYRIGHT: (C) 2000 by Michael Selig
58 This program is free software; you can redistribute it and/or
59 modify it under the terms of the GNU General Public License
60 as published by the Free Software Foundation.
62 This program is distributed in the hope that it will be useful,
63 but WITHOUT ANY WARRANTY; without even the implied warranty of
64 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
65 GNU General Public License for more details.
67 You should have received a copy of the GNU General Public License
68 along with this program; if not, write to the Free Software
69 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
70 USA or view http://www.gnu.org/copyleft/gpl.html.
72 **********************************************************************/
74 #include <simgear/compiler.h>
75 #include <simgear/misc/sg_path.hxx>
76 #include <Aircraft/aircraft.hxx>
77 #include <Main/fg_props.hxx>
79 #include "uiuc_aircraft.h"
80 #include "uiuc_aircraftdir.h"
81 #include "uiuc_coefficients.h"
82 #include "uiuc_engine.h"
83 #include "uiuc_gear.h"
84 #include "uiuc_aerodeflections.h"
85 #include "uiuc_recorder.h"
86 #include "uiuc_menu.h"
87 #include "uiuc_betaprobe.h"
88 #include <FDM/LaRCsim/ls_generic.h>
89 // #include "Main/simple_udp.h"
90 #include "uiuc_fog.h" //321654
92 #if !defined (SG_HAVE_NATIVE_SGI_COMPILERS)
97 extern "C" void uiuc_init_aeromodel ();
98 extern "C" void uiuc_force_moment(double dt);
99 extern "C" void uiuc_engine_routine();
100 extern "C" void uiuc_gear_routine();
101 extern "C" void uiuc_record_routine(double dt);
102 extern "C" void uiuc_vel_init ();
103 extern "C" void uiuc_initial_init ();
105 AIRCRAFT *aircraft_ = new AIRCRAFT;
106 AIRCRAFTDIR *aircraftdir_ = new AIRCRAFTDIR;
108 // SendArray testarray(4950);
110 /* Convert float to string */
111 //string ftoa(double in)
113 // static char temp[20];
114 // sprintf(temp,"%g",in);
115 // return (string)temp;
118 void uiuc_initial_init ()
120 if (P_body_init_true)
121 P_body = P_body_init;
122 if (Q_body_init_true)
123 Q_body = Q_body_init;
124 if (R_body_init_true)
125 R_body = R_body_init;
134 if (U_body_init_true)
135 U_body = U_body_init;
136 if (V_body_init_true)
137 V_body = V_body_init;
138 if (W_body_init_true)
139 W_body = W_body_init;
143 void uiuc_vel_init ()
145 if (U_body_init_true && V_body_init_true && W_body_init_true)
147 double det_T_l_to_b, cof11, cof12, cof13, cof21, cof22, cof23, cof31, cof32, cof33;
149 det_T_l_to_b = T_local_to_body_11*(T_local_to_body_22*T_local_to_body_33-T_local_to_body_23*T_local_to_body_32) - T_local_to_body_12*(T_local_to_body_21*T_local_to_body_33-T_local_to_body_23*T_local_to_body_31) + T_local_to_body_13*(T_local_to_body_21*T_local_to_body_32-T_local_to_body_22*T_local_to_body_31);
150 cof11 = T_local_to_body_22 * T_local_to_body_33 - T_local_to_body_23 * T_local_to_body_32;
151 cof12 = T_local_to_body_23 * T_local_to_body_31 - T_local_to_body_21 * T_local_to_body_33;
152 cof13 = T_local_to_body_21 * T_local_to_body_32 - T_local_to_body_22 * T_local_to_body_31;
153 cof21 = T_local_to_body_13 * T_local_to_body_32 - T_local_to_body_12 * T_local_to_body_33;
154 cof22 = T_local_to_body_11 * T_local_to_body_33 - T_local_to_body_13 * T_local_to_body_31;
155 cof23 = T_local_to_body_12 * T_local_to_body_31 - T_local_to_body_11 * T_local_to_body_32;
156 cof31 = T_local_to_body_12 * T_local_to_body_23 - T_local_to_body_13 * T_local_to_body_22;
157 cof32 = T_local_to_body_13 * T_local_to_body_21 - T_local_to_body_11 * T_local_to_body_23;
158 cof33 = T_local_to_body_11 * T_local_to_body_22 - T_local_to_body_12 * T_local_to_body_21;
160 V_north = (cof11*U_body+cof21*V_body+cof31*W_body)/det_T_l_to_b;
161 V_east_rel_ground = (cof12*U_body+cof22*V_body+cof32*W_body)/det_T_l_to_b;
162 V_down = (cof13*U_body+cof23*V_body+cof33*W_body)/det_T_l_to_b;
164 V_east = V_east_rel_ground + OMEGA_EARTH*Sea_level_radius*cos(Lat_geocentric);
168 void uiuc_init_aeromodel ()
170 SGPath path(globals->get_fg_root());
171 path.append(aircraft_dir);
172 path.append("aircraft.dat");
173 cout << "We are using "<< path.str() << endl;
174 uiuc_initializemaps(); // Initialize the <string,int> maps
175 uiuc_menu(path.str()); // Read the specified aircraft file
178 void uiuc_force_moment(double dt)
180 double qS = Dynamic_pressure * Sw;
181 double qScbar = qS * cbar;
182 double qSb = qS * bw;
184 uiuc_aerodeflections(dt);
187 /* Calculate the wind axis forces */
190 CD = -CX * cos(Alpha) - CZ * sin(Alpha);
191 CL = CX * sin(Alpha) - CZ * cos(Alpha);
193 F_X_wind = -1 * CD * qS;
195 F_Z_wind = -1 * CL * qS;
197 /* wind-axis to body-axis transformation */
198 F_X_aero = F_X_wind * Cos_alpha * Cos_beta - F_Y_wind * Cos_alpha * Sin_beta - F_Z_wind * Sin_alpha;
199 F_Y_aero = F_X_wind * Sin_beta + F_Y_wind * Cos_beta;
200 F_Z_aero = F_X_wind * Sin_alpha * Cos_beta - F_Y_wind * Sin_alpha * Sin_beta + F_Z_wind * Cos_alpha;
202 /* Moment calculations */
204 M_m_aero = Cm * qScbar;
207 /* Call flight data recorder */
208 // if (Simtime >= recordStartTime)
209 // uiuc_recorder(dt);
220 vis = fgGetDouble("/environment/visibility-m");
225 fgSetDouble("/environment/visibility-m", vis);
229 /* Send data on the network to the Glass Cockpit */
233 // input += " stick_right " + ftoa(Lat_control);
234 // input += " rudder_left " + ftoa(-Rudder_pedal);
235 // input += " stick_forward " + ftoa(Long_control);
236 // input += " stick_trim_forward " + ftoa(Long_trim);
237 // input += " vehicle_pitch " + ftoa(Theta * 180.0 / 3.14);
238 // input += " vehicle_roll " + ftoa(Phi * 180.0 / 3.14);
239 // input += " vehicle_speed " + ftoa(V_rel_wind);
240 // input += " throttle_forward " + ftoa(Throttle_pct);
241 // input += " altitude " + ftoa(Altitude);
242 // input += " climb_rate " + ftoa(-1.0*V_down_rel_ground);
244 // testarray.getHello();
245 // testarray.sendData(input);
247 /* End of Networking */
251 void uiuc_engine_routine()
256 void uiuc_gear_routine ()
261 void uiuc_record_routine(double dt)
263 if (Simtime >= recordStartTime)
266 //end uiuc_wrapper.cpp