1 // controls.cxx -- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include <simgear/compiler.h>
25 #include <simgear/debug/logstream.hxx>
26 #include <Main/fg_props.hxx>
28 #include "controls.hxx"
31 static const int MAX_NAME_LEN = 128;
34 ////////////////////////////////////////////////////////////////////////
35 // Inline utility methods.
36 ////////////////////////////////////////////////////////////////////////
39 CLAMP(double *x, double min, double max )
41 if ( *x < min ) { *x = min; }
42 if ( *x > max ) { *x = max; }
46 CLAMP(int *i, int min, int max )
48 if ( *i < min ) { *i = min; }
49 if ( *i > max ) { *i = max; }
53 ////////////////////////////////////////////////////////////////////////
54 // Implementation of FGControls.
55 ////////////////////////////////////////////////////////////////////////
58 FGControls::FGControls() :
73 throttle_idle( true ),
77 copilot_brake_left( 0.0 ),
78 copilot_brake_right( 0.0 ),
85 catapult_launch_cmd( false ),
86 tailwheel_lock( false ),
91 battery_switch( true ),
92 external_power( false ),
93 APU_generator( false ),
104 instruments_norm( 0.0 ),
108 release_ALL( false ),
109 vertical_adjust( 0.0 ),
110 fore_aft_adjust( 0.0 ),
112 APU_fire_switch( false ),
113 autothrottle_arm( false ),
114 autothrottle_engage( false ),
115 heading_select( 0.0 ),
116 altitude_select( 50000.0 ),
117 bank_angle_select( 30.0 ),
118 vertical_speed_select( 0.0 ),
127 void FGControls::reset_all()
130 set_aileron_trim( 0.0 );
132 set_elevator_trim( 0.0 );
134 set_rudder_trim( 0.0 );
137 set_speedbrake( 0.0 );
138 set_wing_sweep( 0.0 );
141 set_throttle( ALL_ENGINES, 0.0 );
142 set_starter( ALL_ENGINES, false );
143 set_magnetos( ALL_ENGINES, 0 );
144 set_fuel_pump( ALL_ENGINES, false );
145 set_fire_switch( ALL_ENGINES, false );
146 set_fire_bottle_discharge( ALL_ENGINES, false );
147 set_cutoff( ALL_ENGINES, true );
148 set_nitrous_injection( ALL_ENGINES, false );
149 set_cowl_flaps_norm( ALL_ENGINES, 1.0 );
150 set_feather( ALL_ENGINES, false );
151 set_ignition( ALL_ENGINES, false );
152 set_augmentation( ALL_ENGINES, false );
153 set_reverser( ALL_ENGINES, false );
154 set_water_injection( ALL_ENGINES, false );
155 set_condition( ALL_ENGINES, 1.0 );
156 throttle_idle = true;
157 set_fuel_selector( ALL_TANKS, true );
163 catapult_launch_cmd = false;
164 tailwheel_lock = false;
165 set_carb_heat( ALL_ENGINES, false );
166 set_inlet_heat( ALL_ENGINES, false );
171 set_engine_pump( ALL_HYD_SYSTEMS, true );
172 set_electric_pump( ALL_HYD_SYSTEMS, true );
173 landing_lights = false;
174 turn_off_lights = false;
176 set_ejection_seat( ALL_EJECTION_SEATS, false );
177 set_eseat_status( ALL_EJECTION_SEATS, SEAT_SAFED );
178 set_cmd_selector_valve( CMD_SEL_NORM );
179 APU_fire_switch = false;
180 autothrottle_arm = false;
181 autothrottle_engage = false;
182 set_autopilot_engage( ALL_AUTOPILOTS, false );
187 FGControls::~FGControls() {
194 throttle_idle = true;
195 for ( int engine = 0; engine < MAX_ENGINES; engine++ ) {
196 throttle[engine] = 0.0;
197 mixture[engine] = 1.0;
198 fuel_pump[engine] = false;
199 prop_advance[engine] = 1.0;
200 magnetos[engine] = 0;
201 starter[engine] = false;
202 ignition[engine] = false;
203 fire_switch[engine] = false;
204 cutoff[engine] = true;
205 augmentation[engine] = false;
206 reverser[engine] = false;
207 water_injection[engine] = false;
208 nitrous_injection[engine] = false;
209 cowl_flaps_norm[engine] = 0.0;
210 condition[engine] = 1.0;
213 brake_left = brake_right
214 = copilot_brake_left = copilot_brake_right
215 = brake_parking = 0.0;
216 for ( int wheel = 0; wheel < MAX_WHEELS; wheel++ ) {
217 alternate_extension[wheel] = false;
220 auto_coordination = fgGetNode("/sim/auto-coordination", true);
230 fgTie("/controls/flight/aileron", this,
231 &FGControls::get_aileron, &FGControls::set_aileron);
232 fgSetArchivable("/controls/flight/aileron");
234 fgTie("/controls/flight/aileron-trim", this,
235 &FGControls::get_aileron_trim, &FGControls::set_aileron_trim);
236 fgSetArchivable("/controls/flight/aileron-trim");
238 fgTie("/controls/flight/elevator", this,
239 &FGControls::get_elevator, &FGControls::set_elevator);
240 fgSetArchivable("/controls/flight/elevator");
242 fgTie("/controls/flight/elevator-trim", this,
243 &FGControls::get_elevator_trim, &FGControls::set_elevator_trim);
244 fgSetArchivable("/controls/flight/elevator-trim");
246 fgTie("/controls/flight/rudder", this,
247 &FGControls::get_rudder, &FGControls::set_rudder);
248 fgSetArchivable("/controls/flight/rudder");
250 fgTie("/controls/flight/rudder-trim", this,
251 &FGControls::get_rudder_trim, &FGControls::set_rudder_trim);
252 fgSetArchivable("/controls/flight/rudder-trim");
254 fgTie("/controls/flight/flaps", this,
255 &FGControls::get_flaps, &FGControls::set_flaps);
256 fgSetArchivable("/controls/flight/flaps");
258 fgTie("/controls/flight/slats", this,
259 &FGControls::get_slats, &FGControls::set_slats);
260 fgSetArchivable("/controls/flight/slats");
262 fgTie("/controls/flight/BLC", this,
263 &FGControls::get_BLC, &FGControls::set_BLC);
264 fgSetArchivable("/controls/flight/BLC");
266 fgTie("/controls/flight/spoilers", this,
267 &FGControls::get_spoilers, &FGControls::set_spoilers);
268 fgSetArchivable("/controls/flight/spoilers");
270 fgTie("/controls/flight/speedbrake", this,
271 &FGControls::get_speedbrake, &FGControls::set_speedbrake);
272 fgSetArchivable("/controls/flight/speedbrake");
274 fgTie("/controls/flight/wing-sweep", this,
275 &FGControls::get_wing_sweep, &FGControls::set_wing_sweep);
276 fgSetArchivable("/controls/flight/wing-sweep");
278 fgTie("/controls/flight/wing-fold", this,
279 &FGControls::get_wing_fold, &FGControls::set_wing_fold);
280 fgSetArchivable("/controls/flight/wing-fold");
282 fgTie("/controls/flight/drag-chute", this,
283 &FGControls::get_drag_chute, &FGControls::set_drag_chute);
284 fgSetArchivable("/controls/flight/drag-chute");
287 fgTie("/controls/engines/throttle_idle", this,
288 &FGControls::get_throttle_idle, &FGControls::set_throttle_idle);
289 fgSetArchivable("/controls/engines/throttle_idle");
291 for (index = 0; index < MAX_ENGINES; index++) {
292 char name[MAX_NAME_LEN];
293 snprintf(name, MAX_NAME_LEN,
294 "/controls/engines/engine[%d]/throttle", index);
295 fgTie(name, this, index,
296 &FGControls::get_throttle, &FGControls::set_throttle);
297 fgSetArchivable(name);
299 snprintf(name, MAX_NAME_LEN, "/controls/engines/engine[%d]/starter", index);
300 fgTie(name, this, index,
301 &FGControls::get_starter, &FGControls::set_starter);
302 fgSetArchivable(name);
304 snprintf(name, MAX_NAME_LEN,
305 "/controls/engines/engine[%d]/fuel-pump", index);
306 fgTie(name, this, index,
307 &FGControls::get_fuel_pump, &FGControls::set_fuel_pump);
308 fgSetArchivable(name);
310 snprintf(name, MAX_NAME_LEN,
311 "/controls/engines/engine[%d]/fire-switch", index);
312 fgTie(name, this, index,
313 &FGControls::get_fire_switch, &FGControls::set_fire_switch);
314 fgSetArchivable(name);
316 snprintf(name, MAX_NAME_LEN,
317 "/controls/engines/engine[%d]/fire-bottle-discharge", index);
318 fgTie(name, this, index,
319 &FGControls::get_fire_bottle_discharge,
320 &FGControls::set_fire_bottle_discharge);
321 fgSetArchivable(name);
323 snprintf(name, MAX_NAME_LEN, "/controls/engines/engine[%d]/cutoff", index);
324 fgTie(name, this, index,
325 &FGControls::get_cutoff, &FGControls::set_cutoff);
326 fgSetArchivable(name);
328 snprintf(name, MAX_NAME_LEN, "/controls/engines/engine[%d]/mixture", index);
329 fgTie(name, this, index,
330 &FGControls::get_mixture, &FGControls::set_mixture);
331 fgSetArchivable(name);
333 snprintf(name, MAX_NAME_LEN,
334 "/controls/engines/engine[%d]/propeller-pitch", index);
335 fgTie(name, this, index,
336 &FGControls::get_prop_advance,
337 &FGControls::set_prop_advance);
338 fgSetArchivable(name);
340 snprintf(name, MAX_NAME_LEN,
341 "/controls/engines/engine[%d]/magnetos", index);
342 fgTie(name, this, index,
343 &FGControls::get_magnetos, &FGControls::set_magnetos);
344 fgSetArchivable(name);
346 snprintf(name, MAX_NAME_LEN, "/controls/engines/engine[%d]/WEP", index);
347 fgTie(name, this, index,
348 &FGControls::get_nitrous_injection,
349 &FGControls::set_nitrous_injection);
350 fgSetArchivable(name);
352 snprintf(name, MAX_NAME_LEN,
353 "/controls/engines/engine[%d]/cowl-flaps-norm", index);
354 fgTie(name, this, index,
355 &FGControls::get_cowl_flaps_norm,
356 &FGControls::set_cowl_flaps_norm);
357 fgSetArchivable(name);
359 snprintf(name, MAX_NAME_LEN,
360 "/controls/engines/engine[%d]/propeller-feather", index);
361 fgTie(name, this, index,
362 &FGControls::get_feather, &FGControls::set_feather);
363 fgSetArchivable(name);
365 snprintf(name, MAX_NAME_LEN,
366 "/controls/engines/engine[%d]/ignition", index);
367 fgTie(name, this, index,
368 &FGControls::get_ignition, &FGControls::set_ignition);
369 fgSetArchivable(name);
371 snprintf(name, MAX_NAME_LEN,
372 "/controls/engines/engine[%d]/augmentation", index);
373 fgTie(name, this, index,
374 &FGControls::get_augmentation,
375 &FGControls::set_augmentation);
376 fgSetArchivable(name);
378 snprintf(name, MAX_NAME_LEN,
379 "/controls/engines/engine[%d]/reverser", index);
380 fgTie(name, this, index,
381 &FGControls::get_reverser, &FGControls::set_reverser);
382 fgSetArchivable(name);
384 snprintf(name, MAX_NAME_LEN,
385 "/controls/engines/engine[%d]/water-injection", index);
386 fgTie(name, this, index,
387 &FGControls::get_water_injection,
388 &FGControls::set_water_injection);
389 fgSetArchivable(name);
391 snprintf(name, MAX_NAME_LEN,
392 "/controls/engines/engine[%d]/condition", index);
393 fgTie(name, this, index,
394 &FGControls::get_condition, &FGControls::set_condition);
395 fgSetArchivable(name);
399 fgTie("/controls/fuel/dump-valve", this,
400 &FGControls::get_dump_valve, &FGControls::set_dump_valve);
401 fgSetArchivable("/controls/fuel/dump-valve");
403 for (index = 0; index < MAX_TANKS; index++) {
404 char name[MAX_NAME_LEN];
405 snprintf(name, MAX_NAME_LEN,
406 "/controls/fuel/tank[%d]/fuel_selector", index);
407 fgTie(name, this, index,
408 &FGControls::get_fuel_selector,
409 &FGControls::set_fuel_selector);
410 fgSetArchivable(name);
412 snprintf(name, MAX_NAME_LEN, "/controls/fuel/tank[%d]/to_engine", index);
413 fgTie(name, this, index,
414 &FGControls::get_to_engine, &FGControls::set_to_engine);
415 fgSetArchivable(name);
417 snprintf(name, MAX_NAME_LEN, "/controls/fuel/tank[%d]/to_tank", index);
418 fgTie(name, this, index,
419 &FGControls::get_to_tank, &FGControls::set_to_tank);
420 fgSetArchivable(name);
422 for (i = 0; i < MAX_BOOSTPUMPS; i++) {
423 char name[MAX_NAME_LEN];
424 snprintf(name, MAX_NAME_LEN,
425 "/controls/fuel/tank[%d]/boost-pump[%d]", index, i);
426 fgTie(name, this, index * 2 + i,
427 &FGControls::get_boost_pump,
428 &FGControls::set_boost_pump);
429 fgSetArchivable(name);
434 fgTie("/controls/gear/brake-left", this,
435 &FGControls::get_brake_left,
436 &FGControls::set_brake_left);
437 fgSetArchivable("/controls/gear/brake-left");
439 fgTie("/controls/gear/brake-right", this,
440 &FGControls::get_brake_right,
441 &FGControls::set_brake_right);
442 fgSetArchivable("/controls/gear/brake-right");
444 fgTie("/controls/gear/copilot-brake-left", this,
445 &FGControls::get_copilot_brake_left,
446 &FGControls::set_copilot_brake_left);
447 fgSetArchivable("/controls/gear/copilot-brake-left");
449 fgTie("/controls/gear/copilot-brake-right", this,
450 &FGControls::get_copilot_brake_right,
451 &FGControls::set_copilot_brake_right);
452 fgSetArchivable("/controls/gear/copilot-brake-right");
454 fgTie("/controls/gear/brake-parking", this,
455 &FGControls::get_brake_parking,
456 &FGControls::set_brake_parking);
457 fgSetArchivable("/controls/gear/brake-parking");
459 fgTie("/controls/gear/steering", this,
460 &FGControls::get_steering, &FGControls::set_steering);
461 fgSetArchivable("/controls/gear/steering");
463 fgTie("/controls/gear/gear-down", this,
464 &FGControls::get_gear_down, &FGControls::set_gear_down);
465 fgSetArchivable("/controls/gear/gear-down");
467 fgTie("/controls/gear/antiskid", this,
468 &FGControls::get_antiskid, &FGControls::set_antiskid);
469 fgSetArchivable("/controls/gear/antiskid");
471 fgTie("/controls/gear/tailhook", this,
472 &FGControls::get_tailhook, &FGControls::set_tailhook);
473 fgSetArchivable("/controls/gear/tailhook");
475 fgTie("/controls/gear/launchbar", this,
476 &FGControls::get_launchbar, &FGControls::set_launchbar);
477 fgSetArchivable("/controls/gear/launchbar");
479 fgTie("/controls/gear/catapult-launch-cmd", this,
480 &FGControls::get_catapult_launch_cmd, &FGControls::set_catapult_launch_cmd);
481 fgSetArchivable("/controls/gear/catapult-launch-cmd");
483 fgTie("/controls/gear/tailwheel-lock", this,
484 &FGControls::get_tailwheel_lock,
485 &FGControls::set_tailwheel_lock);
486 fgSetArchivable("/controls/gear/tailwheel-lock");
488 for (index = 0; index < MAX_WHEELS; index++) {
489 char name[MAX_NAME_LEN];
490 snprintf(name, MAX_NAME_LEN,
491 "/controls/gear/wheel[%d]/alternate-extension", index);
492 fgTie(name, this, index,
493 &FGControls::get_alternate_extension,
494 &FGControls::set_alternate_extension);
495 fgSetArchivable(name);
499 fgTie("/controls/anti-ice/wing-heat", this,
500 &FGControls::get_wing_heat, &FGControls::set_wing_heat);
501 fgSetArchivable("/controls/anti-ice/wing-heat");
503 fgTie("/controls/anti-ice/pitot-heat", this,
504 &FGControls::get_pitot_heat, &FGControls::set_pitot_heat);
505 fgSetArchivable("/controls/anti-ice/pitot-heat");
507 fgTie("/controls/anti-ice/wiper", this,
508 &FGControls::get_wiper, &FGControls::set_wiper);
509 fgSetArchivable("/controls/anti-ice/wiper");
511 fgTie("/controls/anti-ice/window-heat", this,
512 &FGControls::get_window_heat, &FGControls::set_window_heat);
513 fgSetArchivable("/controls/anti-ice/window-heat");
515 for (index = 0; index < MAX_ENGINES; index++) {
516 char name[MAX_NAME_LEN];
517 snprintf(name, MAX_NAME_LEN,
518 "/controls/anti-ice/engine[%d]/carb-heat", index);
519 fgTie(name, this, index,
520 &FGControls::get_carb_heat, &FGControls::set_carb_heat);
521 fgSetArchivable(name);
523 snprintf(name, MAX_NAME_LEN,
524 "/controls/anti-ice/engine[%d]/inlet-heat", index);
525 fgTie(name, this, index,
526 &FGControls::get_inlet_heat, &FGControls::set_inlet_heat);
527 fgSetArchivable(name);
531 for (index = 0; index < MAX_HYD_SYSTEMS; index++) {
532 char name[MAX_NAME_LEN];
533 snprintf(name, MAX_NAME_LEN,
534 "/controls/hydraulic/system[%d]/engine-pump", index);
535 fgTie(name, this, index,
536 &FGControls::get_engine_pump, &FGControls::set_engine_pump);
537 fgSetArchivable(name);
539 snprintf(name, MAX_NAME_LEN,
540 "/controls/hydraulic/system[%d]/electric-pump", index);
541 fgTie(name, this, index,
542 &FGControls::get_electric_pump,
543 &FGControls::set_electric_pump);
544 fgSetArchivable(name);
548 fgTie("/controls/electric/battery-switch", this,
549 &FGControls::get_battery_switch,
550 &FGControls::set_battery_switch);
551 fgSetArchivable("/controls/electric/battery-switch");
553 fgTie("/controls/electric/external-power", this,
554 &FGControls::get_external_power,
555 &FGControls::set_external_power);
556 fgSetArchivable("/controls/electric/external-power");
558 fgTie("/controls/electric/APU-generator", this,
559 &FGControls::get_APU_generator,
560 &FGControls::set_APU_generator);
561 fgSetArchivable("/controls/electric/APU-generator");
563 for (index = 0; index < MAX_ENGINES; index++) {
564 char name[MAX_NAME_LEN];
565 snprintf(name, MAX_NAME_LEN,
566 "/controls/electric/engine[%d]/generator", index);
567 fgTie(name, this, index,
568 &FGControls::get_generator_breaker,
569 &FGControls::set_generator_breaker);
570 fgSetArchivable(name);
572 snprintf(name, MAX_NAME_LEN,
573 "/controls/electric/engine[%d]/bus-tie", index);
574 fgTie(name, this, index,
575 &FGControls::get_bus_tie,
576 &FGControls::set_bus_tie);
577 fgSetArchivable(name);
581 fgTie("/controls/pneumatic/APU-bleed", this,
582 &FGControls::get_APU_bleed,
583 &FGControls::set_APU_bleed);
584 fgSetArchivable("/controls/pneumatic/APU-bleed");
586 for (index = 0; index < MAX_ENGINES; index++) {
587 char name[MAX_NAME_LEN];
588 snprintf(name, MAX_NAME_LEN,
589 "/controls/pneumatic/engine[%d]/bleed", index);
590 fgTie(name, this, index,
591 &FGControls::get_engine_bleed,
592 &FGControls::set_engine_bleed);
593 fgSetArchivable(name);
597 fgTie("/controls/pressurization/mode", this,
598 &FGControls::get_mode, &FGControls::set_mode);
599 fgSetArchivable("/controls/pressurization/mode");
601 fgTie("/controls/pressurization/dump", this,
602 &FGControls::get_dump, &FGControls::set_dump);
603 fgSetArchivable("/controls/pressurization/dump");
605 fgTie("/controls/pressurization/outflow-valve", this,
606 &FGControls::get_outflow_valve,
607 &FGControls::set_outflow_valve);
608 fgSetArchivable("/controls/pressurization/outflow-valve");
610 for (index = 0; index < MAX_PACKS; index++) {
611 char name[MAX_NAME_LEN];
612 snprintf(name, MAX_NAME_LEN,
613 "/controls/pressurization/pack[%d]/pack-on", index);
614 fgTie(name, this, index,
615 &FGControls::get_pack_on, &FGControls::set_pack_on);
616 fgSetArchivable(name);
620 fgTie("/controls/lighting/landing-lights", this,
621 &FGControls::get_landing_lights,
622 &FGControls::set_landing_lights);
623 fgSetArchivable("/controls/lighting/landing-lights");
625 fgTie("/controls/lighting/turn-off-lights", this,
626 &FGControls::get_turn_off_lights,
627 &FGControls::set_turn_off_lights);
628 fgSetArchivable("/controls/lighting/turn-off-lights");
630 fgTie("/controls/lighting/taxi-light", this,
631 &FGControls::get_taxi_light, &FGControls::set_taxi_light);
632 fgSetArchivable("/controls/lighting/taxi-light");
634 fgTie("/controls/lighting/logo-lights", this,
635 &FGControls::get_logo_lights, &FGControls::set_logo_lights);
636 fgSetArchivable("/controls/lighting/logo-lights");
638 fgTie("/controls/lighting/nav-lights", this,
639 &FGControls::get_nav_lights, &FGControls::set_nav_lights);
640 fgSetArchivable("/controls/lighting/nav-lights");
642 fgTie("/controls/lighting/beacon", this,
643 &FGControls::get_beacon, &FGControls::set_beacon);
644 fgSetArchivable("/controls/lighting/beacon");
646 fgTie("/controls/lighting/strobe", this,
647 &FGControls::get_strobe, &FGControls::set_strobe);
648 fgSetArchivable("/controls/lighting/strobe");
650 fgTie("/controls/lighting/panel-norm", this,
651 &FGControls::get_panel_norm, &FGControls::set_panel_norm);
652 fgSetArchivable("/controls/lighting/panel-norm");
654 fgTie("/controls/lighting/instruments-norm", this,
655 &FGControls::get_instruments_norm,
656 &FGControls::set_instruments_norm);
657 fgSetArchivable("/controls/lighting/instruments-norm");
659 fgTie("/controls/lighting/dome-norm", this,
660 &FGControls::get_dome_norm, &FGControls::set_dome_norm);
661 fgSetArchivable("/controls/lighting/dome-norm");
663 #ifdef FG_HAVE_ARMAMENT
665 fgTie("/controls/armament/master-arm", this,
666 &FGControls::get_master_arm, &FGControls::set_master_arm);
667 fgSetArchivable("/controls/armament/master-arm");
669 fgTie("/controls/armament/station-select", this,
670 &FGControls::get_station_select,
671 &FGControls::set_station_select);
672 fgSetArchivable("/controls/armament/station-select");
674 fgTie("/controls/armament/release-all", this,
675 &FGControls::get_release_ALL,
676 &FGControls::set_release_ALL);
677 fgSetArchivable("/controls/armament/release-all");
679 for (index = 0; index < MAX_STATIONS; index++) {
680 char name[MAX_NAME_LEN];
681 snprintf(name, MAX_NAME_LEN,
682 "/controls/armament/station[%d]/stick-size", index);
683 fgTie(name, this, index,
684 &FGControls::get_stick_size, &FGControls::set_stick_size);
685 fgSetArchivable(name);
687 snprintf(name, MAX_NAME_LEN,
688 "/controls/armament/station[%d]/release-stick", index);
689 fgTie(name, this, index,
690 &FGControls::get_release_stick, &FGControls::set_release_stick);
691 fgSetArchivable(name);
693 snprintf(name, MAX_NAME_LEN,
694 "/controls/armament/station[%d]/release-all", index);
695 fgTie(name, this, index,
696 &FGControls::get_release_all, &FGControls::set_release_all);
697 fgSetArchivable(name);
699 snprintf(name, MAX_NAME_LEN,
700 "/controls/armament/station[%d]/jettison-all", index);
701 fgTie(name, this, index,
702 &FGControls::get_jettison_all, &FGControls::set_jettison_all);
703 fgSetArchivable(name);
709 fgTie("/controls/seat/vertical-adjust", this,
710 &FGControls::get_vertical_adjust,
711 &FGControls::set_vertical_adjust);
712 fgSetArchivable("/controls/seat/vertical-adjust");
714 fgTie("/controls/seat/fore-aft-adjust", this,
715 &FGControls::get_fore_aft_adjust,
716 &FGControls::set_fore_aft_adjust);
717 fgSetArchivable("/controls/seat/fore-aft-adjust");
719 for (index = 0; index < MAX_EJECTION_SEATS; index++) {
720 char name[MAX_NAME_LEN];
721 snprintf(name, MAX_NAME_LEN,
722 "/controls/seat/eject[%d]/initiate", index);
723 fgTie(name, this, index,
724 &FGControls::get_ejection_seat,
725 &FGControls::set_ejection_seat);
726 fgSetArchivable(name);
728 snprintf(name, MAX_NAME_LEN,
729 "/controls/seat/eject[%d]/status", index);
731 fgTie(name, this, index,
732 &FGControls::get_eseat_status,
733 &FGControls::set_eseat_status);
735 fgSetArchivable(name);
738 fgTie("/controls/seat/cmd_selector_valve", this,
739 &FGControls::get_cmd_selector_valve,
740 &FGControls::set_cmd_selector_valve);
741 fgSetArchivable("/controls/seat/eject/cmd_selector_valve");
745 fgTie("/controls/APU/off-start-run", this,
746 &FGControls::get_off_start_run,
747 &FGControls::set_off_start_run);
748 fgSetArchivable("/controls/APU/off-start-run");
750 fgTie("/controls/APU/fire-switch", this,
751 &FGControls::get_APU_fire_switch,
752 &FGControls::set_APU_fire_switch);
753 fgSetArchivable("/controls/APU/fire-switch");
756 for (index = 0; index < MAX_AUTOPILOTS; index++) {
757 char name[MAX_NAME_LEN];
758 snprintf(name, MAX_NAME_LEN,
759 "/controls/autoflight/autopilot[%d]/engage", index);
760 fgTie(name, this, index,
761 &FGControls::get_autopilot_engage,
762 &FGControls::set_autopilot_engage);
763 fgSetArchivable(name);
766 fgTie("/controls/autoflight/autothrottle-arm", this,
767 &FGControls::get_autothrottle_arm,
768 &FGControls::set_autothrottle_arm);
769 fgSetArchivable("/controls/autoflight/autothrottle-arm");
771 fgTie("/controls/autoflight/autothrottle-engage", this,
772 &FGControls::get_autothrottle_engage,
773 &FGControls::set_autothrottle_engage);
774 fgSetArchivable("/controls/autoflight/autothrottle-engage");
776 fgTie("/controls/autoflight/heading-select", this,
777 &FGControls::get_heading_select,
778 &FGControls::set_heading_select);
779 fgSetArchivable("/controls/autoflight/heading-select");
781 fgTie("/controls/autoflight/altitude-select", this,
782 &FGControls::get_altitude_select,
783 &FGControls::set_altitude_select);
784 fgSetArchivable("/controls/autoflight/altitude-select");
786 fgTie("/controls/autoflight/bank-angle-select", this,
787 &FGControls::get_bank_angle_select,
788 &FGControls::set_bank_angle_select);
789 fgSetArchivable("/controls/autoflight/bank-angle-select");
791 fgTie("/controls/autoflight/vertical-speed-select", this,
792 &FGControls::get_vertical_speed_select,
793 &FGControls::set_vertical_speed_select);
794 fgSetArchivable("/controls/autoflight/vertical-speed-select");
796 fgTie("/controls/autoflight/speed-select", this,
797 &FGControls::get_speed_select,
798 &FGControls::set_speed_select);
799 fgSetArchivable("/controls/autoflight/speed-select");
801 fgTie("/controls/autoflight/mach-select", this,
802 &FGControls::get_mach_select,
803 &FGControls::set_mach_select);
804 fgSetArchivable("/controls/autoflight/mach-select");
806 fgTie("/controls/autoflight/vertical-mode", this,
807 &FGControls::get_vertical_mode,
808 &FGControls::set_vertical_mode);
809 fgSetArchivable("/controls/autoflight/vertical-mode");
811 fgTie("/controls/autoflight/lateral-mode", this,
812 &FGControls::get_lateral_mode,
813 &FGControls::set_lateral_mode);
814 fgSetArchivable("/controls/autoflight/lateral-mode");
818 void FGControls::unbind ()
821 //Tie control properties.
822 fgUntie("/controls/flight/aileron");
823 fgUntie("/controls/flight/aileron-trim");
824 fgUntie("/controls/flight/elevator");
825 fgUntie("/controls/flight/elevator-trim");
826 fgUntie("/controls/flight/rudder");
827 fgUntie("/controls/flight/rudder-trim");
828 fgUntie("/controls/flight/flaps");
829 fgUntie("/controls/flight/slats");
830 fgUntie("/controls/flight/BLC");
831 fgUntie("/controls/flight/spoilers");
832 fgUntie("/controls/flight/speedbrake");
833 fgUntie("/controls/flight/wing-sweep");
834 fgUntie("/controls/flight/wing-fold");
835 fgUntie("/controls/flight/drag-chute");
836 for (index = 0; index < MAX_ENGINES; index++) {
837 char name[MAX_NAME_LEN];
838 snprintf(name, MAX_NAME_LEN,
839 "/controls/engines/engine[%d]/throttle", index);
841 snprintf(name, MAX_NAME_LEN,
842 "/controls/engines/engine[%d]/starter", index);
844 snprintf(name, MAX_NAME_LEN,
845 "/controls/engines/engine[%d]/fuel_pump", index);
847 snprintf(name, MAX_NAME_LEN,
848 "/controls/engines/engine[%d]/fire-switch", index);
850 snprintf(name, MAX_NAME_LEN,
851 "/controls/engines/engine[%d]/fire-bottle-discharge", index);
853 snprintf(name, MAX_NAME_LEN,
854 "/controls/engines/engine[%d]/throttle_idle", index);
856 snprintf(name, MAX_NAME_LEN, "/controls/engines/engine[%d]/cutoff", index);
858 snprintf(name, MAX_NAME_LEN, "/controls/engines/engine[%d]/mixture", index);
860 snprintf(name, MAX_NAME_LEN,
861 "/controls/engines/engine[%d]/propeller-pitch", index);
863 snprintf(name, MAX_NAME_LEN,
864 "/controls/engines/engine[%d]/magnetos", index);
866 snprintf(name, MAX_NAME_LEN, "/controls/engines/engine[%d]/WEP", index);
868 snprintf(name, MAX_NAME_LEN,
869 "/controls/engines/engine[%d]/cowl-flaps-norm", index);
871 snprintf(name, MAX_NAME_LEN,
872 "/controls/engines/engine[%d]/propeller-feather", index);
874 snprintf(name, MAX_NAME_LEN,
875 "/controls/engines/engine[%d]/ignition", index);
877 snprintf(name, MAX_NAME_LEN,
878 "/controls/engines/engine[%d]/augmentation", index);
880 snprintf(name, MAX_NAME_LEN,
881 "/controls/engines/engine[%d]/reverser", index);
883 snprintf(name, MAX_NAME_LEN,
884 "/controls/engines/engine[%d]/water-injection", index);
886 snprintf(name, MAX_NAME_LEN,
887 "/controls/engines/engine[%d]/condition", index);
890 fgUntie("/controls/fuel/dump-valve");
891 for (index = 0; index < MAX_TANKS; index++) {
892 char name[MAX_NAME_LEN];
893 snprintf(name, MAX_NAME_LEN,
894 "/controls/fuel/tank[%d]/fuel_selector", index);
896 snprintf(name, MAX_NAME_LEN, "/controls/fuel/tank[%d]/to_engine", index);
898 snprintf(name, MAX_NAME_LEN, "/controls/fuel/tank[%d]/to_tank", index);
900 for (i = 0; index < MAX_BOOSTPUMPS; i++) {
901 snprintf(name, MAX_NAME_LEN,
902 "/controls/fuel/tank[%d]/boost-pump[%d]", index, i);
906 fgUntie("/controls/gear/brake-left");
907 fgUntie("/controls/gear/brake-right");
908 fgUntie("/controls/gear/brake-parking");
909 fgUntie("/controls/gear/steering");
910 fgUntie("/controls/gear/gear_down");
911 fgUntie("/controls/gear/antiskid");
912 fgUntie("/controls/gear/tailhook");
913 fgUntie("/controls/gear/launchbar");
914 fgUntie("/controls/gear/catapult-launch-cmd");
915 fgUntie("/controls/gear/tailwheel-lock");
916 for (index = 0; index < MAX_WHEELS; index++) {
917 char name[MAX_NAME_LEN];
918 snprintf(name, MAX_NAME_LEN,
919 "/controls/gear/wheel[%d]/alternate-extension", index);
922 fgUntie("/controls/anti-ice/wing-heat");
923 fgUntie("/controls/anti-ice/pitot-heat");
924 fgUntie("/controls/anti-ice/wiper");
925 fgUntie("/controls/anti-ice/window-heat");
926 for (index = 0; index < MAX_ENGINES; index++) {
927 char name[MAX_NAME_LEN];
928 snprintf(name, MAX_NAME_LEN,
929 "/controls/anti-ice/engine[%d]/carb-heat", index);
931 snprintf(name, MAX_NAME_LEN,
932 "/controls/anti-ice/engine[%d]/inlet-heat", index);
935 for (index = 0; index < MAX_HYD_SYSTEMS; index++) {
936 char name[MAX_NAME_LEN];
937 snprintf(name, MAX_NAME_LEN,
938 "/controls/hydraulic/system[%d]/engine-pump", index);
940 snprintf(name, MAX_NAME_LEN,
941 "/controls/hydraulic/system[%d]/electric-pump", index);
944 fgUntie("/controls/electric/battery-switch");
945 fgUntie("/controls/electric/external-power");
946 fgUntie("/controls/electric/APU-generator");
947 for (index = 0; index < MAX_ENGINES; index++) {
948 char name[MAX_NAME_LEN];
949 snprintf(name, MAX_NAME_LEN,
950 "/controls/electric/engine[%d]/generator", index);
952 snprintf(name, MAX_NAME_LEN,
953 "/controls/electric/engine[%d]/bus-tie", index);
956 fgUntie("/controls/pneumatic/APU-bleed");
957 for (index = 0; index < MAX_ENGINES; index++) {
958 char name[MAX_NAME_LEN];
959 snprintf(name, MAX_NAME_LEN,
960 "/controls/pneumatic/engine[%d]/bleed", index);
963 fgUntie("/controls/pressurization/mode");
964 fgUntie("/controls/pressurization/dump");
965 for (index = 0; index < MAX_PACKS; index++) {
966 char name[MAX_NAME_LEN];
967 snprintf(name, MAX_NAME_LEN,
968 "/controls/pressurization/pack[%d]/pack-on", index);
971 fgUntie("/controls/lighting/landing-lights");
972 fgUntie("/controls/lighting/turn-off-lights");
973 fgUntie("/controls/lighting/taxi-light");
974 fgUntie("/controls/lighting/logo-lights");
975 fgUntie("/controls/lighting/nav-lights");
976 fgUntie("/controls/lighting/beacon");
977 fgUntie("/controls/lighting/strobe");
978 fgUntie("/controls/lighting/panel-norm");
979 fgUntie("/controls/lighting/instruments-norm");
980 fgUntie("/controls/lighting/dome-norm");
982 #ifdef FG_HAVE_ARMAMENT
983 fgUntie("/controls/armament/master-arm");
984 fgUntie("/controls/armament/station-select");
985 fgUntie("/controls/armament/release-all");
986 for (index = 0; index < MAX_STATIONS; index++) {
987 char name[MAX_NAME_LEN];
988 snprintf(name, MAX_NAME_LEN,
989 "/controls/armament/station[%d]/stick-size", index);
991 snprintf(name, MAX_NAME_LEN,
992 "/controls/armament/station[%d]/release-stick", index);
994 snprintf(name, MAX_NAME_LEN,
995 "/controls/armament/station[%d]/release-all", index);
997 snprintf(name, MAX_NAME_LEN,
998 "/controls/armament/station[%d]/jettison-all", index);
1002 fgUntie("/controls/seat/vertical-adjust");
1003 fgUntie("/controls/seat/fore-aft-adjust");
1004 for (index = 0; index < MAX_EJECTION_SEATS; index++) {
1005 char name[MAX_NAME_LEN];
1006 snprintf(name, MAX_NAME_LEN,
1007 "/controls/seat/eject[%d]/initiate", index);
1009 snprintf(name, MAX_NAME_LEN,
1010 "/controls/seat/eject[%d]/status", index);
1013 fgUntie("/controls/seat/cmd_selector_valve");
1015 fgUntie("/controls/APU/off-start-run");
1016 fgUntie("/controls/APU/fire-switch");
1017 for (index = 0; index < MAX_AUTOPILOTS; index++) {
1018 char name[MAX_NAME_LEN];
1019 snprintf(name, MAX_NAME_LEN,
1020 "/controls/autoflight/autopilot[%d]/engage", index);
1023 fgUntie("/controls/autoflight/autothrottle-arm");
1024 fgUntie("/controls/autoflight/autothrottle-engage");
1025 fgUntie("/controls/autoflight/heading-select");
1026 fgUntie("/controls/autoflight/altitude-select");
1027 fgUntie("/controls/autoflight/bank-angle-select");
1028 fgUntie("/controls/autoflight/vertical-speed-select");
1029 fgUntie("/controls/autoflight/speed-select");
1030 fgUntie("/controls/autoflight/mach-select");
1031 fgUntie("/controls/autoflight/vertical-mode");
1032 fgUntie("/controls/autoflight/lateral-mode");
1037 FGControls::update (double dt)
1043 ////////////////////////////////////////////////////////////////////////
1044 // Setters and adjusters.
1045 ////////////////////////////////////////////////////////////////////////
1048 FGControls::set_aileron (double pos)
1051 CLAMP( &aileron, -1.0, 1.0 );
1053 // check for autocoordination
1054 if ( auto_coordination->getBoolValue() ) {
1055 set_rudder( aileron / 2.0 );
1060 FGControls::move_aileron (double amt)
1063 CLAMP( &aileron, -1.0, 1.0 );
1065 // check for autocoordination
1066 if ( auto_coordination->getBoolValue() ) {
1067 set_rudder( aileron / 2.0 );
1072 FGControls::set_aileron_trim( double pos )
1075 CLAMP( &aileron_trim, -1.0, 1.0 );
1079 FGControls::move_aileron_trim( double amt )
1081 aileron_trim += amt;
1082 CLAMP( &aileron_trim, -1.0, 1.0 );
1086 FGControls::set_elevator( double pos )
1089 CLAMP( &elevator, -1.0, 1.0 );
1093 FGControls::move_elevator( double amt )
1096 CLAMP( &elevator, -1.0, 1.0 );
1100 FGControls::set_elevator_trim( double pos )
1102 elevator_trim = pos;
1103 CLAMP( &elevator_trim, -1.0, 1.0 );
1107 FGControls::move_elevator_trim( double amt )
1109 elevator_trim += amt;
1110 CLAMP( &elevator_trim, -1.0, 1.0 );
1114 FGControls::set_rudder( double pos )
1117 CLAMP( &rudder, -1.0, 1.0 );
1121 FGControls::move_rudder( double amt )
1124 CLAMP( &rudder, -1.0, 1.0 );
1128 FGControls::set_rudder_trim( double pos )
1131 CLAMP( &rudder_trim, -1.0, 1.0 );
1135 FGControls::move_rudder_trim( double amt )
1138 CLAMP( &rudder_trim, -1.0, 1.0 );
1142 FGControls::set_flaps( double pos )
1145 CLAMP( &flaps, 0.0, 1.0 );
1149 FGControls::move_flaps( double amt )
1152 CLAMP( &flaps, 0.0, 1.0 );
1156 FGControls::set_slats( double pos )
1159 CLAMP( &slats, 0.0, 1.0 );
1163 FGControls::move_slats( double amt )
1166 CLAMP( &slats, 0.0, 1.0 );
1170 FGControls::set_BLC( bool val )
1176 FGControls::set_spoilers( double pos )
1179 CLAMP( &spoilers, 0.0, 1.0 );
1183 FGControls::move_spoilers( double amt )
1186 CLAMP( &spoilers, 0.0, 1.0 );
1190 FGControls::set_speedbrake( double pos )
1193 CLAMP( &speedbrake, 0.0, 1.0 );
1197 FGControls::move_speedbrake( double amt )
1200 CLAMP( &speedbrake, 0.0, 1.0 );
1204 FGControls::set_wing_sweep( double pos )
1207 CLAMP( &wing_sweep, 0.0, 1.0 );
1211 FGControls::move_wing_sweep( double amt )
1214 CLAMP( &wing_sweep, 0.0, 1.0 );
1218 FGControls::set_wing_fold( bool val )
1224 FGControls::set_drag_chute( bool val )
1230 FGControls::set_throttle_idle( bool val )
1232 throttle_idle = val;
1236 FGControls::set_throttle( int engine, double pos )
1238 if ( engine == ALL_ENGINES ) {
1239 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1241 CLAMP( &throttle[i], 0.0, 1.0 );
1244 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1245 throttle[engine] = pos;
1246 CLAMP( &throttle[engine], 0.0, 1.0 );
1252 FGControls::move_throttle( int engine, double amt )
1254 if ( engine == ALL_ENGINES ) {
1255 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1257 CLAMP( &throttle[i], 0.0, 1.0 );
1260 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1261 throttle[engine] += amt;
1262 CLAMP( &throttle[engine], 0.0, 1.0 );
1268 FGControls::set_starter( int engine, bool flag )
1270 if ( engine == ALL_ENGINES ) {
1271 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1275 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1276 starter[engine] = flag;
1282 FGControls::set_fuel_pump( int engine, bool val )
1284 if ( engine == ALL_ENGINES ) {
1285 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1289 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1290 fuel_pump[engine] = val;
1296 FGControls::set_fire_switch( int engine, bool val )
1298 if ( engine == ALL_ENGINES ) {
1299 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1300 fire_switch[i] = val;
1303 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1304 fire_switch[engine] = val;
1310 FGControls::set_fire_bottle_discharge( int engine, bool val )
1312 if ( engine == ALL_ENGINES ) {
1313 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1314 fire_bottle_discharge[i] = val;
1317 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1318 fire_bottle_discharge[engine] = val;
1324 FGControls::set_cutoff( int engine, bool val )
1326 if ( engine == ALL_ENGINES ) {
1327 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1331 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1332 cutoff[engine] = val;
1339 FGControls::set_mixture( int engine, double pos )
1341 if ( engine == ALL_ENGINES ) {
1342 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1344 CLAMP( &mixture[i], 0.0, 1.0 );
1347 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1348 mixture[engine] = pos;
1349 CLAMP( &mixture[engine], 0.0, 1.0 );
1355 FGControls::move_mixture( int engine, double amt )
1357 if ( engine == ALL_ENGINES ) {
1358 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1360 CLAMP( &mixture[i], 0.0, 1.0 );
1363 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1364 mixture[engine] += amt;
1365 CLAMP( &mixture[engine], 0.0, 1.0 );
1371 FGControls::set_prop_advance( int engine, double pos )
1373 if ( engine == ALL_ENGINES ) {
1374 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1375 prop_advance[i] = pos;
1376 CLAMP( &prop_advance[i], 0.0, 1.0 );
1379 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1380 prop_advance[engine] = pos;
1381 CLAMP( &prop_advance[engine], 0.0, 1.0 );
1387 FGControls::move_prop_advance( int engine, double amt )
1389 if ( engine == ALL_ENGINES ) {
1390 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1391 prop_advance[i] += amt;
1392 CLAMP( &prop_advance[i], 0.0, 1.0 );
1395 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1396 prop_advance[engine] += amt;
1397 CLAMP( &prop_advance[engine], 0.0, 1.0 );
1403 FGControls::set_magnetos( int engine, int pos )
1405 if ( engine == ALL_ENGINES ) {
1406 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1408 CLAMP( &magnetos[i], 0, 3 );
1411 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1412 magnetos[engine] = pos;
1413 CLAMP( &magnetos[engine], 0, 3 );
1419 FGControls::move_magnetos( int engine, int amt )
1421 if ( engine == ALL_ENGINES ) {
1422 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1424 CLAMP( &magnetos[i], 0, 3 );
1427 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1428 magnetos[engine] += amt;
1429 CLAMP( &magnetos[engine], 0, 3 );
1435 FGControls::set_nitrous_injection( int engine, bool val )
1437 if ( engine == ALL_ENGINES ) {
1438 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1439 nitrous_injection[i] = val;
1442 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1443 nitrous_injection[engine] = val;
1450 FGControls::set_cowl_flaps_norm( int engine, double pos )
1452 if ( engine == ALL_ENGINES ) {
1453 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1454 cowl_flaps_norm[i] = pos;
1455 CLAMP( &cowl_flaps_norm[i], 0.0, 1.0 );
1458 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1459 cowl_flaps_norm[engine] = pos;
1460 CLAMP( &cowl_flaps_norm[engine], 0.0, 1.0 );
1466 FGControls::move_cowl_flaps_norm( int engine, double amt )
1468 if ( engine == ALL_ENGINES ) {
1469 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1470 cowl_flaps_norm[i] += amt;
1471 CLAMP( &cowl_flaps_norm[i], 0.0, 1.0 );
1474 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1475 cowl_flaps_norm[engine] += amt;
1476 CLAMP( &cowl_flaps_norm[engine], 0.0, 1.0 );
1482 FGControls::set_feather( int engine, bool val )
1484 if ( engine == ALL_ENGINES ) {
1485 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1489 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1490 feather[engine] = val;
1496 FGControls::set_ignition( int engine, int pos )
1498 if ( engine == ALL_ENGINES ) {
1499 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1501 CLAMP( &ignition[i], 0, 3 );
1504 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1505 ignition[engine] = pos;
1506 CLAMP( &ignition[engine], 0, 3 );
1512 FGControls::set_augmentation( int engine, bool val )
1514 if ( engine == ALL_ENGINES ) {
1515 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1516 augmentation[i] = val;
1519 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1520 augmentation[engine] = val;
1526 FGControls::set_reverser( int engine, bool val )
1528 if ( engine == ALL_ENGINES ) {
1529 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1533 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1534 reverser[engine] = val;
1540 FGControls::set_water_injection( int engine, bool val )
1542 if ( engine == ALL_ENGINES ) {
1543 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1544 water_injection[i] = val;
1547 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1548 water_injection[engine] = val;
1554 FGControls::set_condition( int engine, double val )
1556 if ( engine == ALL_ENGINES ) {
1557 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1561 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1562 condition[engine] = val;
1568 FGControls::set_dump_valve( bool val )
1575 FGControls::set_fuel_selector( int tank, bool pos )
1577 if ( tank == ALL_TANKS ) {
1578 for ( int i = 0; i < MAX_TANKS; i++ ) {
1579 fuel_selector[i] = pos;
1582 if ( (tank >= 0) && (tank < MAX_TANKS) ) {
1583 fuel_selector[tank] = pos;
1589 FGControls::set_to_engine( int tank, int engine )
1591 if ( tank == ALL_TANKS ) {
1592 for ( int i = 0; i < MAX_TANKS; i++ ) {
1593 to_engine[i] = engine;
1596 if ( (tank >= 0) && (tank < MAX_TANKS) ) {
1597 to_engine[tank] = engine;
1603 FGControls::set_to_tank( int tank, int dest_tank )
1605 if ( tank == ALL_TANKS ) {
1606 for ( int i = 0; i < MAX_TANKS; i++ ) {
1607 to_tank[i] = dest_tank;
1610 if ( (tank >= 0) && (tank < MAX_TANKS) ) {
1611 to_tank[tank] = dest_tank;
1617 FGControls::set_boost_pump( int index, bool val )
1619 if ( index == -1 ) {
1620 for ( int i = 0; i < (MAX_TANKS * MAX_BOOSTPUMPS); i++ ) {
1621 boost_pump[i] = val;
1624 if ( (index >= 0) && (index < (MAX_TANKS * MAX_BOOSTPUMPS)) ) {
1625 boost_pump[index] = val;
1632 FGControls::set_brake_left( double pos )
1635 CLAMP(&brake_left, 0.0, 1.0);
1639 FGControls::move_brake_left( double amt )
1642 CLAMP( &brake_left, 0.0, 1.0 );
1646 FGControls::set_brake_right( double pos )
1649 CLAMP(&brake_right, 0.0, 1.0);
1653 FGControls::move_brake_right( double amt )
1656 CLAMP( &brake_right, 0.0, 1.0 );
1660 FGControls::set_copilot_brake_left( double pos )
1662 copilot_brake_left = pos;
1663 CLAMP(&brake_left, 0.0, 1.0);
1667 FGControls::set_copilot_brake_right( double pos )
1669 copilot_brake_right = pos;
1670 CLAMP(&brake_right, 0.0, 1.0);
1674 FGControls::set_brake_parking( double pos )
1676 brake_parking = pos;
1677 CLAMP(&brake_parking, 0.0, 1.0);
1681 FGControls::set_steering( double angle )
1684 CLAMP(&steering, -80.0, 80.0);
1688 FGControls::move_steering( double angle )
1691 CLAMP(&steering, -80.0, 80.0);
1695 FGControls::set_gear_down( bool gear )
1701 FGControls::set_antiskid( bool state )
1707 FGControls::set_tailhook( bool state )
1713 FGControls::set_launchbar( bool state )
1719 FGControls::set_catapult_launch_cmd( bool state )
1721 catapult_launch_cmd = state;
1725 FGControls::set_tailwheel_lock( bool state )
1727 tailwheel_lock = state;
1732 FGControls::set_alternate_extension( int wheel, bool val )
1734 if ( wheel == ALL_WHEELS ) {
1735 for ( int i = 0; i < MAX_WHEELS; i++ ) {
1736 alternate_extension[i] = val;
1739 if ( (wheel >= 0) && (wheel < MAX_WHEELS) ) {
1740 alternate_extension[wheel] = val;
1746 FGControls::set_wing_heat( bool state )
1752 FGControls::set_pitot_heat( bool state )
1758 FGControls::set_wiper( int state )
1764 FGControls::set_window_heat( bool state )
1766 window_heat = state;
1770 FGControls::set_carb_heat( int engine, bool val )
1772 if ( engine == ALL_ENGINES ) {
1773 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1777 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1778 carb_heat[engine] = val;
1784 FGControls::set_inlet_heat( int engine, bool val )
1786 if ( engine == ALL_ENGINES ) {
1787 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1788 inlet_heat[i] = val;
1791 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1792 inlet_heat[engine] = val;
1798 FGControls::set_engine_pump( int system, bool val )
1800 if ( system == ALL_HYD_SYSTEMS ) {
1801 for ( int i = 0; i < MAX_HYD_SYSTEMS; i++ ) {
1802 engine_pump[i] = val;
1805 if ( (system >= 0) && (system < MAX_HYD_SYSTEMS) ) {
1806 engine_pump[system] = val;
1812 FGControls::set_electric_pump( int system, bool val )
1814 if ( system == ALL_HYD_SYSTEMS ) {
1815 for ( int i = 0; i < MAX_HYD_SYSTEMS; i++ ) {
1816 electric_pump[i] = val;
1819 if ( (system >= 0) && (system < MAX_HYD_SYSTEMS) ) {
1820 electric_pump[system] = val;
1826 FGControls::set_battery_switch( bool state )
1828 battery_switch = state;
1832 FGControls::set_external_power( bool state )
1834 external_power = state;
1838 FGControls::set_APU_generator( bool state )
1840 APU_generator = state;
1844 FGControls::set_generator_breaker( int engine, bool val )
1846 if ( engine == ALL_ENGINES ) {
1847 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1848 generator_breaker[i] = val;
1851 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1852 generator_breaker[engine] = val;
1858 FGControls::set_bus_tie( int engine, bool val )
1860 if ( engine == ALL_ENGINES ) {
1861 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1865 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1866 bus_tie[engine] = val;
1872 FGControls::set_APU_bleed( bool state )
1878 FGControls::set_engine_bleed( int engine, bool val )
1880 if ( engine == ALL_ENGINES ) {
1881 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1882 engine_bleed[i] = val;
1885 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1886 engine_bleed[engine] = val;
1892 FGControls::set_mode( int new_mode )
1898 FGControls::set_outflow_valve( double pos )
1900 outflow_valve = pos;
1901 CLAMP( &outflow_valve, 0.0, 1.0 );
1905 FGControls::move_outflow_valve( double amt )
1907 outflow_valve += amt;
1908 CLAMP( &outflow_valve, 0.0, 1.0 );
1912 FGControls::set_dump( bool state )
1918 FGControls::set_pack_on( int pack, bool val )
1920 if ( pack == ALL_PACKS ) {
1921 for ( int i = 0; i < MAX_PACKS; i++ ) {
1925 if ( (pack >= 0) && (pack < MAX_PACKS) ) {
1926 pack_on[pack] = val;
1932 FGControls::set_landing_lights( bool state )
1934 landing_lights = state;
1938 FGControls::set_turn_off_lights( bool state )
1940 turn_off_lights = state;
1944 FGControls::set_taxi_light( bool state )
1950 FGControls::set_logo_lights( bool state )
1952 logo_lights = state;
1956 FGControls::set_nav_lights( bool state )
1962 FGControls::set_beacon( bool state )
1968 FGControls::set_strobe( bool state )
1974 FGControls::set_panel_norm( double intensity )
1976 panel_norm = intensity;
1977 CLAMP( &panel_norm, 0.0, 1.0 );
1981 FGControls::move_panel_norm( double amt )
1984 CLAMP( &panel_norm, 0.0, 1.0 );
1988 FGControls::set_instruments_norm( double intensity )
1990 instruments_norm = intensity;
1991 CLAMP( &instruments_norm, 0.0, 1.0 );
1995 FGControls::move_instruments_norm( double amt )
1997 instruments_norm += amt;
1998 CLAMP( &instruments_norm, 0.0, 1.0 );
2002 FGControls::set_dome_norm( double intensity )
2004 dome_norm = intensity;
2005 CLAMP( &dome_norm, 0.0, 1.0 );
2009 FGControls::move_dome_norm( double amt )
2012 CLAMP( &dome_norm, 0.0, 1.0 );
2015 #ifdef FG_HAVE_ARMAMENT
2018 FGControls::set_master_arm( bool val )
2024 FGControls::set_station_select( int station )
2026 station_select = station;
2027 CLAMP( &station_select, 0, MAX_STATIONS );
2031 FGControls::set_release_ALL( bool val )
2037 FGControls::set_stick_size( int station, int size )
2039 if ( station == ALL_STATIONS ) {
2040 for ( int i = 0; i < MAX_STATIONS; i++ ) {
2041 stick_size[i] = size;
2042 CLAMP( &stick_size[i], 1, 20 );
2045 if ( (station >= 0) && (station < MAX_STATIONS) ) {
2046 stick_size[station] = size;
2047 CLAMP( &stick_size[station], 1, 20 );
2053 FGControls::set_release_stick( int station, bool val )
2055 if ( station == ALL_STATIONS ) {
2056 for ( int i = 0; i < MAX_STATIONS; i++ ) {
2057 release_stick[i] = val;
2060 if ( (station >= 0) && (station < MAX_STATIONS) ) {
2061 release_stick[station] = val;
2067 FGControls::set_release_all( int station, bool val )
2069 if ( station == ALL_STATIONS ) {
2070 for ( int i = 0; i < MAX_STATIONS; i++ ) {
2071 release_all[i] = val;
2074 if ( (station >= 0) && (station < MAX_STATIONS) ) {
2075 release_all[station] = val;
2081 FGControls::set_jettison_all( int station, bool val )
2083 if ( station == ALL_STATIONS ) {
2084 for ( int i = 0; i < MAX_STATIONS; i++ ) {
2085 jettison_all[i] = val;
2088 if ( (station >= 0) && (station < MAX_STATIONS) ) {
2089 jettison_all[station] = val;
2097 FGControls::set_vertical_adjust( double pos )
2099 vertical_adjust = pos;
2100 CLAMP( &vertical_adjust, -1.0, 1.0 );
2104 FGControls::move_vertical_adjust( double amt )
2106 vertical_adjust += amt;
2107 CLAMP( &vertical_adjust, -1.0, 1.0 );
2111 FGControls::set_fore_aft_adjust( double pos )
2113 fore_aft_adjust = pos;
2114 CLAMP( &fore_aft_adjust, -1.0, 1.0 );
2118 FGControls::move_fore_aft_adjust( double amt )
2120 fore_aft_adjust += amt;
2121 CLAMP( &fore_aft_adjust, -1.0, 1.0 );
2125 FGControls::set_ejection_seat( int which_seat, bool val )
2127 if ( which_seat == ALL_EJECTION_SEATS ) {
2128 for ( int i = 0; i < MAX_EJECTION_SEATS; i++ ) {
2132 if ( (which_seat >= 0) && (which_seat <= MAX_EJECTION_SEATS) ) {
2133 if ( eseat_status[which_seat] == SEAT_SAFED ||
2134 eseat_status[which_seat] == SEAT_FAIL )
2136 // we can never eject if SEAT_SAFED or SEAT_FAIL
2140 eject[which_seat] = val;
2146 FGControls::set_eseat_status( int which_seat, int val )
2148 if ( which_seat == ALL_EJECTION_SEATS ) {
2149 for ( int i = 0; i < MAX_EJECTION_SEATS; i++ ) {
2150 eseat_status[i] = val;
2153 if ( (which_seat >=0) && (which_seat <= MAX_EJECTION_SEATS) ) {
2154 eseat_status[which_seat] = val;
2160 FGControls::set_cmd_selector_valve( int val )
2162 cmd_selector_valve = val;
2167 FGControls::set_off_start_run( int pos )
2169 off_start_run = pos;
2170 CLAMP( &off_start_run, 0, 3 );
2174 FGControls::set_APU_fire_switch( bool val )
2176 APU_fire_switch = val;
2180 FGControls::set_autothrottle_arm( bool val )
2182 autothrottle_arm = val;
2186 FGControls::set_autothrottle_engage( bool val )
2188 autothrottle_engage = val;
2192 FGControls::set_heading_select( double heading )
2194 heading_select = heading;
2195 CLAMP( &heading_select, 0.0, 360.0 );
2199 FGControls::move_heading_select( double amt )
2201 heading_select += amt;
2202 CLAMP( &heading_select, 0.0, 360.0 );
2206 FGControls::set_altitude_select( double altitude )
2208 altitude_select = altitude;
2209 CLAMP( &altitude_select, -1000.0, 100000.0 );
2213 FGControls::move_altitude_select( double amt )
2215 altitude_select += amt;
2216 CLAMP( &altitude_select, -1000.0, 100000.0 );
2220 FGControls::set_bank_angle_select( double angle )
2222 bank_angle_select = angle;
2223 CLAMP( &bank_angle_select, 10.0, 30.0 );
2227 FGControls::move_bank_angle_select( double amt )
2229 bank_angle_select += amt;
2230 CLAMP( &bank_angle_select, 10.0, 30.0 );
2234 FGControls::set_vertical_speed_select( double speed )
2236 vertical_speed_select = speed;
2237 CLAMP( &vertical_speed_select, -3000.0, 4000.0 );
2241 FGControls::move_vertical_speed_select( double amt )
2243 vertical_speed_select += amt;
2244 CLAMP( &vertical_speed_select, -3000.0, 4000.0 );
2248 FGControls::set_speed_select( double speed )
2250 speed_select = speed;
2251 CLAMP( &speed_select, 60.0, 400.0 );
2255 FGControls::move_speed_select( double amt )
2257 speed_select += amt;
2258 CLAMP( &speed_select, 60.0, 400.0 );
2262 FGControls::set_mach_select( double mach )
2265 CLAMP( &mach_select, 0.4, 4.0 );
2269 FGControls::move_mach_select( double amt )
2272 CLAMP( &mach_select, 0.4, 4.0 );
2276 FGControls::set_vertical_mode( int mode )
2278 vertical_mode = mode;
2279 CLAMP( &vertical_mode, 0, 4 );
2283 FGControls::set_lateral_mode( int mode )
2285 lateral_mode = mode;
2286 CLAMP( &lateral_mode, 0, 4 );
2290 FGControls::set_autopilot_engage( int ap, bool val )
2292 if ( ap == ALL_AUTOPILOTS ) {
2293 for ( int i = 0; i < MAX_AUTOPILOTS; i++ ) {
2294 autopilot_engage[i] = val;
2297 if ( (ap >= 0) && (ap < MAX_AUTOPILOTS) ) {
2298 autopilot_engage[ap] = val;