1 // controls.hxx -- defines a standard interface to all flight sim controls
3 // Written by Curtis Olson, started May 1997.
5 // Copyright (C) 1997 Curtis L. Olson - http://www.flightgear.org/~curt
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 // General Public License for more details.
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
27 #include <simgear/structure/subsystem_mgr.hxx>
28 #include <simgear/props/tiedpropertylist.hxx>
30 // Define a structure containing the control parameters
32 class FGControls : public SGSubsystem
83 ALL_EJECTION_SEATS = -1,
84 MAX_EJECTION_SEATS = 10
104 double elevator_trim;
109 bool BLC; // Boundary Layer Control
119 // controls/engines/engine[n]/
120 double throttle[MAX_ENGINES];
121 bool starter[MAX_ENGINES];
122 bool fuel_pump[MAX_ENGINES];
123 bool fire_switch[MAX_ENGINES];
124 bool fire_bottle_discharge[MAX_ENGINES];
125 bool cutoff[MAX_ENGINES];
126 double mixture[MAX_ENGINES];
127 double prop_advance[MAX_ENGINES];
128 int magnetos[MAX_ENGINES];
129 int feed_tank[MAX_ENGINES];
130 bool nitrous_injection[MAX_ENGINES]; // War Emergency Power
131 double cowl_flaps_norm[MAX_ENGINES];
132 bool feather[MAX_ENGINES];
133 int ignition[MAX_ENGINES];
134 bool augmentation[MAX_ENGINES];
135 bool reverser[MAX_ENGINES];
136 bool water_injection[MAX_ENGINES];
137 double condition[MAX_ENGINES]; // turboprop speed select
142 // controls/fuel/tank[n]/
143 bool fuel_selector[MAX_TANKS];
144 int to_engine[MAX_TANKS];
145 int to_tank[MAX_TANKS];
147 // controls/fuel/tank[n]/pump[p]/
148 bool boost_pump[MAX_TANKS * MAX_BOOSTPUMPS];
153 double copilot_brake_left;
154 double copilot_brake_right;
155 double brake_parking;
157 bool nose_wheel_steering;
162 bool catapult_launch_cmd;
165 // controls/gear/wheel[n]/
166 bool alternate_extension[MAX_WHEELS];
168 // controls/anti-ice/
174 // controls/anti-ice/engine[n]/
175 bool carb_heat[MAX_ENGINES];
176 bool inlet_heat[MAX_ENGINES];
178 // controls/hydraulic/system[n]/
179 bool engine_pump[MAX_HYD_SYSTEMS];
180 bool electric_pump[MAX_HYD_SYSTEMS];
182 // controls/electric/
187 // controls/electric/engine[n]/
188 bool generator_breaker[MAX_ENGINES];
189 bool bus_tie[MAX_ENGINES];
191 // controls/pneumatic/
194 // controls/pneumatic/engine[n]/
195 bool engine_bleed[MAX_ENGINES];
197 // controls/pressurization/
200 double outflow_valve;
202 // controls/pressurization/pack[n]/
203 bool pack_on[MAX_PACKS];
205 // controls/lighting/
207 bool turn_off_lights;
214 double instruments_norm;
217 // controls/armament/
222 // controls/armament/station[n]/
223 int stick_size[MAX_STATIONS];
224 bool release_stick[MAX_STATIONS];
225 bool release_all[MAX_STATIONS];
226 bool jettison_all[MAX_STATIONS];
229 double vertical_adjust;
230 double fore_aft_adjust;
231 bool eject[MAX_EJECTION_SEATS];
232 int eseat_status[MAX_EJECTION_SEATS];
233 int cmd_selector_valve;
237 bool APU_fire_switch;
239 // controls/autoflight/autopilot[n]/
240 bool autopilot_engage[MAX_AUTOPILOTS];
242 // controls/autoflight/
243 bool autothrottle_arm;
244 bool autothrottle_engage;
245 double heading_select;
246 double altitude_select;
247 double bank_angle_select;
248 double vertical_speed_select;
255 SGPropertyNode_ptr auto_coordination;
256 SGPropertyNode_ptr auto_coordination_factor;
257 simgear::TiedPropertyList _tiedProperties;
263 // Implementation of SGSubsystem.
267 void update (double dt);
268 virtual void reinit();
271 void reset_all(void);
275 inline double get_aileron() const { return aileron; }
276 inline double get_aileron_trim() const { return aileron_trim; }
277 inline double get_elevator() const { return elevator; }
278 inline double get_elevator_trim() const { return elevator_trim; }
279 inline double get_rudder() const { return rudder; }
280 inline double get_rudder_trim() const { return rudder_trim; }
281 inline double get_flaps() const { return flaps; }
282 inline double get_slats() const { return slats; }
283 inline bool get_BLC() const { return BLC; }
284 inline double get_spoilers() const { return spoilers; }
285 inline double get_speedbrake() const { return speedbrake; }
286 inline double get_wing_sweep() const { return wing_sweep; }
287 inline bool get_wing_fold() const { return wing_fold; }
288 inline bool get_drag_chute() const { return drag_chute; }
291 inline bool get_throttle_idle() const { return throttle_idle; }
293 // controls/engines/engine[n]/
294 inline double get_throttle(int engine) const { return throttle[engine]; }
295 inline bool get_starter(int engine) const { return starter[engine]; }
296 inline bool get_fuel_pump(int engine) const { return fuel_pump[engine]; }
297 inline bool get_fire_switch(int engine) const { return fire_switch[engine]; }
298 inline bool get_fire_bottle_discharge(int engine) const {
299 return fire_bottle_discharge[engine];
301 inline bool get_cutoff(int engine) const { return cutoff[engine]; }
302 inline double get_mixture(int engine) const { return mixture[engine]; }
303 inline double get_prop_advance(int engine) const {
304 return prop_advance[engine];
306 inline int get_magnetos(int engine) const { return magnetos[engine]; }
307 inline int get_feed_tank(int engine) const { return feed_tank[engine]; }
308 inline bool get_nitrous_injection(int engine) const {
309 return nitrous_injection[engine];
311 inline double get_cowl_flaps_norm(int engine) const {
312 return cowl_flaps_norm[engine];
314 inline bool get_feather(int engine) const { return feather[engine]; }
315 inline int get_ignition(int engine) const { return ignition[engine]; }
316 inline bool get_augmentation(int engine) const { return augmentation[engine]; }
317 inline bool get_reverser(int engine) const { return reverser[engine]; }
318 inline bool get_water_injection(int engine) const {
319 return water_injection[engine];
321 inline double get_condition(int engine) const { return condition[engine]; }
324 inline bool get_dump_valve() const { return dump_valve; }
326 // controls/fuel/tank[n]/
327 inline bool get_fuel_selector(int tank) const {
328 return fuel_selector[tank];
330 inline int get_to_engine(int tank) const { return to_engine[tank]; }
331 inline int get_to_tank(int tank) const { return to_tank[tank]; }
333 // controls/fuel/tank[n]/pump[p]/
334 inline bool get_boost_pump(int index) const {
335 return boost_pump[index];
339 inline double get_brake_left() const { return brake_left; }
340 inline double get_brake_right() const { return brake_right; }
341 inline double get_copilot_brake_left() const { return copilot_brake_left; }
342 inline double get_copilot_brake_right() const { return copilot_brake_right; }
343 inline double get_brake_parking() const { return brake_parking; }
344 inline double get_steering() const { return steering; }
345 inline bool get_nose_wheel_steering() const { return nose_wheel_steering; }
346 inline bool get_gear_down() const { return gear_down; }
347 inline bool get_antiskid() const { return antiskid; }
348 inline bool get_tailhook() const { return tailhook; }
349 inline bool get_launchbar() const { return launchbar; }
350 inline bool get_catapult_launch_cmd() const { return catapult_launch_cmd; }
351 inline bool get_tailwheel_lock() const { return tailwheel_lock; }
353 // controls/gear/wheel[n]/
354 inline bool get_alternate_extension(int wheel) const {
355 return alternate_extension[wheel];
358 // controls/anti-ice/
359 inline bool get_wing_heat() const { return wing_heat; }
360 inline bool get_pitot_heat() const { return pitot_heat; }
361 inline int get_wiper() const { return wiper; }
362 inline bool get_window_heat() const { return window_heat; }
364 // controls/anti-ice/engine[n]/
365 inline bool get_carb_heat(int engine) const { return carb_heat[engine]; }
366 inline bool get_inlet_heat(int engine) const { return inlet_heat[engine]; }
368 // controls/hydraulic/system[n]/
369 inline bool get_engine_pump(int system) const { return engine_pump[system]; }
370 inline bool get_electric_pump(int system) const { return electric_pump[system]; }
372 // controls/electric/
373 inline bool get_battery_switch() const { return battery_switch; }
374 inline bool get_external_power() const { return external_power; }
375 inline bool get_APU_generator() const { return APU_generator; }
377 // controls/electric/engine[n]/
378 inline bool get_generator_breaker(int engine) const {
379 return generator_breaker[engine];
381 inline bool get_bus_tie(int engine) const { return bus_tie[engine]; }
383 // controls/pneumatic/
384 inline bool get_APU_bleed() const { return APU_bleed; }
386 // controls/pneumatic/engine[n]/
387 inline bool get_engine_bleed(int engine) const { return engine_bleed[engine]; }
389 // controls/pressurization/
390 inline int get_mode() const { return mode; }
391 inline double get_outflow_valve() const { return outflow_valve; }
392 inline bool get_dump() const { return dump; }
394 // controls/pressurization/pack[n]/
395 inline bool get_pack_on(int pack) const { return pack_on[pack]; }
397 // controls/lighting/
398 inline bool get_landing_lights() const { return landing_lights; }
399 inline bool get_turn_off_lights() const { return turn_off_lights; }
400 inline bool get_taxi_light() const { return taxi_light; }
401 inline bool get_logo_lights() const { return logo_lights; }
402 inline bool get_nav_lights() const { return nav_lights; }
403 inline bool get_beacon() const { return beacon; }
404 inline bool get_strobe() const { return strobe; }
405 inline double get_panel_norm() const { return panel_norm; }
406 inline double get_instruments_norm() const { return instruments_norm; }
407 inline double get_dome_norm() const { return dome_norm; }
409 // controls/armament/
410 inline bool get_master_arm() const { return master_arm; }
411 inline int get_station_select() const { return station_select; }
412 inline bool get_release_ALL() const { return release_ALL; }
414 // controls/armament/station[n]/
415 inline int get_stick_size(int station) const { return stick_size[station]; }
416 inline bool get_release_stick(int station) const { return release_stick[station]; }
417 inline bool get_release_all(int station) const { return release_all[station]; }
418 inline bool get_jettison_all(int station) const { return jettison_all[station]; }
421 inline double get_vertical_adjust() const { return vertical_adjust; }
422 inline double get_fore_aft_adjust() const { return fore_aft_adjust; }
423 inline bool get_ejection_seat( int which_seat ) const {
424 return eject[which_seat];
426 inline int get_eseat_status( int which_seat ) const {
427 return eseat_status[which_seat];
429 inline int get_cmd_selector_valve() const { return cmd_selector_valve; }
433 inline int get_off_start_run() const { return off_start_run; }
434 inline bool get_APU_fire_switch() const { return APU_fire_switch; }
436 // controls/autoflight/
437 inline bool get_autothrottle_arm() const { return autothrottle_arm; }
438 inline bool get_autothrottle_engage() const { return autothrottle_engage; }
439 inline double get_heading_select() const { return heading_select; }
440 inline double get_altitude_select() const { return altitude_select; }
441 inline double get_bank_angle_select() const { return bank_angle_select; }
442 inline double get_vertical_speed_select() const {
443 return vertical_speed_select;
445 inline double get_speed_select() const { return speed_select; }
446 inline double get_mach_select() const { return mach_select; }
447 inline int get_vertical_mode() const { return vertical_mode; }
448 inline int get_lateral_mode() const { return lateral_mode; }
450 // controls/autoflight/autopilot[n]/
451 inline bool get_autopilot_engage(int ap) const {
452 return autopilot_engage[ap];
458 void set_aileron( double pos );
459 void move_aileron( double amt );
460 void set_aileron_trim( double pos );
461 void move_aileron_trim( double amt );
462 void set_elevator( double pos );
463 void move_elevator( double amt );
464 void set_elevator_trim( double pos );
465 void move_elevator_trim( double amt );
466 void set_rudder( double pos );
467 void move_rudder( double amt );
468 void set_rudder_trim( double pos );
469 void move_rudder_trim( double amt );
470 void set_flaps( double pos );
471 void move_flaps( double amt );
472 void set_slats( double pos );
473 void move_slats( double amt );
474 void set_BLC( bool val );
475 void set_spoilers( double pos );
476 void move_spoilers( double amt );
477 void set_speedbrake( double pos );
478 void move_speedbrake( double amt );
479 void set_wing_sweep( double pos );
480 void move_wing_sweep( double amt );
481 void set_wing_fold( bool val );
482 void set_drag_chute( bool val );
485 void set_throttle_idle( bool val );
487 // controls/engines/engine[n]/
488 void set_throttle( int engine, double pos );
489 void move_throttle( int engine, double amt );
490 void set_starter( int engine, bool flag );
491 void set_fuel_pump( int engine, bool val );
492 void set_fire_switch( int engine, bool val );
493 void set_fire_bottle_discharge( int engine, bool val );
494 void set_cutoff( int engine, bool val );
495 void set_mixture( int engine, double pos );
496 void move_mixture( int engine, double amt );
497 void set_prop_advance( int engine, double pos );
498 void move_prop_advance( int engine, double amt );
499 void set_magnetos( int engine, int pos );
500 void move_magnetos( int engine, int amt );
501 void set_feed_tank( int engine, int tank );
502 void set_nitrous_injection( int engine, bool val );
503 void set_cowl_flaps_norm( int engine, double pos );
504 void move_cowl_flaps_norm( int engine, double amt );
505 void set_feather( int engine, bool val );
506 void set_ignition( int engine, int val );
507 void set_augmentation( int engine, bool val );
508 void set_reverser( int engine, bool val );
509 void set_water_injection( int engine, bool val );
510 void set_condition( int engine, double val );
513 void set_dump_valve( bool val );
515 // controls/fuel/tank[n]/
516 void set_fuel_selector( int tank, bool pos );
517 void set_to_engine( int tank, int engine );
518 void set_to_tank( int tank, int dest_tank );
520 // controls/fuel/tank[n]/pump[p]
521 void set_boost_pump( int index, bool val );
524 void set_brake_left( double pos );
525 void move_brake_left( double amt );
526 void set_brake_right( double pos );
527 void move_brake_right( double amt );
528 void set_copilot_brake_left( double pos );
529 void set_copilot_brake_right( double pos );
530 void set_brake_parking( double pos );
531 void set_steering( double pos );
532 void move_steering( double amt );
533 void set_nose_wheel_steering( bool nws );
534 void set_gear_down( bool gear );
535 void set_antiskid( bool val );
536 void set_tailhook( bool val );
537 void set_launchbar( bool val );
538 void set_catapult_launch_cmd( bool val );
539 void set_tailwheel_lock( bool val );
541 // controls/gear/wheel[n]/
542 void set_alternate_extension( int wheel, bool val );
544 // controls/anti-ice/
545 void set_wing_heat( bool val );
546 void set_pitot_heat( bool val );
547 void set_wiper( int speed );
548 void set_window_heat( bool val );
550 // controls/anti-ice/engine[n]/
551 void set_carb_heat( int engine, bool val );
552 void set_inlet_heat( int engine, bool val );
554 // controls/hydraulic/system[n]/
555 void set_engine_pump( int system, bool val );
556 void set_electric_pump( int system, bool val );
558 // controls/electric/
559 void set_battery_switch( bool val );
560 void set_external_power( bool val );
561 void set_APU_generator( bool val );
563 // controls/electric/engine[n]/
564 void set_generator_breaker( int engine, bool val );
565 void set_bus_tie( int engine, bool val );
567 // controls/pneumatic/
568 void set_APU_bleed( bool val );
570 // controls/pneumatic/engine[n]/
571 void set_engine_bleed( int engine, bool val );
573 // controls/pressurization/
574 void set_mode( int mode );
575 void set_outflow_valve( double pos );
576 void move_outflow_valve( double amt );
577 void set_dump( bool val );
579 // controls/pressurization/pack[n]/
580 void set_pack_on( int pack, bool val );
582 // controls/lighting/
583 void set_landing_lights( bool val );
584 void set_turn_off_lights( bool val );
585 void set_taxi_light( bool val );
586 void set_logo_lights( bool val );
587 void set_nav_lights( bool val );
588 void set_beacon( bool val );
589 void set_strobe( bool val );
590 void set_panel_norm( double intensity );
591 void move_panel_norm( double amt );
592 void set_instruments_norm( double intensity );
593 void move_instruments_norm( double amt );
594 void set_dome_norm( double intensity );
595 void move_dome_norm( double amt );
597 // controls/armament/
598 void set_master_arm( bool val );
599 void set_station_select( int station );
600 void set_release_ALL( bool val );
602 // controls/armament/station[n]/
603 void set_stick_size( int station, int size );
604 void set_release_stick( int station, bool val );
605 void set_release_all( int station, bool val );
606 void set_jettison_all( int station, bool val );
609 void set_vertical_adjust( double pos );
610 void move_vertical_adjust( double amt );
611 void set_fore_aft_adjust( double pos );
612 void move_fore_aft_adjust( double amt );
613 void set_ejection_seat( int which_seat, bool val );
614 void set_eseat_status( int which_seat, int val );
615 void set_cmd_selector_valve( int val );
618 void set_off_start_run( int pos );
619 void set_APU_fire_switch( bool val );
621 // controls/autoflight/
622 void set_autothrottle_arm( bool val );
623 void set_autothrottle_engage( bool val );
624 void set_heading_select( double heading );
625 void move_heading_select( double amt );
626 void set_altitude_select( double altitude );
627 void move_altitude_select( double amt );
628 void set_bank_angle_select( double angle );
629 void move_bank_angle_select( double amt );
630 void set_vertical_speed_select( double vs );
631 void move_vertical_speed_select( double amt );
632 void set_speed_select( double speed );
633 void move_speed_select( double amt );
634 void set_mach_select( double mach );
635 void move_mach_select( double amt );
636 void set_vertical_mode( int mode );
637 void set_lateral_mode( int mode );
639 // controls/autoflight/autopilot[n]/
640 void set_autopilot_engage( int ap, bool val );
642 static const char* subsystemName() { return "controls"; }
644 inline void do_autocoordination() {
645 // check for autocoordination
646 if ( auto_coordination->getBoolValue() ) {
647 double factor = auto_coordination_factor->getDoubleValue();
648 if( factor > 0.0 ) set_rudder( aileron * factor );
654 #endif // _CONTROLS_HXX