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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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( true ),
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 = true;
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 feed_tank[engine] = -1; // set to -1 to turn off all tanks 0 feeds all engines from center body tank
202 starter[engine] = false;
203 ignition[engine] = false;
204 fire_switch[engine] = false;
205 cutoff[engine] = true;
206 augmentation[engine] = false;
207 reverser[engine] = false;
208 water_injection[engine] = false;
209 nitrous_injection[engine] = false;
210 cowl_flaps_norm[engine] = 0.0;
211 condition[engine] = 1.0;
214 brake_left = brake_right
215 = copilot_brake_left = copilot_brake_right
216 = brake_parking = 0.0;
217 for ( int wheel = 0; wheel < MAX_WHEELS; wheel++ ) {
218 alternate_extension[wheel] = false;
221 auto_coordination = fgGetNode("/sim/auto-coordination", true);
231 fgTie("/controls/flight/aileron", this,
232 &FGControls::get_aileron, &FGControls::set_aileron);
233 fgSetArchivable("/controls/flight/aileron");
235 fgTie("/controls/flight/aileron-trim", this,
236 &FGControls::get_aileron_trim, &FGControls::set_aileron_trim);
237 fgSetArchivable("/controls/flight/aileron-trim");
239 fgTie("/controls/flight/elevator", this,
240 &FGControls::get_elevator, &FGControls::set_elevator);
241 fgSetArchivable("/controls/flight/elevator");
243 fgTie("/controls/flight/elevator-trim", this,
244 &FGControls::get_elevator_trim, &FGControls::set_elevator_trim);
245 fgSetArchivable("/controls/flight/elevator-trim");
247 fgTie("/controls/flight/rudder", this,
248 &FGControls::get_rudder, &FGControls::set_rudder);
249 fgSetArchivable("/controls/flight/rudder");
251 fgTie("/controls/flight/rudder-trim", this,
252 &FGControls::get_rudder_trim, &FGControls::set_rudder_trim);
253 fgSetArchivable("/controls/flight/rudder-trim");
255 fgTie("/controls/flight/flaps", this,
256 &FGControls::get_flaps, &FGControls::set_flaps);
257 fgSetArchivable("/controls/flight/flaps");
259 fgTie("/controls/flight/slats", this,
260 &FGControls::get_slats, &FGControls::set_slats);
261 fgSetArchivable("/controls/flight/slats");
263 fgTie("/controls/flight/BLC", this,
264 &FGControls::get_BLC, &FGControls::set_BLC);
265 fgSetArchivable("/controls/flight/BLC");
267 fgTie("/controls/flight/spoilers", this,
268 &FGControls::get_spoilers, &FGControls::set_spoilers);
269 fgSetArchivable("/controls/flight/spoilers");
271 fgTie("/controls/flight/speedbrake", this,
272 &FGControls::get_speedbrake, &FGControls::set_speedbrake);
273 fgSetArchivable("/controls/flight/speedbrake");
275 fgTie("/controls/flight/wing-sweep", this,
276 &FGControls::get_wing_sweep, &FGControls::set_wing_sweep);
277 fgSetArchivable("/controls/flight/wing-sweep");
279 fgTie("/controls/flight/wing-fold", this,
280 &FGControls::get_wing_fold, &FGControls::set_wing_fold);
281 fgSetArchivable("/controls/flight/wing-fold");
283 fgTie("/controls/flight/drag-chute", this,
284 &FGControls::get_drag_chute, &FGControls::set_drag_chute);
285 fgSetArchivable("/controls/flight/drag-chute");
288 fgTie("/controls/engines/throttle_idle", this,
289 &FGControls::get_throttle_idle, &FGControls::set_throttle_idle);
290 fgSetArchivable("/controls/engines/throttle_idle");
292 for (index = 0; index < MAX_ENGINES; index++) {
293 char name[MAX_NAME_LEN];
294 snprintf(name, MAX_NAME_LEN,
295 "/controls/engines/engine[%d]/throttle", index);
296 fgTie(name, this, index,
297 &FGControls::get_throttle, &FGControls::set_throttle);
298 fgSetArchivable(name);
300 snprintf(name, MAX_NAME_LEN, "/controls/engines/engine[%d]/starter", index);
301 fgTie(name, this, index,
302 &FGControls::get_starter, &FGControls::set_starter);
303 fgSetArchivable(name);
305 snprintf(name, MAX_NAME_LEN,
306 "/controls/engines/engine[%d]/fuel-pump", index);
307 fgTie(name, this, index,
308 &FGControls::get_fuel_pump, &FGControls::set_fuel_pump);
309 fgSetArchivable(name);
311 snprintf(name, MAX_NAME_LEN,
312 "/controls/engines/engine[%d]/fire-switch", index);
313 fgTie(name, this, index,
314 &FGControls::get_fire_switch, &FGControls::set_fire_switch);
315 fgSetArchivable(name);
317 snprintf(name, MAX_NAME_LEN,
318 "/controls/engines/engine[%d]/fire-bottle-discharge", index);
319 fgTie(name, this, index,
320 &FGControls::get_fire_bottle_discharge,
321 &FGControls::set_fire_bottle_discharge);
322 fgSetArchivable(name);
324 snprintf(name, MAX_NAME_LEN, "/controls/engines/engine[%d]/cutoff", index);
325 fgTie(name, this, index,
326 &FGControls::get_cutoff, &FGControls::set_cutoff);
327 fgSetArchivable(name);
329 snprintf(name, MAX_NAME_LEN, "/controls/engines/engine[%d]/mixture", index);
330 fgTie(name, this, index,
331 &FGControls::get_mixture, &FGControls::set_mixture);
332 fgSetArchivable(name);
334 snprintf(name, MAX_NAME_LEN,
335 "/controls/engines/engine[%d]/propeller-pitch", index);
336 fgTie(name, this, index,
337 &FGControls::get_prop_advance,
338 &FGControls::set_prop_advance);
339 fgSetArchivable(name);
341 snprintf(name, MAX_NAME_LEN,
342 "/controls/engines/engine[%d]/magnetos", index);
343 fgTie(name, this, index,
344 &FGControls::get_magnetos, &FGControls::set_magnetos);
345 fgSetArchivable(name);
347 snprintf(name, MAX_NAME_LEN,
348 "/controls/engines/engine[%d]/feed_tank", index);
349 fgTie(name, this, index,
350 &FGControls::get_feed_tank, &FGControls::set_feed_tank);
351 fgSetArchivable(name);
354 snprintf(name, MAX_NAME_LEN, "/controls/engines/engine[%d]/WEP", index);
355 fgTie(name, this, index,
356 &FGControls::get_nitrous_injection,
357 &FGControls::set_nitrous_injection);
358 fgSetArchivable(name);
360 snprintf(name, MAX_NAME_LEN,
361 "/controls/engines/engine[%d]/cowl-flaps-norm", index);
362 fgTie(name, this, index,
363 &FGControls::get_cowl_flaps_norm,
364 &FGControls::set_cowl_flaps_norm);
365 fgSetArchivable(name);
367 snprintf(name, MAX_NAME_LEN,
368 "/controls/engines/engine[%d]/propeller-feather", index);
369 fgTie(name, this, index,
370 &FGControls::get_feather, &FGControls::set_feather);
371 fgSetArchivable(name);
373 snprintf(name, MAX_NAME_LEN,
374 "/controls/engines/engine[%d]/ignition", index);
375 fgTie(name, this, index,
376 &FGControls::get_ignition, &FGControls::set_ignition);
377 fgSetArchivable(name);
379 snprintf(name, MAX_NAME_LEN,
380 "/controls/engines/engine[%d]/augmentation", index);
381 fgTie(name, this, index,
382 &FGControls::get_augmentation,
383 &FGControls::set_augmentation);
384 fgSetArchivable(name);
386 snprintf(name, MAX_NAME_LEN,
387 "/controls/engines/engine[%d]/reverser", index);
388 fgTie(name, this, index,
389 &FGControls::get_reverser, &FGControls::set_reverser);
390 fgSetArchivable(name);
392 snprintf(name, MAX_NAME_LEN,
393 "/controls/engines/engine[%d]/water-injection", index);
394 fgTie(name, this, index,
395 &FGControls::get_water_injection,
396 &FGControls::set_water_injection);
397 fgSetArchivable(name);
399 snprintf(name, MAX_NAME_LEN,
400 "/controls/engines/engine[%d]/condition", index);
401 fgTie(name, this, index,
402 &FGControls::get_condition, &FGControls::set_condition);
403 fgSetArchivable(name);
407 fgTie("/controls/fuel/dump-valve", this,
408 &FGControls::get_dump_valve, &FGControls::set_dump_valve);
409 fgSetArchivable("/controls/fuel/dump-valve");
411 for (index = 0; index < MAX_TANKS; index++) {
412 char name[MAX_NAME_LEN];
413 snprintf(name, MAX_NAME_LEN,
414 "/controls/fuel/tank[%d]/fuel_selector", index);
415 fgTie(name, this, index,
416 &FGControls::get_fuel_selector,
417 &FGControls::set_fuel_selector);
418 fgSetArchivable(name);
420 snprintf(name, MAX_NAME_LEN, "/controls/fuel/tank[%d]/to_engine", index);
421 fgTie(name, this, index,
422 &FGControls::get_to_engine, &FGControls::set_to_engine);
423 fgSetArchivable(name);
425 snprintf(name, MAX_NAME_LEN, "/controls/fuel/tank[%d]/to_tank", index);
426 fgTie(name, this, index,
427 &FGControls::get_to_tank, &FGControls::set_to_tank);
428 fgSetArchivable(name);
430 for (i = 0; i < MAX_BOOSTPUMPS; i++) {
431 char name[MAX_NAME_LEN];
432 snprintf(name, MAX_NAME_LEN,
433 "/controls/fuel/tank[%d]/boost-pump[%d]", index, i);
434 fgTie(name, this, index * 2 + i,
435 &FGControls::get_boost_pump,
436 &FGControls::set_boost_pump);
437 fgSetArchivable(name);
442 fgTie("/controls/gear/brake-left", this,
443 &FGControls::get_brake_left,
444 &FGControls::set_brake_left);
445 fgSetArchivable("/controls/gear/brake-left");
447 fgTie("/controls/gear/brake-right", this,
448 &FGControls::get_brake_right,
449 &FGControls::set_brake_right);
450 fgSetArchivable("/controls/gear/brake-right");
452 fgTie("/controls/gear/copilot-brake-left", this,
453 &FGControls::get_copilot_brake_left,
454 &FGControls::set_copilot_brake_left);
455 fgSetArchivable("/controls/gear/copilot-brake-left");
457 fgTie("/controls/gear/copilot-brake-right", this,
458 &FGControls::get_copilot_brake_right,
459 &FGControls::set_copilot_brake_right);
460 fgSetArchivable("/controls/gear/copilot-brake-right");
462 fgTie("/controls/gear/brake-parking", this,
463 &FGControls::get_brake_parking,
464 &FGControls::set_brake_parking);
465 fgSetArchivable("/controls/gear/brake-parking");
467 fgTie("/controls/gear/steering", this,
468 &FGControls::get_steering, &FGControls::set_steering);
469 fgSetArchivable("/controls/gear/steering");
471 fgTie("/controls/gear/gear-down", this,
472 &FGControls::get_gear_down, &FGControls::set_gear_down);
473 fgSetArchivable("/controls/gear/gear-down");
475 fgTie("/controls/gear/antiskid", this,
476 &FGControls::get_antiskid, &FGControls::set_antiskid);
477 fgSetArchivable("/controls/gear/antiskid");
479 fgTie("/controls/gear/tailhook", this,
480 &FGControls::get_tailhook, &FGControls::set_tailhook);
481 fgSetArchivable("/controls/gear/tailhook");
483 fgTie("/controls/gear/launchbar", this,
484 &FGControls::get_launchbar, &FGControls::set_launchbar);
485 fgSetArchivable("/controls/gear/launchbar");
487 fgTie("/controls/gear/catapult-launch-cmd", this,
488 &FGControls::get_catapult_launch_cmd, &FGControls::set_catapult_launch_cmd);
489 fgSetArchivable("/controls/gear/catapult-launch-cmd");
491 fgTie("/controls/gear/tailwheel-lock", this,
492 &FGControls::get_tailwheel_lock,
493 &FGControls::set_tailwheel_lock);
494 fgSetArchivable("/controls/gear/tailwheel-lock");
496 for (index = 0; index < MAX_WHEELS; index++) {
497 char name[MAX_NAME_LEN];
498 snprintf(name, MAX_NAME_LEN,
499 "/controls/gear/wheel[%d]/alternate-extension", index);
500 fgTie(name, this, index,
501 &FGControls::get_alternate_extension,
502 &FGControls::set_alternate_extension);
503 fgSetArchivable(name);
507 fgTie("/controls/anti-ice/wing-heat", this,
508 &FGControls::get_wing_heat, &FGControls::set_wing_heat);
509 fgSetArchivable("/controls/anti-ice/wing-heat");
511 fgTie("/controls/anti-ice/pitot-heat", this,
512 &FGControls::get_pitot_heat, &FGControls::set_pitot_heat);
513 fgSetArchivable("/controls/anti-ice/pitot-heat");
515 fgTie("/controls/anti-ice/wiper", this,
516 &FGControls::get_wiper, &FGControls::set_wiper);
517 fgSetArchivable("/controls/anti-ice/wiper");
519 fgTie("/controls/anti-ice/window-heat", this,
520 &FGControls::get_window_heat, &FGControls::set_window_heat);
521 fgSetArchivable("/controls/anti-ice/window-heat");
523 for (index = 0; index < MAX_ENGINES; index++) {
524 char name[MAX_NAME_LEN];
525 snprintf(name, MAX_NAME_LEN,
526 "/controls/anti-ice/engine[%d]/carb-heat", index);
527 fgTie(name, this, index,
528 &FGControls::get_carb_heat, &FGControls::set_carb_heat);
529 fgSetArchivable(name);
531 snprintf(name, MAX_NAME_LEN,
532 "/controls/anti-ice/engine[%d]/inlet-heat", index);
533 fgTie(name, this, index,
534 &FGControls::get_inlet_heat, &FGControls::set_inlet_heat);
535 fgSetArchivable(name);
539 for (index = 0; index < MAX_HYD_SYSTEMS; index++) {
540 char name[MAX_NAME_LEN];
541 snprintf(name, MAX_NAME_LEN,
542 "/controls/hydraulic/system[%d]/engine-pump", index);
543 fgTie(name, this, index,
544 &FGControls::get_engine_pump, &FGControls::set_engine_pump);
545 fgSetArchivable(name);
547 snprintf(name, MAX_NAME_LEN,
548 "/controls/hydraulic/system[%d]/electric-pump", index);
549 fgTie(name, this, index,
550 &FGControls::get_electric_pump,
551 &FGControls::set_electric_pump);
552 fgSetArchivable(name);
556 fgTie("/controls/electric/battery-switch", this,
557 &FGControls::get_battery_switch,
558 &FGControls::set_battery_switch);
559 fgSetArchivable("/controls/electric/battery-switch");
561 fgTie("/controls/electric/external-power", this,
562 &FGControls::get_external_power,
563 &FGControls::set_external_power);
564 fgSetArchivable("/controls/electric/external-power");
566 fgTie("/controls/electric/APU-generator", this,
567 &FGControls::get_APU_generator,
568 &FGControls::set_APU_generator);
569 fgSetArchivable("/controls/electric/APU-generator");
571 for (index = 0; index < MAX_ENGINES; index++) {
572 char name[MAX_NAME_LEN];
573 snprintf(name, MAX_NAME_LEN,
574 "/controls/electric/engine[%d]/generator", index);
575 fgTie(name, this, index,
576 &FGControls::get_generator_breaker,
577 &FGControls::set_generator_breaker);
578 fgSetArchivable(name);
580 snprintf(name, MAX_NAME_LEN,
581 "/controls/electric/engine[%d]/bus-tie", index);
582 fgTie(name, this, index,
583 &FGControls::get_bus_tie,
584 &FGControls::set_bus_tie);
585 fgSetArchivable(name);
589 fgTie("/controls/pneumatic/APU-bleed", this,
590 &FGControls::get_APU_bleed,
591 &FGControls::set_APU_bleed);
592 fgSetArchivable("/controls/pneumatic/APU-bleed");
594 for (index = 0; index < MAX_ENGINES; index++) {
595 char name[MAX_NAME_LEN];
596 snprintf(name, MAX_NAME_LEN,
597 "/controls/pneumatic/engine[%d]/bleed", index);
598 fgTie(name, this, index,
599 &FGControls::get_engine_bleed,
600 &FGControls::set_engine_bleed);
601 fgSetArchivable(name);
605 fgTie("/controls/pressurization/mode", this,
606 &FGControls::get_mode, &FGControls::set_mode);
607 fgSetArchivable("/controls/pressurization/mode");
609 fgTie("/controls/pressurization/dump", this,
610 &FGControls::get_dump, &FGControls::set_dump);
611 fgSetArchivable("/controls/pressurization/dump");
613 fgTie("/controls/pressurization/outflow-valve", this,
614 &FGControls::get_outflow_valve,
615 &FGControls::set_outflow_valve);
616 fgSetArchivable("/controls/pressurization/outflow-valve");
618 for (index = 0; index < MAX_PACKS; index++) {
619 char name[MAX_NAME_LEN];
620 snprintf(name, MAX_NAME_LEN,
621 "/controls/pressurization/pack[%d]/pack-on", index);
622 fgTie(name, this, index,
623 &FGControls::get_pack_on, &FGControls::set_pack_on);
624 fgSetArchivable(name);
628 fgTie("/controls/lighting/landing-lights", this,
629 &FGControls::get_landing_lights,
630 &FGControls::set_landing_lights);
631 fgSetArchivable("/controls/lighting/landing-lights");
633 fgTie("/controls/lighting/turn-off-lights", this,
634 &FGControls::get_turn_off_lights,
635 &FGControls::set_turn_off_lights);
636 fgSetArchivable("/controls/lighting/turn-off-lights");
638 fgTie("/controls/lighting/taxi-light", this,
639 &FGControls::get_taxi_light, &FGControls::set_taxi_light);
640 fgSetArchivable("/controls/lighting/taxi-light");
642 fgTie("/controls/lighting/logo-lights", this,
643 &FGControls::get_logo_lights, &FGControls::set_logo_lights);
644 fgSetArchivable("/controls/lighting/logo-lights");
646 fgTie("/controls/lighting/nav-lights", this,
647 &FGControls::get_nav_lights, &FGControls::set_nav_lights);
648 fgSetArchivable("/controls/lighting/nav-lights");
650 fgTie("/controls/lighting/beacon", this,
651 &FGControls::get_beacon, &FGControls::set_beacon);
652 fgSetArchivable("/controls/lighting/beacon");
654 fgTie("/controls/lighting/strobe", this,
655 &FGControls::get_strobe, &FGControls::set_strobe);
656 fgSetArchivable("/controls/lighting/strobe");
658 fgTie("/controls/lighting/panel-norm", this,
659 &FGControls::get_panel_norm, &FGControls::set_panel_norm);
660 fgSetArchivable("/controls/lighting/panel-norm");
662 fgTie("/controls/lighting/instruments-norm", this,
663 &FGControls::get_instruments_norm,
664 &FGControls::set_instruments_norm);
665 fgSetArchivable("/controls/lighting/instruments-norm");
667 fgTie("/controls/lighting/dome-norm", this,
668 &FGControls::get_dome_norm, &FGControls::set_dome_norm);
669 fgSetArchivable("/controls/lighting/dome-norm");
672 fgTie("/controls/armament/master-arm", this,
673 &FGControls::get_master_arm, &FGControls::set_master_arm);
674 fgSetArchivable("/controls/armament/master-arm");
676 fgTie("/controls/armament/station-select", this,
677 &FGControls::get_station_select,
678 &FGControls::set_station_select);
679 fgSetArchivable("/controls/armament/station-select");
681 fgTie("/controls/armament/release-all", this,
682 &FGControls::get_release_ALL,
683 &FGControls::set_release_ALL);
684 fgSetArchivable("/controls/armament/release-all");
686 for (index = 0; index < MAX_STATIONS; index++) {
687 char name[MAX_NAME_LEN];
688 snprintf(name, MAX_NAME_LEN,
689 "/controls/armament/station[%d]/stick-size", index);
690 fgTie(name, this, index,
691 &FGControls::get_stick_size, &FGControls::set_stick_size);
692 fgSetArchivable(name);
694 snprintf(name, MAX_NAME_LEN,
695 "/controls/armament/station[%d]/release-stick", index);
696 fgTie(name, this, index,
697 &FGControls::get_release_stick, &FGControls::set_release_stick);
698 fgSetArchivable(name);
700 snprintf(name, MAX_NAME_LEN,
701 "/controls/armament/station[%d]/release-all", index);
702 fgTie(name, this, index,
703 &FGControls::get_release_all, &FGControls::set_release_all);
704 fgSetArchivable(name);
706 snprintf(name, MAX_NAME_LEN,
707 "/controls/armament/station[%d]/jettison-all", index);
708 fgTie(name, this, index,
709 &FGControls::get_jettison_all, &FGControls::set_jettison_all);
710 fgSetArchivable(name);
714 fgTie("/controls/seat/vertical-adjust", this,
715 &FGControls::get_vertical_adjust,
716 &FGControls::set_vertical_adjust);
717 fgSetArchivable("/controls/seat/vertical-adjust");
719 fgTie("/controls/seat/fore-aft-adjust", this,
720 &FGControls::get_fore_aft_adjust,
721 &FGControls::set_fore_aft_adjust);
722 fgSetArchivable("/controls/seat/fore-aft-adjust");
724 for (index = 0; index < MAX_EJECTION_SEATS; index++) {
725 char name[MAX_NAME_LEN];
726 snprintf(name, MAX_NAME_LEN,
727 "/controls/seat/eject[%d]/initiate", index);
728 fgTie(name, this, index,
729 &FGControls::get_ejection_seat,
730 &FGControls::set_ejection_seat);
731 fgSetArchivable(name);
733 snprintf(name, MAX_NAME_LEN,
734 "/controls/seat/eject[%d]/status", index);
736 fgTie(name, this, index,
737 &FGControls::get_eseat_status,
738 &FGControls::set_eseat_status);
740 fgSetArchivable(name);
743 fgTie("/controls/seat/cmd_selector_valve", this,
744 &FGControls::get_cmd_selector_valve,
745 &FGControls::set_cmd_selector_valve);
746 fgSetArchivable("/controls/seat/eject/cmd_selector_valve");
750 fgTie("/controls/APU/off-start-run", this,
751 &FGControls::get_off_start_run,
752 &FGControls::set_off_start_run);
753 fgSetArchivable("/controls/APU/off-start-run");
755 fgTie("/controls/APU/fire-switch", this,
756 &FGControls::get_APU_fire_switch,
757 &FGControls::set_APU_fire_switch);
758 fgSetArchivable("/controls/APU/fire-switch");
761 for (index = 0; index < MAX_AUTOPILOTS; index++) {
762 char name[MAX_NAME_LEN];
763 snprintf(name, MAX_NAME_LEN,
764 "/controls/autoflight/autopilot[%d]/engage", index);
765 fgTie(name, this, index,
766 &FGControls::get_autopilot_engage,
767 &FGControls::set_autopilot_engage);
768 fgSetArchivable(name);
771 fgTie("/controls/autoflight/autothrottle-arm", this,
772 &FGControls::get_autothrottle_arm,
773 &FGControls::set_autothrottle_arm);
774 fgSetArchivable("/controls/autoflight/autothrottle-arm");
776 fgTie("/controls/autoflight/autothrottle-engage", this,
777 &FGControls::get_autothrottle_engage,
778 &FGControls::set_autothrottle_engage);
779 fgSetArchivable("/controls/autoflight/autothrottle-engage");
781 fgTie("/controls/autoflight/heading-select", this,
782 &FGControls::get_heading_select,
783 &FGControls::set_heading_select);
784 fgSetArchivable("/controls/autoflight/heading-select");
786 fgTie("/controls/autoflight/altitude-select", this,
787 &FGControls::get_altitude_select,
788 &FGControls::set_altitude_select);
789 fgSetArchivable("/controls/autoflight/altitude-select");
791 fgTie("/controls/autoflight/bank-angle-select", this,
792 &FGControls::get_bank_angle_select,
793 &FGControls::set_bank_angle_select);
794 fgSetArchivable("/controls/autoflight/bank-angle-select");
796 fgTie("/controls/autoflight/vertical-speed-select", this,
797 &FGControls::get_vertical_speed_select,
798 &FGControls::set_vertical_speed_select);
799 fgSetArchivable("/controls/autoflight/vertical-speed-select");
801 fgTie("/controls/autoflight/speed-select", this,
802 &FGControls::get_speed_select,
803 &FGControls::set_speed_select);
804 fgSetArchivable("/controls/autoflight/speed-select");
806 fgTie("/controls/autoflight/mach-select", this,
807 &FGControls::get_mach_select,
808 &FGControls::set_mach_select);
809 fgSetArchivable("/controls/autoflight/mach-select");
811 fgTie("/controls/autoflight/vertical-mode", this,
812 &FGControls::get_vertical_mode,
813 &FGControls::set_vertical_mode);
814 fgSetArchivable("/controls/autoflight/vertical-mode");
816 fgTie("/controls/autoflight/lateral-mode", this,
817 &FGControls::get_lateral_mode,
818 &FGControls::set_lateral_mode);
819 fgSetArchivable("/controls/autoflight/lateral-mode");
823 void FGControls::unbind ()
826 //Tie control properties.
827 fgUntie("/controls/flight/aileron");
828 fgUntie("/controls/flight/aileron-trim");
829 fgUntie("/controls/flight/elevator");
830 fgUntie("/controls/flight/elevator-trim");
831 fgUntie("/controls/flight/rudder");
832 fgUntie("/controls/flight/rudder-trim");
833 fgUntie("/controls/flight/flaps");
834 fgUntie("/controls/flight/slats");
835 fgUntie("/controls/flight/BLC");
836 fgUntie("/controls/flight/spoilers");
837 fgUntie("/controls/flight/speedbrake");
838 fgUntie("/controls/flight/wing-sweep");
839 fgUntie("/controls/flight/wing-fold");
840 fgUntie("/controls/flight/drag-chute");
841 for (index = 0; index < MAX_ENGINES; index++) {
842 char name[MAX_NAME_LEN];
843 snprintf(name, MAX_NAME_LEN,
844 "/controls/engines/engine[%d]/throttle", index);
846 snprintf(name, MAX_NAME_LEN,
847 "/controls/engines/engine[%d]/feed_tank", index);
849 snprintf(name, MAX_NAME_LEN,
850 "/controls/engines/engine[%d]/starter", index);
852 snprintf(name, MAX_NAME_LEN,
853 "/controls/engines/engine[%d]/fuel_pump", index);
855 snprintf(name, MAX_NAME_LEN,
856 "/controls/engines/engine[%d]/fire-switch", index);
858 snprintf(name, MAX_NAME_LEN,
859 "/controls/engines/engine[%d]/fire-bottle-discharge", index);
861 snprintf(name, MAX_NAME_LEN,
862 "/controls/engines/engine[%d]/throttle_idle", index);
864 snprintf(name, MAX_NAME_LEN, "/controls/engines/engine[%d]/cutoff", index);
866 snprintf(name, MAX_NAME_LEN, "/controls/engines/engine[%d]/mixture", index);
868 snprintf(name, MAX_NAME_LEN,
869 "/controls/engines/engine[%d]/propeller-pitch", index);
871 snprintf(name, MAX_NAME_LEN,
872 "/controls/engines/engine[%d]/magnetos", index);
874 snprintf(name, MAX_NAME_LEN, "/controls/engines/engine[%d]/WEP", index);
876 snprintf(name, MAX_NAME_LEN,
877 "/controls/engines/engine[%d]/cowl-flaps-norm", index);
879 snprintf(name, MAX_NAME_LEN,
880 "/controls/engines/engine[%d]/propeller-feather", index);
882 snprintf(name, MAX_NAME_LEN,
883 "/controls/engines/engine[%d]/ignition", index);
885 snprintf(name, MAX_NAME_LEN,
886 "/controls/engines/engine[%d]/augmentation", index);
888 snprintf(name, MAX_NAME_LEN,
889 "/controls/engines/engine[%d]/reverser", index);
891 snprintf(name, MAX_NAME_LEN,
892 "/controls/engines/engine[%d]/water-injection", index);
894 snprintf(name, MAX_NAME_LEN,
895 "/controls/engines/engine[%d]/condition", index);
898 fgUntie("/controls/fuel/dump-valve");
899 for (index = 0; index < MAX_TANKS; index++) {
900 char name[MAX_NAME_LEN];
901 snprintf(name, MAX_NAME_LEN,
902 "/controls/fuel/tank[%d]/fuel_selector", index);
904 snprintf(name, MAX_NAME_LEN, "/controls/fuel/tank[%d]/to_engine", index);
906 snprintf(name, MAX_NAME_LEN, "/controls/fuel/tank[%d]/to_tank", index);
908 for (i = 0; index < MAX_BOOSTPUMPS; i++) {
909 snprintf(name, MAX_NAME_LEN,
910 "/controls/fuel/tank[%d]/boost-pump[%d]", index, i);
914 fgUntie("/controls/gear/brake-left");
915 fgUntie("/controls/gear/brake-right");
916 fgUntie("/controls/gear/brake-parking");
917 fgUntie("/controls/gear/steering");
918 fgUntie("/controls/gear/gear_down");
919 fgUntie("/controls/gear/antiskid");
920 fgUntie("/controls/gear/tailhook");
921 fgUntie("/controls/gear/launchbar");
922 fgUntie("/controls/gear/catapult-launch-cmd");
923 fgUntie("/controls/gear/tailwheel-lock");
924 for (index = 0; index < MAX_WHEELS; index++) {
925 char name[MAX_NAME_LEN];
926 snprintf(name, MAX_NAME_LEN,
927 "/controls/gear/wheel[%d]/alternate-extension", index);
930 fgUntie("/controls/anti-ice/wing-heat");
931 fgUntie("/controls/anti-ice/pitot-heat");
932 fgUntie("/controls/anti-ice/wiper");
933 fgUntie("/controls/anti-ice/window-heat");
934 for (index = 0; index < MAX_ENGINES; index++) {
935 char name[MAX_NAME_LEN];
936 snprintf(name, MAX_NAME_LEN,
937 "/controls/anti-ice/engine[%d]/carb-heat", index);
939 snprintf(name, MAX_NAME_LEN,
940 "/controls/anti-ice/engine[%d]/inlet-heat", index);
943 for (index = 0; index < MAX_HYD_SYSTEMS; index++) {
944 char name[MAX_NAME_LEN];
945 snprintf(name, MAX_NAME_LEN,
946 "/controls/hydraulic/system[%d]/engine-pump", index);
948 snprintf(name, MAX_NAME_LEN,
949 "/controls/hydraulic/system[%d]/electric-pump", index);
952 fgUntie("/controls/electric/battery-switch");
953 fgUntie("/controls/electric/external-power");
954 fgUntie("/controls/electric/APU-generator");
955 for (index = 0; index < MAX_ENGINES; index++) {
956 char name[MAX_NAME_LEN];
957 snprintf(name, MAX_NAME_LEN,
958 "/controls/electric/engine[%d]/generator", index);
960 snprintf(name, MAX_NAME_LEN,
961 "/controls/electric/engine[%d]/bus-tie", index);
964 fgUntie("/controls/pneumatic/APU-bleed");
965 for (index = 0; index < MAX_ENGINES; index++) {
966 char name[MAX_NAME_LEN];
967 snprintf(name, MAX_NAME_LEN,
968 "/controls/pneumatic/engine[%d]/bleed", index);
971 fgUntie("/controls/pressurization/mode");
972 fgUntie("/controls/pressurization/dump");
973 for (index = 0; index < MAX_PACKS; index++) {
974 char name[MAX_NAME_LEN];
975 snprintf(name, MAX_NAME_LEN,
976 "/controls/pressurization/pack[%d]/pack-on", index);
979 fgUntie("/controls/lighting/landing-lights");
980 fgUntie("/controls/lighting/turn-off-lights");
981 fgUntie("/controls/lighting/taxi-light");
982 fgUntie("/controls/lighting/logo-lights");
983 fgUntie("/controls/lighting/nav-lights");
984 fgUntie("/controls/lighting/beacon");
985 fgUntie("/controls/lighting/strobe");
986 fgUntie("/controls/lighting/panel-norm");
987 fgUntie("/controls/lighting/instruments-norm");
988 fgUntie("/controls/lighting/dome-norm");
990 fgUntie("/controls/armament/master-arm");
991 fgUntie("/controls/armament/station-select");
992 fgUntie("/controls/armament/release-all");
993 for (index = 0; index < MAX_STATIONS; index++) {
994 char name[MAX_NAME_LEN];
995 snprintf(name, MAX_NAME_LEN,
996 "/controls/armament/station[%d]/stick-size", index);
998 snprintf(name, MAX_NAME_LEN,
999 "/controls/armament/station[%d]/release-stick", index);
1001 snprintf(name, MAX_NAME_LEN,
1002 "/controls/armament/station[%d]/release-all", index);
1004 snprintf(name, MAX_NAME_LEN,
1005 "/controls/armament/station[%d]/jettison-all", index);
1009 fgUntie("/controls/seat/vertical-adjust");
1010 fgUntie("/controls/seat/fore-aft-adjust");
1011 for (index = 0; index < MAX_EJECTION_SEATS; index++) {
1012 char name[MAX_NAME_LEN];
1013 snprintf(name, MAX_NAME_LEN,
1014 "/controls/seat/eject[%d]/initiate", index);
1016 snprintf(name, MAX_NAME_LEN,
1017 "/controls/seat/eject[%d]/status", index);
1020 fgUntie("/controls/seat/cmd_selector_valve");
1022 fgUntie("/controls/APU/off-start-run");
1023 fgUntie("/controls/APU/fire-switch");
1024 for (index = 0; index < MAX_AUTOPILOTS; index++) {
1025 char name[MAX_NAME_LEN];
1026 snprintf(name, MAX_NAME_LEN,
1027 "/controls/autoflight/autopilot[%d]/engage", index);
1030 fgUntie("/controls/autoflight/autothrottle-arm");
1031 fgUntie("/controls/autoflight/autothrottle-engage");
1032 fgUntie("/controls/autoflight/heading-select");
1033 fgUntie("/controls/autoflight/altitude-select");
1034 fgUntie("/controls/autoflight/bank-angle-select");
1035 fgUntie("/controls/autoflight/vertical-speed-select");
1036 fgUntie("/controls/autoflight/speed-select");
1037 fgUntie("/controls/autoflight/mach-select");
1038 fgUntie("/controls/autoflight/vertical-mode");
1039 fgUntie("/controls/autoflight/lateral-mode");
1044 FGControls::update (double dt)
1050 ////////////////////////////////////////////////////////////////////////
1051 // Setters and adjusters.
1052 ////////////////////////////////////////////////////////////////////////
1055 FGControls::set_aileron (double pos)
1058 CLAMP( &aileron, -1.0, 1.0 );
1060 // check for autocoordination
1061 if ( auto_coordination->getBoolValue() ) {
1062 set_rudder( aileron / 2.0 );
1067 FGControls::move_aileron (double amt)
1070 CLAMP( &aileron, -1.0, 1.0 );
1072 // check for autocoordination
1073 if ( auto_coordination->getBoolValue() ) {
1074 set_rudder( aileron / 2.0 );
1079 FGControls::set_aileron_trim( double pos )
1082 CLAMP( &aileron_trim, -1.0, 1.0 );
1086 FGControls::move_aileron_trim( double amt )
1088 aileron_trim += amt;
1089 CLAMP( &aileron_trim, -1.0, 1.0 );
1093 FGControls::set_elevator( double pos )
1096 CLAMP( &elevator, -1.0, 1.0 );
1100 FGControls::move_elevator( double amt )
1103 CLAMP( &elevator, -1.0, 1.0 );
1107 FGControls::set_elevator_trim( double pos )
1109 elevator_trim = pos;
1110 CLAMP( &elevator_trim, -1.0, 1.0 );
1114 FGControls::move_elevator_trim( double amt )
1116 elevator_trim += amt;
1117 CLAMP( &elevator_trim, -1.0, 1.0 );
1121 FGControls::set_rudder( double pos )
1124 CLAMP( &rudder, -1.0, 1.0 );
1128 FGControls::move_rudder( double amt )
1131 CLAMP( &rudder, -1.0, 1.0 );
1135 FGControls::set_rudder_trim( double pos )
1138 CLAMP( &rudder_trim, -1.0, 1.0 );
1142 FGControls::move_rudder_trim( double amt )
1145 CLAMP( &rudder_trim, -1.0, 1.0 );
1149 FGControls::set_flaps( double pos )
1152 CLAMP( &flaps, 0.0, 1.0 );
1156 FGControls::move_flaps( double amt )
1159 CLAMP( &flaps, 0.0, 1.0 );
1163 FGControls::set_slats( double pos )
1166 CLAMP( &slats, 0.0, 1.0 );
1170 FGControls::move_slats( double amt )
1173 CLAMP( &slats, 0.0, 1.0 );
1177 FGControls::set_BLC( bool val )
1183 FGControls::set_spoilers( double pos )
1186 CLAMP( &spoilers, 0.0, 1.0 );
1190 FGControls::move_spoilers( double amt )
1193 CLAMP( &spoilers, 0.0, 1.0 );
1197 FGControls::set_speedbrake( double pos )
1200 CLAMP( &speedbrake, 0.0, 1.0 );
1204 FGControls::move_speedbrake( double amt )
1207 CLAMP( &speedbrake, 0.0, 1.0 );
1211 FGControls::set_wing_sweep( double pos )
1214 CLAMP( &wing_sweep, 0.0, 1.0 );
1218 FGControls::move_wing_sweep( double amt )
1221 CLAMP( &wing_sweep, 0.0, 1.0 );
1225 FGControls::set_wing_fold( bool val )
1231 FGControls::set_drag_chute( bool val )
1237 FGControls::set_throttle_idle( bool val )
1239 throttle_idle = val;
1243 FGControls::set_throttle( int engine, double pos )
1245 if ( engine == ALL_ENGINES ) {
1246 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1248 CLAMP( &throttle[i], 0.0, 1.0 );
1251 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1252 throttle[engine] = pos;
1253 CLAMP( &throttle[engine], 0.0, 1.0 );
1259 FGControls::move_throttle( int engine, double amt )
1261 if ( engine == ALL_ENGINES ) {
1262 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1264 CLAMP( &throttle[i], 0.0, 1.0 );
1267 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1268 throttle[engine] += amt;
1269 CLAMP( &throttle[engine], 0.0, 1.0 );
1275 FGControls::set_starter( int engine, bool flag )
1277 if ( engine == ALL_ENGINES ) {
1278 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1282 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1283 starter[engine] = flag;
1289 FGControls::set_fuel_pump( int engine, bool val )
1291 if ( engine == ALL_ENGINES ) {
1292 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1296 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1297 fuel_pump[engine] = val;
1303 FGControls::set_fire_switch( int engine, bool val )
1305 if ( engine == ALL_ENGINES ) {
1306 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1307 fire_switch[i] = val;
1310 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1311 fire_switch[engine] = val;
1317 FGControls::set_fire_bottle_discharge( int engine, bool val )
1319 if ( engine == ALL_ENGINES ) {
1320 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1321 fire_bottle_discharge[i] = val;
1324 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1325 fire_bottle_discharge[engine] = val;
1331 FGControls::set_cutoff( int engine, bool val )
1333 if ( engine == ALL_ENGINES ) {
1334 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1338 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1339 cutoff[engine] = val;
1345 FGControls::set_feed_tank( int engine, int tank )
1347 if ( engine == ALL_ENGINES ) {
1348 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1349 feed_tank[i] = tank;
1350 CLAMP( &feed_tank[i], -1, 4 );
1353 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1354 feed_tank[engine] = tank;
1355 CLAMP( &feed_tank[engine], -1, 4 );
1358 // feed_tank[engine] = engine;
1363 FGControls::set_mixture( int engine, double pos )
1365 if ( engine == ALL_ENGINES ) {
1366 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1368 CLAMP( &mixture[i], 0.0, 1.0 );
1371 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1372 mixture[engine] = pos;
1373 CLAMP( &mixture[engine], 0.0, 1.0 );
1379 FGControls::move_mixture( int engine, double amt )
1381 if ( engine == ALL_ENGINES ) {
1382 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1384 CLAMP( &mixture[i], 0.0, 1.0 );
1387 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1388 mixture[engine] += amt;
1389 CLAMP( &mixture[engine], 0.0, 1.0 );
1395 FGControls::set_prop_advance( int engine, double pos )
1397 if ( engine == ALL_ENGINES ) {
1398 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1399 prop_advance[i] = pos;
1400 CLAMP( &prop_advance[i], 0.0, 1.0 );
1403 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1404 prop_advance[engine] = pos;
1405 CLAMP( &prop_advance[engine], 0.0, 1.0 );
1411 FGControls::move_prop_advance( int engine, double amt )
1413 if ( engine == ALL_ENGINES ) {
1414 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1415 prop_advance[i] += amt;
1416 CLAMP( &prop_advance[i], 0.0, 1.0 );
1419 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1420 prop_advance[engine] += amt;
1421 CLAMP( &prop_advance[engine], 0.0, 1.0 );
1427 FGControls::set_magnetos( int engine, int pos )
1429 if ( engine == ALL_ENGINES ) {
1430 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1432 CLAMP( &magnetos[i], 0, 3 );
1435 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1436 magnetos[engine] = pos;
1437 CLAMP( &magnetos[engine], 0, 3 );
1443 FGControls::move_magnetos( int engine, int amt )
1445 if ( engine == ALL_ENGINES ) {
1446 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1448 CLAMP( &magnetos[i], 0, 3 );
1451 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1452 magnetos[engine] += amt;
1453 CLAMP( &magnetos[engine], 0, 3 );
1459 FGControls::set_nitrous_injection( int engine, bool val )
1461 if ( engine == ALL_ENGINES ) {
1462 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1463 nitrous_injection[i] = val;
1466 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1467 nitrous_injection[engine] = val;
1474 FGControls::set_cowl_flaps_norm( int engine, double pos )
1476 if ( engine == ALL_ENGINES ) {
1477 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1478 cowl_flaps_norm[i] = pos;
1479 CLAMP( &cowl_flaps_norm[i], 0.0, 1.0 );
1482 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1483 cowl_flaps_norm[engine] = pos;
1484 CLAMP( &cowl_flaps_norm[engine], 0.0, 1.0 );
1490 FGControls::move_cowl_flaps_norm( int engine, double amt )
1492 if ( engine == ALL_ENGINES ) {
1493 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1494 cowl_flaps_norm[i] += amt;
1495 CLAMP( &cowl_flaps_norm[i], 0.0, 1.0 );
1498 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1499 cowl_flaps_norm[engine] += amt;
1500 CLAMP( &cowl_flaps_norm[engine], 0.0, 1.0 );
1506 FGControls::set_feather( int engine, bool val )
1508 if ( engine == ALL_ENGINES ) {
1509 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1513 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1514 feather[engine] = val;
1520 FGControls::set_ignition( int engine, int pos )
1522 if ( engine == ALL_ENGINES ) {
1523 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1525 CLAMP( &ignition[i], 0, 3 );
1528 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1529 ignition[engine] = pos;
1530 CLAMP( &ignition[engine], 0, 3 );
1536 FGControls::set_augmentation( int engine, bool val )
1538 if ( engine == ALL_ENGINES ) {
1539 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1540 augmentation[i] = val;
1543 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1544 augmentation[engine] = val;
1550 FGControls::set_reverser( int engine, bool val )
1552 if ( engine == ALL_ENGINES ) {
1553 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1557 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1558 reverser[engine] = val;
1564 FGControls::set_water_injection( int engine, bool val )
1566 if ( engine == ALL_ENGINES ) {
1567 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1568 water_injection[i] = val;
1571 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1572 water_injection[engine] = val;
1578 FGControls::set_condition( int engine, double val )
1580 if ( engine == ALL_ENGINES ) {
1581 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1583 CLAMP( &condition[i], 0.0, 1.0 );
1586 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1587 condition[engine] = val;
1588 CLAMP( &condition[engine], 0.0, 1.0 );
1594 FGControls::set_dump_valve( bool val )
1601 FGControls::set_fuel_selector( int tank, bool pos )
1603 if ( tank == ALL_TANKS ) {
1604 for ( int i = 0; i < MAX_TANKS; i++ ) {
1605 fuel_selector[i] = pos;
1608 if ( (tank >= 0) && (tank < MAX_TANKS) ) {
1609 fuel_selector[tank] = pos;
1615 FGControls::set_to_engine( int tank, int engine )
1617 if ( tank == ALL_TANKS ) {
1618 for ( int i = 0; i < MAX_TANKS; i++ ) {
1619 to_engine[i] = engine;
1622 if ( (tank >= 0) && (tank < MAX_TANKS) ) {
1623 to_engine[tank] = engine;
1629 FGControls::set_to_tank( int tank, int dest_tank )
1631 if ( tank == ALL_TANKS ) {
1632 for ( int i = 0; i < MAX_TANKS; i++ ) {
1633 to_tank[i] = dest_tank;
1636 if ( (tank >= 0) && (tank < MAX_TANKS) ) {
1637 to_tank[tank] = dest_tank;
1643 FGControls::set_boost_pump( int index, bool val )
1645 if ( index == -1 ) {
1646 for ( int i = 0; i < (MAX_TANKS * MAX_BOOSTPUMPS); i++ ) {
1647 boost_pump[i] = val;
1650 if ( (index >= 0) && (index < (MAX_TANKS * MAX_BOOSTPUMPS)) ) {
1651 boost_pump[index] = val;
1658 FGControls::set_brake_left( double pos )
1661 CLAMP(&brake_left, 0.0, 1.0);
1665 FGControls::move_brake_left( double amt )
1668 CLAMP( &brake_left, 0.0, 1.0 );
1672 FGControls::set_brake_right( double pos )
1675 CLAMP(&brake_right, 0.0, 1.0);
1679 FGControls::move_brake_right( double amt )
1682 CLAMP( &brake_right, 0.0, 1.0 );
1686 FGControls::set_copilot_brake_left( double pos )
1688 copilot_brake_left = pos;
1689 CLAMP(&brake_left, 0.0, 1.0);
1693 FGControls::set_copilot_brake_right( double pos )
1695 copilot_brake_right = pos;
1696 CLAMP(&brake_right, 0.0, 1.0);
1700 FGControls::set_brake_parking( double pos )
1702 brake_parking = pos;
1703 CLAMP(&brake_parking, 0.0, 1.0);
1707 FGControls::set_steering( double angle )
1710 CLAMP(&steering, -80.0, 80.0);
1714 FGControls::move_steering( double angle )
1717 CLAMP(&steering, -80.0, 80.0);
1721 FGControls::set_gear_down( bool gear )
1727 FGControls::set_antiskid( bool state )
1733 FGControls::set_tailhook( bool state )
1739 FGControls::set_launchbar( bool state )
1745 FGControls::set_catapult_launch_cmd( bool state )
1747 catapult_launch_cmd = state;
1751 FGControls::set_tailwheel_lock( bool state )
1753 tailwheel_lock = state;
1758 FGControls::set_alternate_extension( int wheel, bool val )
1760 if ( wheel == ALL_WHEELS ) {
1761 for ( int i = 0; i < MAX_WHEELS; i++ ) {
1762 alternate_extension[i] = val;
1765 if ( (wheel >= 0) && (wheel < MAX_WHEELS) ) {
1766 alternate_extension[wheel] = val;
1772 FGControls::set_wing_heat( bool state )
1778 FGControls::set_pitot_heat( bool state )
1784 FGControls::set_wiper( int state )
1790 FGControls::set_window_heat( bool state )
1792 window_heat = state;
1796 FGControls::set_carb_heat( int engine, bool val )
1798 if ( engine == ALL_ENGINES ) {
1799 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1803 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1804 carb_heat[engine] = val;
1810 FGControls::set_inlet_heat( int engine, bool val )
1812 if ( engine == ALL_ENGINES ) {
1813 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1814 inlet_heat[i] = val;
1817 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1818 inlet_heat[engine] = val;
1824 FGControls::set_engine_pump( int system, bool val )
1826 if ( system == ALL_HYD_SYSTEMS ) {
1827 for ( int i = 0; i < MAX_HYD_SYSTEMS; i++ ) {
1828 engine_pump[i] = val;
1831 if ( (system >= 0) && (system < MAX_HYD_SYSTEMS) ) {
1832 engine_pump[system] = val;
1838 FGControls::set_electric_pump( int system, bool val )
1840 if ( system == ALL_HYD_SYSTEMS ) {
1841 for ( int i = 0; i < MAX_HYD_SYSTEMS; i++ ) {
1842 electric_pump[i] = val;
1845 if ( (system >= 0) && (system < MAX_HYD_SYSTEMS) ) {
1846 electric_pump[system] = val;
1852 FGControls::set_battery_switch( bool state )
1854 battery_switch = state;
1858 FGControls::set_external_power( bool state )
1860 external_power = state;
1864 FGControls::set_APU_generator( bool state )
1866 APU_generator = state;
1870 FGControls::set_generator_breaker( int engine, bool val )
1872 if ( engine == ALL_ENGINES ) {
1873 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1874 generator_breaker[i] = val;
1877 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1878 generator_breaker[engine] = val;
1884 FGControls::set_bus_tie( int engine, bool val )
1886 if ( engine == ALL_ENGINES ) {
1887 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1891 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1892 bus_tie[engine] = val;
1898 FGControls::set_APU_bleed( bool state )
1904 FGControls::set_engine_bleed( int engine, bool val )
1906 if ( engine == ALL_ENGINES ) {
1907 for ( int i = 0; i < MAX_ENGINES; i++ ) {
1908 engine_bleed[i] = val;
1911 if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
1912 engine_bleed[engine] = val;
1918 FGControls::set_mode( int new_mode )
1924 FGControls::set_outflow_valve( double pos )
1926 outflow_valve = pos;
1927 CLAMP( &outflow_valve, 0.0, 1.0 );
1931 FGControls::move_outflow_valve( double amt )
1933 outflow_valve += amt;
1934 CLAMP( &outflow_valve, 0.0, 1.0 );
1938 FGControls::set_dump( bool state )
1944 FGControls::set_pack_on( int pack, bool val )
1946 if ( pack == ALL_PACKS ) {
1947 for ( int i = 0; i < MAX_PACKS; i++ ) {
1951 if ( (pack >= 0) && (pack < MAX_PACKS) ) {
1952 pack_on[pack] = val;
1958 FGControls::set_landing_lights( bool state )
1960 landing_lights = state;
1964 FGControls::set_turn_off_lights( bool state )
1966 turn_off_lights = state;
1970 FGControls::set_taxi_light( bool state )
1976 FGControls::set_logo_lights( bool state )
1978 logo_lights = state;
1982 FGControls::set_nav_lights( bool state )
1988 FGControls::set_beacon( bool state )
1994 FGControls::set_strobe( bool state )
2000 FGControls::set_panel_norm( double intensity )
2002 panel_norm = intensity;
2003 CLAMP( &panel_norm, 0.0, 1.0 );
2007 FGControls::move_panel_norm( double amt )
2010 CLAMP( &panel_norm, 0.0, 1.0 );
2014 FGControls::set_instruments_norm( double intensity )
2016 instruments_norm = intensity;
2017 CLAMP( &instruments_norm, 0.0, 1.0 );
2021 FGControls::move_instruments_norm( double amt )
2023 instruments_norm += amt;
2024 CLAMP( &instruments_norm, 0.0, 1.0 );
2028 FGControls::set_dome_norm( double intensity )
2030 dome_norm = intensity;
2031 CLAMP( &dome_norm, 0.0, 1.0 );
2035 FGControls::move_dome_norm( double amt )
2038 CLAMP( &dome_norm, 0.0, 1.0 );
2042 FGControls::set_master_arm( bool val )
2048 FGControls::set_station_select( int station )
2050 station_select = station;
2051 CLAMP( &station_select, 0, MAX_STATIONS );
2055 FGControls::set_release_ALL( bool val )
2061 FGControls::set_stick_size( int station, int size )
2063 if ( station == ALL_STATIONS ) {
2064 for ( int i = 0; i < MAX_STATIONS; i++ ) {
2065 stick_size[i] = size;
2066 CLAMP( &stick_size[i], 1, 20 );
2069 if ( (station >= 0) && (station < MAX_STATIONS) ) {
2070 stick_size[station] = size;
2071 CLAMP( &stick_size[station], 1, 20 );
2077 FGControls::set_release_stick( int station, bool val )
2079 if ( station == ALL_STATIONS ) {
2080 for ( int i = 0; i < MAX_STATIONS; i++ ) {
2081 release_stick[i] = val;
2084 if ( (station >= 0) && (station < MAX_STATIONS) ) {
2085 release_stick[station] = val;
2091 FGControls::set_release_all( int station, bool val )
2093 if ( station == ALL_STATIONS ) {
2094 for ( int i = 0; i < MAX_STATIONS; i++ ) {
2095 release_all[i] = val;
2098 if ( (station >= 0) && (station < MAX_STATIONS) ) {
2099 release_all[station] = val;
2105 FGControls::set_jettison_all( int station, bool val )
2107 if ( station == ALL_STATIONS ) {
2108 for ( int i = 0; i < MAX_STATIONS; i++ ) {
2109 jettison_all[i] = val;
2112 if ( (station >= 0) && (station < MAX_STATIONS) ) {
2113 jettison_all[station] = val;
2119 FGControls::set_vertical_adjust( double pos )
2121 vertical_adjust = pos;
2122 CLAMP( &vertical_adjust, -1.0, 1.0 );
2126 FGControls::move_vertical_adjust( double amt )
2128 vertical_adjust += amt;
2129 CLAMP( &vertical_adjust, -1.0, 1.0 );
2133 FGControls::set_fore_aft_adjust( double pos )
2135 fore_aft_adjust = pos;
2136 CLAMP( &fore_aft_adjust, -1.0, 1.0 );
2140 FGControls::move_fore_aft_adjust( double amt )
2142 fore_aft_adjust += amt;
2143 CLAMP( &fore_aft_adjust, -1.0, 1.0 );
2147 FGControls::set_ejection_seat( int which_seat, bool val )
2149 if ( which_seat == ALL_EJECTION_SEATS ) {
2150 for ( int i = 0; i < MAX_EJECTION_SEATS; i++ ) {
2154 if ( (which_seat >= 0) && (which_seat <= MAX_EJECTION_SEATS) ) {
2155 if ( eseat_status[which_seat] == SEAT_SAFED ||
2156 eseat_status[which_seat] == SEAT_FAIL )
2158 // we can never eject if SEAT_SAFED or SEAT_FAIL
2162 eject[which_seat] = val;
2168 FGControls::set_eseat_status( int which_seat, int val )
2170 if ( which_seat == ALL_EJECTION_SEATS ) {
2171 for ( int i = 0; i < MAX_EJECTION_SEATS; i++ ) {
2172 eseat_status[i] = val;
2175 if ( (which_seat >=0) && (which_seat <= MAX_EJECTION_SEATS) ) {
2176 eseat_status[which_seat] = val;
2182 FGControls::set_cmd_selector_valve( int val )
2184 cmd_selector_valve = val;
2189 FGControls::set_off_start_run( int pos )
2191 off_start_run = pos;
2192 CLAMP( &off_start_run, 0, 3 );
2196 FGControls::set_APU_fire_switch( bool val )
2198 APU_fire_switch = val;
2202 FGControls::set_autothrottle_arm( bool val )
2204 autothrottle_arm = val;
2208 FGControls::set_autothrottle_engage( bool val )
2210 autothrottle_engage = val;
2214 FGControls::set_heading_select( double heading )
2216 heading_select = heading;
2217 CLAMP( &heading_select, 0.0, 360.0 );
2221 FGControls::move_heading_select( double amt )
2223 heading_select += amt;
2224 CLAMP( &heading_select, 0.0, 360.0 );
2228 FGControls::set_altitude_select( double altitude )
2230 altitude_select = altitude;
2231 CLAMP( &altitude_select, -1000.0, 100000.0 );
2235 FGControls::move_altitude_select( double amt )
2237 altitude_select += amt;
2238 CLAMP( &altitude_select, -1000.0, 100000.0 );
2242 FGControls::set_bank_angle_select( double angle )
2244 bank_angle_select = angle;
2245 CLAMP( &bank_angle_select, 10.0, 30.0 );
2249 FGControls::move_bank_angle_select( double amt )
2251 bank_angle_select += amt;
2252 CLAMP( &bank_angle_select, 10.0, 30.0 );
2256 FGControls::set_vertical_speed_select( double speed )
2258 vertical_speed_select = speed;
2259 CLAMP( &vertical_speed_select, -3000.0, 4000.0 );
2263 FGControls::move_vertical_speed_select( double amt )
2265 vertical_speed_select += amt;
2266 CLAMP( &vertical_speed_select, -3000.0, 4000.0 );
2270 FGControls::set_speed_select( double speed )
2272 speed_select = speed;
2273 CLAMP( &speed_select, 60.0, 400.0 );
2277 FGControls::move_speed_select( double amt )
2279 speed_select += amt;
2280 CLAMP( &speed_select, 60.0, 400.0 );
2284 FGControls::set_mach_select( double mach )
2287 CLAMP( &mach_select, 0.4, 4.0 );
2291 FGControls::move_mach_select( double amt )
2294 CLAMP( &mach_select, 0.4, 4.0 );
2298 FGControls::set_vertical_mode( int mode )
2300 vertical_mode = mode;
2301 CLAMP( &vertical_mode, 0, 4 );
2305 FGControls::set_lateral_mode( int mode )
2307 lateral_mode = mode;
2308 CLAMP( &lateral_mode, 0, 4 );
2312 FGControls::set_autopilot_engage( int ap, bool val )
2314 if ( ap == ALL_AUTOPILOTS ) {
2315 for ( int i = 0; i < MAX_AUTOPILOTS; i++ ) {
2316 autopilot_engage[i] = val;
2319 if ( (ap >= 0) && (ap < MAX_AUTOPILOTS) ) {
2320 autopilot_engage[ap] = val;