#include <Main/fg_props.hxx>
+\f
+////////////////////////////////////////////////////////////////////////
+// Inline utility methods.
+////////////////////////////////////////////////////////////////////////
+
+static inline void
+CLAMP(double *x, double min, double max )
+{
+ if ( *x < min ) { *x = min; }
+ if ( *x > max ) { *x = max; }
+}
+
+static inline void
+CLAMP(int *i, int min, int max )
+{
+ if ( *i < min ) { *i = min; }
+ if ( *i > max ) { *i = max; }
+}
+
+\f
+////////////////////////////////////////////////////////////////////////
+// Implementation of FGControls.
+////////////////////////////////////////////////////////////////////////
+
// Constructor
FGControls::FGControls() :
aileron( 0.0 ),
&FGControls::get_starter, &FGControls::set_starter);
fgSetArchivable(name);
}
+ fgTie("/controls/parking-brake", this,
+ &FGControls::get_parking_brake, &FGControls::set_parking_brake);
+ fgSetArchivable("/controls/parking-brake");
for (index = 0; index < MAX_WHEELS; index++) {
char name[32];
sprintf(name, "/controls/brakes[%d]", index);
{
}
+
+\f
+////////////////////////////////////////////////////////////////////////
+// Setters and adjusters.
+////////////////////////////////////////////////////////////////////////
+
+void
+FGControls::set_aileron (double pos)
+{
+ aileron = pos;
+ CLAMP( &aileron, -1.0, 1.0 );
+
+ // check for autocoordination
+ if ( auto_coordination->getBoolValue() ) {
+ set_rudder( aileron / 2.0 );
+ }
+}
+
+void
+FGControls::move_aileron (double amt)
+{
+ aileron += amt;
+ CLAMP( &aileron, -1.0, 1.0 );
+
+ // check for autocoordination
+ if ( auto_coordination->getBoolValue() ) {
+ set_rudder( aileron / 2.0 );
+ }
+}
+
+void
+FGControls::set_aileron_trim( double pos )
+{
+ aileron_trim = pos;
+ CLAMP( &aileron_trim, -1.0, 1.0 );
+}
+
+void
+FGControls::move_aileron_trim( double amt )
+{
+ aileron_trim += amt;
+ CLAMP( &aileron_trim, -1.0, 1.0 );
+}
+
+void
+FGControls::set_elevator( double pos )
+{
+ elevator = pos;
+ CLAMP( &elevator, -1.0, 1.0 );
+}
+
+void
+FGControls::move_elevator( double amt )
+{
+ elevator += amt;
+ CLAMP( &elevator, -1.0, 1.0 );
+}
+
+void
+FGControls::set_elevator_trim( double pos )
+{
+ elevator_trim = pos;
+ CLAMP( &elevator_trim, -1.0, 1.0 );
+}
+
+void
+FGControls::move_elevator_trim( double amt )
+{
+ elevator_trim += amt;
+ CLAMP( &elevator_trim, -1.0, 1.0 );
+}
+
+void
+FGControls::set_rudder( double pos )
+{
+ rudder = pos;
+ CLAMP( &rudder, -1.0, 1.0 );
+}
+
+void
+FGControls::move_rudder( double amt )
+{
+ rudder += amt;
+ CLAMP( &rudder, -1.0, 1.0 );
+}
+
+void
+FGControls::set_rudder_trim( double pos )
+{
+ rudder_trim = pos;
+ CLAMP( &rudder_trim, -1.0, 1.0 );
+}
+
+void
+FGControls::move_rudder_trim( double amt )
+{
+ rudder_trim += amt;
+ CLAMP( &rudder_trim, -1.0, 1.0 );
+}
+
+void
+FGControls::set_flaps( double pos )
+{
+ flaps = pos;
+ CLAMP( &flaps, 0.0, 1.0 );
+}
+
+void
+FGControls::move_flaps( double amt )
+{
+ flaps += amt;
+ CLAMP( &flaps, 0.0, 1.0 );
+}
+
+void
+FGControls::set_throttle( int engine, double pos )
+{
+ if ( engine == ALL_ENGINES ) {
+ for ( int i = 0; i < MAX_ENGINES; i++ ) {
+ throttle[i] = pos;
+ CLAMP( &throttle[i], 0.0, 1.0 );
+ }
+ } else {
+ if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
+ throttle[engine] = pos;
+ CLAMP( &throttle[engine], 0.0, 1.0 );
+ }
+ }
+}
+
+void
+FGControls::move_throttle( int engine, double amt )
+{
+ if ( engine == ALL_ENGINES ) {
+ for ( int i = 0; i < MAX_ENGINES; i++ ) {
+ throttle[i] += amt;
+ CLAMP( &throttle[i], 0.0, 1.0 );
+ }
+ } else {
+ if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
+ throttle[engine] += amt;
+ CLAMP( &throttle[engine], 0.0, 1.0 );
+ }
+ }
+}
+
+void
+FGControls::set_mixture( int engine, double pos )
+{
+ if ( engine == ALL_ENGINES ) {
+ for ( int i = 0; i < MAX_ENGINES; i++ ) {
+ mixture[i] = pos;
+ CLAMP( &mixture[i], 0.0, 1.0 );
+ }
+ } else {
+ if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
+ mixture[engine] = pos;
+ CLAMP( &mixture[engine], 0.0, 1.0 );
+ }
+ }
+}
+
+void
+FGControls::move_mixture( int engine, double amt )
+{
+ if ( engine == ALL_ENGINES ) {
+ for ( int i = 0; i < MAX_ENGINES; i++ ) {
+ mixture[i] += amt;
+ CLAMP( &mixture[i], 0.0, 1.0 );
+ }
+ } else {
+ if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
+ mixture[engine] += amt;
+ CLAMP( &mixture[engine], 0.0, 1.0 );
+ }
+ }
+}
+
+void
+FGControls::set_prop_advance( int engine, double pos )
+{
+ if ( engine == ALL_ENGINES ) {
+ for ( int i = 0; i < MAX_ENGINES; i++ ) {
+ prop_advance[i] = pos;
+ CLAMP( &prop_advance[i], 0.0, 1.0 );
+ }
+ } else {
+ if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
+ prop_advance[engine] = pos;
+ CLAMP( &prop_advance[engine], 0.0, 1.0 );
+ }
+ }
+}
+
+void
+FGControls::move_prop_advance( int engine, double amt )
+{
+ if ( engine == ALL_ENGINES ) {
+ for ( int i = 0; i < MAX_ENGINES; i++ ) {
+ prop_advance[i] += amt;
+ CLAMP( &prop_advance[i], 0.0, 1.0 );
+ }
+ } else {
+ if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
+ prop_advance[engine] += amt;
+ CLAMP( &prop_advance[engine], 0.0, 1.0 );
+ }
+ }
+}
+
+void
+FGControls::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 );
+ }
+ }
+}
+
+void
+FGControls::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 );
+ }
+ }
+}
+
+void
+FGControls::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;
+ }
+ }
+}
+
+void
+FGControls::set_parking_brake( double pos )
+{
+ parking_brake = pos;
+ CLAMP(&parking_brake, 0.0, 1.0);
+}
+
+void
+FGControls::set_brake( int wheel, double pos )
+{
+ if ( wheel == ALL_WHEELS ) {
+ for ( int i = 0; i < MAX_WHEELS; i++ ) {
+ brake[i] = pos;
+ CLAMP( &brake[i], 0.0, 1.0 );
+ }
+ } else {
+ if ( (wheel >= 0) && (wheel < MAX_WHEELS) ) {
+ brake[wheel] = pos;
+ CLAMP( &brake[wheel], 0.0, 1.0 );
+ }
+ }
+}
+
+void
+FGControls::move_brake( int wheel, double amt )
+{
+ if ( wheel == ALL_WHEELS ) {
+ for ( int i = 0; i < MAX_WHEELS; i++ ) {
+ brake[i] += amt;
+ CLAMP( &brake[i], 0.0, 1.0 );
+ }
+ } else {
+ if ( (wheel >= 0) && (wheel < MAX_WHEELS) ) {
+ brake[wheel] += amt;
+ CLAMP( &brake[wheel], 0.0, 1.0 );
+ }
+ }
+}
+
+void
+FGControls::set_gear_down( bool gear )
+{
+ gear_down = gear;
+}
+
+
double throttle[MAX_ENGINES];
double mixture[MAX_ENGINES];
double prop_advance[MAX_ENGINES];
+ double parking_brake;
double brake[MAX_WHEELS];
int magnetos[MAX_ENGINES];
bool throttle_idle;
SGPropertyNode * auto_coordination;
- inline void CLAMP(double *x, double min, double max ) {
- 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();
inline double get_prop_advance(int engine) const {
return prop_advance[engine];
}
+ inline double get_parking_brake() const { return parking_brake; }
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
- inline void set_aileron( double pos ) {
- aileron = pos;
- CLAMP( &aileron, -1.0, 1.0 );
-
- // check for autocoordination
- if ( auto_coordination->getBoolValue() )
- {
- set_rudder( aileron / 2.0 );
- }
- }
- inline void move_aileron( double amt ) {
- aileron += amt;
- CLAMP( &aileron, -1.0, 1.0 );
-
- // check for autocoordination
- if ( auto_coordination->getBoolValue() )
- {
- set_rudder( aileron / 2.0 );
- }
- }
- inline void set_aileron_trim( double pos ) {
- aileron_trim = pos;
- CLAMP( &aileron_trim, -1.0, 1.0 );
- }
- inline void move_aileron_trim( double amt ) {
- aileron_trim += amt;
- CLAMP( &aileron_trim, -1.0, 1.0 );
- }
- inline void set_elevator( double pos ) {
- elevator = pos;
- CLAMP( &elevator, -1.0, 1.0 );
- }
- inline void move_elevator( double amt ) {
- elevator += amt;
- CLAMP( &elevator, -1.0, 1.0 );
- }
- inline void set_elevator_trim( double pos ) {
- elevator_trim = pos;
- CLAMP( &elevator_trim, -1.0, 1.0 );
- }
- inline void move_elevator_trim( double amt ) {
- elevator_trim += amt;
- CLAMP( &elevator_trim, -1.0, 1.0 );
- }
- inline void set_rudder( double pos ) {
- rudder = pos;
- CLAMP( &rudder, -1.0, 1.0 );
- }
- inline void move_rudder( double amt ) {
- rudder += amt;
- CLAMP( &rudder, -1.0, 1.0 );
- }
- inline void set_rudder_trim( double pos ) {
- rudder_trim = pos;
- CLAMP( &rudder_trim, -1.0, 1.0 );
- }
- inline void move_rudder_trim( double amt ) {
- rudder_trim += amt;
- CLAMP( &rudder_trim, -1.0, 1.0 );
- }
- inline void set_flaps( double pos ) {
- flaps = pos;
- CLAMP( &flaps, 0.0, 1.0 );
- }
- inline void move_flaps( double amt ) {
- flaps += amt;
- CLAMP( &flaps, 0.0, 1.0 );
- }
- inline void set_throttle( int engine, double pos ) {
- if ( engine == ALL_ENGINES ) {
- for ( int i = 0; i < MAX_ENGINES; i++ ) {
- throttle[i] = pos;
- CLAMP( &throttle[i], 0.0, 1.0 );
- }
- } else {
- if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
- throttle[engine] = pos;
- CLAMP( &throttle[engine], 0.0, 1.0 );
- }
- }
- }
- inline void move_throttle( int engine, double amt ) {
- if ( engine == ALL_ENGINES ) {
- for ( int i = 0; i < MAX_ENGINES; i++ ) {
- throttle[i] += amt;
- CLAMP( &throttle[i], 0.0, 1.0 );
- }
- } else {
- if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
- throttle[engine] += amt;
- CLAMP( &throttle[engine], 0.0, 1.0 );
- }
- }
- }
- inline void set_mixture( int engine, double pos ) {
- if ( engine == ALL_ENGINES ) {
- for ( int i = 0; i < MAX_ENGINES; i++ ) {
- mixture[i] = pos;
- CLAMP( &mixture[i], 0.0, 1.0 );
- }
- } else {
- if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
- mixture[engine] = pos;
- CLAMP( &mixture[engine], 0.0, 1.0 );
- }
- }
- }
- inline void move_mixture( int engine, double amt ) {
- if ( engine == ALL_ENGINES ) {
- for ( int i = 0; i < MAX_ENGINES; i++ ) {
- mixture[i] += amt;
- CLAMP( &mixture[i], 0.0, 1.0 );
- }
- } else {
- if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
- mixture[engine] += amt;
- CLAMP( &mixture[engine], 0.0, 1.0 );
- }
- }
- }
- inline void set_prop_advance( int engine, double pos ) {
- if ( engine == ALL_ENGINES ) {
- for ( int i = 0; i < MAX_ENGINES; i++ ) {
- prop_advance[i] = pos;
- CLAMP( &prop_advance[i], 0.0, 1.0 );
- }
- } else {
- if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
- prop_advance[engine] = pos;
- CLAMP( &prop_advance[engine], 0.0, 1.0 );
- }
- }
- }
- inline void move_prop_advance( int engine, double amt ) {
- if ( engine == ALL_ENGINES ) {
- for ( int i = 0; i < MAX_ENGINES; i++ ) {
- prop_advance[i] += amt;
- CLAMP( &prop_advance[i], 0.0, 1.0 );
- }
- } else {
- if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
- prop_advance[engine] += amt;
- CLAMP( &prop_advance[engine], 0.0, 1.0 );
- }
- }
- }
- 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++ ) {
- brake[i] = pos;
- CLAMP( &brake[i], 0.0, 1.0 );
- }
- } else {
- if ( (wheel >= 0) && (wheel < MAX_WHEELS) ) {
- brake[wheel] = pos;
- CLAMP( &brake[wheel], 0.0, 1.0 );
- }
- }
- }
- inline void move_brake( int wheel, double amt ) {
- if ( wheel == ALL_WHEELS ) {
- for ( int i = 0; i < MAX_WHEELS; i++ ) {
- brake[i] += amt;
- CLAMP( &brake[i], 0.0, 1.0 );
- }
- } else {
- if ( (wheel >= 0) && (wheel < MAX_WHEELS) ) {
- brake[wheel] += amt;
- CLAMP( &brake[wheel], 0.0, 1.0 );
- }
- }
- }
- inline void set_gear_down( bool gear ) { gear_down = gear; }
+ void set_aileron( double pos );
+ void move_aileron( double amt );
+ void set_aileron_trim( double pos );
+ void move_aileron_trim( double amt );
+ void set_elevator( double pos );
+ void move_elevator( double amt );
+ void set_elevator_trim( double pos );
+ void move_elevator_trim( double amt );
+ void set_rudder( double pos );
+ void move_rudder( double amt );
+ void set_rudder_trim( double pos );
+ void move_rudder_trim( double amt );
+ void set_flaps( double pos );
+ void move_flaps( double amt );
+ void set_throttle( int engine, double pos );
+ void move_throttle( int engine, double amt );
+ void set_mixture( int engine, double pos );
+ void move_mixture( int engine, double amt );
+ void set_prop_advance( int engine, double pos );
+ void move_prop_advance( int engine, double amt );
+ void set_magnetos( int engine, int pos );
+ void move_magnetos( int engine, int amt );
+ void set_starter( int engine, bool flag );
+ void set_parking_brake( double pos );
+ void set_brake( int wheel, double pos );
+ void move_brake( int wheel, double amt );
+ void set_gear_down( bool gear );
};