From OrbiterWiki
Jump to navigation Jump to search

Project home: Fly-By-Wire on Orbithangar
Author: Oliver 'Redburne' Pieper.

About Fly-By-Wire[edit]


Fly-By-Wire (FBW) complements or replaces Orbiter's support for Windows game controllers like joysticks, game pads, and HOTAS (Hands On Throttle And Stick) systems like the Saitek X52 or Thrustmaster Cougar.

With FBW, you can currently assign different axes on different game controllers to control

  • main, hover, and retro engine thrust
  • aileron, elevator, and rudder deflection (but not the nose wheel)
  • elevator trim
  • both rotational and translational RCS thrusters.

FBW is passive and will not interfere with vessel autopilots if the controllers are not moved.

A word of warning: The add-on is work in progress. Flexibility, power, and maintainability of the source code currently take precedence over looks and ease of use (and, quite possibly, always will)!

Change log[edit]

Release 0.9[edit]

  • new input type "combined" (combine any two joystick inputs to act as one axis)
  • use custom function (graph) to modify joystick input
    • presets for identity, linear, exponential function
    • mirror function (for symmetric controls)
    • saving and loading of custom functions
  • new "shared" mode for main and retro engine (control both with one joystick axis)
    • audio feedback on mode change (main/idle/retro)
  • latest SDL library (1.2.13) included

Release 0.8[edit]

  • code completely rewritten in C++ and Borland Delphi
  • no longer MFD based
  • configuration dialog on Orbiter launchpad, "Extra" tab, Fly-By-Wire/Configure
  • visual input selection, showing all axes, all buttons, etc. on one panel
  • for axes, upper, lower and central deadzones can be set
  • provisional support for RCS

Thanks and acknowledgements[edit]

  • Thanks to Dr. Martin Schweiger for spending so much time working on Orbiter that his homepage is still stuck in the 1990s ...
  • Artyom "Artlav" Litvinovich's Pascal/OAPI interface (taken from his GPLed OGLA client) was a great time saver and gave me some valuable pointers (pun intended) for getting Delphi 6 and the Orbiter API to play along nicely.
  • The guys and gals responsible for the Simple DirectMedia Layer
  • acclivity on the Freesound Project had just the right sound effects.
  • Tex for the new forum, Vash for the indespensable Orbit Hangar, and last but not least thanks to all the forum members reporting bugs and coming up with new ideas for Fly-By-Wire (some of the names can be found in the "Planned and/or requested features" section)!


The latest version of Fly-By-Wire can be found at Orbit Hangar Mods.


  1. Extract the contents of the archive file to your Orbiter directory, preserving the directory structure. You should now have a file called FlyByWire.dll in the subfolder \Modules\Plugin of your Orbiter folder. FBW will not overwrite any existing files, except those of older versions of FBW.
  2. Start Orbiter.
  3. Activate the module "Fly-By-Wire" on the "Modules" tab of the Orbiter Launchpad.
  4. It is recommended to disable Main Engine Control on the "Joystick" tab of the Orbiter Launchpad (i.e. set it to "<Keyboard only>") and use FBW to control the engines. It is not necessary to disable the joystick entirely. FBW will deactivate the axes when necessary.


Opening the configuration dialog[edit]

Unlike its predecessors, FBW v0.8+ no longer uses a MFD screen to for configuration, but adds an entry to the Extra tab of the Orbiter Launchpad window. Double-click 'Configure' (or select it and press the Edit button) to open the configuration dialog.

Choosing a game device[edit]

... to be written ...

Selecting an input[edit]

Standard inputs[edit]

... to be written ...

Combined axis[edit]

... to be written ...

Configure the input[edit]

... to be written ...

Set deadzones[edit]

... to be written ...

Use custom function[edit]

... to be written ...


Short for "Fly-By-Wire". This add-on.
(Game) device
The physical device plugged into your computer (joystick, trackball, throttle quadrant, gamepad, ...) which is recognized by Windows as a game controller.
(Game) controller
Same as game device
One single input channel on a game device. This can be a button, an axis of motion, a trackball, or an 8-way-hat. An input is characterized by its input type and input number (e.g. "axis 1", "button 12"). FBW also lists additional inputs derived from those standard ones (namely, "hat-as-button" and "hat-as-axis").
Input type
the type of an input ("button", "axis", "hat", "trackball X-axis", "hat NW as button", "hat E-W as axis", ...)
Input number
a game device usually consists of several inputs of the same type. They are numbered from 1 to n.

Files and folder structure[edit]



This small DLL, written in C++, acts as an interface between Orbiter and the FBW core DLL (see below).


The work horse of FBW. This DLL, written in Borland Delphi 6.0, contains the core functionality of Fly-By-Wire.


This folder contains ini files of the active FBW configuration.


Currently, this folder only holds saved custom functions, but will - at a later time - also hold saved FBW configurations.



This is the configuration file of the old (up to 0.7) FBW MFD version. Unless you are still using the MFD version of FBW, this file can be deleted.

Planned and/or requested features[edit]

(not necessarily complete, and most certainly not in any specific order)

  • automatic disengaging of controls if input and current setting differ by more than 5%, especially when switching vessels; automatic reengaging
  • separate axes for left and right (and center?) main engines [lockingtoggle]
  • RCS support:
    • different modes: normal (power), pulse, rate, rate change [yagni01, c3po, ...]
    • hard-coded "vernier" setting of 10% max. power when CTRL is pressed [Hielor]
    • configurable "vernier" setting (less power, e.g. 10%, at the push of a button) [yagni01]
    • virtual axis re-assignment for easier docking with dorsal, ventral, lateral docking ports [yagni01]
  • use keypresses like joystick buttons [yagni01]
  • Fly-By-Wire API for other developers
    • modified Shuttle-A as sample project (joystick controls auxiliary engine pod rotation and power)
  • multiple setups
    • automatic switching based on vessel class [c3po]

already implemented[edit]

  • [v0.9] Main/Retro: split axis with a configurable center deadzone [lockingtoggle]
  • [v0.9] add a way to assign two buttons to emulate an axis [pattersoncr]
  • [v0.9] fully customizable axis response (plus presets for "linear", "exponential")
  • [v0.9] Main/Retro: additional button mode (toggle main/retro) [yagni01]
  • RCS support:
    • [v0.9] rotation and translation independent and simultaneous [many ...]

Known issues[edit]

Rudder control/nosewheel[edit]

Unfortunately, the Orbiter API makes it difficult for add-ons to set the control surfaces for atmospheric flight. To take control of the rudder, FBW has to deactivate manual rudder control (both by keyboard and by joystick) when the FBW rudder control is active. Otherwise, the manual control would constantly override FBW's changes, rendering it inoperational. To complicate matters further, the Orbiter API does not support steering of the nose wheel. The nose wheel is still controlled by the usual Orbiter mechanism (i.e. the rudder keys or the standard joystick axis if Orbiter's joystick support is enabled). So, for technical reasons, FBW cannot support the nose wheel with the current Orbiter version.

Saitek X52 and X52 Pro[edit]

Rotary 2 (the big one on top of the throttle lever) is not recognized and cannot be used. This is probably a deficiency of the underlying SDL library that is used to access the game device.

Saitek Pro Flight Rudder Pedals[edit]

At this time (August 30th 2009), I believe the problem with Saitek Rotary 2 axis also exist with this rudder pedals. Like the Rotary 2 axis, it is detected but Fly By Wire 0.9 does not show any movement on the screen when the controller is moved


Fly-By-Wire started out as a humble little Python script (using my rudimentary and unreleased Python binding for Orbiter, PyOrbiter) for personal use with my Saitex X52 HOTAS system. It was never released to the public, because the installation process would have been both tedious and error prone.

About a year later I noticed increased activity of simpit builders on the Orbiter forum and their demand for a more versatile joystick handling in Orbiter. This motivated me to port the Python code to C++, and on 2007-06-03 the first release of Fly-By-Wire MFD was posted at Orbit Hangar Mods. Several revisions followed (0.7 being the latest), until, in early July, it became apparent to me that the structure of the code and my decision to use an MFD as user interface, made it very hard to further extend the functionality. Especially the much requested RCS support never made it into the code. I decided that a total rewrite of the code, this time with the bulk of the functionality in a Delphi DLL (which I use as a professional developer), was required.

In the following months, a small prototype proved the feasibility of using Delphi, both to access game devices and to build a GUI to be used on the Orbiter launchpad, but the project did not make a lot of progress. This changed when I discovered that Artlav is also using a Delphi compatible programming language to develop OGLA, his OpenGL client for the Orbiter Visualisation Project. His Orbiter/Object Pascal interface already implemented most of the functionality I needed to access Orbiter from Delphi, and vice versa.

With the technical difficulties out of the way, with renewed interest in the project on the M6 forum thread, and with the (not very ambitious) goal of bringing the new system to the level of v0.7 of the MFD version, it did not take too long to release the first beta of the new FBW system. The version was dubbed 0.8 to continue with the old numbering scheme.


FBW does not prompt me to save changes when exiting although I did modify some settings
Your final settings probably ended up being exactly the same as the one you initially had. FBW does not monitor user activity but simply compares the final settings with the ones it originally loaded. If you modify a control and later change your mind and set it to the old configuration, FBW will not recognize this as a change.
If that is not the case, you have found a bug.


I have decided to not include the sources during beta development, but you can request a copy at any time, and I will gladly send it to you.

If you want a copy, please send an e-mail to [email protected]

Fly-By-Wire is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Fly-By-Wire is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Fly-By-Wire.  If not, see <>.