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>
78 #ifndef FG_NEW_ENVIRONMENT
79 #include <WeatherCM/FGLocalWeatherDatabase.h>
81 #include <Environment/environment.hxx>
84 #include "uiuc_aircraft.h"
85 #include "uiuc_aircraftdir.h"
86 #include "uiuc_coefficients.h"
87 #include "uiuc_engine.h"
88 #include "uiuc_gear.h"
89 #include "uiuc_aerodeflections.h"
90 #include "uiuc_recorder.h"
91 #include "uiuc_menu.h"
92 #include "uiuc_betaprobe.h"
93 #include <FDM/LaRCsim/ls_generic.h>
94 // #include "Main/simple_udp.h"
95 #include "uiuc_fog.h" //321654
97 #if !defined (SG_HAVE_NATIVE_SGI_COMPILERS)
102 extern "C" void uiuc_init_aeromodel ();
103 extern "C" void uiuc_force_moment(double dt);
104 extern "C" void uiuc_engine_routine();
105 extern "C" void uiuc_gear_routine();
106 extern "C" void uiuc_record_routine(double dt);
107 extern "C" void uiuc_vel_init ();
108 extern "C" void uiuc_initial_init ();
110 AIRCRAFT *aircraft_ = new AIRCRAFT;
111 AIRCRAFTDIR *aircraftdir_ = new AIRCRAFTDIR;
113 // SendArray testarray(4950);
115 /* Convert float to string */
116 //string ftoa(double in)
118 // static char temp[20];
119 // sprintf(temp,"%g",in);
120 // return (string)temp;
123 void uiuc_initial_init ()
125 if (P_body_init_true)
126 P_body = P_body_init;
127 if (Q_body_init_true)
128 Q_body = Q_body_init;
129 if (R_body_init_true)
130 R_body = R_body_init;
139 if (U_body_init_true)
140 U_body = U_body_init;
141 if (V_body_init_true)
142 V_body = V_body_init;
143 if (W_body_init_true)
144 W_body = W_body_init;
148 void uiuc_vel_init ()
150 if (U_body_init_true && V_body_init_true && W_body_init_true)
152 double det_T_l_to_b, cof11, cof12, cof13, cof21, cof22, cof23, cof31, cof32, cof33;
154 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);
155 cof11 = T_local_to_body_22 * T_local_to_body_33 - T_local_to_body_23 * T_local_to_body_32;
156 cof12 = T_local_to_body_23 * T_local_to_body_31 - T_local_to_body_21 * T_local_to_body_33;
157 cof13 = T_local_to_body_21 * T_local_to_body_32 - T_local_to_body_22 * T_local_to_body_31;
158 cof21 = T_local_to_body_13 * T_local_to_body_32 - T_local_to_body_12 * T_local_to_body_33;
159 cof22 = T_local_to_body_11 * T_local_to_body_33 - T_local_to_body_13 * T_local_to_body_31;
160 cof23 = T_local_to_body_12 * T_local_to_body_31 - T_local_to_body_11 * T_local_to_body_32;
161 cof31 = T_local_to_body_12 * T_local_to_body_23 - T_local_to_body_13 * T_local_to_body_22;
162 cof32 = T_local_to_body_13 * T_local_to_body_21 - T_local_to_body_11 * T_local_to_body_23;
163 cof33 = T_local_to_body_11 * T_local_to_body_22 - T_local_to_body_12 * T_local_to_body_21;
165 V_north = (cof11*U_body+cof21*V_body+cof31*W_body)/det_T_l_to_b;
166 V_east_rel_ground = (cof12*U_body+cof22*V_body+cof32*W_body)/det_T_l_to_b;
167 V_down = (cof13*U_body+cof23*V_body+cof33*W_body)/det_T_l_to_b;
169 V_east = V_east_rel_ground + OMEGA_EARTH*Sea_level_radius*cos(Lat_geocentric);
173 void uiuc_init_aeromodel ()
175 SGPath path(globals->get_fg_root());
176 path.append(aircraft_dir);
177 path.append("aircraft.dat");
178 cout << "We are using "<< path.str() << endl;
179 uiuc_initializemaps(); // Initialize the <string,int> maps
180 uiuc_menu(path.str()); // Read the specified aircraft file
183 void uiuc_force_moment(double dt)
185 double qS = Dynamic_pressure * Sw;
186 double qScbar = qS * cbar;
187 double qSb = qS * bw;
189 uiuc_aerodeflections(dt);
192 /* Calculate the wind axis forces */
195 CD = -CX * cos(Alpha) - CZ * sin(Alpha);
196 CL = CX * sin(Alpha) - CZ * cos(Alpha);
198 F_X_wind = -1 * CD * qS;
200 F_Z_wind = -1 * CL * qS;
202 /* wind-axis to body-axis transformation */
203 F_X_aero = F_X_wind * Cos_alpha * Cos_beta - F_Y_wind * Cos_alpha * Sin_beta - F_Z_wind * Sin_alpha;
204 F_Y_aero = F_X_wind * Sin_beta + F_Y_wind * Cos_beta;
205 F_Z_aero = F_X_wind * Sin_alpha * Cos_beta - F_Y_wind * Sin_alpha * Sin_beta + F_Z_wind * Cos_alpha;
207 /* Moment calculations */
209 M_m_aero = Cm * qScbar;
212 /* Call flight data recorder */
213 // if (Simtime >= recordStartTime)
214 // uiuc_recorder(dt);
225 #ifndef FG_NEW_ENVIRONMENT
226 vis = WeatherDatabase->getWeatherVisibility();
231 WeatherDatabase->setWeatherVisibility( vis );
233 vis = current_environment.get_visibility_m();
238 current_environment.set_visibility_m( vis );
243 /* Send data on the network to the Glass Cockpit */
247 // input += " stick_right " + ftoa(Lat_control);
248 // input += " rudder_left " + ftoa(-Rudder_pedal);
249 // input += " stick_forward " + ftoa(Long_control);
250 // input += " stick_trim_forward " + ftoa(Long_trim);
251 // input += " vehicle_pitch " + ftoa(Theta * 180.0 / 3.14);
252 // input += " vehicle_roll " + ftoa(Phi * 180.0 / 3.14);
253 // input += " vehicle_speed " + ftoa(V_rel_wind);
254 // input += " throttle_forward " + ftoa(Throttle_pct);
255 // input += " altitude " + ftoa(Altitude);
256 // input += " climb_rate " + ftoa(-1.0*V_down_rel_ground);
258 // testarray.getHello();
259 // testarray.sendData(input);
261 /* End of Networking */
265 void uiuc_engine_routine()
270 void uiuc_gear_routine ()
275 void uiuc_record_routine(double dt)
277 if (Simtime >= recordStartTime)
280 //end uiuc_wrapper.cpp