Patches from Dave Luffto pass the magneto and starter control movements
through the controls interface and the running and cranking flags through the engine interface. This has no current effect on LaRCsim (other than to make the code neater) but is necessary to add engine startup to JSBSim which is now underway. I've also put in main.cxx which escaped getting committed in the previous round of changes - adding this will add the cranking sound to LaRCsim during engine startup.
This commit is contained in:
parent
a264f99310
commit
3e968179c2
8 changed files with 165 additions and 28 deletions
|
@ -45,6 +45,8 @@ void FGControls::reset_all()
|
|||
set_elevator_trim(0.0);
|
||||
set_rudder(0.0);
|
||||
set_throttle(FGControls::ALL_ENGINES, 0.0);
|
||||
set_starter(FGControls::ALL_ENGINES, false);
|
||||
set_magnetos(FGControls::ALL_ENGINES, 0);
|
||||
throttle_idle = true;
|
||||
gear_down = true;
|
||||
}
|
||||
|
@ -62,6 +64,8 @@ FGControls::init ()
|
|||
throttle[engine] = 0.0;
|
||||
mixture[engine] = 1.0;
|
||||
prop_advance[engine] = 1.0;
|
||||
magnetos[engine] = 0;
|
||||
starter[engine] = false;
|
||||
}
|
||||
|
||||
for ( int wheel = 0; wheel < MAX_WHEELS; wheel++ ) {
|
||||
|
@ -105,6 +109,14 @@ FGControls::bind ()
|
|||
fgTie(name, this, index,
|
||||
&FGControls::get_prop_advance, &FGControls::set_prop_advance);
|
||||
fgSetArchivable(name);
|
||||
sprintf(name, "/controls/magnetos[%d]", index);
|
||||
fgTie(name, this, index,
|
||||
&FGControls::get_magnetos, &FGControls::set_magnetos);
|
||||
fgSetArchivable(name);
|
||||
sprintf(name, "/controls/starter[%d]", index);
|
||||
fgTie(name, this, index,
|
||||
&FGControls::get_starter, &FGControls::set_starter);
|
||||
fgSetArchivable(name);
|
||||
}
|
||||
for (index = 0; index < MAX_WHEELS; index++) {
|
||||
char name[32];
|
||||
|
@ -137,6 +149,10 @@ FGControls::unbind ()
|
|||
fgUntie(name);
|
||||
sprintf(name, "/controls/propellor-pitch[%d]", index);
|
||||
fgUntie(name);
|
||||
sprintf(name, "/controls/magnetos[%d]", index);
|
||||
fgUntie(name);
|
||||
sprintf(name, "/controls/starter[%d]", index);
|
||||
fgUntie(name);
|
||||
}
|
||||
for (index = 0; index < MAX_WHEELS; index++) {
|
||||
char name[32];
|
||||
|
|
|
@ -65,7 +65,9 @@ private:
|
|||
double mixture[MAX_ENGINES];
|
||||
double prop_advance[MAX_ENGINES];
|
||||
double brake[MAX_WHEELS];
|
||||
int magnetos[MAX_ENGINES];
|
||||
bool throttle_idle;
|
||||
bool starter[MAX_ENGINES];
|
||||
bool gear_down;
|
||||
|
||||
SGPropertyNode * auto_coordination;
|
||||
|
@ -74,7 +76,12 @@ private:
|
|||
if ( *x < min ) { *x = min; }
|
||||
if ( *x > max ) { *x = max; }
|
||||
}
|
||||
|
||||
|
||||
inline void CLAMP(int *i, int min, int max ) {
|
||||
if ( *i < min ) { *i = min; }
|
||||
if ( *i > max ) { *i = max; }
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
FGControls();
|
||||
|
@ -101,6 +108,8 @@ public:
|
|||
return prop_advance[engine];
|
||||
}
|
||||
inline double get_brake(int wheel) const { return brake[wheel]; }
|
||||
inline int get_magnetos(int engine) const { return magnetos[engine]; }
|
||||
inline bool get_starter(int engine) const { return starter[engine]; }
|
||||
inline bool get_gear_down() const { return gear_down; }
|
||||
|
||||
// Update functions
|
||||
|
@ -240,6 +249,43 @@ public:
|
|||
}
|
||||
}
|
||||
}
|
||||
inline void set_magnetos( int engine, int pos ) {
|
||||
if ( engine == ALL_ENGINES ) {
|
||||
for ( int i = 0; i < MAX_ENGINES; i++ ) {
|
||||
magnetos[i] = pos;
|
||||
CLAMP( &magnetos[i], 0, 3 );
|
||||
}
|
||||
} else {
|
||||
if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
|
||||
magnetos[engine] = pos;
|
||||
CLAMP( &magnetos[engine], 0, 3 );
|
||||
}
|
||||
}
|
||||
}
|
||||
inline void move_magnetos( int engine, int amt ) {
|
||||
if ( engine == ALL_ENGINES ) {
|
||||
for ( int i = 0; i < MAX_ENGINES; i++ ) {
|
||||
magnetos[i] += amt;
|
||||
CLAMP( &magnetos[i], 0, 3 );
|
||||
}
|
||||
} else {
|
||||
if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
|
||||
magnetos[engine] += amt;
|
||||
CLAMP( &magnetos[engine], 0, 3 );
|
||||
}
|
||||
}
|
||||
}
|
||||
inline void set_starter( int engine, bool flag ) {
|
||||
if ( engine == ALL_ENGINES ) {
|
||||
for ( int i = 0; i < MAX_ENGINES; i++ ) {
|
||||
starter[i] = flag;
|
||||
}
|
||||
} else {
|
||||
if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
|
||||
starter[engine] = flag;
|
||||
}
|
||||
}
|
||||
}
|
||||
inline void set_brake( int wheel, double pos ) {
|
||||
if ( wheel == ALL_WHEELS ) {
|
||||
for ( int i = 0; i < MAX_WHEELS; i++ ) {
|
||||
|
|
|
@ -82,10 +82,10 @@ void FGNewEngine::init(double dt) {
|
|||
n_R = 2; // Number of crank revolutions per power cycle - 2 for a 4 stroke engine.
|
||||
|
||||
// Various bits of housekeeping describing the engines initial state.
|
||||
running = fgGetBool("/engines/engine[0]/running");
|
||||
running = false;
|
||||
cranking = false;
|
||||
crank_counter = false;
|
||||
fgSetBool("/engines/engine[0]/cranking", false);
|
||||
starter = false;
|
||||
|
||||
// Initialise Engine Variables used by this instance
|
||||
if(running)
|
||||
|
@ -148,7 +148,6 @@ void FGNewEngine::update() {
|
|||
// Check for spark
|
||||
bool Magneto_Left = false;
|
||||
bool Magneto_Right = false;
|
||||
int mag_pos = fgGetInt("/engines/engine[0]/magneto");
|
||||
// Magneto positions:
|
||||
// 0 -> off
|
||||
// 1 -> left only
|
||||
|
@ -172,15 +171,10 @@ void FGNewEngine::update() {
|
|||
} // Need to make this better, eg position of fuel selector switch.
|
||||
|
||||
// Check if we are turning the starter motor
|
||||
bool temp = fgGetBool("/engines/engine[0]/starter");
|
||||
if(cranking != temp) {
|
||||
if(cranking != starter) {
|
||||
// This check saves .../cranking from getting updated every loop - they only update when changed.
|
||||
cranking = temp;
|
||||
if(cranking)
|
||||
fgSetBool("/engines/engine[0]/cranking", true);
|
||||
else
|
||||
fgSetBool("/engines/engine[0]/cranking", false);
|
||||
crank_counter = 0;
|
||||
cranking = starter;
|
||||
crank_counter = 0;
|
||||
}
|
||||
// Note that although /engines/engine[0]/starter and /engines/engine[0]/cranking might appear to be duplication it is
|
||||
// not since the starter may be engaged with the battery voltage too low for cranking to occur (or perhaps the master
|
||||
|
@ -206,7 +200,6 @@ void FGNewEngine::update() {
|
|||
if(RPM > 450) {
|
||||
// For now just instantaneously start but later we should maybe crank for a bit
|
||||
running = true;
|
||||
fgSetBool("/engines/engine[0]/running", true);
|
||||
// RPM = 600;
|
||||
}
|
||||
}
|
||||
|
@ -214,7 +207,6 @@ void FGNewEngine::update() {
|
|||
// Cut the engine
|
||||
// note that we only cut the power - the engine may continue to spin if the prop is in a moving airstream
|
||||
running = false;
|
||||
fgSetBool("/engines/engine[0]/running", false);
|
||||
}
|
||||
|
||||
// Now we've ascertained whether the engine is running or not we can start to do the engine calculations 'proper'
|
||||
|
@ -293,11 +285,9 @@ void FGNewEngine::update() {
|
|||
//Check if we have stalled the engine
|
||||
if (RPM == 0) {
|
||||
running = false;
|
||||
fgSetBool("/engines/engine[0]/running", false);
|
||||
} else if((RPM <= 480) && (cranking)) {
|
||||
//Make sure the engine noise dosn't play if the engine won't start due to eg mixture lever pulled out.
|
||||
running = false;
|
||||
fgSetBool("/engines/engine[0]/running", false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -58,6 +58,8 @@ private:
|
|||
float Throttle_Lever_Pos; // 0 = Closed, 100 = Fully Open
|
||||
float Propeller_Lever_Pos; // 0 = Full Course 100 = Full Fine
|
||||
float Mixture_Lever_Pos; // 0 = Idle Cut Off 100 = Full Rich
|
||||
int mag_pos; // 0=off, 1=left, 2=right, 3=both.
|
||||
bool starter;
|
||||
|
||||
//misc
|
||||
float IAS;
|
||||
|
@ -205,6 +207,13 @@ public:
|
|||
inline void set_Mixture_Lever_Pos( float value ) {
|
||||
Mixture_Lever_Pos = value;
|
||||
}
|
||||
// set the magneto switch position
|
||||
inline void set_Magneto_Switch_Pos( int value ) {
|
||||
mag_pos = value;
|
||||
}
|
||||
inline void setStarterFlag( bool flag ) {
|
||||
starter = flag;
|
||||
}
|
||||
// set ambient pressure - takes pounds per square foot
|
||||
inline void set_p_amb( float value ) {
|
||||
p_amb = value * 47.88026;
|
||||
|
@ -228,6 +237,9 @@ public:
|
|||
inline float get_prop_thrust_lbs() const { return (prop_thrust * 0.2248); }
|
||||
inline float get_fuel_flow_gals_hr() const { return (Fuel_Flow_gals_hr); }
|
||||
inline float get_oil_temp() const { return ((current_oil_temp * 1.8) - 459.67); }
|
||||
inline bool getRunningFlag() const { return running; }
|
||||
inline bool getCrankingFlag() const { return cranking; }
|
||||
inline bool getStarterFlag() const { return starter; }
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -74,10 +74,8 @@ FGLaRCsim::FGLaRCsim( double dt ) {
|
|||
// Hardwired to C172 full tanks for now - need to fix this sometime
|
||||
// Also note that this is the max quantity - the usable quantity
|
||||
// is slightly less
|
||||
set_Tank1Fuel(14.0);
|
||||
set_Tank2Fuel(14.0);
|
||||
|
||||
|
||||
set_Tank1Fuel(28.0);
|
||||
set_Tank2Fuel(28.0);
|
||||
}
|
||||
|
||||
FGLaRCsim::~FGLaRCsim(void) {
|
||||
|
@ -109,6 +107,8 @@ bool FGLaRCsim::update( int multiloop ) {
|
|||
eng.set_Propeller_Lever_Pos( 100 );
|
||||
eng.set_Mixture_Lever_Pos( globals->get_controls()->get_mixture( 0 )
|
||||
* 100.0 );
|
||||
eng.set_Magneto_Switch_Pos( globals->get_controls()->get_magnetos(0) );
|
||||
eng.setStarterFlag( globals->get_controls()->get_starter(0) );
|
||||
eng.set_p_amb( Static_pressure );
|
||||
eng.set_T_amb( Static_temperature );
|
||||
|
||||
|
@ -117,8 +117,8 @@ bool FGLaRCsim::update( int multiloop ) {
|
|||
|
||||
// copy engine state values onto "bus"
|
||||
FGEngInterface *e = get_engine( 0 );
|
||||
e->set_Throttle( globals->get_controls()->get_throttle( 0 ) * 100.0 );
|
||||
e->set_Mixture( 80 );
|
||||
e->set_Throttle( globals->get_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() );
|
||||
|
@ -129,6 +129,8 @@ bool FGLaRCsim::update( int multiloop ) {
|
|||
e->set_prop_thrust( eng.get_prop_thrust_SI() );
|
||||
e->set_Fuel_Flow( eng.get_fuel_flow_gals_hr() );
|
||||
e->set_Oil_Temp( eng.get_oil_temp() );
|
||||
e->set_Running_Flag( eng.getRunningFlag() );
|
||||
e->set_Cranking_Flag( eng.getCrankingFlag() );
|
||||
|
||||
//Assume we are using both tanks equally for now
|
||||
reduce_Tank1Fuel( (eng.get_fuel_flow_gals_hr() / (2 * 3600))
|
||||
|
|
|
@ -110,8 +110,8 @@ private:
|
|||
double Throttle;
|
||||
double Mixture;
|
||||
double Prop_Advance;
|
||||
int Magnetos; // 0=off, 1=left, 2=right, 3=both
|
||||
bool Starter; // flag to indicate the starter switch is on
|
||||
// int Magnetos; // 0=off, 1=left, 2=right, 3=both
|
||||
// bool Starter; // flag to indicate the starter switch is on
|
||||
|
||||
// outputs
|
||||
double RPM;
|
||||
|
@ -161,8 +161,6 @@ public:
|
|||
inline void set_Throttle( double t ) { Throttle = t; }
|
||||
inline void set_Mixture( double m ) { Mixture = m; }
|
||||
inline void set_Prop_Advance( double p ) { Prop_Advance = p; }
|
||||
inline void set_Magnetos( int m ) { Magnetos = m; }
|
||||
inline void set_Starter( bool s ) { Starter = s; }
|
||||
inline void set_RPM( double r ) { RPM = r; }
|
||||
inline void set_Manifold_Pressure( double mp ) { Manifold_Pressure = mp; }
|
||||
inline void set_MaxHP( double hp ) { MaxHP = hp; }
|
||||
|
@ -172,6 +170,8 @@ public:
|
|||
inline void set_prop_thrust( double t ) { prop_thrust = t; }
|
||||
inline void set_Fuel_Flow( double f ) { Fuel_Flow = f; }
|
||||
inline void set_Oil_Temp (double o) { Oil_Temp = o; }
|
||||
inline void set_Running_Flag (bool r) { running = r; }
|
||||
inline void set_Cranking_Flag (bool c) { cranking = c; }
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -468,6 +468,32 @@ getFuelFlow ()
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the current engine0 running flag
|
||||
*/
|
||||
static bool
|
||||
getRunningFlag ()
|
||||
{
|
||||
if ( current_aircraft.fdm_state->get_engine(0) != NULL ) {
|
||||
return current_aircraft.fdm_state->get_engine(0)->get_Running_Flag();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the current engine0 cranking flag
|
||||
*/
|
||||
static bool
|
||||
getCrankingFlag ()
|
||||
{
|
||||
if ( current_aircraft.fdm_state->get_engine(0) != NULL ) {
|
||||
return current_aircraft.fdm_state->get_engine(0)->get_Cranking_Flag();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the fuel level in tank 1
|
||||
*/
|
||||
|
@ -892,6 +918,31 @@ setWindDown (double speed)
|
|||
speed);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the current engine0 running flag.
|
||||
*/
|
||||
static void
|
||||
setRunningFlag (bool flag)
|
||||
{
|
||||
if(current_aircraft.fdm_state->get_engine(0) != NULL) {
|
||||
current_aircraft.fdm_state->get_engine(0)->set_Running_Flag( flag );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the current engine0 cranking flag.
|
||||
*/
|
||||
//Although there is no real reason to want to tell the engine that it is cranking,
|
||||
//this is currently necessary to avoid the cranking sound being played
|
||||
//before the engine inits.
|
||||
static void
|
||||
setCrankingFlag (bool flag)
|
||||
{
|
||||
if(current_aircraft.fdm_state->get_engine(0) != NULL) {
|
||||
current_aircraft.fdm_state->get_engine(0)->set_Cranking_Flag( flag );
|
||||
}
|
||||
}
|
||||
|
||||
static double
|
||||
getFOV ()
|
||||
{
|
||||
|
@ -1032,6 +1083,8 @@ fgInitProps ()
|
|||
fgTie("/engines/engine[0]/oil-temperature-degf", getOilTemp);
|
||||
fgTie("/engines/engine[0]/mp-osi", getMP);
|
||||
fgTie("/engines/engine[0]/fuel-flow-gph", getFuelFlow);
|
||||
fgTie("/engines/engine[0]/running", getRunningFlag, setRunningFlag);
|
||||
fgTie("/engines/engine[0]/cranking", getCrankingFlag, setCrankingFlag);
|
||||
|
||||
//consumables
|
||||
fgTie("/consumables/fuel/tank[0]/level-gal_us",
|
||||
|
|
|
@ -110,7 +110,8 @@
|
|||
#include <FDM/flight.hxx>
|
||||
#include <FDM/ADA.hxx>
|
||||
#include <Scenery/tileentry.hxx>
|
||||
// Should be inlcluded by gl.h if needed by your platform
|
||||
// Should already be inlcluded by gl.h if needed by your platform so
|
||||
// we shouldn't include this here.
|
||||
// #include <GL/glext.h>
|
||||
PFNGLPOINTPARAMETERFEXTPROC glPointParameterfEXT = 0;
|
||||
PFNGLPOINTPARAMETERFVEXTPROC glPointParameterfvEXT = 0;
|
||||
|
@ -1195,6 +1196,7 @@ static void fgMainLoop( void ) {
|
|||
|
||||
// Run audio scheduler
|
||||
#ifdef ENABLE_AUDIO_SUPPORT
|
||||
static bool bCranking;
|
||||
if ( fgGetBool("/sim/sound") && globals->get_soundmgr()->is_working() ) {
|
||||
if ( fgGetString("/sim/aircraft") == "c172" ) {
|
||||
if(fgGetBool("/engines/engine[0]/running")) {
|
||||
|
@ -1242,7 +1244,18 @@ static void fgMainLoop( void ) {
|
|||
s1->set_pitch(0.0);
|
||||
s1->set_volume(0.0);
|
||||
}
|
||||
} else {
|
||||
if(fgGetBool("/engines/engine[0]/cranking")) {
|
||||
if(!bCranking) {
|
||||
globals->get_soundmgr()->play_looped("cranking");
|
||||
bCranking = true;
|
||||
}
|
||||
} else {
|
||||
if(bCranking) {
|
||||
globals->get_soundmgr()->stop("cranking");
|
||||
bCranking = false;
|
||||
}
|
||||
}
|
||||
} else { // Not C172
|
||||
double param
|
||||
= globals->get_controls()->get_throttle( 0 ) * 2.0 + 1.0;
|
||||
s1->set_pitch( param );
|
||||
|
@ -1314,6 +1327,11 @@ static void fgIdleFunction ( void ) {
|
|||
// s2 = new FGSimpleSound( "Sounds/corflaps.wav" );
|
||||
// s2->set_volume( 0.3 );
|
||||
// globals->get_soundmgr()->add( s2, "flaps" );
|
||||
s2 = new FGSimpleSound( fgGetString("/sim/sounds/engine",
|
||||
"Sounds/cranking.wav") );
|
||||
globals->get_soundmgr()->add( s2, "cranking" );
|
||||
s2->set_pitch(1.5);
|
||||
s2->set_volume(0.25);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in a new issue