Added variables necessary for new abilities.
/FDM/UIUCModel/uiuc_coefficients.cpp
/FDM/UIUCModel/uiuc_coefficients.h
/FDM/UIUCModel/uiuc_coef_lift.cpp
Added CZfa.
/FDM/UIUCModel/uiuc_controlInput.cpp
Added aileron and rudder inputs.
/FDM/UIUCModel/uiuc_engine.cpp
Added throttle input.
/FDM/UIUCModel/uiuc_engine.h
/FDM/UIUCModel/uiuc_map_CL.cpp
/FDM/UIUCModel/uiuc_map_engine.cpp
/FDM/UIUCModel/uiuc_map_init.cpp
/FDM/UIUCModel/uiuc_menu.cpp
/FDM/UIUCModel/uiuc_wrapper.cpp
Added a few new functions.
/FDM/UIUCModel/uiuc_wrapper.h
/FDM/UIUCModel/uiuc_map_controlSurface.cpp
/FDM/UIUCModel/uiuc_initializemaps.cpp
/FDM/UIUCModel/uiuc_initializemaps.h
/FDM/UIUCModel/uiuc_map_keyword.cpp
/FDM/UIUCModel/Makefile.am
/Main/Makefile.am
added files
/FDM/UIUCModel/uiuc_map_fog.cpp
For the visibility ability.
/FDM/UIUCModel/uiuc_map_fog.h
/FDM/UIUCModel/uiuc_fog.cpp
/FDM/UIUCModel/uiuc_fog.h
uiuc_controlInput.cpp uiuc_controlInput.h \
uiuc_convert.cpp uiuc_convert.h \
uiuc_engine.cpp uiuc_engine.h \
- uiuc_gear.cpp uiuc_gear.h \
+ uiuc_fog.cpp uiuc_fog.h \
+ uiuc_gear.cpp uiuc_gear.h\
uiuc_ice.cpp uiuc_ice.h \
uiuc_initializemaps.cpp uiuc_initializemaps.h \
uiuc_map_CD.cpp uiuc_map_CD.h \
uiuc_map_Croll.cpp uiuc_map_Croll.h \
uiuc_map_controlSurface.cpp uiuc_map_controlSurface.h \
uiuc_map_engine.cpp uiuc_map_engine.h \
+ uiuc_map_fog.cpp uiuc_map_fog.h \
uiuc_map_geometry.cpp uiuc_map_geometry.h \
uiuc_map_ice.cpp uiuc_map_ice.h \
uiuc_map_gear.cpp uiuc_map_gear.h \
04/01/2000 (JS) added throttle, longitudinal, lateral,
and rudder inputs to record map
03/09/2001 (DPM) added support for gear
-
+ 06/18/2001 (RD) added variables needed for aileron,
+ rudder, and throttle_pct input files.
+ Added Alpha, Beta, U_body, V_body, and
+ W_body to init map. Added variables
+ needed to ignore elevator, aileron, and
+ rudder pilot inputs. Added CZ as a function
+ of alpha, CZfa. Added twinotter to engine
+ group.
+ 07/05/2001 (RD) added pilot_elev_no_check, pilot_ail_no
+ _check, and pilot_rud_no_check variables.
+ This allows pilot to fly aircraft after the
+ input files have been used.
+ 08/27/2001 (RD) Added xxx_init_true and xxx_init for
+ P_body, Q_body, R_body, Phi, Theta, Psi,
+ U_body, V_body, and W_body to help in
+ starting the A/C at an initial condition.
----------------------------------------------------------------------
AUTHOR(S): Bipin Sehgal <bsehgal@uiuc.edu>
Jeff Scott <jscott@mail.com>
+ Robert Deters <rdeters@uiuc.edu>
David Megginson <david@megginson.com>
----------------------------------------------------------------------
/* Add more keywords here if required*/
enum {init_flag = 1000, geometry_flag, controlSurface_flag, controlsMixer_flag,
mass_flag, engine_flag, CD_flag, CL_flag, Cm_flag, CY_flag, Cl_flag,
- Cn_flag, gear_flag, ice_flag, record_flag, misc_flag};
+ Cn_flag, gear_flag, ice_flag, record_flag, misc_flag, fog_flag};
// init ======= Initial values for equation of motion
enum {Dx_pilot_flag = 2000, Dy_pilot_flag, Dz_pilot_flag,
P_body_flag, Q_body_flag, R_body_flag,
Phi_flag, Theta_flag, Psi_flag,
Long_trim_flag, recordRate_flag, recordStartTime_flag,
- nondim_rate_V_rel_wind_flag, dyn_on_speed_flag};
+ nondim_rate_V_rel_wind_flag, dyn_on_speed_flag, Alpha_flag,
+ Beta_flag, U_body_flag, V_body_flag, W_body_flag};
// geometry === Aircraft-specific geometric quantities
enum {bw_flag = 3000, cbar_flag, Sw_flag, ih_flag, bh_flag, ch_flag, Sh_flag};
// controlSurface = Control surface deflections and properties
enum {de_flag = 4000, da_flag, dr_flag,
set_Long_trim_flag, set_Long_trim_deg_flag, zero_Long_trim_flag,
- elevator_step_flag, elevator_singlet_flag, elevator_doublet_flag, elevator_input_flag};
+ elevator_step_flag, elevator_singlet_flag, elevator_doublet_flag, elevator_input_flag, aileron_input_flag, rudder_input_flag, pilot_elev_no_flag, pilot_ail_no_flag, pilot_rud_no_flag};
// controlsMixer == Controls mixer
enum {nomix_flag = 5000};
enum {Weight_flag = 6000, Mass_flag, I_xx_flag, I_yy_flag, I_zz_flag, I_xz_flag};
// engine ===== Propulsion data
-enum {simpleSingle_flag = 7000, c172_flag, cherokee_flag};
+enum {simpleSingle_flag = 7000, c172_flag, cherokee_flag, Throttle_pct_input_flag};
// CD ========= Aerodynamic x-force quantities (longitudinal)
enum {CDo_flag = 8000, CDK_flag, CD_a_flag, CD_adot_flag, CD_q_flag, CD_ih_flag, CD_de_flag,
enum {CLo_flag = 9000, CL_a_flag, CL_adot_flag, CL_q_flag, CL_ih_flag, CL_de_flag,
CLfa_flag, CLfade_flag, CLfdf_flag, CLfadf_flag,
CZo_flag, CZ_a_flag, CZ_a2_flag, CZ_a3_flag, CZ_adot_flag,
- CZ_q_flag, CZ_de_flag, CZ_deb2_flag, CZ_df_flag, CZ_adf_flag};
+ CZ_q_flag, CZ_de_flag, CZ_deb2_flag, CZ_df_flag, CZ_adf_flag, CZfa_flag};
// Cm ========= Aerodynamic m-moment quantities (longitudinal)
enum {Cmo_flag = 10000, Cm_a_flag, Cm_a2_flag, Cm_adot_flag, Cm_q_flag,
// misc ======= Miscellaneous inputs
enum {simpleHingeMomentCoef_flag = 17000, dfTimefdf_flag};
+//321654
+// fog ======== Fog field quantities
+enum {fog_segments_flag = 18000, fog_point_flag};
-typedef struct
+//321654
+struct AIRCRAFT
{
// ParseFile stuff [] Bipin to add more comments
ParseFile *airplane;
#define nondim_rate_V_rel_wind aircraft_->nondim_rate_V_rel_wind
double dyn_on_speed;
#define dyn_on_speed aircraft_->dyn_on_speed
+ bool P_body_init_true;
+ double P_body_init;
+#define P_body_init_true aircraft_->P_body_init_true
+#define P_body_init aircraft_->P_body_init
+ bool Q_body_init_true;
+ double Q_body_init;
+#define Q_body_init_true aircraft_->Q_body_init_true
+#define Q_body_init aircraft_->Q_body_init
+ bool R_body_init_true;
+ double R_body_init;
+#define R_body_init_true aircraft_->R_body_init_true
+#define R_body_init aircraft_->R_body_init
+ bool Phi_init_true;
+ double Phi_init;
+#define Phi_init_true aircraft_->Phi_init_true
+#define Phi_init aircraft_->Phi_init
+ bool Theta_init_true;
+ double Theta_init;
+#define Theta_init_true aircraft_->Theta_init_true
+#define Theta_init aircraft_->Theta_init
+ bool Psi_init_true;
+ double Psi_init;
+#define Psi_init_true aircraft_->Psi_init_true
+#define Psi_init aircraft_->Psi_init
+ bool Alpha_init_true;
+ double Alpha_init;
+#define Alpha_init_true aircraft_->Alpha_init_true
+#define Alpha_init aircraft_->Alpha_init
+ bool Beta_init_true;
+ double Beta_init;
+#define Beta_init_true aircraft_->Beta_init_true
+#define Beta_init aircraft_->Beta_init
+ bool U_body_init_true;
+ double U_body_init;
+#define U_body_init_true aircraft_->U_body_init_true
+#define U_body_init aircraft_->U_body_init
+ bool V_body_init_true;
+ double V_body_init;
+#define V_body_init_true aircraft_->V_body_init_true
+#define V_body_init aircraft_->V_body_init
+ bool W_body_init_true;
+ double W_body_init;
+#define W_body_init_true aircraft_->W_body_init_true
+#define W_body_init aircraft_->W_body_init
/* Variables (token2) ===========================================*/
#define elevator_input_ntime aircraft_->elevator_input_ntime
#define elevator_input_startTime aircraft_->elevator_input_startTime
+ bool aileron_input;
+ string aileron_input_file;
+ double aileron_input_timeArray[1000];
+ double aileron_input_daArray[1000];
+ int aileron_input_ntime;
+ double aileron_input_startTime;
+#define aileron_input aircraft_->aileron_input
+#define aileron_input_file aircraft_->aileron_input_file
+#define aileron_input_timeArray aircraft_->aileron_input_timeArray
+#define aileron_input_daArray aircraft_->aileron_input_daArray
+#define aileron_input_ntime aircraft_->aileron_input_ntime
+#define aileron_input_startTime aircraft_->aileron_input_startTime
+
+ bool rudder_input;
+ string rudder_input_file;
+ double rudder_input_timeArray[1000];
+ double rudder_input_drArray[1000];
+ int rudder_input_ntime;
+ double rudder_input_startTime;
+#define rudder_input aircraft_->rudder_input
+#define rudder_input_file aircraft_->rudder_input_file
+#define rudder_input_timeArray aircraft_->rudder_input_timeArray
+#define rudder_input_drArray aircraft_->rudder_input_drArray
+#define rudder_input_ntime aircraft_->rudder_input_ntime
+#define rudder_input_startTime aircraft_->rudder_input_startTime
+
+ bool pilot_elev_no;
+#define pilot_elev_no aircraft_->pilot_elev_no
+ bool pilot_elev_no_check;
+#define pilot_elev_no_check aircraft_->pilot_elev_no_check
+
+ bool pilot_ail_no;
+#define pilot_ail_no aircraft_->pilot_ail_no
+ bool pilot_ail_no_check;
+#define pilot_ail_no_check aircraft_->pilot_ail_no_check
+
+ bool pilot_rud_no;
+#define pilot_rud_no aircraft_->pilot_rud_no
+ bool pilot_rud_no_check;
+#define pilot_rud_no_check aircraft_->pilot_rud_no_check
+
/* Variables (token2) ===========================================*/
/* controlsMixer = Control mixer ================================*/
double simpleSingleMaxThrust;
#define simpleSingleMaxThrust aircraft_->simpleSingleMaxThrust
+ bool Throttle_pct_input;
+ string Throttle_pct_input_file;
+ double Throttle_pct_input_timeArray[1000];
+ double Throttle_pct_input_dTArray[1000];
+ int Throttle_pct_input_ntime;
+ double Throttle_pct_input_startTime;
+#define Throttle_pct_input aircraft_->Throttle_pct_input
+#define Throttle_pct_input_file aircraft_->Throttle_pct_input_file
+#define Throttle_pct_input_timeArray aircraft_->Throttle_pct_input_timeArray
+#define Throttle_pct_input_dTArray aircraft_->Throttle_pct_input_dTArray
+#define Throttle_pct_input_ntime aircraft_->Throttle_pct_input_ntime
+#define Throttle_pct_input_startTime aircraft_->Throttle_pct_input_startTime
+
/* Variables (token2) ===========================================*/
/* CD ============ Aerodynamic x-force quantities (longitudinal) */
#define CZ_deb2 aircraft_->CZ_deb2
#define CZ_df aircraft_->CZ_df
#define CZ_adf aircraft_->CZ_adf
+ string CZfa;
+ double CZfa_aArray[100];
+ double CZfa_CZArray[100];
+ int CZfa_nAlpha;
+ double CZfaI;
+#define CZfa aircraft_->CZfa
+#define CZfa_aArray aircraft_->CZfa_aArray
+#define CZfa_CZArray aircraft_->CZfa_CZArray
+#define CZfa_nAlpha aircraft_->CZfa_nAlpha
+#define CZfaI aircraft_->CZfaI
/* Variables (token2) ===========================================*/
#define Cn_b3_clean aircraft_->Cn_b3_clean
+ //321654
+ /* Variables (token2) ===========================================*/
+ /* fog =========== Fog field quantities ======================== */
+
+ map <string,int> fog_map;
+#define fog_map aircraft_->fog_map
+
+ bool fog_field;
+ int fog_segments;
+ int fog_point_index;
+ double *fog_time;
+ int *fog_value;
+ double fog_next_time;
+ int fog_current_segment;
+
+ int Fog;
+
+ AIRCRAFT()
+ {
+ fog_field = false;
+ fog_segments = 0;
+ fog_point_index = -1;
+ fog_time = NULL;
+ fog_value = NULL;
+ fog_next_time = 0.0;
+ fog_current_segment = 0;
+ Fog = 0;
+ };
+
+#define fog_field aircraft_->fog_field
+#define fog_segments aircraft_->fog_segments
+#define fog_point_index aircraft_->fog_point_index
+#define fog_time aircraft_->fog_time
+#define fog_value aircraft_->fog_value
+#define fog_next_time aircraft_->fog_next_time
+#define fog_current_segment aircraft_->fog_current_segment
+
+#define Fog aircraft_->Fog
+
+
+
/* Variables (token2) ===========================================*/
/* record ======== Record desired quantites to file =============*/
#define fout aircraft_->fout
-} AIRCRAFT;
+};
extern AIRCRAFT *aircraft_; // usually defined in the first program that includes uiuc_aircraft.h
----------------------------------------------------------------------
HISTORY: 04/15/2000 initial release
+ 06/18/2001 (RD) Added CZfa
----------------------------------------------------------------------
AUTHOR(S): Bipin Sehgal <bsehgal@uiuc.edu>
Jeff Scott <jscott@mail.com>
+ Robert Deters <rdeters@uiuc.edu>
----------------------------------------------------------------------
CZ += CZ_adf * Alpha * flap;
break;
}
+ case CZfa_flag:
+ {
+ CZfaI = uiuc_1Dinterpolation(CZfa_aArray,
+ CZfa_CZArray,
+ CZfa_nAlpha,
+ Alpha);
+ CZ += CZfaI;
+ break;
+ }
};
} // end CL map
Cnfada, and Cnfbetadr switches
04/15/2000 (JS) broke up into multiple
uiuc_coef_xxx functions
+ 06/18/2001 (RD) Added initialization of Alpha and
+ Beta. Added aileron_input and rudder_input.
+ Added pilot_elev_no, pilot_ail_no, and
+ pilot_rud_no.
+ 07/05/2001 (RD) Added pilot_(elev,ail,rud)_no=false
----------------------------------------------------------------------
AUTHOR(S): Bipin Sehgal <bsehgal@uiuc.edu>
Jeff Scott <jscott@mail.com>
+ Robert Deters <rdeters@uiuc.edu>
----------------------------------------------------------------------
void uiuc_coefficients()
{
+ double l_trim, l_defl;
+
+ if (Alpha_init_true && Simtime==0)
+ Alpha = Alpha_init;
+
+ if (Beta_init_true && Simtime==0)
+ Beta = Beta_init;
+
// calculate rate derivative nondimensionalization factors
// check if speed is sufficient to compute dynamic pressure terms
if (nondim_rate_V_rel_wind) // c172_aero uses V_rel_wind
uiuc_ice_eta();
}
- // check to see if phugoid mode engaged
- if (elevator_step || elevator_singlet || elevator_doublet || elevator_input)
+ // check to see if data files are used for control deflections
+ pilot_elev_no = false;
+ pilot_ail_no = false;
+ pilot_rud_no = false;
+ if (elevator_step || elevator_singlet || elevator_doublet || elevator_input || aileron_input || rudder_input)
{
uiuc_controlInput();
}
uiuc_coef_roll();
uiuc_coef_yaw();
+ if (pilot_ail_no)
+ {
+ if (aileron <=0)
+ Lat_control = - aileron / damax * RAD_TO_DEG;
+ else
+ Lat_control = - aileron / damin * RAD_TO_DEG;
+ }
+
+ if (pilot_elev_no)
+ {
+ l_trim = elevator_tab;
+ l_defl = elevator - elevator_tab;
+ if (l_trim <=0 )
+ Long_trim = l_trim / demax * RAD_TO_DEG;
+ else
+ Long_trim = l_trim / demin * RAD_TO_DEG;
+ if (l_defl <= 0)
+ Long_control = l_defl / demax * RAD_TO_DEG;
+ else
+ Long_control = l_defl / demin * RAD_TO_DEG;
+ }
+
+ if (pilot_rud_no)
+ {
+ if (rudder <=0)
+ Rudder_pedal = - rudder / drmax * RAD_TO_DEG;
+ else
+ Rudder_pedal = - rudder / drmin * RAD_TO_DEG;
+ }
+
return;
}
#include "uiuc_coef_roll.h"
#include "uiuc_coef_yaw.h"
#include <FDM/LaRCsim/ls_generic.h>
+#include <FDM/LaRCsim/ls_cockpit.h> /*Long_control,Lat_control,Rudder_pedal */
+#include <FDM/LaRCsim/ls_constants.h> /* RAD_TO_DEG, DEG_TO_RAD*/
void uiuc_coefficients();
----------------------------------------------------------------------
HISTORY: 04/08/2000 initial release
+ 06/18/2001 (RD) Added aileron_input and rudder_input
+ 07/05/2001 (RD) Code added to allow the pilot to fly
+ aircraft after the control surface input
+ files have been used.
----------------------------------------------------------------------
AUTHOR(S): Jeff Scott <jscott@mail.com>
+ Robert Deters <rdeters@uiuc.edu>
----------------------------------------------------------------------
Simtime <= (elevator_input_startTime + elevator_input_endTime))
{
double time = Simtime - elevator_input_startTime;
+ if (pilot_elev_no_check)
+ {
+ elevator = 0 + elevator_tab;
+ pilot_elev_no = true;
+ }
elevator = elevator +
uiuc_1Dinterpolation(elevator_input_timeArray,
elevator_input_deArray,
time);
}
}
+
+ // aileron input
+ if (aileron_input)
+ {
+ double aileron_input_endTime = aileron_input_timeArray[aileron_input_ntime];
+ if (Simtime >= aileron_input_startTime &&
+ Simtime <= (aileron_input_startTime + aileron_input_endTime))
+ {
+ double time = Simtime - aileron_input_startTime;
+ if (pilot_ail_no_check)
+ {
+ aileron = 0;
+ if (Simtime==0) //7-25-01 (RD) Added because
+ pilot_ail_no = false; //segmentation fault is given
+ else //with FG 0.7.8
+ pilot_ail_no = true;
+ }
+ aileron = aileron +
+ uiuc_1Dinterpolation(aileron_input_timeArray,
+ aileron_input_daArray,
+ aileron_input_ntime,
+ time);
+ }
+ }
+
+ // rudder input
+ if (rudder_input)
+ {
+ double rudder_input_endTime = rudder_input_timeArray[rudder_input_ntime];
+ if (Simtime >= rudder_input_startTime &&
+ Simtime <= (rudder_input_startTime + rudder_input_endTime))
+ {
+ double time = Simtime - rudder_input_startTime;
+ if (pilot_rud_no_check)
+ {
+ rudder = 0;
+ pilot_rud_no = true;
+ }
+ rudder = rudder +
+ uiuc_1Dinterpolation(rudder_input_timeArray,
+ rudder_input_drArray,
+ rudder_input_ntime,
+ time);
+ }
+ }
return;
}
----------------------------------------------------------------------
HISTORY: 01/30/2000 initial release
+ 06/18/2001 (RD) Added Throttle_pct_input.
----------------------------------------------------------------------
AUTHOR(S): Bipin Sehgal <bsehgal@uiuc.edu>
Jeff Scott <jscott@mail.com>
+ Robert Deters <rdeters@uiuc.edu>
Michael Selig <m-selig@uiuc.edu>
----------------------------------------------------------------------
stack command_list;
string linetoken1;
string linetoken2;
+
+ if (Throttle_pct_input)
+ {
+ double Throttle_pct_input_endTime = Throttle_pct_input_timeArray[Throttle_pct_input_ntime];
+ if (Simtime >= Throttle_pct_input_startTime &&
+ Simtime <= (Throttle_pct_input_startTime + Throttle_pct_input_endTime))
+ {
+ double time = Simtime - Throttle_pct_input_startTime;
+ Throttle_pct = uiuc_1Dinterpolation(Throttle_pct_input_timeArray,
+ Throttle_pct_input_dTArray,
+ Throttle_pct_input_ntime,
+ time);
+ }
+ }
Throttle[3] = Throttle_pct;
#define _ENGINE_H_
#include "uiuc_aircraft.h"
+#include "uiuc_1Dinterpolation.h"
#include <FDM/LaRCsim/ls_generic.h>
#include <FDM/LaRCsim/ls_cockpit.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern double Simtime;
+
+#ifdef __cplusplus
+}
+#endif
+
void uiuc_engine();
#endif // _ENGINE_H_
--- /dev/null
+/**********************************************************************
+
+ FILENAME: uiuc_fog.cpp
+
+----------------------------------------------------------------------
+
+ DESCRIPTION: changes Fog variable to +/-1 or 0 using fog
+ parameters and Simtime
+
+----------------------------------------------------------------------
+
+ STATUS: alpha version
+
+----------------------------------------------------------------------
+
+ REFERENCES:
+
+----------------------------------------------------------------------
+
+ HISTORY: 05/20/2001 initial release
+
+----------------------------------------------------------------------
+
+ AUTHOR(S): Michael Savchenko <savchenk@uiuc.edu>
+
+----------------------------------------------------------------------
+
+ VARIABLES:
+
+----------------------------------------------------------------------
+
+ INPUTS: -Simtime
+ -Fog
+ -fog_field
+ -fog_next_time
+ -fog_current_segment
+ -fog_value
+ -fog_time
+
+----------------------------------------------------------------------
+
+ OUTPUTS: -Fog
+ -fog_field
+ -fog_next_time
+ -fog_current_segment
+
+----------------------------------------------------------------------
+
+ CALLED BY: uiuc_wrapper
+
+----------------------------------------------------------------------
+
+ CALLS TO: none
+
+----------------------------------------------------------------------
+
+ COPYRIGHT: (C) 2000 by Michael Selig
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA or view http://www.gnu.org/copyleft/gpl.html.
+
+**********************************************************************/
+
+
+#include "uiuc_fog.h"
+
+void uiuc_fog()
+{
+ if (Simtime >= fog_next_time)
+ {
+ if (fog_current_segment != 0)
+ {
+ if (fog_value[fog_current_segment] > fog_value[fog_current_segment-1])
+ Fog = 1;
+ else if (fog_value[fog_current_segment] < fog_value[fog_current_segment-1])
+ Fog = -1;
+ else
+ Fog = 0;
+ }
+ else
+ Fog = 0;
+
+ if (Simtime > fog_time[fog_current_segment]) {
+ if (fog_current_segment == fog_segments)
+ {
+ fog_field = false;
+ Fog = 0;
+ return;
+ }
+ else
+ fog_current_segment++; }
+
+ if (fog_value[fog_current_segment] == fog_value[fog_current_segment-1])
+ fog_next_time = fog_time[fog_current_segment];
+ else
+ fog_next_time += (fog_time[fog_current_segment]-fog_time[fog_current_segment-1]) / abs(fog_value[fog_current_segment]-fog_value[fog_current_segment-1]);
+ }
+ else
+ Fog = 0;
+
+ return;
+}
+
--- /dev/null
+#ifndef _FOG_H_
+#define _FOG_H_
+
+#include "uiuc_aircraft.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern double Simtime;
+
+#ifdef __cplusplus
+}
+#endif
+
+void uiuc_fog();
+
+#endif // _FOG_H_
uiuc_map_Croll();
uiuc_map_Cn();
uiuc_map_gear();
+ uiuc_map_fog();
uiuc_map_ice();
uiuc_map_record1();
uiuc_map_record2();
#include "uiuc_map_Cn.h"
#include "uiuc_map_ice.h"
#include "uiuc_map_gear.h"
+#include "uiuc_map_fog.h"
#include "uiuc_map_record1.h"
#include "uiuc_map_record2.h"
#include "uiuc_map_record3.h"
----------------------------------------------------------------------
HISTORY: 04/08/2000 initial release
+ 06/18/2001 Added CZfa
----------------------------------------------------------------------
AUTHOR(S): Bipin Sehgal <bsehgal@uiuc.edu>
Jeff Scott <jscott@mail.com>
+ Robert Deters <rdeters@uiuc.edu>
----------------------------------------------------------------------
CL_map["CZ_deb2"] = CZ_deb2_flag ;
CL_map["CZ_df"] = CZ_df_flag ;
CL_map["CZ_adf"] = CZ_adf_flag ;
+ CL_map["CZfa"] = CZfa_flag ;
}
// end uiuc_map_CL.cpp
----------------------------------------------------------------------
HISTORY: 04/08/2000 initial release
+ 06/18/2001 Added aileron_input, rudder_input,
+ pilot_elev_no, pilot_ail_no, and
+ pilot_rud_no
----------------------------------------------------------------------
AUTHOR(S): Bipin Sehgal <bsehgal@uiuc.edu>
Jeff Scott <jscott@mail.com>
+ Robert Deters <rdeters@uiuc.edu>
----------------------------------------------------------------------
controlSurface_map["elevator_singlet"] = elevator_singlet_flag ;
controlSurface_map["elevator_doublet"] = elevator_doublet_flag ;
controlSurface_map["elevator_input"] = elevator_input_flag ;
+ controlSurface_map["aileron_input"] = aileron_input_flag ;
+ controlSurface_map["rudder_input"] = rudder_input_flag ;
+ controlSurface_map["pilot_elev_no"] = pilot_elev_no_flag ;
+ controlSurface_map["pilot_ail_no"] = pilot_ail_no_flag ;
+ controlSurface_map["pilot_rud_no"] = pilot_rud_no_flag ;
}
// end uiuc_map_controlSurface.cpp
----------------------------------------------------------------------
HISTORY: 04/08/2000 initial release
+ 06/18/2001 (RD) Added Throttle_pct_input
----------------------------------------------------------------------
AUTHOR(S): Bipin Sehgal <bsehgal@uiuc.edu>
Jeff Scott <jscott@mail.com>
+ Robert Deters <rdeters@uiuc.edu>
----------------------------------------------------------------------
engine_map["simpleSingle"] = simpleSingle_flag ;
engine_map["c172"] = c172_flag ;
engine_map["cherokee"] = cherokee_flag ;
+ engine_map["Throttle_pct_input"]= Throttle_pct_input_flag ;
}
// end uiuc_map_engine.cpp
--- /dev/null
+/**********************************************************************
+
+ FILENAME: uiuc_map_fog.cpp
+
+----------------------------------------------------------------------
+
+ DESCRIPTION: initializes the fog map
+
+----------------------------------------------------------------------
+
+ STATUS: alpha version
+
+----------------------------------------------------------------------
+
+ REFERENCES:
+
+----------------------------------------------------------------------
+
+ HISTORY: 05/20/2001 initial release
+
+----------------------------------------------------------------------
+
+ AUTHOR(S): Michael Savchenko <savchenk@uiuc.edu>
+
+----------------------------------------------------------------------
+
+ VARIABLES:
+
+----------------------------------------------------------------------
+
+ INPUTS: none
+
+----------------------------------------------------------------------
+
+ OUTPUTS: none
+
+----------------------------------------------------------------------
+
+ CALLED BY: uiuc_initializemaps.cpp
+
+----------------------------------------------------------------------
+
+ CALLS TO: none
+
+----------------------------------------------------------------------
+
+ COPYRIGHT: (C) 2000 by Michael Selig
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA or view http://www.gnu.org/copyleft/gpl.html.
+
+**********************************************************************/
+
+
+#include "uiuc_map_fog.h"
+
+
+void uiuc_map_fog()
+{
+ fog_map["fog_segments"] = fog_segments_flag ;
+ fog_map["fog_point"] = fog_point_flag ;
+
+}
+
+// end uiuc_map_fog.cpp
--- /dev/null
+//321654
+
+#ifndef _MAP_FOG_H_
+#define _MAP_FOG_H_
+
+#include "uiuc_aircraft.h"
+
+void uiuc_map_fog();
+
+#endif // _MAP_FOG_H_
----------------------------------------------------------------------
HISTORY: 04/08/2000 initial release
+ 06/18/2001 (RD) Added Alpha, Beta, U_body
+ V_body, and W_body.
----------------------------------------------------------------------
AUTHOR(S): Bipin Sehgal <bsehgal@uiuc.edu>
Jeff Scott <jscott@mail.com>
+ Robert Deters <rdeters@uiuc.edu>
----------------------------------------------------------------------
init_map["recordStartTime"] = recordStartTime_flag ;
init_map["nondim_rate_V_rel_wind"]= nondim_rate_V_rel_wind_flag;
init_map["dyn_on_speed"] = dyn_on_speed_flag ;
+ init_map["Alpha"] = Alpha_flag ;
+ init_map["Beta"] = Beta_flag ;
+ init_map["U_body"] = U_body_flag ;
+ init_map["V_body"] = V_body_flag ;
+ init_map["W_body"] = W_body_flag ;
}
// end uiuc_map_init.cpp
Keyword_map["ice"] = ice_flag ;
Keyword_map["record"] = record_flag ;
Keyword_map["misc"] = misc_flag ;
+ Keyword_map["fog"] = fog_flag ;
}
// end uiuc_map_keyword.cpp
maps; added zero_Long_trim to
controlSurface map
03/09/2001 (DPM) added support for gear.
+ 06/18/2001 (RD) Added Alpha, Beta, U_body,
+ V_body, and W_body to init map. Added
+ aileron_input, rudder_input, pilot_elev_no,
+ pilot_ail_no, and pilot_rud_no to
+ controlSurface map. Added Throttle_pct_input
+ to engine map. Added CZfa to CL map.
+ 07/05/2001 (RD) Changed pilot_elev_no = true to pilot_
+ elev_no_check=false. This is to allow pilot
+ to fly aircraft after input files have been
+ used.
+ 08/27/2001 (RD) Added xxx_init_true and xxx_init for
+ P_body, Q_body, R_body, Phi, Theta, Psi,
+ U_body, V_body, and W_body to help in
+ starting the A/C at an initial condition.
----------------------------------------------------------------------
AUTHOR(S): Bipin Sehgal <bsehgal@uiuc.edu>
Jeff Scott <jscott@mail.com>
+ Robert Deters <rdeters@uiuc.edu>
Michael Selig <m-selig@uiuc.edu>
David Megginson <david@megginson.com>
token3 >> token_value;
else
uiuc_warnings_errors(1, *command_line);
-
- P_body = token_value;
+
+ P_body_init_true = true;
+ P_body_init = token_value;
initParts -> storeCommands (*command_line);
break;
}
else
uiuc_warnings_errors(1, *command_line);
- Q_body = token_value;
+ Q_body_init_true = true;
+ Q_body_init = token_value;
initParts -> storeCommands (*command_line);
break;
}
else
uiuc_warnings_errors(1, *command_line);
- R_body = token_value;
+ R_body_init_true = true;
+ R_body_init = token_value;
initParts -> storeCommands (*command_line);
break;
}
else
uiuc_warnings_errors(1, *command_line);
- Phi = token_value;
+ Phi_init_true = true;
+ Phi_init = token_value;
initParts -> storeCommands (*command_line);
break;
}
else
uiuc_warnings_errors(1, *command_line);
- Theta = token_value;
+ Theta_init_true = true;
+ Theta_init = token_value;
initParts -> storeCommands (*command_line);
break;
}
else
uiuc_warnings_errors(1, *command_line);
- Psi = token_value;
+ Psi_init_true = true;
+ Psi_init = token_value;
initParts -> storeCommands (*command_line);
break;
}
dyn_on_speed = token_value;
break;
}
+ case Alpha_flag:
+ {
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+
+ Alpha_init_true = true;
+ Alpha_init = token_value * DEG_TO_RAD;
+ break;
+ }
+ case Beta_flag:
+ {
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+
+ Beta_init_true = true;
+ Beta_init = token_value * DEG_TO_RAD;
+ break;
+ }
+ case U_body_flag:
+ {
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+
+ U_body_init_true = true;
+ U_body_init = token_value;
+ break;
+ }
+ case V_body_flag:
+ {
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+
+ V_body_init_true = true;
+ V_body_init = token_value;
+ break;
+ }
+ case W_body_flag:
+ {
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+
+ W_body_init_true = true;
+ W_body_init = token_value;
+ break;
+ }
default:
{
uiuc_warnings_errors(2, *command_line);
elevator_input_startTime = token_value;
break;
}
+ case aileron_input_flag:
+ {
+ aileron_input = true;
+ aileron_input_file = linetoken3;
+ token4 >> token_value_convert1;
+ token5 >> token_value_convert2;
+ convert_y = uiuc_convert(token_value_convert1);
+ convert_x = uiuc_convert(token_value_convert2);
+ uiuc_1DdataFileReader(aileron_input_file,
+ aileron_input_timeArray,
+ aileron_input_daArray,
+ aileron_input_ntime);
+ token6 >> token_value;
+ aileron_input_startTime = token_value;
+ break;
+ }
+ case rudder_input_flag:
+ {
+ rudder_input = true;
+ rudder_input_file = linetoken3;
+ token4 >> token_value_convert1;
+ token5 >> token_value_convert2;
+ convert_y = uiuc_convert(token_value_convert1);
+ convert_x = uiuc_convert(token_value_convert2);
+ uiuc_1DdataFileReader(rudder_input_file,
+ rudder_input_timeArray,
+ rudder_input_drArray,
+ rudder_input_ntime);
+ token6 >> token_value;
+ rudder_input_startTime = token_value;
+ break;
+ }
+ case pilot_elev_no_flag:
+ {
+ pilot_elev_no_check = true;
+ break;
+ }
+ case pilot_ail_no_flag:
+ {
+ pilot_ail_no_check = true;
+ break;
+ }
+ case pilot_rud_no_flag:
+ {
+ pilot_rud_no_check = true;
+ break;
+ }
default:
{
uiuc_warnings_errors(2, *command_line);
engineParts -> storeCommands (*command_line);
break;
}
+ case Throttle_pct_input_flag:
+ {
+ Throttle_pct_input = true;
+ Throttle_pct_input_file = linetoken3;
+ token4 >> token_value_convert1;
+ token5 >> token_value_convert2;
+ convert_y = uiuc_convert(token_value_convert1);
+ convert_x = uiuc_convert(token_value_convert2);
+ uiuc_1DdataFileReader(Throttle_pct_input_file,
+ Throttle_pct_input_timeArray,
+ Throttle_pct_input_dTArray,
+ Throttle_pct_input_ntime);
+ token6 >> token_value;
+ Throttle_pct_input_startTime = token_value;
+ break;
+ }
default:
{
uiuc_warnings_errors(2, *command_line);
aeroLiftParts -> storeCommands (*command_line);
break;
}
+ case CZfa_flag:
+ {
+ CZfa = linetoken3;
+ token4 >> token_value_convert1;
+ token5 >> token_value_convert2;
+ convert_y = uiuc_convert(token_value_convert1);
+ convert_x = uiuc_convert(token_value_convert2);
+ /* call 1D File Reader with file name (CZfa) and conversion
+ factors; function returns array of alphas (aArray) and
+ corresponding CZ values (CZArray) and max number of
+ terms in arrays (nAlpha) */
+ uiuc_1DdataFileReader(CZfa,
+ CZfa_aArray,
+ CZfa_CZArray,
+ CZfa_nAlpha);
+ aeroLiftParts -> storeCommands (*command_line);
+ break;
+ }
default:
{
uiuc_warnings_errors(2, *command_line);
};
break;
} // end ice map
-
+
+
+ case fog_flag:
+ {
+ switch(fog_map[linetoken2])
+ {
+ case fog_segments_flag:
+ {
+ if (check_float(linetoken3))
+ token3 >> token_value_convert1;
+ else
+ uiuc_warnings_errors(1, *command_line);
+
+ if (token_value_convert1 < 1 || token_value_convert1 > 100)
+ uiuc_warnings_errors(1, *command_line);
+
+ fog_field = true;
+ fog_point_index = 0;
+ delete[] fog_time;
+ delete[] fog_value;
+ fog_segments = token_value_convert1;
+ fog_time = new double[fog_segments+1];
+ fog_time[0] = 0.0;
+ fog_value = new int[fog_segments+1];
+ fog_value[0] = 0;
+
+ break;
+ }
+ case fog_point_flag:
+ {
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+
+ if (token_value < 0.1)
+ uiuc_warnings_errors(1, *command_line);
+
+ if (check_float(linetoken4))
+ token4 >> token_value_convert1;
+ else
+ uiuc_warnings_errors(1, *command_line);
+
+ if (token_value_convert1 < -1000 || token_value_convert1 > 1000)
+ uiuc_warnings_errors(1, *command_line);
+
+ if (fog_point_index == fog_segments || fog_point_index == -1)
+ uiuc_warnings_errors(1, *command_line);
+
+ fog_point_index++;
+ fog_time[fog_point_index] = token_value;
+ fog_value[fog_point_index] = token_value_convert1;
+
+ break;
+ }
+ default:
+ {
+ uiuc_warnings_errors(2, *command_line);
+ break;
+ }
+ };
+ break;
+ } // end fog map
+
+
+
+
+
case record_flag:
{
HISTORY: 01/26/2000 initial release
03/09/2001 (DPM) added support for gear
+ 06/18/2001 (RD) Made uiuc_recorder its own routine.
+ 07/19/2001 (RD) Added uiuc_vel_init() to initialize
+ the velocities.
+ 08/27/2001 (RD) Added uiuc_initial_init() to help
+ in starting an A/C at an initial condition
----------------------------------------------------------------------
AUTHOR(S): Bipin Sehgal <bsehgal@uiuc.edu>
+ Robert Deters <rdeters@uiuc.edu>
David Megginson <david@megginson.com>
----------------------------------------------------------------------
**********************************************************************/
#include <simgear/compiler.h>
+#include <Aircraft/aircraft.hxx>
+
+#ifndef FG_OLD_WEATHER
+#include <WeatherCM/FGLocalWeatherDatabase.h>
+#else
+#include <Weather/weather.hxx>
+#endif
#include "uiuc_aircraft.h"
#include "uiuc_aircraftdir.h"
#include "uiuc_menu.h"
#include "uiuc_betaprobe.h"
#include <FDM/LaRCsim/ls_generic.h>
+#include "Main/simple_udp.h"
+#include "uiuc_fog.h" //321654
#if !defined (SG_HAVE_NATIVE_SGI_COMPILERS)
SG_USING_STD(cout);
extern "C" void uiuc_force_moment(double dt);
extern "C" void uiuc_engine_routine();
extern "C" void uiuc_gear_routine();
+extern "C" void uiuc_record_routine(double dt);
+extern "C" void uiuc_vel_init ();
+extern "C" void uiuc_initial_init ();
AIRCRAFT *aircraft_ = new AIRCRAFT;
AIRCRAFTDIR *aircraftdir_ = new AIRCRAFTDIR;
+SendArray testarray(4950);
+
+/* Convert float to string */
+string ftoa(double in)
+{
+ static char temp[20];
+ sprintf(temp,"%g",in);
+ return (string)temp;
+}
+
+void uiuc_initial_init ()
+{
+ if (P_body_init_true)
+ P_body = P_body_init;
+ if (Q_body_init_true)
+ Q_body = Q_body_init;
+ if (R_body_init_true)
+ R_body = R_body_init;
+
+ if (Phi_init_true)
+ Phi = Phi_init;
+ if (Theta_init_true)
+ Theta = Theta_init;
+ if (Psi_init_true)
+ Psi = Psi_init;
+
+ if (U_body_init_true)
+ U_body = U_body_init;
+ if (V_body_init_true)
+ V_body = V_body_init;
+ if (W_body_init_true)
+ W_body = W_body_init;
+
+}
+
+void uiuc_vel_init ()
+{
+ if (U_body_init_true && V_body_init_true && W_body_init_true)
+ {
+ double det_T_l_to_b, cof11, cof12, cof13, cof21, cof22, cof23, cof31, cof32, cof33;
+
+ 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);
+ cof11 = T_local_to_body_22 * T_local_to_body_33 - T_local_to_body_23 * T_local_to_body_32;
+ cof12 = T_local_to_body_23 * T_local_to_body_31 - T_local_to_body_21 * T_local_to_body_33;
+ cof13 = T_local_to_body_21 * T_local_to_body_32 - T_local_to_body_22 * T_local_to_body_31;
+ cof21 = T_local_to_body_13 * T_local_to_body_32 - T_local_to_body_12 * T_local_to_body_33;
+ cof22 = T_local_to_body_11 * T_local_to_body_33 - T_local_to_body_13 * T_local_to_body_31;
+ cof23 = T_local_to_body_12 * T_local_to_body_31 - T_local_to_body_11 * T_local_to_body_32;
+ cof31 = T_local_to_body_12 * T_local_to_body_23 - T_local_to_body_13 * T_local_to_body_22;
+ cof32 = T_local_to_body_13 * T_local_to_body_21 - T_local_to_body_11 * T_local_to_body_23;
+ cof33 = T_local_to_body_11 * T_local_to_body_22 - T_local_to_body_12 * T_local_to_body_21;
+
+ V_north = (cof11*U_body+cof21*V_body+cof31*W_body)/det_T_l_to_b;
+ V_east_rel_ground = (cof12*U_body+cof22*V_body+cof32*W_body)/det_T_l_to_b;
+ V_down = (cof13*U_body+cof23*V_body+cof33*W_body)/det_T_l_to_b;
+
+ V_east = V_east_rel_ground + OMEGA_EARTH*Sea_level_radius*cos(Lat_geocentric);
+ }
+}
+
void uiuc_init_aeromodel ()
{
string aircraft;
M_m_aero = Cm * qScbar;
M_n_aero = Cn * qSb;
- /* Call fligt data recorder */
- if (Simtime >= recordStartTime)
- uiuc_recorder(dt);
+ /* Call flight data recorder */
+ // if (Simtime >= recordStartTime)
+ // uiuc_recorder(dt);
+
+
+ // fog field update
+ Fog = 0;
+ if (fog_field)
+ uiuc_fog();
+
+ double vis;
+ if (Fog != 0)
+ {
+ #ifndef FG_OLD_WEATHER
+ vis = WeatherDatabase->getWeatherVisibility();
+ if (Fog > 0)
+ vis /= 1.01;
+ else
+ vis *= 1.01;
+ WeatherDatabase->setWeatherVisibility( vis );
+ #else
+ vis = current_weather->get_visibility();
+ if (Fog > 0)
+ vis /= 1.01;
+ else
+ vis *= 1.01;
+ current_weather->set_visibility( vis );
+ #endif
+ }
+
+
+ /* Send data on the network to the Glass Cockpit */
+
+ string input="";
+
+ input += " stick_right " + ftoa(Lat_control);
+ input += " rudder_left " + ftoa(-Rudder_pedal);
+ input += " stick_forward " + ftoa(Long_control);
+ input += " stick_trim_forward " + ftoa(Long_trim);
+ input += " vehicle_pitch " + ftoa(Theta * 180.0 / 3.14);
+ input += " vehicle_roll " + ftoa(Phi * 180.0 / 3.14);
+ input += " vehicle_speed " + ftoa(V_rel_wind);
+ input += " throttle_forward " + ftoa(Throttle_pct);
+ input += " altitude " + ftoa(Altitude);
+ input += " climb_rate " + ftoa(-1.0*V_down_rel_ground);
+
+ testarray.getHello();
+ testarray.sendData(input);
+
+ /* End of Networking */
+
}
void uiuc_engine_routine()
uiuc_gear();
}
+void uiuc_record_routine(double dt)
+{
+ if (Simtime >= recordStartTime)
+ uiuc_recorder(dt);
+}
//end uiuc_wrapper.cpp
void uiuc_force_moment(double dt);
void uiuc_engine_routine();
void uiuc_gear_routine();
+void uiuc_record_routine(double dt);
+void uiuc_vel_init ();
+void uiuc_initial_init ();