#ifndef _CONTROLS_HXX
#define _CONTROLS_HXX
-#include <Main/options.hxx>
+#include <simgear/misc/props.hxx>
+
+#include <Main/fgfs.hxx>
+#include <Main/globals.hxx>
#ifndef __cplusplus
# error This library requires C++
// Define a structure containing the control parameters
-class FGControls {
+class FGControls : public FGSubsystem
+{
public:
double elevator;
double elevator_trim;
double rudder;
+ double flaps;
double throttle[MAX_ENGINES];
+ double mixture[MAX_ENGINES];
+ double prop_advance[MAX_ENGINES];
double brake[MAX_WHEELS];
+ bool throttle_idle;
+
+ SGPropertyNode * auto_coordination;
inline void CLAMP(double *x, double min, double max ) {
if ( *x < min ) { *x = min; }
FGControls();
~FGControls();
+ // Implementation of FGSubsystem.
+ void init ();
+ void bind ();
+ void unbind ();
+ void update ();
+
// Reset function
void reset_all(void);
inline double get_elevator() const { return elevator; }
inline double get_elevator_trim() const { return elevator_trim; }
inline double get_rudder() const { return rudder; }
+ inline double get_flaps() const { return flaps; }
inline double get_throttle(int engine) const { return throttle[engine]; }
+ inline double get_mixture(int engine) const { return mixture[engine]; }
+ inline double get_prop_advance(int engine) const {
+ return prop_advance[engine];
+ }
inline double get_brake(int wheel) const { return brake[wheel]; }
// Update functions
CLAMP( &aileron, -1.0, 1.0 );
// check for autocoordination
- if ( current_options.get_auto_coordination() ==
- fgOPTIONS::FG_AUTO_COORD_ENABLED )
+ if ( auto_coordination->getBoolValue() )
{
set_rudder( aileron / 2.0 );
}
CLAMP( &aileron, -1.0, 1.0 );
// check for autocoordination
- if ( current_options.get_auto_coordination() ==
- fgOPTIONS::FG_AUTO_COORD_ENABLED )
+ if ( auto_coordination->getBoolValue() )
{
set_rudder( aileron / 2.0 );
}
rudder += amt;
CLAMP( &rudder, -1.0, 1.0 );
}
+ inline void set_flaps( double pos ) {
+ if ( flaps != pos ) {
+ globals->get_soundmgr()->play_once( "flaps" );
+ }
+ flaps = pos;
+ CLAMP( &flaps, 0.0, 1.0 );
+ }
+ inline void move_flaps( double amt ) {
+ if ( fabs(amt) > 0.0 ) {
+ globals->get_soundmgr()->play_once( "flaps" );
+ }
+ 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++ ) {
}
}
}
+ 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_brake( int wheel, double pos ) {
if ( wheel == ALL_WHEELS ) {
for ( int i = 0; i < MAX_WHEELS; i++ ) {