1 // ADA.cxx -- interface to the "External"-ly driven ADA flight model
3 // This program is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU General Public License as
5 // published by the Free Software Foundation; either version 2 of the
6 // License, or (at your option) any later version.
8 // This program is distributed in the hope that it will be useful, but
9 // WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // General Public License for more details.
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 // Modified by Cdr. VS Renganthan <vsranga@ada.ernet.in>, 12 Oct 2K
21 #include <simgear/io/iochannel.hxx>
23 #include <Controls/controls.hxx>
28 #define numberofbytes 472
31 double number_of_bytes;
38 double earth_posn_angle;
39 double radius_to_vehicle;
40 double sea_level_radius;
55 double Gamma_vert_rad;
56 double Runway_altitude;
103 #define number_of_bytes sixdof_to_visuals.number_of_bytes
104 #define U_dot_local sixdof_to_visuals.U_dot_local
105 #define V_dot_local sixdof_to_visuals.V_dot_local
106 #define W_dot_local sixdof_to_visuals.W_dot_local
107 #define U_local sixdof_to_visuals.U_local
108 #define V_local sixdof_to_visuals.V_local
109 #define W_local sixdof_to_visuals.W_local
110 #define throttle sixdof_to_visuals.throttle
111 #define pstick sixdof_to_visuals.pstick
112 #define rstick sixdof_to_visuals.rstick
113 #define rpedal sixdof_to_visuals.rpedal
114 #define V_north sixdof_to_visuals.Vnorth
115 #define V_east sixdof_to_visuals.Veast
116 #define V_down sixdof_to_visuals.Vdown
117 #define V_calibrated_kts sixdof_to_visuals.Vcas_kts
118 #define P_body sixdof_to_visuals.prad
119 #define Q_body sixdof_to_visuals.qrad
120 #define R_body sixdof_to_visuals.rrad
121 #define Latitude_dot sixdof_to_visuals.latitude_dot
122 #define Longitude_dot sixdof_to_visuals.longitude_dot
123 #define Radius_dot sixdof_to_visuals.radius_dot
124 #define Latitude sixdof_to_visuals.latitude
125 #define Longitude sixdof_to_visuals.longitude
126 #define Lat_geocentric sixdof_to_visuals.lat_geoc
127 #define Lon_geocentric sixdof_to_visuals.lon_geoc
128 #define Radius_to_vehicle sixdof_to_visuals.radius_to_vehicle
129 #define Altitude sixdof_to_visuals.altitude
130 #define Phi sixdof_to_visuals.phirad
131 #define Theta sixdof_to_visuals.thetrad
132 #define Psi sixdof_to_visuals.psirad
133 #define Alpha sixdof_to_visuals.alpharad
134 #define Beta sixdof_to_visuals.betarad
135 #define Sea_level_radius sixdof_to_visuals.sea_level_radius
136 #define Earth_position_angle sixdof_to_visuals.earth_posn_angle
137 #define Runway_altitude sixdof_to_visuals.Runway_altitude
138 #define Gamma_vert_rad sixdof_to_visuals.Gamma_vert_rad
139 #define Machno sixdof_to_visuals.Machno
140 #define anxg sixdof_to_visuals.anxg
141 #define anyg sixdof_to_visuals.anyg
142 #define anzg sixdof_to_visuals.anzg
145 // Initialize the ADA flight model, dt is the time increment
146 // for each subsequent iteration through the EOM
147 bool FGADA::init( double dt ) {
148 // cout << "FGADA::init()" << endl;
150 char Buffer[numberofbytes];
152 // set valid time for this record
155 printf("\nInitialising UDP sockets\n");
156 // initialise a "udp" socket
157 fdmsock = new SGSocket( "reddy_pc", "5001", "udp" );
160 bool result = fdmsock->open(SG_IO_OUT);
161 if (result == false) {
162 printf ("Socket Open Error\n");
164 // Dummy Write FGExternal structure from socket to establish connection
165 int result = fdmsock->write(Buffer, numberofbytes);
166 printf("Connection established.\n");
173 // Run an iteration of the EOM. This is essentially a NOP here
174 // because these values are getting filled in elsewhere based on
176 bool FGADA::update( int multiloop ) {
177 // cout << "FGADA::update()" << endl;
179 char Buffer[numberofbytes];
181 // Read FGExternal structure from socket
183 int result = fdmsock->read(Buffer, numberofbytes);
184 if (result == numberofbytes) {
185 // Copy buffer into FGExternal structure
186 memcpy (&sixdof_to_visuals, &Buffer, sizeof (Buffer));
192 //cout << endl << sixdof_to_visuals.aux18 << endl;
193 // Close Visuals through message/flag from Flight model
194 if (sixdof_to_visuals.aux18 == 1) {
198 //cout << endl << sixdof_to_visuals.aux18 << endl;
200 // Convert from the FGExternal struct to the FGInterface struct (input)
206 // Convert from the FGInterface struct to the FGADA struct (output)
207 bool FGADA::copy_to_FGADA () {
213 // Convert from the FGADA struct to the FGInterface struct (input)
214 bool FGADA::copy_from_FGADA() {
217 _set_Velocities_Local( V_north, V_east, V_down );
218 _set_V_calibrated_kts( V_calibrated_kts );
221 _set_Omega_Body( P_body, Q_body, R_body );
222 _set_Geocentric_Rates( Latitude_dot, Longitude_dot, Radius_dot );
224 // FG_LOG( FG_FLIGHT, FG_DEBUG, "lon = " << Longitude
225 // << " lat_geoc = " << Lat_geocentric << " lat_geod = " << Latitude
226 // << " alt = " << Altitude << " sl_radius = " << Sea_level_radius
227 // << " radius_to_vehicle = " << Radius_to_vehicle );
230 _set_Geocentric_Position( Lat_geocentric, Lon_geocentric,
232 _set_Geodetic_Position( Latitude, Longitude, Altitude );
233 _set_Euler_Angles( Phi, Theta, Psi );
235 // Miscellaneous quantities
238 _set_Gamma_vert_rad( Gamma_vert_rad );
239 _set_Sea_level_radius( Sea_level_radius );
240 _set_Earth_position_angle( Earth_position_angle );
241 _set_Runway_altitude( Runway_altitude );
242 _set_sin_lat_geocentric(Lat_geocentric);
243 _set_cos_lat_geocentric(Lat_geocentric);
244 _set_sin_cos_longitude(Longitude);
245 _set_sin_cos_latitude(Latitude);
246 _set_Accels_Local( U_dot_local, V_dot_local, W_dot_local );
247 _set_Velocities_Ground( U_local, V_local, W_local );
248 _set_Accels_CG_Body_N( anxg,anyg,anzg);
249 _set_Mach_number( Machno);
251 // printf("sr=%f\n",Sea_level_radius);
252 // printf("psi = %f %f\n",Psi,Psi*RAD_TO_DEG);
255 controls.set_throttle(0,throttle/131.0);
256 controls.set_elevator(pstick);
257 controls.set_aileron(rstick);
258 controls.set_rudder(rpedal);
260 // auxilliary parameters for HUD
261 set_iaux1(sixdof_to_visuals.iaux1);
262 set_iaux2(sixdof_to_visuals.iaux2);
263 set_iaux3(sixdof_to_visuals.iaux3);
264 set_iaux4(sixdof_to_visuals.iaux4);
265 set_iaux5(sixdof_to_visuals.iaux5);
266 set_iaux6(sixdof_to_visuals.iaux6);
267 set_iaux7(sixdof_to_visuals.iaux7);
268 set_iaux8(sixdof_to_visuals.iaux8);
269 set_iaux9(sixdof_to_visuals.iaux9);
270 set_iaux10(sixdof_to_visuals.iaux10);
271 set_iaux11(sixdof_to_visuals.iaux11);
272 set_iaux12(sixdof_to_visuals.iaux12);
273 set_aux1(sixdof_to_visuals.aux1);
274 set_aux2(sixdof_to_visuals.aux2);
275 set_aux3(sixdof_to_visuals.aux3);
276 set_aux4(sixdof_to_visuals.aux4);
277 set_aux5(sixdof_to_visuals.aux5);
278 set_aux6(sixdof_to_visuals.aux6);
279 set_aux7(sixdof_to_visuals.aux7);
280 set_aux8(sixdof_to_visuals.aux8);
281 set_aux9(sixdof_to_visuals.aux9);
282 set_aux10(sixdof_to_visuals.aux10);
283 set_aux11(sixdof_to_visuals.aux11);
284 set_aux12(sixdof_to_visuals.aux12);
285 set_aux13(sixdof_to_visuals.aux13);
286 set_aux14(sixdof_to_visuals.aux14);
287 set_aux15(sixdof_to_visuals.aux15);
288 set_aux16(sixdof_to_visuals.aux16);
289 set_aux17(sixdof_to_visuals.aux17);
290 set_aux18(sixdof_to_visuals.aux18);
292 cout << endl << sixdof_to_visuals.aux18 << endl;