The long history of aerospace control design provides many ideas for input devices. For example, the SR-71 Blackbird's autopilot system [Lon01] featured two finger wheels that allowed the pitch and roll of the aircraft to be controlled with a single finger. The Flightdeck-UI project aims to use such ideas in designing generic input controls.
Interfaces which use a few elements to implement many functions may look simpler at first glance, but they are far more difficult to use. For example, a telephone-based system — with its limited keypad — is harder to work with than the relative multitude of controls in a car [Nor88]. This idea is also part of the Python design philosophy: "Flat is better than nested" is one of its 19 principles.
Limiting nesting at the user interface level makes a program easier to interact with. Possible inputs are more obvious, and are easier to remember. Heavily nested menus and frequent use of popup dialog boxes make a user lose context. The Flightdeck-UI cmdwatch.py demonstration program does not use any menus or dialog boxes at all. In order to serve as an example, it will continue to keep these features to a minimum as it evolves.
Analog dials have a similar "gestural" value to gauges. Flightdeck-UI includes a Dial as of version 0.1.3. An illustration is given below.
A dial input element — similar to an analog gauge — allows the user to quickly get an approximate reading of its setting. Current Flightdeck-UI dials focus on this feature, and include no text markings on the face. The exact value to which the dial is set can be shown in a text label near the dial, which is how the demonstration program cmdwatch.py uses this element. See the next subsection for a full description of features.
Flightdeck-UI dials are most suitable when some adjustment must be made quickly, but great precision is not required. There are actually many tasks that fit this description. For example, when the cmdwatch.py application is in its "minimized" state, a dial element is included to allow the sampling rate to be adjusted between 1 and 10 times a second. A few clicks of the mouse over the relatively large dial target suffice to change the sampling rate, with a strong graphical indication of that change being shown immediately. A small text label below the dial supplements the graphical information with a displayed numerical value.
Of course, when something like 15-digit numbers must be accurately entered via an interface, the traditional text box is probably the best approach. In many cases, however, the input required is much more coarse, and the ease of setting it, along with a strong indication of the approximate value, are the determining factors for reducing operator error.
The features of the Flightdeck-UI dial are listed below.
The number of dial knobs, along with their lengths (as a percentage of the longest indicator's length) can be specified. By default, there is one knob.
The colors of the knobs and the outer ring of the dial face can be changed from their defaults.
The number of allowable positions for the dial knobs can be set by the caller (10 is the default). The caller can also specify the color value which correspond to the maximum and minimum settings (defaults are red and green, respectively). The inner ring of the dial is then colored in segments (based on the number of allowed knob positions) using calculated intermediate colors between the maximum and minimum boundary values.
Any number of keystrokes which cause the dial knobs to "click" in either direction can be specified by the caller. Three sets of two keys each are configured by default — right mouse button with left mouse button, as well as their Alt and Shift combinations. A caller-supplied function is called when each of these keystroke events is received. The function has an integer as its sole formal parameter; the integer's magnitude represents the key set that generated the event, while its sign shows whether positive or negative motion of the dial was requested.
Like any other gauge object, the dial has an update method. It is up to the caller to make use of this method in order to set the dial reading. The callback function called by Dial when input keystrokes are received is a good place to do so. Separating the update and input functions results in greater flexibility (it is possible to implement logarithmic scale dials, for example).