1
0
Fork 0

Some tweaks relating to engines and the various LaRCsim related fdm's

This commit is contained in:
curt 2000-10-10 20:31:20 +00:00
parent 0fc90cfc56
commit 7c38f172d9
5 changed files with 75 additions and 125 deletions

View file

@ -39,16 +39,16 @@
// each subsequent iteration through the EOM
int FGLaRCsim::init( double dt ) {
#ifdef USE_NEW_ENGINE_CODE
// Initialize our little engine that hopefully might
eng.init(dt);
// dcl - in passing dt to init rather than update I am assuming
// that the LaRCsim dt is fixed at one value (yes it is 120hz CLO)
if ( current_options.get_aircraft() == "c172" ) {
// Initialize our little engine that hopefully might
eng.init(dt);
// dcl - in passing dt to init rather than update I am assuming
// that the LaRCsim dt is fixed at one value (yes it is 120hz CLO)
// update the engines interface
FGEngInterface e;
add_engine( e );
#endif
// update the engines interface
FGEngInterface e;
add_engine( e );
}
// cout << "FGLaRCsim::init()" << endl;
@ -87,46 +87,46 @@ int FGLaRCsim::init( double dt ) {
int FGLaRCsim::update( int multiloop ) {
// cout << "FGLaRCsim::update()" << endl;
#ifdef USE_NEW_ENGINE_CODE
// set control inputs
eng.set_IAS( V_calibrated_kts );
eng.set_Throttle_Lever_Pos( controls.get_throttle( 0 ) * 100.0 );
eng.set_Propeller_Lever_Pos( 100 );
if ( controls.get_mixture( 0 ) > 0.60 ) {
eng.set_Mixture_Lever_Pos( controls.get_mixture( 0 ) * 100.0 );
} else {
eng.set_Mixture_Lever_Pos( 60.0 );
}
if ( current_options.get_aircraft() == "c172" ) {
// set control inputs
eng.set_IAS( V_calibrated_kts );
eng.set_Throttle_Lever_Pos( controls.get_throttle( 0 ) * 100.0 );
eng.set_Propeller_Lever_Pos( 100 );
if ( controls.get_mixture( 0 ) > 0.60 ) {
eng.set_Mixture_Lever_Pos( controls.get_mixture( 0 ) * 100.0 );
} else {
eng.set_Mixture_Lever_Pos( 60.0 );
}
// update engine model
eng.update();
// update engine model
eng.update();
// copy engine state values onto "bus"
FGEngInterface *e = get_engine( 0 );
e->set_Throttle( controls.get_throttle( 0 ) * 100.0 );
e->set_Mixture( 80 );
e->set_Prop_Advance( 100 );
e->set_RPM( eng.get_RPM() );
e->set_Manifold_Pressure( eng.get_Manifold_Pressure() );
e->set_MaxHP( eng.get_MaxHP() );
e->set_Percentage_Power( eng.get_Percentage_Power() );
e->set_EGT( eng.get_EGT() );
e->set_prop_thrust( eng.get_prop_thrust_SI() );
// copy engine state values onto "bus"
FGEngInterface *e = get_engine( 0 );
e->set_Throttle( controls.get_throttle( 0 ) * 100.0 );
e->set_Mixture( 80 );
e->set_Prop_Advance( 100 );
e->set_RPM( eng.get_RPM() );
e->set_Manifold_Pressure( eng.get_Manifold_Pressure() );
e->set_MaxHP( eng.get_MaxHP() );
e->set_Percentage_Power( eng.get_Percentage_Power() );
e->set_EGT( eng.get_EGT() );
e->set_prop_thrust( eng.get_prop_thrust_SI() );
#if 0
cout << "Throttle = " << controls.get_throttle( 0 ) * 100.0;
cout << " Mixture = " << controls.get_mixture( 0 ) * 100.0;
cout << " RPM = " << eng.get_RPM();
cout << " MP = " << eng.get_Manifold_Pressure();
cout << " HP = " << ( eng.get_MaxHP() * eng.get_Percentage_Power()
cout << "Throttle = " << controls.get_throttle( 0 ) * 100.0;
cout << " Mixture = " << controls.get_mixture( 0 ) * 100.0;
cout << " RPM = " << eng.get_RPM();
cout << " MP = " << eng.get_Manifold_Pressure();
cout << " HP = " << ( eng.get_MaxHP() * eng.get_Percentage_Power()
/ 100.0 );
cout << " EGT = " << eng.get_EGT();
cout << " Thrust (N) " << eng.get_prop_thrust_SI(); // Thrust in Newtons
cout << '\n';
cout << " EGT = " << eng.get_EGT();
cout << " Thrust (N) " << eng.get_prop_thrust_SI(); // Thrust in Newtons
cout << '\n';
#endif
F_X_engine = eng.get_prop_thrust_SI() * 0.07;
#endif // USE_NEW_ENGINE_CODE
F_X_engine = eng.get_prop_thrust_SI() * 0.07;
}
double save_alt = 0.0;
double time_step = (1.0 / current_options.get_model_hz()) * multiloop;
@ -144,11 +144,14 @@ int FGLaRCsim::update( int multiloop ) {
Long_trim = controls.get_elevator_trim();
Rudder_pedal = controls.get_rudder() / current_options.get_speed_up();
Flap_handle = 30.0 * controls.get_flaps();
#ifdef USE_NEW_ENGINE_CODE
Throttle_pct = -1.0; // tells engine model to use propellor thrust
#else
if ( current_options.get_aircraft() == "c172" ) {
Use_External_Engine = 1;
} else {
Use_External_Engine = 0;
}
Throttle_pct = controls.get_throttle( 0 ) * 1.0;
#endif
Brake_pct[0] = controls.get_brake( 1 );
Brake_pct[1] = controls.get_brake( 0 );

View file

@ -31,14 +31,9 @@
#include "flight.hxx"
#define USE_NEW_ENGINE_CODE 1
class FGLaRCsim: public FGInterface {
#ifdef USE_NEW_ENGINE_CODE
FGEngine eng;
#endif
public:

View file

@ -77,7 +77,7 @@ void c172_engine( SCALAR dt, int init ) {
Throttle[3] = Throttle_pct;
if ( Throttle_pct >= 0 ) {
if ( ! Use_External_Engine ) {
/* do a crude engine power calc based on throttle position */
v=V_rel_wind;
h=Altitude;

View file

@ -128,6 +128,9 @@ typedef struct {
#define F_Y_engine generic_.f_engine_v[1]
#define F_Z_engine generic_.f_engine_v[2]
int use_external_engine;
#define Use_External_Engine generic_.use_external_engine
VECTOR_3 f_gear_v;
#define F_gear_v generic_.f_gear_v
#define F_X_gear generic_.f_gear_v[0]

View file

@ -21,10 +21,6 @@
// $Id$
#define USE_NEW_ENGINE_CODE
#undef MICHAEL_JOHNSON_EXPERIMENTAL_ENGINE_AUDIO
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
@ -102,6 +98,8 @@
# include <Weather/weather.hxx>
#endif
#include "version.h"
#include "bfi.hxx"
#include "fg_init.hxx"
#include "fg_io.hxx"
@ -174,7 +172,7 @@ sgMat4 copy_of_ssgOpenGLAxisSwapMatrix =
{ 0.0f, 0.0f, 0.0f, 1.0f }
} ;
// The following defines flight gear options. Because glutlib will also
// The following defines flightgear options. Because glutlib will also
// want to parse its own options, those options must not be included here
// or they will get parsed by the main program option parser. Hence case
// is significant for any option added that might be in conflict with
@ -897,71 +895,16 @@ static void fgMainLoop( void ) {
#ifdef ENABLE_AUDIO_SUPPORT
if ( current_options.get_sound() && !audio_sched->not_working() ) {
# if defined(MICHAEL_JOHNSON_EXPERIMENTAL_ENGINE_AUDIO)
static double kts_to_fts = NM_TO_METER * METER_TO_FEET / 3600.0;
// note: all these factors are relative to the sample. our
// sample format should really contain a conversion factor so
// that we can get prop speed right for arbitrary samples.
// Note that for normal-size props, there is a point at which
// the prop tips approach the speed of sound; that is a pretty
// strong limit to how fast the prop can go.
// multiplication factor is prime pitch control; add some log
// component for verisimilitude
double pitch = log((controls.get_throttle(0) * 14.0) + 1.0);
//fprintf(stderr, "pitch1: %f ", pitch);
// if (controls.get_throttle(0) > 0.0 ||
// cur_fdm_state->get_V_calibrated_kts() > 40.0) {
//fprintf(stderr, "rel_wind: %f ", cur_fdm_state->get_V_calibrated_kts());
// only add relative wind and AoA if prop is moving
// or we're really flying at idle throttle
if (pitch < 5.4) { // this needs tuning
// prop tips not breaking sound barrier
pitch += log(cur_fdm_state->get_V_calibrated_kts() * kts_to_fts + 0.8)/2;
} else {
// prop tips breaking sound barrier
pitch += log(cur_fdm_state->get_V_calibrated_kts() * kts_to_fts + 0.8)/10;
}
//fprintf(stderr, "pitch2: %f ", pitch);
//fprintf(stderr, "AoA: %f ", FG_Gamma_vert_rad);
// Angle of Attack next... -x^3(e^x) is my best guess Just
// need to calculate some reasonable scaling factor and
// then clamp it on the positive aoa (neg adj) side
double aoa = cur_fdm_state->get_Gamma_vert_rad() * 2.2;
double tmp = 3.0;
double aoa_adj = pow(-aoa, tmp) * pow(M_E, aoa);
if (aoa_adj < -0.8) aoa_adj = -0.8;
pitch += aoa_adj;
//fprintf(stderr, "pitch3: %f ", pitch);
// don't run at absurdly slow rates -- not realistic
// and sounds bad to boot. :-)
if (pitch < 0.8) pitch = 0.8;
// }
// fprintf(stderr, "pitch4: %f\n", pitch);
double volume = controls.get_throttle(0) * 0.1 + 0.3 +
log(cur_fdm_state->get_V_calibrated_kts() * kts_to_fts + 1.0)/14.0;
if ( volume > 1.0 ) { volume = 1.0; }
// fprintf(stderr, "volume: %f\n", volume);
pitch_envelope.setStep ( 0, 0.01, pitch );
volume_envelope.setStep ( 0, 0.01, volume );
# elif defined(USE_NEW_ENGINE_CODE)
if ( current_options.get_flight_model() == FGInterface::FG_LARCSIM ) {
if ( current_options.get_aircraft() == "c172" ) {
// pitch corresponds to rpm
// volume corresponds to manifold pressure
double rpm_factor = cur_fdm_state->get_engine(0)->get_RPM() /
2500.0;
double rpm_factor;
if ( cur_fdm_state->get_engine(0) != NULL ) {
rpm_factor = cur_fdm_state->get_engine(0)->get_RPM() / 2500.0;
} else {
rpm_factor = 1.0;
}
// cout << "rpm = " << cur_fdm_state->get_engine(0)->get_RPM()
// << endl;
@ -973,8 +916,13 @@ static void fgMainLoop( void ) {
if (pitch > 5.0) { pitch = 5.0; }
// cout << "pitch = " << pitch << endl;
double mp_factor =
cur_fdm_state->get_engine(0)->get_Manifold_Pressure() / 28;
double mp_factor;
if ( cur_fdm_state->get_engine(0) != NULL ) {
mp_factor =
cur_fdm_state->get_engine(0)->get_Manifold_Pressure() / 28;
} else {
mp_factor = 1.0;
}
// cout << "mp = "
// << cur_fdm_state->get_engine(0)->get_Manifold_Pressure()
// << endl;
@ -992,7 +940,7 @@ static void fgMainLoop( void ) {
pitch_envelope.setStep ( 0, 0.01, param );
volume_envelope.setStep ( 0, 0.01, param );
}
# endif
audio_sched -> update();
}
#endif
@ -1054,7 +1002,7 @@ static void fgIdleFunction ( void ) {
} else if ( idle_state == 3 ) {
// This is the top level init routine which calls all the
// other subsystem initialization routines. If you are adding
// a subsystem to flight gear, its initialization call should
// a subsystem to flightgear, its initialization call should
// located in this routine.
if( !fgInitSubsystems()) {
FG_LOG( FG_GENERAL, FG_ALERT,
@ -1214,7 +1162,7 @@ int fgGlutInit( int *argc, char **argv ) {
// Initialize windows
if ( current_options.get_game_mode() == 0 ) {
// Open the regular window
glutCreateWindow("Flight Gear");
glutCreateWindow("FlightGear");
#ifndef GLUT_WRONG_VERSION
} else {
// Open the cool new 'game mode' window
@ -1324,7 +1272,8 @@ int main( int argc, char **argv ) {
// set default log levels
fglog().setLogLevels( FG_ALL, FG_INFO );
FG_LOG( FG_GENERAL, FG_INFO, "Flight Gear: Version " << VERSION << endl );
FG_LOG( FG_GENERAL, FG_INFO, "FlightGear: Version "
<< FLIGHTGEAR_VERSION << endl );
// seed the random number generater
fg_srandom();