<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.flightgear.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jester</id>
	<title>FlightGear wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.flightgear.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jester"/>
	<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/Special:Contributions/Jester"/>
	<updated>2026-04-04T08:15:36Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Mumble&amp;diff=117625</id>
		<title>Mumble</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Mumble&amp;diff=117625"/>
		<updated>2019-03-19T01:03:43Z</updated>

		<summary type="html">&lt;p&gt;Jester: Added section about binding Push-To-Talk to joystick button on linux&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Software&lt;br /&gt;
| title               = Mumble&lt;br /&gt;
| logo                = &lt;br /&gt;
| image               = &lt;br /&gt;
| alt                 = &lt;br /&gt;
| developedby         = Various&lt;br /&gt;
| initialrelease      = 2005&lt;br /&gt;
| latestrelease       = 1.2.19 (stable)&lt;br /&gt;
| writtenin           = C++&lt;br /&gt;
| os                  = Windows, OS X, Linux, Android, iOS&lt;br /&gt;
| platform            = PC, Mac, smartphones&lt;br /&gt;
| developmentstatus   = &lt;br /&gt;
| developmentprogress = &lt;br /&gt;
| type                = Voice chat software&lt;br /&gt;
| license             = [https://github.com/mumble-voip/mumble/blob/master/LICENSE Open source]&lt;br /&gt;
| website             = http://wiki.mumble.info/wiki/Main_Page&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Mumble''' is a free, open source VoIP software used by some ATCs and pilots on the multiplayer network.&lt;br /&gt;
&lt;br /&gt;
== Installation and configuration ==&lt;br /&gt;
# Download Mumble from its [http://wiki.mumble.info/wiki/Main_Page official website] (choose the links from the ''Stable Release'' column). If you're on Linux, you can usually install it using your package manager.&lt;br /&gt;
# Start it and follow the instructions on your screen to configure the program.&lt;br /&gt;
{{tip|We suggest to choose the '''Push-To-Talk''' mode in the '''Voice Activity Detection''' step; if you choose another mode, make sure to calibrate the volume levels correctly (follow the on-screen instructions carefully). This way, your voice will be transmitted only when you mean to, and there will be less background noise on the channel.}}&lt;br /&gt;
&lt;br /&gt;
=== Binding '''Push-To-Talk''' to joystick button on linux ===&lt;br /&gt;
&lt;br /&gt;
On linux you can enable generic input support by editing &amp;lt;code&amp;gt;~/.config/Mumble/Mumble.conf&amp;lt;/code&amp;gt;. You need to add the following section:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
[shortcut]&lt;br /&gt;
linux\evdev\enable=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure you have permission to access the input devices (typically called &amp;lt;code&amp;gt;/dev/input/event*&amp;lt;/code&amp;gt;). You might need to add yourself to the appropriate group (for example &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt;) or configure your device manager to grant access. Consult your OS documentation for details. {{Tip|&amp;lt;code&amp;gt;input-events&amp;lt;/code&amp;gt; is a useful tool for troubleshooting.}}&lt;br /&gt;
&lt;br /&gt;
Proceed to launch mumble. If you are using a terminal, watch the output messages. You should see your input device listed, such as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;GlobalShortcutX: /dev/input/event7: Saitek Cyborg Evo Force&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open the settings dialog, go to the shortcuts tab and assign any button you like to the &amp;lt;code&amp;gt;Push-to-Talk&amp;lt;/code&amp;gt; function.&lt;br /&gt;
{{Note|It may show up as nonsense but that is just a cosmetic issue. For example, one of my joystick buttons appears as {{button|semicolon}}. Nevertheless, it's still the joystick button and typing semicolon on the keyboard has no effect.}}&lt;br /&gt;
&lt;br /&gt;
== Connecting ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Click on {{Menu item|Server|Connect}}.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If this is the first time you connect to the FlightGear Mumble server, click on {{button|Add New...}} at the bottom of the window and input the following parameters, then click {{button|OK}}:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Label'''&lt;br /&gt;
| &amp;lt;tt&amp;gt;FlightGear ATC&amp;lt;/tt&amp;gt; (or another descriptive name of your choice)&lt;br /&gt;
|-&lt;br /&gt;
| '''Address'''&lt;br /&gt;
| &amp;lt;tt&amp;gt;itpns.ddns.net&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Port'''&lt;br /&gt;
| &amp;lt;tt&amp;gt;64738&amp;lt;/tt&amp;gt; (the default value)&lt;br /&gt;
|-&lt;br /&gt;
| '''Username'''&lt;br /&gt;
| A username (callsign) of your choice&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Select '''FlightGear ATC''' from the server list and click {{button|Connect}}.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using Mumble ==&lt;br /&gt;
When you are connected, Mumble will show a hierarchical list of channels on the right side of the main window.&lt;br /&gt;
* To enter an existing channel, right click on it and choose {{Menu item|Join Channel}}.&lt;br /&gt;
* To create a new channel (e.g. if you're acting as a controller), right click on the ''FlightGear'' channel and choose {{Menu item|Add}}. Input a name and (optionally) a description, then click {{button|OK}}.&lt;br /&gt;
{{note|The new channel is temporary and will be deleted when the last person in it exits the channel.}}&lt;br /&gt;
* To mute yourself, click the {{button|Mute}} button in the main toolbar.&lt;br /&gt;
&lt;br /&gt;
== OpenRadar flickering when using Mumble ==&lt;br /&gt;
If you're using Mumble and OpenRadar at the same time, you might notice that the OpenRadar screen flickers. A solution is disabling the Mumble overlay (in Mumble, click on {{Menu item|Configure|Settings}}, open the '''Overlay''' section, deselect '''Enable Overlay''' and click {{button|OK}}).&lt;br /&gt;
&lt;br /&gt;
[[Category:Air Traffic Control]]&lt;br /&gt;
[[Category:Software]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Git&amp;diff=32524</id>
		<title>FlightGear Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Git&amp;diff=32524"/>
		<updated>2011-06-21T23:20:14Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* fgdata.bundle */ updated instructions for new bundle version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FlightGearGitOn}}&lt;br /&gt;
'''Git''' is a version control system used by the [[FlightGear]] project to store all of the files required to build FlightGear, as well as data (mainly [[aircraft]]). Git tracks updates to every file as developers around the world work together concurrently to create new versions. &lt;br /&gt;
&lt;br /&gt;
While new FlightGear features and additions are in development, they are available from Git before they are available in the standard release version. Using Git allows a user to build the newest possible version of FlightGear from the latest source files, to experiment with new aircraft or other features. However, it's not a beginner's tool. Using Git can expose the user to unstable features that show ugly error messages, or crash the computer. &lt;br /&gt;
&lt;br /&gt;
In May 2010, after a hardware failure on the [[CVS]] servers, the FlightGear project changed version control system from CVS to Git. The Git repositories are located at [http://gitorious.org/fg Gitorious] and at the [http://mapserver.flightgear.org/git/?p=fgdata;a=summary Mapserver].&lt;br /&gt;
&lt;br /&gt;
Due to the &amp;quot;recent&amp;quot; switch, we are currently doing our best on providing manuals for obtaining FlightGear through Git. The following articles are work in progress:&lt;br /&gt;
* '''Mac OS X:''' [[FlightGear Git on Mac OS X]]&lt;br /&gt;
* '''Windows:''' [[FlightGear Git on Windows]]&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
Much has been written on the advantages of Git over CVS. For us, some advantages are:&lt;br /&gt;
* Much better support for branches and merging branches. This is especially important for creating bug-fix releases for major releases while still allowing work on the next major release to continue. It is also very nice for a developer's personal workflow.&lt;br /&gt;
* Easier path for contributors to submit changes and developers to integrate them;&lt;br /&gt;
* Much better support for everyday tasks like searching the project history for changes, viewing changes, bisecting the project history to find the original source of a bug.&lt;br /&gt;
&lt;br /&gt;
Also, as noted before, the CVS servers had a hardware failure on May 2010, speeding up FlightGear's change to Git.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Repositories and Branches ==&lt;br /&gt;
For historical reasons there continue to be separate repositories for SimGear and FlightGear '''source'''. For most users and developers the most interesting ones of each are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;next&amp;lt;/tt&amp;gt; The current tip of new development. This branch should always compile and run, but various things could be broken.&lt;br /&gt;
* &amp;lt;tt&amp;gt;release/*&amp;lt;/tt&amp;gt; The branch subdirectory containing former and, if there is one, upcoming releases.&lt;br /&gt;
For other available branches have a look at our [http://gitorious.org/fg/flightgear#more repository] at gitorious.org. The following two branches are as of now (May 2011) very much out of date. '''Do not use'''.&lt;br /&gt;
* &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt; The tip of stable, tested new features. If we were to make a new release today, we would start from the tip of this branch. New features that have been &amp;quot;cooking&amp;quot; in the &amp;lt;tt&amp;gt;next&amp;lt;/tt&amp;gt; branch for a few days or weeks will be merged here.&lt;br /&gt;
* &amp;lt;tt&amp;gt;maint&amp;lt;/tt&amp;gt; Bug fixes for the most recently released Flightgear. When a release is made from &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;, this branch is reset to it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
FlightGear '''data''''s branches of interest are:&lt;br /&gt;
* &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt; The one that is used with the &amp;lt;tt&amp;gt;next&amp;lt;/tt&amp;gt; branch of the source.&lt;br /&gt;
* &amp;lt;tt&amp;gt;release/*&amp;lt;/tt&amp;gt; Same as for the source.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This arrangement follows the scheme used by the Git maintainers.&lt;br /&gt;
[http://www.kernel.org/pub/software/scm/git/docs/howto/maintain-git.txt This description] is very technical; you will surely have achieved git-fu if completely understand it. However, the idea of maintaining several branches of different stability is common in collaborative software projects.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Clone and handle Repositories ==&lt;br /&gt;
=== Quick checkout ===&lt;br /&gt;
# Check on gitorious for valid projects: http://gitorious.org/fg&lt;br /&gt;
# Cloning Simgear&lt;br /&gt;
# Cloning FlightGear&lt;br /&gt;
# Cloning FGData&lt;br /&gt;
&lt;br /&gt;
By default you will be checking out the &amp;lt;tt&amp;gt;next&amp;lt;/tt&amp;gt; branch of SimGear and FlightGear and the &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt; branch of FGData. This is probably what you want if you want to assist with reporting bugs and the like before they are release as a proper release version.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== For dummies ===&lt;br /&gt;
Some basic git commands on how to clone, update and handle local git repositories. Except the initial ''git clone'' for each repository all commands have to be executed from within the ''target'' folder.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cloning SimGear ====&lt;br /&gt;
;&amp;lt;code&amp;gt;git clone git://gitorious.org/fg/simgear.git [target]&amp;lt;/code&amp;gt;&lt;br /&gt;
: the folder ''target'' will be created and a clone of the SimGear repo stored inside it. If no ''target'' is given the new folder's name is &amp;lt;code&amp;gt;simgear&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt;''' into the new folder. You are then inside the ''working tree'' of this git repo. The repo itself is stored inside the subfolder &amp;lt;tt&amp;gt;.git&amp;lt;/tt&amp;gt;, which we mustn't edit manually. Git will take care of that.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code&amp;gt;git branch&amp;lt;/code&amp;gt;&lt;br /&gt;
: will show the active [[FlightGear and Git#Repositories and Branches|branch]]. Right after download this will be &amp;lt;tt&amp;gt;* next&amp;lt;/tt&amp;gt;, that means the content of the ''working tree'' is the bleeding edge of SimGear's source code.&lt;br /&gt;
:;&amp;lt;code&amp;gt;git branch -a&amp;lt;/code&amp;gt;&lt;br /&gt;
:: will list all branches of a git repository. The one marked with an asterisk (*) is the active one.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code&amp;gt;git checkout master&amp;lt;/code&amp;gt;&lt;br /&gt;
: will change the active [[FlightGear and Git#Repositories and Branches|branch]] to &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;. Means, that the content of the ''working tree'' will be changed to that state.&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code&amp;gt;git checkout v2.0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
:: will activate the state of the code inside the &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt; branch at the time FG 2.0.0 was released.&lt;br /&gt;
:;&amp;lt;code&amp;gt;git tag&amp;lt;/code&amp;gt;&lt;br /&gt;
:: will show all tags of the history of the active branch.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;&lt;br /&gt;
: will update the local repo from the remote one.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Cloning FlightGear ====&lt;br /&gt;
Except for the initial clone command this is identic to [[FlightGear and Git#Cloning SimGear|Cloning SimGear]].&lt;br /&gt;
;&amp;lt;code&amp;gt;git clone git://gitorious.org/fg/flightgear.git [target]&amp;lt;/code&amp;gt;&lt;br /&gt;
To successfully compile &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; Flight- and SimGear's ''working tree'' must have the same state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Cloning fgdata ====&lt;br /&gt;
At the time of writing the data repository is about ''3.4 GB''. Continuing an interrupted cloning of a repository is '''not supported''' with git. Therefore, if you have a slow or unstable connection to the internet, it is recommended to download the [[FlightGear and Git#fgdata.bundle|fgdata.bundle]].&lt;br /&gt;
&lt;br /&gt;
Also have in mind, that the repository plus the ''working tree'' will be more than twice the size of the download on your local filesystem.&lt;br /&gt;
&lt;br /&gt;
There is neither a &amp;lt;tt&amp;gt;next&amp;lt;/tt&amp;gt; branch nor any tags in that repository. If you want to build FlightGear 2.0.0 you may fetch the data (FlightGear-data-2.0.0.tar.bz2) at one of the [http://flightgear.org/mirrors.html mirrors].&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code&amp;gt;git clone git://mapserver.flightgear.org/fgdata/ [target]&amp;lt;/code&amp;gt;&lt;br /&gt;
: if no ''target'' is given the new folder's name is &amp;lt;tt&amp;gt;fgdata&amp;lt;/tt&amp;gt;&lt;br /&gt;
'''&amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt;''' into the new directory and verify it's state with '''&amp;lt;code&amp;gt;git branch&amp;lt;/code&amp;gt;'''. If it isn't &amp;lt;tt&amp;gt;* master&amp;lt;/tt&amp;gt;, do a '''&amp;lt;code&amp;gt;git checkout master&amp;lt;/code&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Local Branch ====&lt;br /&gt;
To make individual changes, like editing a joystick file or add a plane to fgdata or patch the source code, it is recommended to create a local branch inside that repository. The following commands will describe a way to achieve this. But have in mind, that this is very basic and only suits for users who have minor changes.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt;''' into the repositories folder, e.g. fgdata:&lt;br /&gt;
;&amp;lt;code&amp;gt;git checkout -b master.local master&amp;lt;/code&amp;gt;&lt;br /&gt;
: a new branch &amp;lt;tt&amp;gt;master.local&amp;lt;/tt&amp;gt; is created out of the &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt; branch and set as the active one. You may now apply your individual stuff there and start FlightGear to verify the changes are propper.&lt;br /&gt;
&lt;br /&gt;
If you conclude they are, you have to tell git about those changes:&lt;br /&gt;
;&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
: will give you a list of files that have been altered or that are new.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code&amp;gt;git add -i&amp;lt;/code&amp;gt;&lt;br /&gt;
: will show the files that have been altered and give you options on what to do next. &amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt; does not actually add the changes to ''master.local'' but adds them to the ''index''.&lt;br /&gt;
: '''&amp;lt;tt&amp;gt;[a]dd&amp;lt;/tt&amp;gt;''' will add new paths/files (called ''untracked'' in status) from the ''working tree'' to the ''index''. This has to be done only if you have added paths/files, like an aircraft, to the ''working tree''.&lt;br /&gt;
: If git finds more than one ''untracked'' file/path, it will give you a numbered list and prompt to select which ones should be added. An empty input will exit this mode. See &amp;quot;Interactive mode&amp;quot; in [http://www.kernel.org/pub/software/scm/git/docs/git-add.html man git add] for more details.&lt;br /&gt;
: '''&amp;lt;tt&amp;gt;[u]pdate&amp;lt;/tt&amp;gt;''' is the next step and will update the altered and ''tracked'' files to the index in the same manner as explained in &amp;lt;tt&amp;gt;add&amp;lt;/tt&amp;gt; untracked paths above.&lt;br /&gt;
;&amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt;&lt;br /&gt;
: will commit the ''indexed'' updates to the ''master.local'' branch. It opens a list of the updates in your standard editor. You may add a comment to that file describing the object of the commit. Save and exit the editor. You have now commited your changes inside the ''working tree'' to your personal branch.&lt;br /&gt;
&lt;br /&gt;
To update that personal branch from the remote one do the following steps:&lt;br /&gt;
 git checkout master           # switch to master branch&lt;br /&gt;
 git pull                      # update it&lt;br /&gt;
 git checkout master.local     # switch back to the individual branch&lt;br /&gt;
 git rebase master             # update it&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Some more helpful commands ====&lt;br /&gt;
;&amp;lt;code&amp;gt;git help&amp;lt;/code&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;git help [commad]&amp;lt;/code&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;git apply&amp;lt;/code&amp;gt;&lt;br /&gt;
: apply a patch to files and/or to the index http://www.kernel.org/pub/software/scm/git/docs/git-apply.html&lt;br /&gt;
;&amp;lt;code&amp;gt;git checkout -f&amp;lt;/code&amp;gt;&lt;br /&gt;
: may be used to throw away any local changes to the ''working tree''. Use with care, as any option that name is &amp;lt;tt&amp;gt;-f&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;--force&amp;lt;/tt&amp;gt;, and only after reading &amp;lt;code&amp;gt;git checkout help&amp;lt;/code&amp;gt;!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fgdata.bundle ===&lt;br /&gt;
For the FlightGear-data there are also bundles (snapshots) available that can be retrieved with your favourite download manager. This way you can resume interrupted downloads. After unpacking only a comparatively small amount of data has to be transferred from the git server to synchronize your repository.&lt;br /&gt;
&lt;br /&gt;
Download the bundle from&lt;br /&gt;
 $ wget http://flightgear.mxchange.org/pub/fgfs/fgdata.bundle&lt;br /&gt;
&lt;br /&gt;
The bundle may be periodically updated and bundles from different sources need not be the same. The file size for the above bundle dated 2011-05-27 is 3607494099, while the md5 checksum is&lt;br /&gt;
 $ md5sum fgdata.bundle&lt;br /&gt;
 3ddb025053fc395323ae708816555551  fgdata.bundle&lt;br /&gt;
&lt;br /&gt;
Do the following steps to extract the bundle and bring the repository up to date:&lt;br /&gt;
 $ git clone fgdata.bundle fgdata&lt;br /&gt;
 Initialized empty Git repository in fgdata/.git/&lt;br /&gt;
 warning: unrecognized header: -deg&amp;quot; - /orientation/roll += &amp;quot;-deg&amp;quot; - /position/altitude += &amp;quot;-ft&amp;quot; - /position/altitude-agl += &amp;quot;-ft&amp;quot; - /position/latitude += &amp;quot;-deg&amp;quot; - /position/longitude += &amp;quot;-deg&amp;quot; [...]&lt;br /&gt;
 $ cd fgdata&lt;br /&gt;
 $ git checkout -b master-tmp&lt;br /&gt;
 Switched to a new branch 'master-tmp'&lt;br /&gt;
 $ git remote rm origin&lt;br /&gt;
 $ git remote add origin git://gitorious.org/fg/fgdata&lt;br /&gt;
 $ git fetch origin&lt;br /&gt;
 remote: Counting objects: 5011, done.&lt;br /&gt;
 remote: Compressing objects: 100% (2206/2206), done.&lt;br /&gt;
 remote: Total 3512 (delta 1948), reused 2321 (delta 1239)&lt;br /&gt;
 Receiving objects: 100% (3512/3512), 161.20 MiB | 474 KiB/s, done.&lt;br /&gt;
 Resolving deltas: 100% (1948/1948), completed with 698 local objects.&lt;br /&gt;
 From git://gitorious.org/fg/fgdata&lt;br /&gt;
  * [new branch]      PRE_OSG_PLIB_20061029 -&amp;gt; origin/PRE_OSG_PLIB_20061029&lt;br /&gt;
  * [new branch]      master     -&amp;gt; origin/master&lt;br /&gt;
  * [new branch]      releases/2.2.0 -&amp;gt; origin/releases/2.2.0&lt;br /&gt;
  * [new tag]         last-cvs   -&amp;gt; last-cvs&lt;br /&gt;
  * [new tag]         mapserver  -&amp;gt; mapserver&lt;br /&gt;
 From git://gitorious.org/fg/fgdata&lt;br /&gt;
  * [new tag]         last-cvs   -&amp;gt; last-cvs&lt;br /&gt;
  * [new tag]         mapserver  -&amp;gt; mapserver&lt;br /&gt;
 $ git branch --track master origin/master&lt;br /&gt;
 Branch master set up to track remote branch refs/remotes/origin/master.&lt;br /&gt;
 $ git checkout master&lt;br /&gt;
 Checking out files: 100% (1117/1117), done.&lt;br /&gt;
 Switched to branch 'master'&lt;br /&gt;
 $ git branch -D master-tmp&lt;br /&gt;
 Deleted branch master-tmp.&lt;br /&gt;
&lt;br /&gt;
If you get an error at '''&amp;lt;code&amp;gt;git fetch origin&amp;lt;/code&amp;gt;''' try:&lt;br /&gt;
 $ git remote rm origin&lt;br /&gt;
 $ git remote add origin git://mapserver.flightgear.org/fgdata/&lt;br /&gt;
 $ git fetch origin&lt;br /&gt;
You should be suspicious if based on the printed progress you estimate the data download during the fetch will exceed 1GB (assuming the bundle is not terribly outdated).&lt;br /&gt;
&lt;br /&gt;
For future updates just do a '''&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
=== Git tutorials and resources ===&lt;br /&gt;
* Git [http://git-scm.com/documentation documentation and tutorials]&lt;br /&gt;
* Git as a [http://tomayko.com/topics/git way of life].&lt;br /&gt;
* The [https://git.wiki.kernel.org/index.php/GitCheatSheet Git Cheat Sheet] and the [http://jan-krueger.net/development/git-cheat-sheet-extended-edition Git Cheat Sheet Extended Edition]&lt;br /&gt;
* [http://wiki.github.com/bogolisk/egg Egg], a cool Git emacs mode.&lt;br /&gt;
* A guide to [http://nathanj.github.com/gitguide/ using Git on Windows]&lt;br /&gt;
* [http://kylecordes.com/2008/04/30/git-windows-go/ Git on Windows Go!] (Setting up msysgit on Windows)&lt;br /&gt;
* [http://gitcasts.com/posts/git-on-windows Git on Windows (webcast)]&lt;br /&gt;
* [http://sourceforge.net/projects/qgit qgit - interactive git repository viewer and frontend]&lt;br /&gt;
* Additional [[Resources WRT running git on Win32]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Building}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Implement_generic_tyre_smoke&amp;diff=28551</id>
		<title>Howto:Implement generic tyre smoke</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Implement_generic_tyre_smoke&amp;diff=28551"/>
		<updated>2011-02-15T15:19:03Z</updated>

		<summary type="html">&lt;p&gt;Jester: Removed cleanup required notice&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Tyre smoke 727-230.jpg|thumb|270px|Tyre smoke, as seen on a [[Boeing 727-230]] at touchdown.]]&lt;br /&gt;
'''Tyre smoke''' often refers to the smoke that is visible when an [[aircraft]] touches down. This arises when stationary wheels hit the ground at high speeds; a little layer of rubber is burned due to the friction between the tyre and the runway.&lt;br /&gt;
&lt;br /&gt;
Following this [[:Category:Howto|howto]], you will be able to add tyre smoke when landing and spray when it is raining to your aircraft. The here explained method works with both [[YASim]] and [[JSBSim]].&lt;br /&gt;
&lt;br /&gt;
The examples below are for a 3-point-gear, but you can use more gears of course!&lt;br /&gt;
&lt;br /&gt;
===Nasal/tyresmoke.nas===&lt;br /&gt;
&lt;br /&gt;
Create a folder in &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Aircraft/''YourAircraft''&amp;lt;/tt&amp;gt; called ''Nasal'', if not already there.&lt;br /&gt;
Create a file called tyresmoke.nas with the following lines inside:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
 #============================ Tyre Smoke ===================================&lt;br /&gt;
 aircraft.tyresmoke_system.new(0, 1, 2);&lt;br /&gt;
 #============================ Rain ===================================&lt;br /&gt;
 aircraft.rain.init();&lt;br /&gt;
 var rain = func {&lt;br /&gt;
	 aircraft.rain.update();&lt;br /&gt;
	 settimer(rain, 0);&lt;br /&gt;
 }&lt;br /&gt;
 # == fire it up ===&lt;br /&gt;
 rain()&lt;br /&gt;
 # end &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pass the indices of gears you would like to produce smoke.&lt;br /&gt;
&lt;br /&gt;
=== -set.xml ===&lt;br /&gt;
Insert the following code before the &amp;lt;sim&amp;gt;-tag or below &amp;lt;/sim&amp;gt;-tag in your aircraft's -set.xml file. Not between them!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;gear&amp;gt;&lt;br /&gt;
  &amp;lt;gear n=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;tyre-smoke type=&amp;quot;int&amp;quot;&amp;gt;0&amp;lt;/tyre-smoke&amp;gt;&lt;br /&gt;
   &amp;lt;sprayspeed-ms type=&amp;quot;double&amp;quot;&amp;gt;0&amp;lt;/sprayspeed-ms&amp;gt;&lt;br /&gt;
   &amp;lt;spray-density type=&amp;quot;double&amp;quot;&amp;gt;0&amp;lt;/spray-density&amp;gt;&lt;br /&gt;
   &amp;lt;caster-angle-deg-damped type=&amp;quot;double&amp;quot;&amp;gt;0&amp;lt;/caster-angle-deg-damped&amp;gt;&lt;br /&gt;
  &amp;lt;/gear&amp;gt;&lt;br /&gt;
  &amp;lt;gear n=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;tyre-smoke type=&amp;quot;int&amp;quot;&amp;gt;0&amp;lt;/tyre-smoke&amp;gt;&lt;br /&gt;
   &amp;lt;sprayspeed-ms type=&amp;quot;double&amp;quot;&amp;gt;0&amp;lt;/sprayspeed-ms&amp;gt;&lt;br /&gt;
   &amp;lt;spray-density type=&amp;quot;double&amp;quot;&amp;gt;0&amp;lt;/spray-density&amp;gt;&lt;br /&gt;
  &amp;lt;/gear&amp;gt;&lt;br /&gt;
  &amp;lt;gear n=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;tyre-smoke type=&amp;quot;int&amp;quot;&amp;gt;0&amp;lt;/tyre-smoke&amp;gt;&lt;br /&gt;
   &amp;lt;sprayspeed-ms type=&amp;quot;double&amp;quot;&amp;gt;0&amp;lt;/sprayspeed-ms&amp;gt;&lt;br /&gt;
   &amp;lt;spray-density type=&amp;quot;double&amp;quot;&amp;gt;0&amp;lt;/spray-density&amp;gt;&lt;br /&gt;
  &amp;lt;/gear&amp;gt;&lt;br /&gt;
 &amp;lt;/gear&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At the bottom of the file, add the link to the nasal-file, between the &amp;lt;nasal&amp;gt; and &amp;lt;/nasal&amp;gt; tags.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tyresmoke&amp;gt;&lt;br /&gt;
   &amp;lt;file&amp;gt;Aircraft/''YourAircraft''/Nasal/tyresmoke.nas&amp;lt;/file&amp;gt;&lt;br /&gt;
 &amp;lt;/tyresmoke&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models/ .model.xml ===&lt;br /&gt;
Insert the following lines into your animation.xml in your Models-Folder and change the ccordinates so it matches with your gear. &lt;br /&gt;
This are examples for a 3-point-gear- it links to the Aircraft/Generic/Effects-folder. &lt;br /&gt;
&lt;br /&gt;
You can create of course your own Effect-file if you want. Just regard the correct link!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;model&amp;gt;&lt;br /&gt;
  &amp;lt;path&amp;gt;Aircraft/Generic/Effects/tyre-smoke-nose.xml&amp;lt;/path&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;tyre-smoke-n&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;offsets&amp;gt;&lt;br /&gt;
   &amp;lt;x-m&amp;gt;-4.669&amp;lt;/x-m&amp;gt;&lt;br /&gt;
   &amp;lt;y-m&amp;gt;0&amp;lt;/y-m&amp;gt;&lt;br /&gt;
   &amp;lt;z-m&amp;gt;-2.484&amp;lt;/z-m&amp;gt;&lt;br /&gt;
  &amp;lt;/offsets&amp;gt;&lt;br /&gt;
 &amp;lt;/model&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;model&amp;gt;&lt;br /&gt;
  &amp;lt;path&amp;gt;Aircraft/Generic/Effects/tyre-smoke-port.xml&amp;lt;/path&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;tyre-smoke-p&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;offsets&amp;gt;&lt;br /&gt;
   &amp;lt;x-m&amp;gt;7.962&amp;lt;/x-m&amp;gt;&lt;br /&gt;
   &amp;lt;y-m&amp;gt;-2.634&amp;lt;/y-m&amp;gt;&lt;br /&gt;
   &amp;lt;z-m&amp;gt;-2.784&amp;lt;/z-m&amp;gt;&lt;br /&gt;
  &amp;lt;/offsets&amp;gt;&lt;br /&gt;
 &amp;lt;/model&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;model&amp;gt;&lt;br /&gt;
  &amp;lt;path&amp;gt;Aircraft/Generic/Effects/tyre-smoke-stbd.xml&amp;lt;/path&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;tyre-smoke-s&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;offsets&amp;gt;&lt;br /&gt;
   &amp;lt;x-m&amp;gt;7.962&amp;lt;/x-m&amp;gt;&lt;br /&gt;
   &amp;lt;y-m&amp;gt;2.634&amp;lt;/y-m&amp;gt;&lt;br /&gt;
   &amp;lt;z-m&amp;gt;-2.784&amp;lt;/z-m&amp;gt;&lt;br /&gt;
  &amp;lt;/offsets&amp;gt;&lt;br /&gt;
 &amp;lt;/model&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have tyre-smoke when landing, and spray when it is raining on your aircraft!&lt;br /&gt;
&lt;br /&gt;
[[Category:Aircraft enhancement|Implement generic tyre smoke]]&lt;br /&gt;
[[Category:Howto|Implement generic tyre smoke]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Implement_generic_tyre_smoke&amp;diff=28550</id>
		<title>Howto:Implement generic tyre smoke</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Implement_generic_tyre_smoke&amp;diff=28550"/>
		<updated>2011-02-15T15:17:30Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* Nasal/tyresmoke.nas */ updated for new tyresmoke_system&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{cleanup}}&lt;br /&gt;
Do not use the instructions for now. A nasal cleanup is coming shortly. --[[User:Papillon81|Papillon81]] 05:33, 14 February 2011 (EST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Tyre smoke 727-230.jpg|thumb|270px|Tyre smoke, as seen on a [[Boeing 727-230]] at touchdown.]]&lt;br /&gt;
'''Tyre smoke''' often refers to the smoke that is visible when an [[aircraft]] touches down. This arises when stationary wheels hit the ground at high speeds; a little layer of rubber is burned due to the friction between the tyre and the runway.&lt;br /&gt;
&lt;br /&gt;
Following this [[:Category:Howto|howto]], you will be able to add tyre smoke when landing and spray when it is raining to your aircraft. The here explained method works with both [[YASim]] and [[JSBSim]].&lt;br /&gt;
&lt;br /&gt;
The examples below are for a 3-point-gear, but you can use more gears of course!&lt;br /&gt;
&lt;br /&gt;
===Nasal/tyresmoke.nas===&lt;br /&gt;
&lt;br /&gt;
Create a folder in &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Aircraft/''YourAircraft''&amp;lt;/tt&amp;gt; called ''Nasal'', if not already there.&lt;br /&gt;
Create a file called tyresmoke.nas with the following lines inside:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
 #============================ Tyre Smoke ===================================&lt;br /&gt;
 aircraft.tyresmoke_system.new(0, 1, 2);&lt;br /&gt;
 #============================ Rain ===================================&lt;br /&gt;
 aircraft.rain.init();&lt;br /&gt;
 var rain = func {&lt;br /&gt;
	 aircraft.rain.update();&lt;br /&gt;
	 settimer(rain, 0);&lt;br /&gt;
 }&lt;br /&gt;
 # == fire it up ===&lt;br /&gt;
 rain()&lt;br /&gt;
 # end &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pass the indices of gears you would like to produce smoke.&lt;br /&gt;
&lt;br /&gt;
=== -set.xml ===&lt;br /&gt;
Insert the following code before the &amp;lt;sim&amp;gt;-tag or below &amp;lt;/sim&amp;gt;-tag in your aircraft's -set.xml file. Not between them!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;gear&amp;gt;&lt;br /&gt;
  &amp;lt;gear n=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;tyre-smoke type=&amp;quot;int&amp;quot;&amp;gt;0&amp;lt;/tyre-smoke&amp;gt;&lt;br /&gt;
   &amp;lt;sprayspeed-ms type=&amp;quot;double&amp;quot;&amp;gt;0&amp;lt;/sprayspeed-ms&amp;gt;&lt;br /&gt;
   &amp;lt;spray-density type=&amp;quot;double&amp;quot;&amp;gt;0&amp;lt;/spray-density&amp;gt;&lt;br /&gt;
   &amp;lt;caster-angle-deg-damped type=&amp;quot;double&amp;quot;&amp;gt;0&amp;lt;/caster-angle-deg-damped&amp;gt;&lt;br /&gt;
  &amp;lt;/gear&amp;gt;&lt;br /&gt;
  &amp;lt;gear n=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;tyre-smoke type=&amp;quot;int&amp;quot;&amp;gt;0&amp;lt;/tyre-smoke&amp;gt;&lt;br /&gt;
   &amp;lt;sprayspeed-ms type=&amp;quot;double&amp;quot;&amp;gt;0&amp;lt;/sprayspeed-ms&amp;gt;&lt;br /&gt;
   &amp;lt;spray-density type=&amp;quot;double&amp;quot;&amp;gt;0&amp;lt;/spray-density&amp;gt;&lt;br /&gt;
  &amp;lt;/gear&amp;gt;&lt;br /&gt;
  &amp;lt;gear n=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;tyre-smoke type=&amp;quot;int&amp;quot;&amp;gt;0&amp;lt;/tyre-smoke&amp;gt;&lt;br /&gt;
   &amp;lt;sprayspeed-ms type=&amp;quot;double&amp;quot;&amp;gt;0&amp;lt;/sprayspeed-ms&amp;gt;&lt;br /&gt;
   &amp;lt;spray-density type=&amp;quot;double&amp;quot;&amp;gt;0&amp;lt;/spray-density&amp;gt;&lt;br /&gt;
  &amp;lt;/gear&amp;gt;&lt;br /&gt;
 &amp;lt;/gear&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At the bottom of the file, add the link to the nasal-file, between the &amp;lt;nasal&amp;gt; and &amp;lt;/nasal&amp;gt; tags.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tyresmoke&amp;gt;&lt;br /&gt;
   &amp;lt;file&amp;gt;Aircraft/''YourAircraft''/Nasal/tyresmoke.nas&amp;lt;/file&amp;gt;&lt;br /&gt;
 &amp;lt;/tyresmoke&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models/ .model.xml ===&lt;br /&gt;
Insert the following lines into your animation.xml in your Models-Folder and change the ccordinates so it matches with your gear. &lt;br /&gt;
This are examples for a 3-point-gear- it links to the Aircraft/Generic/Effects-folder. &lt;br /&gt;
&lt;br /&gt;
You can create of course your own Effect-file if you want. Just regard the correct link!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;model&amp;gt;&lt;br /&gt;
  &amp;lt;path&amp;gt;Aircraft/Generic/Effects/tyre-smoke-nose.xml&amp;lt;/path&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;tyre-smoke-n&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;offsets&amp;gt;&lt;br /&gt;
   &amp;lt;x-m&amp;gt;-4.669&amp;lt;/x-m&amp;gt;&lt;br /&gt;
   &amp;lt;y-m&amp;gt;0&amp;lt;/y-m&amp;gt;&lt;br /&gt;
   &amp;lt;z-m&amp;gt;-2.484&amp;lt;/z-m&amp;gt;&lt;br /&gt;
  &amp;lt;/offsets&amp;gt;&lt;br /&gt;
 &amp;lt;/model&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;model&amp;gt;&lt;br /&gt;
  &amp;lt;path&amp;gt;Aircraft/Generic/Effects/tyre-smoke-port.xml&amp;lt;/path&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;tyre-smoke-p&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;offsets&amp;gt;&lt;br /&gt;
   &amp;lt;x-m&amp;gt;7.962&amp;lt;/x-m&amp;gt;&lt;br /&gt;
   &amp;lt;y-m&amp;gt;-2.634&amp;lt;/y-m&amp;gt;&lt;br /&gt;
   &amp;lt;z-m&amp;gt;-2.784&amp;lt;/z-m&amp;gt;&lt;br /&gt;
  &amp;lt;/offsets&amp;gt;&lt;br /&gt;
 &amp;lt;/model&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;model&amp;gt;&lt;br /&gt;
  &amp;lt;path&amp;gt;Aircraft/Generic/Effects/tyre-smoke-stbd.xml&amp;lt;/path&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;tyre-smoke-s&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;offsets&amp;gt;&lt;br /&gt;
   &amp;lt;x-m&amp;gt;7.962&amp;lt;/x-m&amp;gt;&lt;br /&gt;
   &amp;lt;y-m&amp;gt;2.634&amp;lt;/y-m&amp;gt;&lt;br /&gt;
   &amp;lt;z-m&amp;gt;-2.784&amp;lt;/z-m&amp;gt;&lt;br /&gt;
  &amp;lt;/offsets&amp;gt;&lt;br /&gt;
 &amp;lt;/model&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have tyre-smoke when landing, and spray when it is raining on your aircraft!&lt;br /&gt;
&lt;br /&gt;
[[Category:Aircraft enhancement|Implement generic tyre smoke]]&lt;br /&gt;
[[Category:Howto|Implement generic tyre smoke]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_scripting_language&amp;diff=28356</id>
		<title>Nasal scripting language</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_scripting_language&amp;diff=28356"/>
		<updated>2011-02-07T22:21:29Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* setprop() */ Fixed list example and added note about slash separator&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Please note that a considerable amount of resources has not yet been incorporated here, you can check these out by going to the &amp;quot;[http://wiki.flightgear.org/index.php/Talk:Nasal_scripting_language discussion]&amp;quot; page, where we are collecting links to webpages and mailing list discussions/postings related to Nasal.''&lt;br /&gt;
&lt;br /&gt;
==Nasal = Not another scripting language!==&lt;br /&gt;
&lt;br /&gt;
[[FlightGear]] offers a very powerful functional scripting language called [http://plausible.org/nasal/ &amp;quot;Nasal&amp;quot;], which supports reading and writing of internal [[Property Tree Intro|FlightGear properties]], accessing internal data via extension functions, creating GUI dialogs and much more. &lt;br /&gt;
&lt;br /&gt;
It uses some of the concepts of ECMA/JavaScript, Python and Perl and implements a simple but complete way of Object Oriented Programming. &lt;br /&gt;
&lt;br /&gt;
Nasal code can be run by aircraft configuration files, and it can be embedded in various [[XML]] files (dialog files, animation files, bindings for joysticks, keyboard and cockpit controls, and even in [[Howto: Nasal in scenery object XML files|scenery objects]]). Nasal is platform independent.&lt;br /&gt;
&lt;br /&gt;
As of 03/2009, there were approximately 170.000 lines of reported Nasal source code in the FlightGear base package [http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg21333.html], compared to 2006 this is almost a rate of growth of 600% within 3 years [http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg01728.html]. This illustrates the sheer adoption rate Nasal is experiencing in FlightGear.&lt;br /&gt;
&lt;br /&gt;
Note that this page is mostly about FlightGear-specific APIs/extension functions and usage patterns. &lt;br /&gt;
* [http://plausible.org/nasal/lib.html core language/library documentation] &lt;br /&gt;
* [http://plausible.org/nasal/sample.nas annotated source code examples]&lt;br /&gt;
* [http://plausible.org/nasal/doc.html Nasal design document]&lt;br /&gt;
* [http://www.plausible.org/nasal/flightgear.html a helpful tutorial about using Nasal in FlightGear].&lt;br /&gt;
&lt;br /&gt;
In addition, the [http://cvs.flightgear.org/viewvc/data/Nasal/ Nasal directory] in the FlightGear base package contains a wealth of tested, proven and usually well-commented source code that you may want to check out for additional examples of using the Nasal scripting language in FlightGear [http://cvs.flightgear.org/viewvc/data/Nasal/].&lt;br /&gt;
&lt;br /&gt;
If you have any Nasal specific questions, you will want to check out the [[Nasal FAQ]], feel free to ask new questions or help answer or refine existing ones. If you would like to learn more about existing Nasal modules in FlightGear, you may want to check out [[Nasal Modules]].&lt;br /&gt;
&lt;br /&gt;
If you are a developer and interested in extending Nasal, you may want to check out [[Howto:Extending Nasal]].&lt;br /&gt;
&lt;br /&gt;
== Creating new Scripts ==&lt;br /&gt;
Generally, aircraft specific Nasal scripts reside in the corresponding aircraft's folder (or a corresponding /Nasal subfolder) where they are usually included by adding a corresponding &amp;lt;nasal&amp;gt; tag to the aircraft-set.xml file (see [http://wiki.flightgear.org/index.php/Writing_simple_scripts_in_%22nasal%22]), while instrument specific scripts are saved within the instrument's folder (as previously mentioned, Nasal scripts can also be embedded in various other XML files), nasal scripts driving shared instruments are generally stored in [[$FG_ROOT]]/Aircraft/Generic/&lt;br /&gt;
&lt;br /&gt;
Nasal scripts that are not specific to certain aircraft, instruments or other uses, generally reside in the system-wide [[$FG_ROOT]]/Nasal directory.&lt;br /&gt;
&lt;br /&gt;
Nasal scripts need to be plain text files, saved with a *.nas extension.&lt;br /&gt;
&lt;br /&gt;
Nasal scripts that are placed inside [[$FG_ROOT]]/Nasal (with a *.nas extension) are automatically loaded and run during FlightGear startup, a simple hello world example would be:&lt;br /&gt;
&lt;br /&gt;
 # hello.nas&lt;br /&gt;
 print('Hello World!');&lt;br /&gt;
&lt;br /&gt;
This will show the &amp;quot;Hello World&amp;quot; string during startup in the console window. The pound sign (#) just introduces comments.&lt;br /&gt;
&lt;br /&gt;
Note: Script-specific symbols such as global variables (or functions) will be put into a scope (namespace) based on the script's name, scripts embedded via aircraft-set.xml files can separately specify a corresponding module name (see [[Howto: Make an aircraft]] for details).&lt;br /&gt;
&lt;br /&gt;
Strings in Nasal can also use double quotes which support escaping:&lt;br /&gt;
 # hello.nas&lt;br /&gt;
 print(&amp;quot;Hello\nWorld!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Double quotes support typical escape sequences:&lt;br /&gt;
* \n &lt;br /&gt;
* \r &lt;br /&gt;
* \t &lt;br /&gt;
* \xnn &lt;br /&gt;
* \&amp;quot;  &lt;br /&gt;
Single quotes treat everything as literal except for embedded single quotes (including embedded whitespace like newlines).&lt;br /&gt;
&lt;br /&gt;
Nasal strings are always arrays of bytes (never characters: see the utf8 library if you want character-based equivalents of substr() et. al.).  They can be indexed just like in C (although note that there is no nul termination -- get the length with size()):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note that there is currently no way to tell FlightGear to reload Nasal scripts from the global Nasal directory at runtime, so in order to see changes take effect, you will have to exit and restart FlightGear for the time being.&lt;br /&gt;
&lt;br /&gt;
Also, note that as of 05/2009, Nasal in FlightGear does not yet support any form of dependency resolution. In other words, there's  no &amp;quot;import&amp;quot;, &amp;quot;require&amp;quot; or &amp;quot;include&amp;quot; directive - this is also why most code in FlightGear is wrapped inside a _setlistener() call instead, which in turn waits for a FlightGear signal before executing the code (see below for details).&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
Nasal scripts should make use of the var keyword when declaring variables. The &amp;quot;var&amp;quot; keyword makes a variable guaranteed to be local. Nasal, natively provides support for scalars (numbers, strings), lists (arrays, vectors) and hashes (objects or dictionaries):&lt;br /&gt;
&lt;br /&gt;
 var w=100;     # w is a local numerical variable&lt;br /&gt;
 var x=&amp;quot;hello&amp;quot;; # x is a local string variable&lt;br /&gt;
 var y=[];      # y is a local vector (array)&lt;br /&gt;
 var z={};      # z is a local hash (dictionary or table) - also used for OOP&lt;br /&gt;
&lt;br /&gt;
Nasal supports a &amp;quot;nil&amp;quot; value for use as a null pointer equivalent:&lt;br /&gt;
&lt;br /&gt;
 var foo=nil; &lt;br /&gt;
&lt;br /&gt;
Also, note that Nasal symbols are case-sensitive, these are all different variables:&lt;br /&gt;
&lt;br /&gt;
 var show = func(what) {print(what,&amp;quot;\n&amp;quot;);}&lt;br /&gt;
 var abc=1; # these are all different symbols&lt;br /&gt;
 var ABC=2; # different from abc &lt;br /&gt;
 var aBc=3; # different from abc and ABC&lt;br /&gt;
 &lt;br /&gt;
 show(abc);&lt;br /&gt;
 show(ABC);&lt;br /&gt;
 show(aBc);&lt;br /&gt;
&lt;br /&gt;
Please note that functions assigned to variables are no exception. If you write code without using &amp;quot;var&amp;quot; on variables, then you risk (often hard to debug) breakage at a later time because you may be overwriting symbols in another namespace. &lt;br /&gt;
&lt;br /&gt;
So functions bound to variables should use the &amp;quot;var&amp;quot; keyword as well:&lt;br /&gt;
&lt;br /&gt;
 var hello = func { &lt;br /&gt;
   print(&amp;quot;hello\n&amp;quot;); &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
But there's another reason why &amp;quot;var&amp;quot; should be used consequently, even if a variable is safe enough from later side effects, because it has a relatively specific or unique name: The &amp;quot;var&amp;quot; keyword makes&lt;br /&gt;
reading code for others (and for the author after some time) easier, as it makes clear: &amp;quot;this variable starts its life *HERE*&amp;quot;. No need to search around to see whether assigning a value to it means something to other code outside or not. Also, with an editor offering proper syntax highlighting reading such code is actually easier, despite the &amp;quot;noise&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The problem with nasal code that does not make use of the var keyword is, that it can break other code, and with it the whole system, but no Nasal error message will point you there, as it's syntactically and semantically correct code. Just doing things that it wasn't supposed to do.&lt;br /&gt;
For a more in-depth discussion, please see [http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg13557.html].&lt;br /&gt;
&lt;br /&gt;
Also, Nasal scripts that are loaded from $FG_ROOT/Nasal are automatically placed inside a namespace  that is based on the script's name.&lt;br /&gt;
&lt;br /&gt;
For example, referring to our earlier &amp;quot;Hello World&amp;quot; example, global variables defined in the hello.nas script would be accessible by using &amp;quot;hello&amp;quot; as prefix from other modules:&lt;br /&gt;
&lt;br /&gt;
 # hello.nas&lt;br /&gt;
 var greeting=&amp;quot;Hello World&amp;quot;; # define a greeting symbol inside the hello namespace&lt;br /&gt;
&lt;br /&gt;
If you were now to read out the value from the greeting variable from another Nasal module, you would have to use the hello prefix:&lt;br /&gt;
&lt;br /&gt;
 # greetme.nas&lt;br /&gt;
 print(hello.greeting); # the hello prefix is referring to the hello namespace (or module).&lt;br /&gt;
&lt;br /&gt;
== Variables - Advanced Uses ==&lt;br /&gt;
&lt;br /&gt;
Nasal, also supports Multi-assignment expressions.  You can assign more than one variable (or lvalue) at a time by putting them in a parenthesized list:&lt;br /&gt;
&lt;br /&gt;
   (var a, var b) = (1, 2);&lt;br /&gt;
   var (a, b) = (1, 2);               # Shorthand for (var a, var b)&lt;br /&gt;
   (var a, v[0], obj.field) = (1,2,3) # Any assignable lvalue works&lt;br /&gt;
   var color = [1, 1, 0.5];&lt;br /&gt;
   var (r, g, b) = color;  # works with runtime vectors too&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vectors (lists or arrays) can be created from others using an ordered list of indexes and ranges. &lt;br /&gt;
This is usually called &amp;quot;vector slicing&amp;quot;.&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
   var v1 = [&amp;quot;a&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;d&amp;quot;,&amp;quot;e&amp;quot;]&lt;br /&gt;
   # &lt;br /&gt;
   var v2 = v1[3,2];   # == [&amp;quot;d&amp;quot;,&amp;quot;c&amp;quot;];&lt;br /&gt;
   var v3 = v1[1:3];   # i.e. range from 1 to 3: [&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;d&amp;quot;];&lt;br /&gt;
   var v4 = v1[1:];    # no value means &amp;quot;to the end&amp;quot;: [&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;d&amp;quot;,&amp;quot;e&amp;quot;]&lt;br /&gt;
   var i = 2;&lt;br /&gt;
   var v5 = v1[i];     # runtime expressions are fine: [&amp;quot;c&amp;quot;]&lt;br /&gt;
   var v6 = v1[-2,-1]; # negative indexes are relative to end: [&amp;quot;d&amp;quot;,&amp;quot;e&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
The range values can be computed at runtime (e.g. i=1; v5=v1[i:]). Negative indices work the same way they do with the vector functions (-1 is the last element, -2 is 2nd to last, etc...).&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
As previously shown, Nasal functions are implemented using the func keyword:&lt;br /&gt;
&lt;br /&gt;
 var log_message = func {&lt;br /&gt;
    print(arg[0]);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
By default, arguments are passed in the &amp;quot;arg&amp;quot; array, not unlike perl. &lt;br /&gt;
Note that this is just an assignment of an (anonymous) function argument to the local &amp;quot;log_message&amp;quot; variable. There is no function declaration syntax in Nasal.&lt;br /&gt;
&lt;br /&gt;
Also, Nasal being a functional programming language, all passed arguments will be local to the corresponding scope. If you want to modify state in a function, you'll preferably return new state to the caller.&lt;br /&gt;
&lt;br /&gt;
You can also pass named arguments to a function, thus saving the typing and performance costs of extracting them from the arg array:&lt;br /&gt;
&lt;br /&gt;
 var log_message = func(msg) {&lt;br /&gt;
    print(msg);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Also, Nasal functions can be easily nested, for example:&lt;br /&gt;
&lt;br /&gt;
  var calculate = func(param1,param2,operator) {&lt;br /&gt;
   var add = func(p1,p2) {p1+p2;}&lt;br /&gt;
   var sub = func(p1,p2) {p1-p2;}&lt;br /&gt;
   var mul = func(p1,p2) {p1*p2;}&lt;br /&gt;
   var div = func(p1,p2) {p1/p2;}&lt;br /&gt;
   if (operator==&amp;quot;+&amp;quot;) return add(param1,param2);&lt;br /&gt;
   if (operator==&amp;quot;-&amp;quot;) return sub(param1,param2);&lt;br /&gt;
   if (operator==&amp;quot;*&amp;quot;) return mul(param1,param2);&lt;br /&gt;
   if (operator==&amp;quot;/&amp;quot;) return div(param1,param2);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Note that the add,sub,mul and div functions in this example do not make use of an explicit return statement, instead the result of each expression is implicitly returned to the caller.&lt;br /&gt;
Nasal functions that just consist of such simple expressions can also be further simplified to read:&lt;br /&gt;
&lt;br /&gt;
  var add = func(val1,val2) val1+val2;&lt;br /&gt;
&lt;br /&gt;
Function arguments can have default values, as in C++. Note that the default value must be a scalar (number, string, function, nil) and not a mutable composite object (list, hash).&lt;br /&gt;
&lt;br /&gt;
 var log_message = func(msg=&amp;quot;error&amp;quot;) {&lt;br /&gt;
    print(msg);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Any extra arguments after the named list are placed in the &amp;quot;arg&amp;quot; vector as above.  You can rename this to something other than &amp;quot;arg&amp;quot; by specifying a final argument name with an ellipsis:&lt;br /&gt;
&lt;br /&gt;
 listify = func(elements...) { return elements; }&lt;br /&gt;
 listify(1, 2, 3, 4); # returns a list: [1, 2, 3, 4]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Also, Nasal supports Call-by-name function arguments.  &lt;br /&gt;
You can specify a hash literal in place of ordered function arguments, and it will become the local&lt;br /&gt;
variable namespace for the called function, making functions with many arguments more readable.&lt;br /&gt;
&lt;br /&gt;
 log_message(msg:&amp;quot;Hello World!&amp;quot;);&lt;br /&gt;
 view_manager.lookat(heading:180, pitch:20, roll:0, x:X0, y:Y0, z:Z0,time:now, fov:55);&lt;br /&gt;
&lt;br /&gt;
Declared arguments are checked and defaulted as would be expected: it's an error if you fail to pass a value for an undefaulted argument, missing default arguments get assigned, and any rest parameter (e.g. &amp;quot;func(a,b=2,rest...){}&amp;quot;) will be assigned with an empty vector.&lt;br /&gt;
&lt;br /&gt;
Note that Nasal functions can generally not be overloaded, and that operator overloading in particular is also not supported.&lt;br /&gt;
&lt;br /&gt;
As previously mentioned, arguments to a Nasal function can also be functions themselves (Nasal being a functional programming language), this means that Nasal functions are higher order functions so that you can easily pass and return functions to and from Nasal functions. This can for example be used to dynamically create new functions (such functions are commonly called 'generators'):&lt;br /&gt;
&lt;br /&gt;
  # a function that returns a new custom function&lt;br /&gt;
  var i18n_hello = func(hello) {&lt;br /&gt;
   return func(name) { # returns an anonymous/unnamed function&lt;br /&gt;
     print(hello,name);&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  # create three new functions&lt;br /&gt;
  var english_hello = i18n_hello(&amp;quot;Good Day &amp;quot;);&lt;br /&gt;
  var spanish_hello = i18n_hello(&amp;quot;Buenos Dias &amp;quot;);&lt;br /&gt;
  var italian_hello = i18n_hello(&amp;quot;Buon giorno &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
  # actually call these functions&lt;br /&gt;
  english_hello(&amp;quot;FlightGear&amp;quot;);&lt;br /&gt;
  spanish_hello(&amp;quot;FlightGear&amp;quot;);&lt;br /&gt;
  italian_hello(&amp;quot;FlightGear&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
== Conditionals ==&lt;br /&gt;
&lt;br /&gt;
Nasal has no &amp;quot;statements&amp;quot;, which means that any expression can appear in any context. This means that you can use an if/else clause to do what the ?: does in C.  &lt;br /&gt;
The last semicolon in a code block is optional, to make this prettier&lt;br /&gt;
&lt;br /&gt;
 abs = func(n) { if(n&amp;lt;0) { -n } else { n } }&lt;br /&gt;
&lt;br /&gt;
But for those who don't like typing, the ternary operator works like you expect:&lt;br /&gt;
&lt;br /&gt;
 abs = func(n) { n &amp;lt; 0 ? -n : n }&lt;br /&gt;
&lt;br /&gt;
In addition, Nasal supports braceless blocks, like they're known from C/C++ and other languages:&lt;br /&gt;
&lt;br /&gt;
 var foo=1;&lt;br /&gt;
 if (foo)&lt;br /&gt;
   print(&amp;quot;1\n&amp;quot;);&lt;br /&gt;
 else&lt;br /&gt;
   print(&amp;quot;0\n&amp;quot;);&lt;br /&gt;
 print(&amp;quot;this is printed regardless\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nasal's binary boolean operators are &amp;quot;and&amp;quot; and &amp;quot;or&amp;quot;, unlike C. unary not is still &amp;quot;!&amp;quot; however.  &lt;br /&gt;
They short-circuit like you expect&lt;br /&gt;
&lt;br /&gt;
 var toggle = 0;&lt;br /&gt;
 var a = nil;&lt;br /&gt;
 if(a and a.field == 42) {&lt;br /&gt;
    toggle = !toggle; # doesn't crash when a is nil&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
Nasal has several ways to implement an iteration.&lt;br /&gt;
&lt;br /&gt;
Nasal's looping constructs are mostly C-like:&lt;br /&gt;
&lt;br /&gt;
 for(var i=0; i &amp;lt; 3; i = i+1) {&lt;br /&gt;
  # loop body&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 while (condition) {&lt;br /&gt;
 # loop body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The differences are that there is no do{}while(); construct, and there is a foreach, which  takes a local variable name as its first argument and a vector as its second:&lt;br /&gt;
&lt;br /&gt;
  foreach(elem; list1) { doSomething(elem); }&lt;br /&gt;
&lt;br /&gt;
The hash/vector index expression is an lvalue that can be assigned as well as inspected:&lt;br /&gt;
&lt;br /&gt;
  foreach(light; lights) { lightNodes[light] = propertyPath; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There is also a &amp;quot;forindex&amp;quot;, which is like foreach except that it assigns the index of each element, instead of the value, to the loop variable.&lt;br /&gt;
&lt;br /&gt;
 forindex(i; list1) { doSomething(list1[i]); }&lt;br /&gt;
&lt;br /&gt;
Also, braceless blocks work for loops equally well:&lt;br /&gt;
&lt;br /&gt;
 var c=0;&lt;br /&gt;
 while( c&amp;lt;5 )&lt;br /&gt;
  print( c+=1 );&lt;br /&gt;
 print(&amp;quot;end of loop\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
However, loops using &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;foreach&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;forindex&amp;lt;/tt&amp;gt; block all of FlightGear's subsystems that run in the main thread, and can, thus, only be used for instantaneous operations that don't take too long. &lt;br /&gt;
&lt;br /&gt;
For operations that should continue over a longer period, one needs a non-blocking solution. This is done by letting functions call themselves after a timed delay: &lt;br /&gt;
&lt;br /&gt;
 var loop = func {&lt;br /&gt;
     print(&amp;quot;this line appears once every two seconds&amp;quot;);&lt;br /&gt;
     settimer(loop, 2);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 loop();        # start loop&lt;br /&gt;
&lt;br /&gt;
Note that the &amp;lt;tt&amp;gt;settimer&amp;lt;/tt&amp;gt; function expects a ''function object'' (&amp;lt;tt&amp;gt;loop&amp;lt;/tt&amp;gt;), not a function call (&amp;lt;tt&amp;gt;loop()&amp;lt;/tt&amp;gt;) - unless of course the function call returns a function object. &lt;br /&gt;
&lt;br /&gt;
The fewer code FlightGear has to execute, the better, so it is desirable to run loops only when they are needed. But how does one stop a loop? A once triggered timer function can't be revoked. But one can let the loop function check an outside variable and refuse calling itself, which makes the loop chain die off:&lt;br /&gt;
&lt;br /&gt;
 var running = 1;&lt;br /&gt;
 var loop = func {&lt;br /&gt;
     if (running) {&lt;br /&gt;
         print(&amp;quot;this line appears once every two seconds&amp;quot;);&lt;br /&gt;
         settimer(loop, 2);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 loop();        # start loop ...&lt;br /&gt;
 ...&lt;br /&gt;
 running = 0;   # ... and let it die&lt;br /&gt;
&lt;br /&gt;
Unfortunately, this method is rather unreliable. What if the loop is &amp;quot;stopped&amp;quot; and a new instance immediately started again? Then the ''running'' variable would be ''1'' again, and a pending old loop call, which should really finish this chain, would happily continue. And the new loop chain would start, too, so that we would end up with two loop chains.&lt;br /&gt;
&lt;br /&gt;
This can be solved by providing each loop chain with a ''loop identifier'' and letting the function end itself if the id doesn't match the global loop-id. Self-called loop functions need to inherit the chain id. So, every time the global loop id is increased, all loop chains die, and a new one can immediately be started.&lt;br /&gt;
&lt;br /&gt;
 var loopid = 0;&lt;br /&gt;
 var loop = func(id) {&lt;br /&gt;
     id == loopid or return;           # stop here if the id doesn't match the global loop-id&lt;br /&gt;
     ...&lt;br /&gt;
     settimer(func { loop(id) }, 2);   # call self with own loop id&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 loop(loopid);       # start loop&lt;br /&gt;
 ...&lt;br /&gt;
 loopid += 1;        # this kills off all pending loops, as none can have this new identifier yet&lt;br /&gt;
 ...&lt;br /&gt;
 loop(loopid);       # start new chain; this can also be abbreviated to:  loop(loopid += 1);&lt;br /&gt;
&lt;br /&gt;
== OOP - Object Oriented Programming ==&lt;br /&gt;
&lt;br /&gt;
In Nasal, objects (&amp;quot;classes&amp;quot;) are regular hashes. Self-reference and inheritance are implemented through special variables &amp;lt;tt&amp;gt;me&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;parents&amp;lt;/tt&amp;gt;. To get a better understanding of the concept, let's start with the very basics.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hashes ===&lt;br /&gt;
&lt;br /&gt;
Hashes, also known as &amp;quot;dictionaries&amp;quot; in Python or &amp;quot;maps&amp;quot; in C++/STL are data structures that hold key/value pairs in a way that allows quick access to a value via its key.&lt;br /&gt;
&lt;br /&gt;
 var airport = {&lt;br /&gt;
     &amp;quot;LOXZ&amp;quot;: &amp;quot;Zeltweg&amp;quot;,&lt;br /&gt;
     &amp;quot;LOWI&amp;quot;: &amp;quot;Innsbruck&amp;quot;,&lt;br /&gt;
     &amp;quot;LOXL&amp;quot;: &amp;quot;Linz Hoersching&amp;quot;,     # the last comma is optional&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 print(airport[&amp;quot;LOXZ&amp;quot;]);            # prints &amp;quot;Zeltweg&amp;quot;&lt;br /&gt;
 airport[&amp;quot;LOXA&amp;quot;] = &amp;quot;Aigen&amp;quot;;         # adds LOXA to the hash&lt;br /&gt;
&lt;br /&gt;
The quotes around keys can be left away in a hash definition if the key is a valid variable name or a number. This works just as well:&lt;br /&gt;
&lt;br /&gt;
 var airport = {&lt;br /&gt;
     LOXZ: &amp;quot;Zeltweg&amp;quot;,&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
There's also an alternative way to access hash members if the keys are valid variable names: &amp;lt;tt&amp;gt;airport.LOXI&amp;lt;/tt&amp;gt; can be used instead of &amp;lt;tt&amp;gt;airport[&amp;quot;LOXI&amp;quot;]&amp;lt;/tt&amp;gt;. There is a difference, though, which is described in the next section.&lt;br /&gt;
&lt;br /&gt;
Note that assigning a hash (or a vector) to another variable does never ''copy'' the contents. It only creates another reference to the same data structure. So manipulating the hash via its new name does in fact change the one, original hash.&lt;br /&gt;
&lt;br /&gt;
 var a = airport;&lt;br /&gt;
 a.LOXL = &amp;quot;Linz&amp;quot;;           # same as airport.LOXL!&lt;br /&gt;
 print(airport.LOXL);       # prints now &amp;quot;Linz&amp;quot;, not &amp;quot;Linz Hoersching&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(True copies of vectors can be made by assigning a full slice: &amp;lt;tt&amp;gt;var copy = vec[:]&amp;lt;/tt&amp;gt;. There's no such method for hashes.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Self-reference: &amp;quot;&amp;lt;tt&amp;gt;me&amp;lt;/tt&amp;gt;&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Values stored in a hash can be of any type, even of type ''function''. Member functions (&amp;quot;methods&amp;quot;) can reference their own enclosing hash via reserved keyword &amp;lt;tt&amp;gt;me&amp;lt;/tt&amp;gt;. This is comparable to the &amp;lt;tt&amp;gt;this&amp;lt;/tt&amp;gt; keyword in C++ classes, or the &amp;lt;tt&amp;gt;self&amp;lt;/tt&amp;gt; keyword in Python.&lt;br /&gt;
&lt;br /&gt;
 var value = &amp;quot;test&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 var data = {&lt;br /&gt;
     value: 23,                         # scalar member variable&lt;br /&gt;
     write1: func { print(value); },    # function member&lt;br /&gt;
     write2: func { print(me.value); }, # function member&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 data.write1();     # prints &amp;quot;test&amp;quot;&lt;br /&gt;
 data.write2();     # prints 23&lt;br /&gt;
&lt;br /&gt;
The above example is already a simple form of an object. It has its own variable namespace (''data''), its own methods, and it can be passed around by-reference as one unit. Such classes are sometimes called ''singleton classes'', as they are unique, with no independent class instances. They mostly serve as a way to keep data and methods nicely encapsulated within a Nasal module. Often they contain a method for initializing, which is usually called &amp;lt;tt&amp;gt;init&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Inheritance: &amp;quot;&amp;lt;tt&amp;gt;parents&amp;lt;/tt&amp;gt;&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
What we learned about &amp;lt;tt&amp;gt;me&amp;lt;/tt&amp;gt; in the last section is only half the truth. &amp;quot;me&amp;quot; doesn't only reference an object's own hash, but also one or more parent hashes. &amp;lt;tt&amp;gt;parents&amp;lt;/tt&amp;gt; is another reserved keyword. It denotes a vector referencing other object hashes, which are &amp;quot;inherited&amp;quot; that way.&lt;br /&gt;
&lt;br /&gt;
Please note that Nasal's currently supported form of encapsulation does not provide support for any form of data/information hiding (restricting access), i.e. all hash fields (but also all hash methods) are always publicly accessible (so there's nothing like the &amp;quot;private&amp;quot; or &amp;quot;protected&amp;quot; keywords in C++: in this sense, Nasal's inheritance mechanism can be thought of like C++ structs which are also public by default).&lt;br /&gt;
&lt;br /&gt;
 var parent_object = {&lt;br /&gt;
     value: 123,&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 var object = {&lt;br /&gt;
     parents: [parent_object],&lt;br /&gt;
     write: func { print(me.value) },&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 object.write();    # prints 123&lt;br /&gt;
&lt;br /&gt;
Even though &amp;lt;tt&amp;gt;object&amp;lt;/tt&amp;gt; itself doesn't contain a member &amp;lt;tt&amp;gt;value&amp;lt;/tt&amp;gt;, it finds and uses the one of its parent object. &amp;lt;tt&amp;gt;parents&amp;lt;/tt&amp;gt; is a vector that can contain several parent objects. These are then searched in the order from left to right, until a matching member variable or method is found. Each of the parents can itself have parents, which are all recursively searched.&lt;br /&gt;
&lt;br /&gt;
In the section about hashes it was said that hash members can be accessed in two alternative ways, and that's also true for methods. &amp;lt;tt&amp;gt;object.write()&amp;lt;/tt&amp;gt; could also be called as &amp;lt;tt&amp;gt;object[&amp;quot;write&amp;quot;]()&amp;lt;/tt&amp;gt;. But only in the first form will members also be searched in parent hashes if not found in the base hash, whereas the second form creates an error if it's not a direct member.&lt;br /&gt;
&lt;br /&gt;
=== Creating class instances ===&lt;br /&gt;
&lt;br /&gt;
With &amp;lt;tt&amp;gt;me&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;parents&amp;lt;/tt&amp;gt; we can implement a class object and create independent instances from that:&lt;br /&gt;
&lt;br /&gt;
 var Class = {&lt;br /&gt;
     write:     func { print(me.value); },&lt;br /&gt;
     increment: func { me.value += 1; },&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 var instance1 = { parents: [Class], value: 123 };&lt;br /&gt;
 var instance2 = { parents: [Class], value: 456 };&lt;br /&gt;
 &lt;br /&gt;
 instance1.write();    # prints 123&lt;br /&gt;
 instance2.write();    # prints 456&lt;br /&gt;
&lt;br /&gt;
As you can see, the two class instances are separate, independent objects, which share another object as parent -- they &amp;quot;inherit&amp;quot; from object &amp;lt;tt&amp;gt;Class&amp;lt;/tt&amp;gt;. One can now easily change members of any of these three objects. The following will redefine the parent's &amp;lt;tt&amp;gt;write&amp;lt;/tt&amp;gt; method, and all instances will automatically use this new version:&lt;br /&gt;
&lt;br /&gt;
 Class.write = func { print(&amp;quot;VALUE = &amp;quot; ~ me.value) }&lt;br /&gt;
&lt;br /&gt;
But one can also add a method to just one instance:&lt;br /&gt;
&lt;br /&gt;
 instance1.write = func { print(&amp;quot;VALUE = &amp;quot; ~ me.value) }&lt;br /&gt;
&lt;br /&gt;
Because &amp;lt;tt&amp;gt;instance1&amp;lt;/tt&amp;gt; does now have its own &amp;lt;tt&amp;gt;write&amp;lt;/tt&amp;gt; method, the parents won't be searched for one, so &amp;lt;tt&amp;gt;Class.write&amp;lt;/tt&amp;gt; is now overridden by &amp;lt;tt&amp;gt;instance1&amp;lt;/tt&amp;gt;'s own method. Nothing changed for &amp;lt;tt&amp;gt;instance2&amp;lt;/tt&amp;gt; -- it will still only find and use &amp;lt;tt&amp;gt;Class.write&amp;lt;/tt&amp;gt; via its parent.&lt;br /&gt;
&lt;br /&gt;
Note, the we couldn't create a class instance by simple assignment, because, as we learned above, this wouldn't create a separate copy of the Class object. All &amp;quot;instances&amp;quot; would reference the same hash!&lt;br /&gt;
&lt;br /&gt;
 var bad_instance1 = Class;   # bad&lt;br /&gt;
 var bad_instance2 = Class;   # bad&lt;br /&gt;
 &lt;br /&gt;
 bad_instance1.value = 123;   # sets Class.value to 123&lt;br /&gt;
 bad_instance2.value = 456;   # sets Class.value to 456&lt;br /&gt;
 &lt;br /&gt;
 bad_instance1.write();       # prints 456, not 123&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Constructor ===&lt;br /&gt;
&lt;br /&gt;
Defining each class instance by explicitly creating a hash with parents is clumsy. It is nicer to have a function that does that for us. Then we can also use function arguments to initialize members of this instance.&lt;br /&gt;
&lt;br /&gt;
 var new_class = func(val) {&lt;br /&gt;
     return { parents: [Class], value: val };&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 var instance1 = new_class(123);&lt;br /&gt;
 var instance2 = new_class(456);&lt;br /&gt;
 &lt;br /&gt;
 instance1.write();   # prints 123&lt;br /&gt;
 instance2.write();   # prints 456&lt;br /&gt;
&lt;br /&gt;
Because the class generating function &amp;lt;tt&amp;gt;new_class()&amp;lt;/tt&amp;gt; really belongs to class &amp;lt;tt&amp;gt;Class&amp;lt;/tt&amp;gt;, it would be nicer to put it into the class hash as well. In this case we call it a class &amp;quot;constructor&amp;quot;, and as a convention, give it the name ''new''. It could have any name, though, and there could be more than one constructor.&lt;br /&gt;
&lt;br /&gt;
 var Class = {&lt;br /&gt;
     new: func(val) {&lt;br /&gt;
         return { parents: [Class], value: val };&lt;br /&gt;
     },&lt;br /&gt;
     write: func {&lt;br /&gt;
         print(&amp;quot;VALUE=&amp;quot; ~ me.value);&lt;br /&gt;
     },&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 var instance1 = Class.new(123);&lt;br /&gt;
 var instance2 = Class.new(456);&lt;br /&gt;
&lt;br /&gt;
As you can see, &amp;lt;tt&amp;gt;new()&amp;lt;/tt&amp;gt; doesn't return a copy of &amp;lt;tt&amp;gt;Class&amp;lt;/tt&amp;gt;, but rather a small hash that contains only a list of parents and one individual member &amp;lt;tt&amp;gt;value&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Classes aren't always as simple as in our example. Usually they contain several members, of which some may have yet to be calculated in the constructor. In that case it's easier to create a local object hash first, and to let the constructor finally return it. Such local hashes are often named &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; (as a short reference to &amp;lt;tt&amp;gt;me&amp;lt;/tt&amp;gt;), or &amp;lt;tt&amp;gt;obj&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 var Class = {&lt;br /&gt;
     new: func(val) {&lt;br /&gt;
         var m = { parents: [Class] };&lt;br /&gt;
         m.value = val;&lt;br /&gt;
         return m;&lt;br /&gt;
     },&lt;br /&gt;
     write: func {&lt;br /&gt;
         print(&amp;quot;VALUE=&amp;quot; ~ me.value);&lt;br /&gt;
     },&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
This last example is the most frequently used form of class definitions in FlightGear-Nasal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Destructor ===&lt;br /&gt;
&lt;br /&gt;
There's no such thing in Nasal. In other languages destructors are automatically called when the class gets destroyed, so that memory and other resources that were allocated by the constructor can be freed. In Nasal that's all done by the Garbage Collector (GC), anyway. In the FlightGear context, however, there ''are'' resources that should get freed. Listeners should get removed, self-calling functions (&amp;quot;loops&amp;quot;) stopped. For that it's recommended to create a destructor function and to call that manually. Such functions are often called &amp;lt;tt&amp;gt;del&amp;lt;/tt&amp;gt;, similar to Python and to pair nicely with the three-letter constructor name &amp;lt;tt&amp;gt;new&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Multiple inheritance ===&lt;br /&gt;
&lt;br /&gt;
A class can inherit from one or more other classes. It can then access all methods and class members of all parent classes, but also override them and add additional members.&lt;br /&gt;
&lt;br /&gt;
 var A = {                                            # simple class A&lt;br /&gt;
     new: func {&lt;br /&gt;
         return { parents: [A] };&lt;br /&gt;
     },&lt;br /&gt;
     alpha: func print(&amp;quot;\tALPHA&amp;quot;),&lt;br /&gt;
     test:  func print(&amp;quot;\tthis is A.test&amp;quot;),&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 var B = {                                            # simple class B&lt;br /&gt;
     new: func(v) {                                   # ... whose constructor takes an argument&lt;br /&gt;
         return { parents: [B], value: v };&lt;br /&gt;
     },&lt;br /&gt;
     bravo: func print(&amp;quot;\tBRAVO&amp;quot;),&lt;br /&gt;
     test:  func print(&amp;quot;\tthis is B.test&amp;quot;),&lt;br /&gt;
     write: func print(&amp;quot;\tmy value is: &amp;quot;, me.value),&lt;br /&gt;
 },&lt;br /&gt;
 &lt;br /&gt;
 var C = {                                            # class C that inherits ...&lt;br /&gt;
     new: func(v) {&lt;br /&gt;
         return { parents: [C, A.new(), B.new(v)] };  # ... from class A and B&lt;br /&gt;
     },&lt;br /&gt;
     charlie: func print(&amp;quot;\tCHARLIE&amp;quot;),&lt;br /&gt;
     test:    func print(&amp;quot;\tthis is C.test&amp;quot;),         # overrides A.test() and B.test()&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 print(&amp;quot;A instance&amp;quot;);&lt;br /&gt;
 var a = A.new();&lt;br /&gt;
 a.alpha();&lt;br /&gt;
 &lt;br /&gt;
 print(&amp;quot;B instance&amp;quot;);&lt;br /&gt;
 var b = B.new(123);&lt;br /&gt;
 b.bravo();&lt;br /&gt;
 b.write();&lt;br /&gt;
 &lt;br /&gt;
 print(&amp;quot;C instance&amp;quot;);&lt;br /&gt;
 var c = C.new(456);&lt;br /&gt;
 c.alpha();                        # use alpha from the A parent&lt;br /&gt;
 c.bravo();                        # use bravo from the B parent&lt;br /&gt;
 c.charlie();                      # use charlie from C itself&lt;br /&gt;
 c.test();                         # use C.test(), which overrides A.test() and B.test()&lt;br /&gt;
 c.write();&lt;br /&gt;
&lt;br /&gt;
Even if a class overrides a method of a parent with the same name, the parent's version can still be accessed via &amp;lt;tt&amp;gt;parents&amp;lt;/tt&amp;gt; vector.&lt;br /&gt;
&lt;br /&gt;
 c.test()               # use C.test()&lt;br /&gt;
 c.parents[0].test();   # use C.test()&lt;br /&gt;
 c.parents[1].test();   # use A.test()&lt;br /&gt;
 c.parents[2].test();   # use B.test()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== More on methods ===&lt;br /&gt;
&lt;br /&gt;
Methods are function members of a class hash. They can access other class members via the &amp;lt;tt&amp;gt;me&amp;lt;/tt&amp;gt; variable, which is a reference to the class hash. For this reason, a method returning &amp;lt;tt&amp;gt;me&amp;lt;/tt&amp;gt; can be used like the class itself, and one can apply further methods to the return value (this is usually called &amp;quot;method chaining&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
 var Object = {&lt;br /&gt;
     new: func(coords...) {&lt;br /&gt;
         return { parents: [Object], coords: coords };&lt;br /&gt;
     },&lt;br /&gt;
     rotate: func(angle) {&lt;br /&gt;
         # do the rotation&lt;br /&gt;
         return me;&lt;br /&gt;
     },&lt;br /&gt;
     scale: func(factor) {&lt;br /&gt;
         # do the scaling&lt;br /&gt;
         return me;&lt;br /&gt;
     },&lt;br /&gt;
     translate: func(x, y) {&lt;br /&gt;
         # do the translation&lt;br /&gt;
         return me;&lt;br /&gt;
     },&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 var triangle = Object.new([0, 0], [10, 0], [5, 7]);&lt;br /&gt;
 triangle.translate(-9, -4).scale(5).rotate(33).translate(9, 4);    # concatenated methods thanks to &amp;quot;me&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;me&amp;lt;/tt&amp;gt;, however, is only known in the scope of the class. If a method is to be called as a listener callback or a timer function, &amp;lt;tt&amp;gt;me&amp;lt;/tt&amp;gt; has to get wrapped in a function, so that it's stored in the function closure.&lt;br /&gt;
&lt;br /&gt;
 var Manager = {&lt;br /&gt;
     new: func {&lt;br /&gt;
         return { parents: [Manager] };&lt;br /&gt;
     },&lt;br /&gt;
     start_timers: func {  &lt;br /&gt;
         settimer(do_stuff, 5);            # BAD: there's no &amp;quot;do_stuff&amp;quot; function in the scope&lt;br /&gt;
         settimer(me.do_stuff, 5);         # BAD: function exists, but &amp;quot;me&amp;quot; won't be known&lt;br /&gt;
                                           #      when the timer function is actually executed&lt;br /&gt;
         settimer(func me.do_stuff(), 5);  # GOOD: new function object packs &amp;quot;me&amp;quot; in the closure&lt;br /&gt;
 &lt;br /&gt;
         setlistener(&amp;quot;/sim/foo&amp;quot;, func me.do_stuff());  # GOOD  (same as with timers) &lt;br /&gt;
     },         &lt;br /&gt;
     do_stuff: func {&lt;br /&gt;
         print(&amp;quot;doing stuff&amp;quot;);&lt;br /&gt;
     },&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 var manager = Manager.new();&lt;br /&gt;
 manager.start_timers();&lt;br /&gt;
&lt;br /&gt;
== Exception handling ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;die()&amp;lt;/tt&amp;gt; aborts a function with an error message (this can be compared to the throw() mechanism in C++).&lt;br /&gt;
&lt;br /&gt;
 var divide = func(a, b) {&lt;br /&gt;
     if (b == 0)&lt;br /&gt;
         die(&amp;quot;division by zero&amp;quot;);&lt;br /&gt;
     return a / b;     # this line won't be reached if b == 0&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
die() is also used internally by built-in extension functions or Nasal core functions. &amp;lt;tt&amp;gt;getprop(&amp;quot;/4me&amp;quot;)&amp;lt;/tt&amp;gt;, for example, dies with an error message ''&amp;quot;name must begin with alpha or '_'&amp;quot;''. Now assume we want to write a dialog where the user can type a property path into an input field, and we display the property's value in a popup dialog. What if the user typed an invalid path and we hand that over to &amp;lt;tt&amp;gt;getprop()&amp;lt;/tt&amp;gt;? We don't want Nasal to abort our code because of that. We want to display a nice error message instead. The &amp;lt;tt&amp;gt;call()&amp;lt;/tt&amp;gt; function can catch &amp;lt;tt&amp;gt;die()&amp;lt;/tt&amp;gt; exceptions:&lt;br /&gt;
&lt;br /&gt;
 var value = getprop(property);                                    # dies if 'property' is invalid&lt;br /&gt;
 var value = call(func getprop(property), nil, var err = []);      # catches invalid-property-exception and continues&lt;br /&gt;
&lt;br /&gt;
The second line calls getprop(property) just like the first, and returns its value. But if 'property' was invalid then the &amp;lt;tt&amp;gt;call()&amp;lt;/tt&amp;gt; function catches the exception and sets the 'err' vector instead. That vector remains empty on success.&lt;br /&gt;
&lt;br /&gt;
 if (size(err))&lt;br /&gt;
     print(&amp;quot;ERROR: bad property &amp;quot;, property, &amp;quot; (&amp;quot;, err[0], &amp;quot;)&amp;quot;);   # err[0] contains the die() message&lt;br /&gt;
 else&lt;br /&gt;
     print(&amp;quot;value of &amp;quot;, property, &amp;quot; is &amp;quot;, value);&lt;br /&gt;
&lt;br /&gt;
The first argument of &amp;lt;tt&amp;gt;call()&amp;lt;/tt&amp;gt; is a function object, the second a vector of function arguments (or ''nil''), and the third a vector where the function will return a possible error. For more information on the &amp;lt;tt&amp;gt;call()&amp;lt;/tt&amp;gt; function see the [http://plausible.org/nasal/lib.html Nasal library documentation]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;die()&amp;lt;/tt&amp;gt; doesn't really care about what its argument is. It doesn't have to be a string, and can be any variable, for example a class. This can be used to pass values through a chain of functions.&lt;br /&gt;
&lt;br /&gt;
 var Error = {                                                             # exception class&lt;br /&gt;
     new: func(msg, number) {&lt;br /&gt;
         return { parents: [Error], message: msg, number: number };&lt;br /&gt;
     },&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 var A = func(a) {&lt;br /&gt;
     if (a &amp;lt; 0)&lt;br /&gt;
         die(Error.new(&amp;quot;negative argument to A&amp;quot;, a));                      # throw Error&lt;br /&gt;
     return &amp;quot;A received &amp;quot; ~ a;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 var B = func(val) {&lt;br /&gt;
     var result = A(val);&lt;br /&gt;
     print(&amp;quot;B finished&amp;quot;);      # this line is not reached if A threw an exception&lt;br /&gt;
     return result;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 var value = call(B, [-4], var err = []);                                  # try B(-4)&lt;br /&gt;
 &lt;br /&gt;
 if (size(err)) {                                                          # catch (...)&lt;br /&gt;
     print(&amp;quot;ERROR: &amp;quot;, err[0].message, &amp;quot;; bad value was &amp;quot;, err[0].number);&lt;br /&gt;
     die(err[0]);                                                          # re-throw&lt;br /&gt;
 } else {&lt;br /&gt;
     print(&amp;quot;SUCCESS: &amp;quot;, value);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Listeners and Signals ==&lt;br /&gt;
&lt;br /&gt;
Listeners are callback functions that are attached to property nodes. They are triggered whenever the node is written to, or, depending on the listener type, also when children are added or removed, and when children are written to. Unlike polling loops, listeners don't have the least effect on the frame rate when they aren't triggered, which makes them preferable to monitor properties that aren't written to frequently. Unfortunately, listeners don't work on so-called &amp;quot;tied&amp;quot; properties when the node value isn't set via property methods. (You can spot such tied properties by Ctrl-clicking the &amp;quot;.&amp;quot; entry in the property browser: they are marked with a &amp;quot;T&amp;quot;.) Most of the FDM properties are &amp;quot;tied&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;setlistener()&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
 var listener_id = setlistener(&amp;lt;property&amp;gt;, &amp;lt;function&amp;gt; [, &amp;lt;startup=0&amp;gt; [, &amp;lt;runtime=1&amp;gt;]]);&lt;br /&gt;
&lt;br /&gt;
The first argument is a property node object (&amp;lt;tt&amp;gt;props.Node()&amp;lt;/tt&amp;gt; hash) or a property path. Because the node hash depends on the props.nas module being loaded, &amp;lt;tt&amp;gt;setlistener()&amp;lt;/tt&amp;gt; calls need to be deferred when used in an $FG_ROOT/Nasal/*.nas file, usually by calling them in a &amp;lt;tt&amp;gt;settimer(func {}, 0)&amp;lt;/tt&amp;gt; construction. To avoid that, one can use the raw &amp;lt;tt&amp;gt;_setlistener()&amp;lt;/tt&amp;gt; function directly, for which &amp;lt;tt&amp;gt;setlistener()&amp;lt;/tt&amp;gt; is a wrapper. The raw function does only accept node paths (e.g. &amp;quot;/sim/menubar/visibility&amp;quot;), but not props.Node() objects.&lt;br /&gt;
&lt;br /&gt;
The second argument is a function object (not a function call!). The &amp;lt;tt&amp;gt;func&amp;lt;/tt&amp;gt; keyword turns code into a function object.&lt;br /&gt;
&lt;br /&gt;
The third argument is optional. If it is non-null, then it causes the listener to be called initially. This is useful to let the callback function pick up the node value at startup.&lt;br /&gt;
&lt;br /&gt;
The fourth argument is optional, and defaults to 1. This means that the callback function will be executed whenever the property is written to, independent of the value. If the argument is set to 0, then the function will only get triggered if a value other than the current value is written to the node. This should be used for properties that are written to in every frame, although the written value is mostly the same. If the argument is 2, then also write access to children will get reported, as well as the creation and removal of children nodes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;setlistener()&amp;lt;/tt&amp;gt; returns a unique listener id on success, and &amp;lt;tt&amp;gt;nil&amp;lt;/tt&amp;gt; on error. The id is nothing else than a counter that is 0 for the first Nasal listener, 1 for the second etc. You need this id number to remove the listener. Most listeners are never removed, so that one doesn't assign the return value, but simply drop it.&lt;br /&gt;
&lt;br /&gt;
Listener callback functions can access up to four values via regular function arguments, the first two of which are property nodes in the form of a &amp;lt;tt&amp;gt;props.Node()&amp;lt;/tt&amp;gt; object hash.&lt;br /&gt;
&lt;br /&gt;
If you have set a callback function named ''myCallbackFunc'' via &amp;lt;tt&amp;gt;setlistener&amp;lt;/tt&amp;gt; (''setlistener(myNode, myCallbackFunc)''), you can use this syntax in the callback function:&lt;br /&gt;
&lt;br /&gt;
 myCallbackFunc ([&amp;lt;changed_node&amp;gt; [, &amp;lt;listened_to_node&amp;gt; [, &amp;lt;operation&amp;gt; [, &amp;lt;is_child_event&amp;gt;]]]])&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;removelistener()&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
 var num_listeners = removelistener(&amp;lt;listener id&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;removelistener()&amp;lt;/tt&amp;gt; takes one argument: the unique listener id that a &amp;lt;tt&amp;gt;setlistener()&amp;lt;/tt&amp;gt; call returned. It returns the number of remaining active Nasal listeners on success,  &amp;lt;tt&amp;gt;nil&amp;lt;/tt&amp;gt; on error, or -1 if a listener function applies &amp;lt;tt&amp;gt;removelistener()&amp;lt;/tt&amp;gt; to itself. The fact that a listener can remove itself, can be used to implement a one-shot listener function:&lt;br /&gt;
&lt;br /&gt;
 var L = setlistener(&amp;quot;/some/property&amp;quot;, func {&lt;br /&gt;
     print(&amp;quot;I can only be triggered once.&amp;quot;);&lt;br /&gt;
     removelistener(L);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Listener Examples ===&lt;br /&gt;
&lt;br /&gt;
The following example attaches an anonymous callback function to a &amp;quot;signal&amp;quot;. The function will be executed when FlightGear is closed.&lt;br /&gt;
&lt;br /&gt;
 setlistener(&amp;quot;/sim/signals/exit&amp;quot;, func { print(&amp;quot;bye!&amp;quot;) });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Instead of an anonymous function, a named function can be used as well:&lt;br /&gt;
&lt;br /&gt;
 var say_bye = func { print(&amp;quot;bye&amp;quot;) }&lt;br /&gt;
 setlistener(&amp;quot;/sim/signals/exit&amp;quot;, say_bye);&lt;br /&gt;
&lt;br /&gt;
Callback functions can, optionally, access up to four parameters which are handed over via regular function arguments. Many times none of these parameters is used at all, as in the above example.&lt;br /&gt;
&lt;br /&gt;
Most often, only the first parameter is used--which gives the node of the changed value.&lt;br /&gt;
&lt;br /&gt;
The following code attaches the monitor_course() function to a gps property, using the argument &amp;lt;i&amp;gt;course&amp;lt;/i&amp;gt; to get the node with the changed value.&lt;br /&gt;
&lt;br /&gt;
 var monitor_course = func(course) {&lt;br /&gt;
     print(&amp;quot;Monitored course set to &amp;quot;, course.getValue());&lt;br /&gt;
 }&lt;br /&gt;
 var i = setlistener(&amp;quot;instrumentation/gps/wp/leg-course-deviation-deg&amp;quot;, monitor_course);&lt;br /&gt;
 &lt;br /&gt;
 # here the listener is active&lt;br /&gt;
 &lt;br /&gt;
 removelistener(i);                    # remove that listener again&lt;br /&gt;
&lt;br /&gt;
Here is code that accesses two arguments--the changed node and the listened-to node (these may be different when monitoring all children of a certain node)--and also shows how to monitor changes to a node including changes to children:&lt;br /&gt;
&lt;br /&gt;
 var monitor_course = func(course, flightinfo) {&lt;br /&gt;
     print(&amp;quot;One way to get the course setting: &amp;quot;, flightinfo.leg-course-deviation-deg.getValue());&lt;br /&gt;
     print(&amp;quot;Another way to get the same setting &amp;quot;, course.getValue());&lt;br /&gt;
 }&lt;br /&gt;
 var i = setlistener(&amp;quot;instrumentation/gps/wp&amp;quot;, monitor_course, 0, 2);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The function object doesn't need to be a separate, external function -- it can also be an anonymous function made directly in the &amp;lt;tt&amp;gt;setlistener()&amp;lt;/tt&amp;gt; call:&lt;br /&gt;
&lt;br /&gt;
 setlistener(&amp;quot;/sim/signals/exit&amp;quot;, func { print(&amp;quot;bye&amp;quot;) });    # say &amp;quot;bye&amp;quot; on exit&lt;br /&gt;
&lt;br /&gt;
Beware, however, that the contents of a function defined within the &amp;lt;tt&amp;gt;setlistener&amp;lt;/tt&amp;gt; call are not evaluated until the call is actually made.  If, for instance, local variables change before the setlistener call happens, the call will reflect the current value of those variables ''at the time the callback function is called'', not the value ''at the time the listener was set''.  &lt;br /&gt;
&lt;br /&gt;
For example, with this loop, the function will always return the value 10--even if mynode[1], mynode[2], mynode[3] or any of the others is the one that changed.  It is because the contents of the setlistener are evaluated after the loop has completed running and at that point, i=10:&lt;br /&gt;
&lt;br /&gt;
 var output = func(number) {&lt;br /&gt;
     print(&amp;quot;mynode&amp;quot;, number, &amp;quot; has changed!&amp;quot;); #This won't work!&lt;br /&gt;
 }&lt;br /&gt;
 for(i=1; i &amp;lt;= 10; i = i+1) {&lt;br /&gt;
    var i = setlistener(&amp;quot;mynode[&amp;quot;~i~&amp;quot;]&amp;quot;, func{ output (i); });&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
You can also access the four available function properties (or just one, two, or three of them as you need) in your anonymous function.  Here is an example that accesses the first value:&lt;br /&gt;
 &lt;br /&gt;
 for(i=1; i &amp;lt;= 10; i = i+1) {&lt;br /&gt;
    var i = setlistener(&amp;quot;mynode[&amp;quot;~i~&amp;quot;]&amp;quot;, func (changedNode) { print (changedNode); });&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Attaching a function to a node that is specified as &amp;lt;tt&amp;gt;props.Node()&amp;lt;/tt&amp;gt; hash:&lt;br /&gt;
&lt;br /&gt;
 var node = props.globals.getNode(&amp;quot;/sim/signals/click&amp;quot;, 1);&lt;br /&gt;
 setlistener(node, func { gui.popupTip(&amp;quot;don't click here!&amp;quot;) });&lt;br /&gt;
&lt;br /&gt;
Sometimes it is desirable to call the listener function initially, so that it can pick up the node value. In the following example a listener watches the view number, and turns the HUD on in cockpit view, and off in all other views. It doesn't only do that on writing to &amp;quot;view-number&amp;quot;, but also once when the listener gets attached, thanks to the third argument &amp;quot;1&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 setlistener(&amp;quot;/sim/current-view/view-number&amp;quot;, func(n) {&lt;br /&gt;
     setprop(&amp;quot;/sim/hud/visibility[0]&amp;quot;, n.getValue() == 0);&lt;br /&gt;
 }, 1);&lt;br /&gt;
&lt;br /&gt;
There's no limit for listeners on a node. Several functions can get attached to one node, just as one function can get attached to several nodes. Listeners may write to the node they are listening to. This will not make the listener call itself causing an endless recursion.&lt;br /&gt;
&lt;br /&gt;
=== Signals ===&lt;br /&gt;
&lt;br /&gt;
In addition to &amp;quot;normal&amp;quot; nodes, there are &amp;quot;signal&amp;quot; nodes that were created solely for the purpose of having listeners attached:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;/sim/signals/exit&amp;lt;/tt&amp;gt; ... set to &amp;quot;true&amp;quot; on quitting FlightGear&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;/sim/signals/reinit&amp;lt;/tt&amp;gt; ... set to &amp;quot;true&amp;quot; right before resetting FlightGear (Shift-Esc), and to &amp;quot;false&amp;quot; afterwards&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;/sim/signals/click&amp;lt;/tt&amp;gt; ... set to &amp;quot;true&amp;quot; after a mouse click at the terrain. Hint that the geo coords for the click spot were updated and can be retrieved from /sim/input/click/{longitude-deg,latitude-deg,elevation-ft,elevation-m}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;/sim/signals/screenshot&amp;lt;/tt&amp;gt; ... set to &amp;quot;true&amp;quot; right before the screenshot is taken, and set to &amp;quot;false&amp;quot; after it. Can be used to hide and reveal dialogs etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;/sim/signals/nasal-dir-initialized&amp;lt;/tt&amp;gt; ... set to &amp;quot;true&amp;quot; after all Nasal &amp;quot;library&amp;quot; files in $FG_ROOT/Nasal/ were loaded and executed. It is only set once and can only be used to trigger listener functions that were defined in one of the Nasal files in that directory. After that signal was set&lt;br /&gt;
Nasal starts loading and executing aircraft Nasal files, and only later are &amp;lt;tt&amp;gt;settimer()&amp;lt;/tt&amp;gt; functions&lt;br /&gt;
called and the next signal is set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;/sim/signals/fdm-initialized&amp;lt;/tt&amp;gt; ... set to &amp;quot;true&amp;quot; when then FDM has just finished its initialization&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;/sim/signals/reinit-gui&amp;lt;/tt&amp;gt; ... set to &amp;quot;true&amp;quot; when the GUI has just been reset (e.g. via Help menu). This&lt;br /&gt;
is used by the gui.Dialog class to reload Nasal-loaded XML dialogs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;/sim/signals/frame&amp;lt;/tt&amp;gt; ... triggered at the beginning of each iteration of the main loop (a.k.a. &amp;quot;frame&amp;quot;). This is meant for debugging purposes. Normally, one would just use a settimer() with interval 0 for the same effect. The difference is that the signal is guaranteed to be raised at a defined moment, while the timer call may change when subsystems are re-ordered.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FlightGear extension functions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;print()&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
Concatenates an arbitrary number of arguments to one string, appends a new-line, and prints it to the terminal. Returns the number of printed characters.&lt;br /&gt;
&lt;br /&gt;
 print(&amp;quot;Just&amp;quot;, &amp;quot; a &amp;quot;, &amp;quot;test&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;getprop()&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
Returns the node value for a given path, or &amp;lt;tt&amp;gt;nil&amp;lt;/tt&amp;gt; if the node doesn't exist or hasn't been initialized yet. &lt;br /&gt;
&lt;br /&gt;
 getprop(&amp;lt;path&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 print(&amp;quot;The frame rate is &amp;quot;, getprop(&amp;quot;/sim/frame-rate&amp;quot;), &amp;quot; FPS&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;setprop()&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
Sets a property value for a given node path string. Always returns nil.&lt;br /&gt;
&lt;br /&gt;
 setprop(&amp;lt;path&amp;gt; [, &amp;lt;path&amp;gt;, [...]], &amp;lt;value&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
All arguments but the last are concatenated to a path string, with a slash (/) inserted between each element. The last value is written to the respective node. If the node isn't writable, then an error message is printed to the console.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
 setprop(&amp;quot;/sim/current-view/view-number&amp;quot;, 2);&lt;br /&gt;
 setprop(&amp;quot;/controls&amp;quot;, &amp;quot;engines/engine[0]&amp;quot;, &amp;quot;reverser&amp;quot;, 1);&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;settimer()&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
Runs a function after a given simulation (default) or real time in seconds.&lt;br /&gt;
&lt;br /&gt;
 settimer(&amp;lt;function&amp;gt;, &amp;lt;time&amp;gt; [, &amp;lt;realtime=0&amp;gt;]);&lt;br /&gt;
&lt;br /&gt;
The third argument is optional and defaults to 0, which lets the time argument be interpreted as &amp;quot;seconds simulation time&amp;quot;. In this case the timer doesn't run when FlightGear is paused. For user interaction purposes (measuring key press time, displaying popups, etc.) one usually prefers real time.&lt;br /&gt;
&lt;br /&gt;
 var copilot_annoyed = func { setprop(&amp;quot;/sim/messages/copilot&amp;quot;, &amp;quot;Stop it! Immediately!&amp;quot;) }&lt;br /&gt;
 settimer(copilot_annoyed, 10);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;systime()&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
Returns epoch time (time since 1972/01/01 00:00) in seconds as a floating point number with high resolution. This is useful for benchmarking purposes.&lt;br /&gt;
&lt;br /&gt;
  #benchmarking example:&lt;br /&gt;
  var start = systime();&lt;br /&gt;
  how_fast_am_I(123);&lt;br /&gt;
  var end = systime();&lt;br /&gt;
  print(&amp;quot;took &amp;quot;, end - start, &amp;quot; seconds&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;carttogeod()&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
Converts cartesian coordinates x/y/z to geodetic coordinates lat/lon/alt, which are returned as a vector. Units are degree and meter.&lt;br /&gt;
&lt;br /&gt;
 var geod = carttogeod(-2737504, -4264101, 3862172);&lt;br /&gt;
 print(&amp;quot;lat=&amp;quot;, geod[0], &amp;quot; lon=&amp;quot;, geod[1], &amp;quot; alt=&amp;quot;, geod[2]);&lt;br /&gt;
 &lt;br /&gt;
 # outputs&lt;br /&gt;
 lat=37.49999782141546 lon=-122.6999914632327 alt=998.6042055172776&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;geodtocart()&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
Converts geodetic coordinates lat/lon/alt to cartesian coordinates x/y/z. Units are degree and meter.&lt;br /&gt;
&lt;br /&gt;
 var cart = geodtocart(37.5, -122.7, 1000); # lat/lon/alt(m)&lt;br /&gt;
 print(&amp;quot;x=&amp;quot;, cart[0], &amp;quot; y=&amp;quot;, cart[1], &amp;quot; z=&amp;quot;, cart[2]);&lt;br /&gt;
 &lt;br /&gt;
 # outputs&lt;br /&gt;
 x=-2737504.667684828 y=-4264101.900993474 z=3862172.834656495&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;geodinfo()&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
Returns information about geodetic coordinates. Takes two arguments: lat, lon (in degree) and returns a vector with two entries, or nil if no information could be obtained because the terrain tile wasn't loaded. The first entry is the elevation (in meters) for the given point, and the second is a hash with information about the assigned material, or nil if there was no material information available, because there is, for instance, an untextured building at that spot.&lt;br /&gt;
&lt;br /&gt;
 var lat = getprop(&amp;quot;/position/latitude-deg&amp;quot;);&lt;br /&gt;
 var lon = getprop(&amp;quot;/position/longitude-deg&amp;quot;);&lt;br /&gt;
 var info = geodinfo(lat, lon);&lt;br /&gt;
 &lt;br /&gt;
 if (info != nil) {&lt;br /&gt;
     print(&amp;quot;the terrain under the aircraft is at elevation &amp;quot;, info[0], &amp;quot; m&amp;quot;);&lt;br /&gt;
     if (info[1] != nil)&lt;br /&gt;
         print(&amp;quot;and it is &amp;quot;, info[1].solid ? &amp;quot;solid ground&amp;quot; : &amp;quot;covered by water&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
A full data set looks like this:&lt;br /&gt;
&lt;br /&gt;
 debug.dump(geodinfo(lat, lon));&lt;br /&gt;
 &lt;br /&gt;
 # outputs&lt;br /&gt;
 [ 106.9892101062052, { light_coverage : 0, bumpiness : 0.5999999999999999, load_resistance : 1e+30,&lt;br /&gt;
 solid : 0,  names : [ &amp;quot;Lake&amp;quot;, &amp;quot;Pond&amp;quot;, &amp;quot;Reservoir&amp;quot;, &amp;quot;Stream&amp;quot;, &amp;quot;Canal&amp;quot; ], friction_factor : 1, &lt;br /&gt;
 rolling_friction : 1.5 } ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;parsexml()&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
This function is an interface to the built-in expat XML parser. It takes up to five arguments. The first is a mandatory absolute path to an XMl file, the remaining four are optional callback functions, each of which can be nil (which is also the default value).&lt;br /&gt;
&lt;br /&gt;
 var ret = parsexml(&amp;lt;path&amp;gt; [, &amp;lt;start-elem&amp;gt; [, &amp;lt;end-elem&amp;gt; [, &amp;lt;data&amp;gt; [, &amp;lt;pi&amp;gt; ]]]]);&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;start-elem&amp;gt;  ... called for every starting tag with two arguments: the tag name, and an attribute hash&lt;br /&gt;
 &amp;lt;end-elem&amp;gt;    ... called for every ending tag with one argument: the tag name&lt;br /&gt;
 &amp;lt;data&amp;gt;        ... called for every piece of data with one argument: the data string&lt;br /&gt;
 &amp;lt;pi&amp;gt;          ... called for every &amp;quot;processing information&amp;quot; with two args: target and data string&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;ret&amp;gt;         ... the return value is nil on error, and the &amp;lt;path&amp;gt; otherwise&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 var start = func(name, attr) {&lt;br /&gt;
     print(&amp;quot;starting tag &amp;quot;, name);&lt;br /&gt;
     foreach (var a; keys(attr))&lt;br /&gt;
         print(&amp;quot;\twith attribute &amp;quot;, a, &amp;quot;=&amp;quot;, attr[a]);&lt;br /&gt;
 }&lt;br /&gt;
 var end = func(name) { print(&amp;quot;ending tag &amp;quot;, name) }&lt;br /&gt;
 var data = func(data) { print(&amp;quot;data=&amp;quot;, data) }&lt;br /&gt;
 var pi = func(target, data) { print(&amp;quot;processing instruction: target=&amp;quot;, target, &amp;quot; data=&amp;quot;, data) }&lt;br /&gt;
 parsexml(&amp;quot;/tmp/foo.xml&amp;quot;, start, end, data, pi);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== airportinfo() ===&lt;br /&gt;
Function for retrieval of airport/runway information.&lt;br /&gt;
Usage:&lt;br /&gt;
&lt;br /&gt;
  var apt = airportinfo(&amp;quot;KHAF&amp;quot;);   # get info about KHAF&lt;br /&gt;
  var apt = airportinfo(lat, lon); # get info about apt closest to lat/lon&lt;br /&gt;
  var apt = airportinfo();         # get info about apt closest to aircraft  &lt;br /&gt;
&lt;br /&gt;
The command  debug.dump(airportinfo(&amp;quot;KHAF&amp;quot;))  outputs this:&lt;br /&gt;
&lt;br /&gt;
  { lon : -122.4962626410256, lat : 37.51343502564102, has_metar : 0,&lt;br /&gt;
  runways : { 12 : { stopway2 : 0, threshold1 : 232.5624,&lt;br /&gt;
  lon : -122.5010889999999, lat : 37.513831, stopway1 : 0, width : 45.72,&lt;br /&gt;
  threshold2 : 232.5624, heading : 138.1199999999999, length : 1523.0856 } },&lt;br /&gt;
  elevation : 20.42159999999999, id : &amp;quot;KHAF&amp;quot;, name : &amp;quot;Half Moon Bay&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
That is: a hash with elements lat/lon/elev/id/name/has_metar for the&lt;br /&gt;
airport, and a hash with runways, each of which consists of lat/lon/&lt;br /&gt;
/length/width/heading/threshold[12]/stopway[12]. Only one side of each&lt;br /&gt;
runway is listed -- the other can easily be deduced.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Useful functions==&lt;br /&gt;
&lt;br /&gt;
===Distance calculations===&lt;br /&gt;
&lt;br /&gt;
To calculate the distance between two points (in two different ways):&lt;br /&gt;
 # mylat1, mylong1, mylat2, mylong2 are lat &amp;amp; long in degrees &lt;br /&gt;
 # myalt1 &amp;amp; myalt2 are altitude in meters&lt;br /&gt;
 &lt;br /&gt;
 var GeoCoord1 = geo.Coord.new();&lt;br /&gt;
 GeoCoord1.set_latlon(mylat1, mylong1,myalt1);&lt;br /&gt;
 &lt;br /&gt;
 var GeoCoord2 = geo.Coord.new();&lt;br /&gt;
 GeoCoord2.set_latlon(mylat2, mylong2, myalt2);&lt;br /&gt;
 &lt;br /&gt;
 var directDistance = GeoCoord1.direct_distance_to(GeoCoord2);&lt;br /&gt;
 var surfaceDistance = GeoCoord1.distance_to(GeoCoord2);&lt;br /&gt;
&lt;br /&gt;
The results are distances in meters.&lt;br /&gt;
&lt;br /&gt;
* distance_to - returns distance in meters along Earth curvature, ignoring altitudes; useful for map distance&lt;br /&gt;
* direct_distance_to - returns  distance in meters direct; considers altitude, but cuts through Earth surface&lt;br /&gt;
&lt;br /&gt;
===Other useful geographical functions===&lt;br /&gt;
Other useful geographical functions are found in geo.nas (in the FlightGear/data/Nasal directory of a FlightGear installation).  geo.nas also includes documentation/explanation of the functions available.&lt;br /&gt;
&lt;br /&gt;
==Related content==&lt;br /&gt;
{{Forum|30|Nasal}}&lt;br /&gt;
* [[:Category:Nasal]]&lt;br /&gt;
&lt;br /&gt;
=== External links ===&lt;br /&gt;
* http://www.plausible.org/nasal&lt;br /&gt;
&lt;br /&gt;
[[Category:Nasal]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Building_FlightGear_-_Debian&amp;diff=24452</id>
		<title>Building FlightGear - Debian</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Building_FlightGear_-_Debian&amp;diff=24452"/>
		<updated>2010-10-04T22:02:17Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* FlightGear source */ Remove confusing [] notation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= HowTo build on Debian =&lt;br /&gt;
&lt;br /&gt;
HowTo build FlightGear 2.0.0 or GIT on GNU/Linux Debian '''Stable''' 5.x (Lenny).&lt;br /&gt;
&lt;br /&gt;
This HowTo may also work with '''Testing'''/'''Unstable''' except that some things are easier because of more up to date packages. So, before fetching something check the version of the available -dev package for it.&lt;br /&gt;
&lt;br /&gt;
It even *should* work with '''Etch''', but I am not certain about some dependencies. [http://wiki.flightgear.org/index.php?title=Talk:Building_Flightgear_-_Debian&amp;amp;action=edit Reports] are welcome.&lt;br /&gt;
&lt;br /&gt;
If you don't want to make your hands dirty, have a look at [[Scripted_Compilation_on_Linux_Debian/Ubuntu]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements and Preparations ==&lt;br /&gt;
You need an OpenGL capable graphics including a proper installed driver.&amp;lt;BR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also a bunch of packages (and some of their dependencies) are required:&lt;br /&gt;
*gcc, g++, make, automake1.9, pkg-config&lt;br /&gt;
*mawk (or gawk)&lt;br /&gt;
*cmake   (min. version 2.6.0-5, for Etch available on backports.debian.org!)&lt;br /&gt;
*git, subversion, wget&lt;br /&gt;
&amp;lt;!--*libsvn-dev, for [[Terrasync]]s proper operation.--&amp;gt;&lt;br /&gt;
*freeglut3-dev, libgl1-mesa-dev, libxrandr-dev&lt;br /&gt;
*libxi-dev, libxmu-dev, libxext-dev&lt;br /&gt;
*libopenal-dev (see [[#libopenal|libopenal]]), libalut-dev&lt;br /&gt;
*libjpeg62-dev, libtiff4-dev, libpng12-dev&lt;br /&gt;
*libboost1.37-dev (min 1.37, 1.40 available for Lenny on backports.debian.org)&lt;br /&gt;
&lt;br /&gt;
During installation packages ''simgear-dev'' and ''openscenegraph-dev'' *must not* be installed. They can safely be re-installed after compilation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Build and install ==&lt;br /&gt;
Because we are going to install versions different to the ones in the repositries it is recommended to install FG-2.0.0 and/or GIT in a place independent to the base system such as /usr/local/FG-2.0.0, /opt/FG-2.0.0 or in a subdirectory of your $HOME. I suggest to make it writeable by the user that there is no need to become root for the &amp;lt;code&amp;gt;make install&amp;lt;/code&amp;gt; commands. I'll use &amp;lt;code&amp;gt;$prefix&amp;lt;/code&amp;gt; as a placeholder for this directory. &amp;lt;BR&amp;gt;&lt;br /&gt;
Another one will be &amp;lt;code&amp;gt;$srcdir&amp;lt;/code&amp;gt;, it stands for the absolute path to the directory which contains the folders of the various source codes. So in the following instructions you have to replace these with the local paths or even &amp;lt;code&amp;gt;export&amp;lt;/code&amp;gt; them during the process.&lt;br /&gt;
&lt;br /&gt;
Follow the instructions to fetch the sources and the data needed by FlightGear and the commands to build/install each source.&lt;br /&gt;
&lt;br /&gt;
Have in mind that the data is relatively large (GIT about 3.5 GB and 2.0.0 300 MB) so, to save some time, it is a good idea to fetch it while building the sources.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== libopenal ===&lt;br /&gt;
The libopenal-dev package in Lenny/Etch is too old for [[fgcom]]. For FlightGear it does work but not all features (like Doppler) are available, so installing an up to date version is recommended anyway.&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 wget http://kcat.strangesoft.net/openal-releases/openal-soft-1.11.753.tar.bz2&lt;br /&gt;
 tar xjf openal-soft-1.11.753.tar.bz2&lt;br /&gt;
 cd openal-soft-1.11.753/build&lt;br /&gt;
 cmake  -D CMAKE_INSTALL_PREFIX:PATH=&amp;quot;$prefix&amp;quot; ..&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== plib ===&lt;br /&gt;
Latest SVN is [http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg20793.html recommended], yet package plib1.8.5-dev for Testing/Unstable does work as well.&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co https://plib.svn.sourceforge.net/svnroot/plib/trunk plib&lt;br /&gt;
 cd plib&lt;br /&gt;
 sed s/PLIB_TINY_VERSION\ \ 5/PLIB_TINY_VERSION\ \ 6/ -i src/util/ul.h&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
 ./configure --prefix=$prefix&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Boost Library ===&lt;br /&gt;
Version 1.37 is needed. At least for Lenny/Etch this means getting the sources because this is not available atm on backports.org. Testing/Unstable users may have more luck and a package is available, libboost-1.37-dev or newer.&lt;br /&gt;
&lt;br /&gt;
To build SimGear, FlightGear, fgrun and fgcom some boostlib header files are required, no need to compile and install it. If you have installed a libboost1.37-dev (or higher) package on your system you don't have to bother at all with it. If not, you have to tell each ./configure where the header files are. To do so, add the option &amp;lt;code&amp;gt;CPPFLAGS=-I$prefix/include&amp;lt;/code&amp;gt; to the SimGear, FlightGear and fgrun &amp;lt;code&amp;gt;./configure&amp;lt;/code&amp;gt; commands. We copy the header files to $prefix/include because fgcom will need them there.&lt;br /&gt;
&lt;br /&gt;
Get the newest version tar ball from http://sourceforge.net/projects/boost/files/boost/, extract it into &amp;lt;code&amp;gt;$srcdir&amp;lt;/code&amp;gt; then:&lt;br /&gt;
 cp -R $srcdir/boost-[version]/boost/ $prefix/include/&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can directly extract the required include files:&lt;br /&gt;
 tar xvf boost_1_37_0.tar.bz2 -C $prefix/include --strip 1 --wildcards --no-wildcards-match-slash '*/boost'&lt;br /&gt;
&lt;br /&gt;
=== OpenSceneGraph ===&lt;br /&gt;
For FlightGear 2.0.0 one may use the latest (or at least 2.9.6) developer release from http://www.openscenegraph.org/projects/osg/wiki/Downloads/DeveloperReleases and extract it into &amp;lt;code&amp;gt;$srcdir&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mostly this is ok for FlightGear GIT as well as it is stable. However, sometimes the release is not fresh enough and one have to get the latest developments via SVN:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk OpenSceneGraph&lt;br /&gt;
&lt;br /&gt;
cmake demands a build directory separate to its source directory. So &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; one and &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; into it.&lt;br /&gt;
 cmake -D CMAKE_BUILD_TYPE=&amp;quot;Release&amp;quot; -D CMAKE_CXX_FLAGS=&amp;quot;-O3&amp;quot; -D CMAKE_C_FLAGS=&amp;quot;-O3&amp;quot; \&lt;br /&gt;
    -D CMAKE_INSTALL_PREFIX:PATH=&amp;quot;$prefix&amp;quot; $srcdir/OpenSceneGraph[-version]&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SimGear ===&lt;br /&gt;
2.0.0:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 wget http://mirrors.ibiblio.org/pub/mirrors/simgear/ftp/Source/SimGear-2.0.0.tar.gz&lt;br /&gt;
 tar xzf SimGear-2.0.0.tar.gz&lt;br /&gt;
 cd SimGear-2.0.0&lt;br /&gt;
&lt;br /&gt;
GIT:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 git clone git://gitorious.org/fg/simgear.git simgear&lt;br /&gt;
 cd simgear&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
&lt;br /&gt;
2.0.0 and GIT:&lt;br /&gt;
 ./configure --prefix=$prefix CPPFLAGS=-I$prefix/include LDFLAGS=&amp;quot;-L$prefix/lib -L$prefix/lib64&amp;quot;&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== FlightGear source ===&lt;br /&gt;
2.0.0:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 wget http://mirrors.ibiblio.org/pub/mirrors/flightgear/ftp/Source/FlightGear-2.0.0.tar.gz&lt;br /&gt;
 tar xzf FlightGear-2.0.0.tar.gz&lt;br /&gt;
 cd FlightGear-2.0.0&lt;br /&gt;
&lt;br /&gt;
GIT:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 git clone git://gitorious.org/fg/flightgear.git flightgear&lt;br /&gt;
 cd flightgear&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
&lt;br /&gt;
2.0.0 and GIT:&lt;br /&gt;
 ./configure --prefix=$prefix CPPFLAGS=-I$prefix/include/ LDFLAGS=&amp;quot;-L$prefix/lib -L$prefix/lib64&amp;quot;&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== FlightGear data ===&lt;br /&gt;
2.0.0:&lt;br /&gt;
 cd $prefix&lt;br /&gt;
 wget http://mirrors.ibiblio.org/pub/mirrors/flightgear/ftp/Shared/FlightGear-data-2.0.0.tar.bz2&lt;br /&gt;
 tar xjf FlightGear-data-2.0.0.tar.bz2&lt;br /&gt;
&lt;br /&gt;
GIT:&lt;br /&gt;
 cd $prefix&lt;br /&gt;
 git clone git://gitorious.org/fg/fgdata.git data&lt;br /&gt;
&lt;br /&gt;
The primary gitorious source is known to have trouble cloning the data, the mapserver mirror usually has no problems:&lt;br /&gt;
 cd $prefix&lt;br /&gt;
 git clone git://mapserver.flightgear.org/fgdata data&lt;br /&gt;
&lt;br /&gt;
Also, there are bundles (snapshots) available that can be retrieved with your favorite download manager. This way you can resume interrupted downloads. After unpacking only a comparatively small amount of data has to be transferred from the git server to synchronize your repository.&lt;br /&gt;
 $ cd $prefix&lt;br /&gt;
 $ wget http://flightgear.mxchange.org/pub/fgfs/fgdata.bundle&lt;br /&gt;
 $ git clone fgdata.bundle fgdata&lt;br /&gt;
 Initialized empty Git repository in fgdata/.git/&lt;br /&gt;
 warning: unrecognized header: -deg&amp;quot; - /orientation/roll += &amp;quot;-deg&amp;quot; - /position/altitude += &amp;quot;-ft&amp;quot; - /position/altitude-agl += &amp;quot;-ft&amp;quot; - /position/latitude += &amp;quot;-deg&amp;quot; --/position/longitude += &amp;quot;-deg&amp;quot; - /radios/adf/frequencies/selected += &amp;quot;-khz&amp;quot; - /radios/adf/frequencies/&lt;br /&gt;
 warning: remote HEAD refers to nonexistent ref, unable to checkout.&lt;br /&gt;
 $ cd fgdata&lt;br /&gt;
 $ git branch master-tmp origin/master&lt;br /&gt;
 Branch master-tmp set up to track remote branch refs/remotes/origin/master.&lt;br /&gt;
 $ git remote rm origin&lt;br /&gt;
 $ git remote add origin git://gitorious.org/fg/fgdata&lt;br /&gt;
 $ git fetch origin&lt;br /&gt;
 remote: Counting objects: 5596, done.&lt;br /&gt;
 remote: Compressing objects: 100% (2919/2919), done.&lt;br /&gt;
 remote: Total 4266 (delta 2540), reused 2166 (delta 1297)&lt;br /&gt;
 Receiving objects: 100% (4266/4266), 117.93 MiB | 1374 KiB/s, done.&lt;br /&gt;
 Resolving deltas: 100% (2540/2540), completed with 628 local objects.&lt;br /&gt;
 From git://gitorious.org/fg/fgdata&lt;br /&gt;
  * [new branch]      PRE_OSG_PLIB_20061029 -&amp;gt; origin/PRE_OSG_PLIB_20061029&lt;br /&gt;
  * [new branch]      master     -&amp;gt; origin/master&lt;br /&gt;
  * [new tag]         last-cvs   -&amp;gt; last-cvs&lt;br /&gt;
  * [new tag]         mapserver  -&amp;gt; mapserver&lt;br /&gt;
 $ git branch -D master-tmp&lt;br /&gt;
 Deleted branch master-tmp.&lt;br /&gt;
 $ git branch --track master origin/master&lt;br /&gt;
 Branch master set up to track remote branch refs/remotes/origin/master.&lt;br /&gt;
 $ git checkout&lt;br /&gt;
&lt;br /&gt;
The bundle may be periodically updated and bundles from different sources need not be the same. The file size for the above bundle dated 2010-06-09 is 2394168314, while the md5 checksum is&lt;br /&gt;
 $ md5sum fgdata.bundle&lt;br /&gt;
 2996221bd2b8ab7740f332f49396cf56  fgdata.bundle&lt;br /&gt;
&lt;br /&gt;
=== Trial run ===&lt;br /&gt;
When all the builds are done and the data download has finished it is time for a test run:&lt;br /&gt;
 export LD_LIBRARY_PATH=$prefix/lib/:$LD_LIBRARY_PATH&lt;br /&gt;
 $prefix/bin/fgfs --fg-root=$prefix/data&lt;br /&gt;
&lt;br /&gt;
For the future, if you want to start FlightGear from command line have a look at [[fgfsrc]], if you prefer a graphical user interface continue with [[#fgrun|compiling fgrun]]. Have in mind that fgfs need to find our self compiled libraries and therefore we have to tell the linker (ld) where to find them. That is what the first line here does.&lt;br /&gt;
&lt;br /&gt;
== Optional Software ==&lt;br /&gt;
&lt;br /&gt;
=== fgrun ===&lt;br /&gt;
To build [[fgrun]] two more package is required:&lt;br /&gt;
*libfltk1.1-dev fluid&lt;br /&gt;
&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co http://fgrun.svn.sourceforge.net/svnroot/fgrun/trunk fgrun&lt;br /&gt;
 cd fgrun/fgrun/&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
 ./configure --prefix=$prefix  [CPPFLAGS=-I$prefix/include/]&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== fgcom ===&lt;br /&gt;
For [[fgcom]] unfortunately there is one more dependency which cannot be solved with packages on Lenny/Etch, see [[#libopenal|libopenal]].&lt;br /&gt;
&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co https://appfgcom.svn.sourceforge.net/svnroot/fgcom/trunk fgcom&lt;br /&gt;
 cd fgcom/src&lt;br /&gt;
 make INSTALL_BIN=$prefix/bin INSTALL_DIR=$prefix/fgcom \&lt;br /&gt;
    PLIB_PREFIX=$prefix OPENAL_PREFIX=$prefix install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Keeping the GIT version up to date ==&lt;br /&gt;
&lt;br /&gt;
...to be continued. ;-)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Building}}&lt;br /&gt;
&lt;br /&gt;
[[de:FlightGear_bauen_-_Debian]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Building_FlightGear_-_Debian&amp;diff=24451</id>
		<title>Building FlightGear - Debian</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Building_FlightGear_-_Debian&amp;diff=24451"/>
		<updated>2010-10-04T22:01:38Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* SimGear */ remove confusing [] notatiom&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= HowTo build on Debian =&lt;br /&gt;
&lt;br /&gt;
HowTo build FlightGear 2.0.0 or GIT on GNU/Linux Debian '''Stable''' 5.x (Lenny).&lt;br /&gt;
&lt;br /&gt;
This HowTo may also work with '''Testing'''/'''Unstable''' except that some things are easier because of more up to date packages. So, before fetching something check the version of the available -dev package for it.&lt;br /&gt;
&lt;br /&gt;
It even *should* work with '''Etch''', but I am not certain about some dependencies. [http://wiki.flightgear.org/index.php?title=Talk:Building_Flightgear_-_Debian&amp;amp;action=edit Reports] are welcome.&lt;br /&gt;
&lt;br /&gt;
If you don't want to make your hands dirty, have a look at [[Scripted_Compilation_on_Linux_Debian/Ubuntu]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements and Preparations ==&lt;br /&gt;
You need an OpenGL capable graphics including a proper installed driver.&amp;lt;BR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also a bunch of packages (and some of their dependencies) are required:&lt;br /&gt;
*gcc, g++, make, automake1.9, pkg-config&lt;br /&gt;
*mawk (or gawk)&lt;br /&gt;
*cmake   (min. version 2.6.0-5, for Etch available on backports.debian.org!)&lt;br /&gt;
*git, subversion, wget&lt;br /&gt;
&amp;lt;!--*libsvn-dev, for [[Terrasync]]s proper operation.--&amp;gt;&lt;br /&gt;
*freeglut3-dev, libgl1-mesa-dev, libxrandr-dev&lt;br /&gt;
*libxi-dev, libxmu-dev, libxext-dev&lt;br /&gt;
*libopenal-dev (see [[#libopenal|libopenal]]), libalut-dev&lt;br /&gt;
*libjpeg62-dev, libtiff4-dev, libpng12-dev&lt;br /&gt;
*libboost1.37-dev (min 1.37, 1.40 available for Lenny on backports.debian.org)&lt;br /&gt;
&lt;br /&gt;
During installation packages ''simgear-dev'' and ''openscenegraph-dev'' *must not* be installed. They can safely be re-installed after compilation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Build and install ==&lt;br /&gt;
Because we are going to install versions different to the ones in the repositries it is recommended to install FG-2.0.0 and/or GIT in a place independent to the base system such as /usr/local/FG-2.0.0, /opt/FG-2.0.0 or in a subdirectory of your $HOME. I suggest to make it writeable by the user that there is no need to become root for the &amp;lt;code&amp;gt;make install&amp;lt;/code&amp;gt; commands. I'll use &amp;lt;code&amp;gt;$prefix&amp;lt;/code&amp;gt; as a placeholder for this directory. &amp;lt;BR&amp;gt;&lt;br /&gt;
Another one will be &amp;lt;code&amp;gt;$srcdir&amp;lt;/code&amp;gt;, it stands for the absolute path to the directory which contains the folders of the various source codes. So in the following instructions you have to replace these with the local paths or even &amp;lt;code&amp;gt;export&amp;lt;/code&amp;gt; them during the process.&lt;br /&gt;
&lt;br /&gt;
Follow the instructions to fetch the sources and the data needed by FlightGear and the commands to build/install each source.&lt;br /&gt;
&lt;br /&gt;
Have in mind that the data is relatively large (GIT about 3.5 GB and 2.0.0 300 MB) so, to save some time, it is a good idea to fetch it while building the sources.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== libopenal ===&lt;br /&gt;
The libopenal-dev package in Lenny/Etch is too old for [[fgcom]]. For FlightGear it does work but not all features (like Doppler) are available, so installing an up to date version is recommended anyway.&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 wget http://kcat.strangesoft.net/openal-releases/openal-soft-1.11.753.tar.bz2&lt;br /&gt;
 tar xjf openal-soft-1.11.753.tar.bz2&lt;br /&gt;
 cd openal-soft-1.11.753/build&lt;br /&gt;
 cmake  -D CMAKE_INSTALL_PREFIX:PATH=&amp;quot;$prefix&amp;quot; ..&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== plib ===&lt;br /&gt;
Latest SVN is [http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg20793.html recommended], yet package plib1.8.5-dev for Testing/Unstable does work as well.&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co https://plib.svn.sourceforge.net/svnroot/plib/trunk plib&lt;br /&gt;
 cd plib&lt;br /&gt;
 sed s/PLIB_TINY_VERSION\ \ 5/PLIB_TINY_VERSION\ \ 6/ -i src/util/ul.h&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
 ./configure --prefix=$prefix&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Boost Library ===&lt;br /&gt;
Version 1.37 is needed. At least for Lenny/Etch this means getting the sources because this is not available atm on backports.org. Testing/Unstable users may have more luck and a package is available, libboost-1.37-dev or newer.&lt;br /&gt;
&lt;br /&gt;
To build SimGear, FlightGear, fgrun and fgcom some boostlib header files are required, no need to compile and install it. If you have installed a libboost1.37-dev (or higher) package on your system you don't have to bother at all with it. If not, you have to tell each ./configure where the header files are. To do so, add the option &amp;lt;code&amp;gt;CPPFLAGS=-I$prefix/include&amp;lt;/code&amp;gt; to the SimGear, FlightGear and fgrun &amp;lt;code&amp;gt;./configure&amp;lt;/code&amp;gt; commands. We copy the header files to $prefix/include because fgcom will need them there.&lt;br /&gt;
&lt;br /&gt;
Get the newest version tar ball from http://sourceforge.net/projects/boost/files/boost/, extract it into &amp;lt;code&amp;gt;$srcdir&amp;lt;/code&amp;gt; then:&lt;br /&gt;
 cp -R $srcdir/boost-[version]/boost/ $prefix/include/&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can directly extract the required include files:&lt;br /&gt;
 tar xvf boost_1_37_0.tar.bz2 -C $prefix/include --strip 1 --wildcards --no-wildcards-match-slash '*/boost'&lt;br /&gt;
&lt;br /&gt;
=== OpenSceneGraph ===&lt;br /&gt;
For FlightGear 2.0.0 one may use the latest (or at least 2.9.6) developer release from http://www.openscenegraph.org/projects/osg/wiki/Downloads/DeveloperReleases and extract it into &amp;lt;code&amp;gt;$srcdir&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mostly this is ok for FlightGear GIT as well as it is stable. However, sometimes the release is not fresh enough and one have to get the latest developments via SVN:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk OpenSceneGraph&lt;br /&gt;
&lt;br /&gt;
cmake demands a build directory separate to its source directory. So &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; one and &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; into it.&lt;br /&gt;
 cmake -D CMAKE_BUILD_TYPE=&amp;quot;Release&amp;quot; -D CMAKE_CXX_FLAGS=&amp;quot;-O3&amp;quot; -D CMAKE_C_FLAGS=&amp;quot;-O3&amp;quot; \&lt;br /&gt;
    -D CMAKE_INSTALL_PREFIX:PATH=&amp;quot;$prefix&amp;quot; $srcdir/OpenSceneGraph[-version]&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SimGear ===&lt;br /&gt;
2.0.0:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 wget http://mirrors.ibiblio.org/pub/mirrors/simgear/ftp/Source/SimGear-2.0.0.tar.gz&lt;br /&gt;
 tar xzf SimGear-2.0.0.tar.gz&lt;br /&gt;
 cd SimGear-2.0.0&lt;br /&gt;
&lt;br /&gt;
GIT:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 git clone git://gitorious.org/fg/simgear.git simgear&lt;br /&gt;
 cd simgear&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
&lt;br /&gt;
2.0.0 and GIT:&lt;br /&gt;
 ./configure --prefix=$prefix CPPFLAGS=-I$prefix/include LDFLAGS=&amp;quot;-L$prefix/lib -L$prefix/lib64&amp;quot;&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== FlightGear source ===&lt;br /&gt;
2.0.0:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 wget http://mirrors.ibiblio.org/pub/mirrors/flightgear/ftp/Source/FlightGear-2.0.0.tar.gz&lt;br /&gt;
 tar xzf FlightGear-2.0.0.tar.gz&lt;br /&gt;
 cd FlightGear-2.0.0&lt;br /&gt;
&lt;br /&gt;
GIT:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 git clone git://gitorious.org/fg/flightgear.git flightgear&lt;br /&gt;
 cd flightgear&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
&lt;br /&gt;
2.0.0 and GIT:&lt;br /&gt;
 ./configure --prefix=$prefix [CPPFLAGS=-I$prefix/include/ LDFLAGS=&amp;quot;-L$prefix/lib -L$prefix/lib64&amp;quot;]&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== FlightGear data ===&lt;br /&gt;
2.0.0:&lt;br /&gt;
 cd $prefix&lt;br /&gt;
 wget http://mirrors.ibiblio.org/pub/mirrors/flightgear/ftp/Shared/FlightGear-data-2.0.0.tar.bz2&lt;br /&gt;
 tar xjf FlightGear-data-2.0.0.tar.bz2&lt;br /&gt;
&lt;br /&gt;
GIT:&lt;br /&gt;
 cd $prefix&lt;br /&gt;
 git clone git://gitorious.org/fg/fgdata.git data&lt;br /&gt;
&lt;br /&gt;
The primary gitorious source is known to have trouble cloning the data, the mapserver mirror usually has no problems:&lt;br /&gt;
 cd $prefix&lt;br /&gt;
 git clone git://mapserver.flightgear.org/fgdata data&lt;br /&gt;
&lt;br /&gt;
Also, there are bundles (snapshots) available that can be retrieved with your favorite download manager. This way you can resume interrupted downloads. After unpacking only a comparatively small amount of data has to be transferred from the git server to synchronize your repository.&lt;br /&gt;
 $ cd $prefix&lt;br /&gt;
 $ wget http://flightgear.mxchange.org/pub/fgfs/fgdata.bundle&lt;br /&gt;
 $ git clone fgdata.bundle fgdata&lt;br /&gt;
 Initialized empty Git repository in fgdata/.git/&lt;br /&gt;
 warning: unrecognized header: -deg&amp;quot; - /orientation/roll += &amp;quot;-deg&amp;quot; - /position/altitude += &amp;quot;-ft&amp;quot; - /position/altitude-agl += &amp;quot;-ft&amp;quot; - /position/latitude += &amp;quot;-deg&amp;quot; --/position/longitude += &amp;quot;-deg&amp;quot; - /radios/adf/frequencies/selected += &amp;quot;-khz&amp;quot; - /radios/adf/frequencies/&lt;br /&gt;
 warning: remote HEAD refers to nonexistent ref, unable to checkout.&lt;br /&gt;
 $ cd fgdata&lt;br /&gt;
 $ git branch master-tmp origin/master&lt;br /&gt;
 Branch master-tmp set up to track remote branch refs/remotes/origin/master.&lt;br /&gt;
 $ git remote rm origin&lt;br /&gt;
 $ git remote add origin git://gitorious.org/fg/fgdata&lt;br /&gt;
 $ git fetch origin&lt;br /&gt;
 remote: Counting objects: 5596, done.&lt;br /&gt;
 remote: Compressing objects: 100% (2919/2919), done.&lt;br /&gt;
 remote: Total 4266 (delta 2540), reused 2166 (delta 1297)&lt;br /&gt;
 Receiving objects: 100% (4266/4266), 117.93 MiB | 1374 KiB/s, done.&lt;br /&gt;
 Resolving deltas: 100% (2540/2540), completed with 628 local objects.&lt;br /&gt;
 From git://gitorious.org/fg/fgdata&lt;br /&gt;
  * [new branch]      PRE_OSG_PLIB_20061029 -&amp;gt; origin/PRE_OSG_PLIB_20061029&lt;br /&gt;
  * [new branch]      master     -&amp;gt; origin/master&lt;br /&gt;
  * [new tag]         last-cvs   -&amp;gt; last-cvs&lt;br /&gt;
  * [new tag]         mapserver  -&amp;gt; mapserver&lt;br /&gt;
 $ git branch -D master-tmp&lt;br /&gt;
 Deleted branch master-tmp.&lt;br /&gt;
 $ git branch --track master origin/master&lt;br /&gt;
 Branch master set up to track remote branch refs/remotes/origin/master.&lt;br /&gt;
 $ git checkout&lt;br /&gt;
&lt;br /&gt;
The bundle may be periodically updated and bundles from different sources need not be the same. The file size for the above bundle dated 2010-06-09 is 2394168314, while the md5 checksum is&lt;br /&gt;
 $ md5sum fgdata.bundle&lt;br /&gt;
 2996221bd2b8ab7740f332f49396cf56  fgdata.bundle&lt;br /&gt;
&lt;br /&gt;
=== Trial run ===&lt;br /&gt;
When all the builds are done and the data download has finished it is time for a test run:&lt;br /&gt;
 export LD_LIBRARY_PATH=$prefix/lib/:$LD_LIBRARY_PATH&lt;br /&gt;
 $prefix/bin/fgfs --fg-root=$prefix/data&lt;br /&gt;
&lt;br /&gt;
For the future, if you want to start FlightGear from command line have a look at [[fgfsrc]], if you prefer a graphical user interface continue with [[#fgrun|compiling fgrun]]. Have in mind that fgfs need to find our self compiled libraries and therefore we have to tell the linker (ld) where to find them. That is what the first line here does.&lt;br /&gt;
&lt;br /&gt;
== Optional Software ==&lt;br /&gt;
&lt;br /&gt;
=== fgrun ===&lt;br /&gt;
To build [[fgrun]] two more package is required:&lt;br /&gt;
*libfltk1.1-dev fluid&lt;br /&gt;
&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co http://fgrun.svn.sourceforge.net/svnroot/fgrun/trunk fgrun&lt;br /&gt;
 cd fgrun/fgrun/&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
 ./configure --prefix=$prefix  [CPPFLAGS=-I$prefix/include/]&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== fgcom ===&lt;br /&gt;
For [[fgcom]] unfortunately there is one more dependency which cannot be solved with packages on Lenny/Etch, see [[#libopenal|libopenal]].&lt;br /&gt;
&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co https://appfgcom.svn.sourceforge.net/svnroot/fgcom/trunk fgcom&lt;br /&gt;
 cd fgcom/src&lt;br /&gt;
 make INSTALL_BIN=$prefix/bin INSTALL_DIR=$prefix/fgcom \&lt;br /&gt;
    PLIB_PREFIX=$prefix OPENAL_PREFIX=$prefix install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Keeping the GIT version up to date ==&lt;br /&gt;
&lt;br /&gt;
...to be continued. ;-)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Building}}&lt;br /&gt;
&lt;br /&gt;
[[de:FlightGear_bauen_-_Debian]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Building_FlightGear_-_Debian&amp;diff=23640</id>
		<title>Building FlightGear - Debian</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Building_FlightGear_-_Debian&amp;diff=23640"/>
		<updated>2010-08-31T01:04:44Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* Boost Library */ Added alternate extract command&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= HowTo build on Debian =&lt;br /&gt;
&lt;br /&gt;
HowTo build FlightGear 2.0.0 or GIT on GNU/Linux Debian '''Stable''' 5.x (Lenny).&lt;br /&gt;
&lt;br /&gt;
This HowTo may also work with '''Testing'''/'''Unstable''' except that some things are easier because of more up to date packages. So, before fetching something check the version of the available -dev package for it.&lt;br /&gt;
&lt;br /&gt;
It even *should* work with '''Etch''', but I am not certain about some dependencies. [http://wiki.flightgear.org/index.php?title=Talk:Building_Flightgear_-_Debian&amp;amp;action=edit Reports] are welcome.&lt;br /&gt;
&lt;br /&gt;
If you don't want to make your hands dirty, have a look at [[Scripted_Compilation_on_Linux_Debian/Ubuntu]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements and Preparations ==&lt;br /&gt;
You need an OpenGL capable graphics including a proper installed driver.&amp;lt;BR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also a bunch of packages (and some of their dependencies) are required:&lt;br /&gt;
*gcc, g++, make, automake1.9, pkg-config&lt;br /&gt;
*mawk (or gawk)&lt;br /&gt;
*cmake   (min. version 2.6.0-5,  for Etch available on backports.org!)&lt;br /&gt;
*git, subversion, wget&lt;br /&gt;
&amp;lt;!--*libsvn-dev, for [[Terrasync]]s proper operation.--&amp;gt;&lt;br /&gt;
*freeglut3-dev, libgl1-mesa-dev, libxrandr-dev&lt;br /&gt;
*libxi-dev, libxmu-dev, libxext-dev&lt;br /&gt;
*libopenal-dev (see [[#libopenal|libopenal]]), libalut-dev&lt;br /&gt;
*libjpeg62-dev, libtiff4-dev, libpng12-dev&lt;br /&gt;
*libboost1.37-dev  (Not available for Lenny atm, see [[#Boost Library|Boost Library]] below.)&lt;br /&gt;
&lt;br /&gt;
During installation packages ''simgear-dev'' and ''openscenegraph-dev'' *must not* be installed. They can safely be re-installed after compilation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Build and install ==&lt;br /&gt;
Because we are going to install versions different to the ones in the repositries it is recommended to install FG-2.0.0 and/or GIT in a place independent to the base system such as /usr/local/FG-2.0.0, /opt/FG-2.0.0 or in a subdirectory of your $HOME. I suggest to make it writeable by the user that there is no need to become root for the &amp;lt;code&amp;gt;make install&amp;lt;/code&amp;gt; commands. I'll use &amp;lt;code&amp;gt;$prefix&amp;lt;/code&amp;gt; as a placeholder for this directory. &amp;lt;BR&amp;gt;&lt;br /&gt;
Another one will be &amp;lt;code&amp;gt;$srcdir&amp;lt;/code&amp;gt;, it stands for the absolute path to the directory which contains the folders of the various source codes. So in the following instructions you have to replace these with the local paths or even &amp;lt;code&amp;gt;export&amp;lt;/code&amp;gt; them during the process.&lt;br /&gt;
&lt;br /&gt;
Follow the instructions to fetch the sources and the data needed by FlightGear and the commands to build/install each source.&lt;br /&gt;
&lt;br /&gt;
Have in mind that the data is relatively large (GIT about 3.5 GB and 2.0.0 300 MB) so, to save some time, it is a good idea to fetch it while building the sources.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== libopenal ===&lt;br /&gt;
The libopenal-dev package in Lenny/Etch is too old for [[fgcom]]. For FlightGear it does work but not all features (like Doppler) are available, so installing an up to date version is recommended anyway.&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 wget http://kcat.strangesoft.net/openal-releases/openal-soft-1.11.753.tar.bz2&lt;br /&gt;
 tar xjf openal-soft-1.11.753.tar.bz2&lt;br /&gt;
 cd openal-soft-1.11.753/build&lt;br /&gt;
 cmake  -D CMAKE_INSTALL_PREFIX:PATH=&amp;quot;$prefix&amp;quot; ..&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== plib ===&lt;br /&gt;
Latest SVN is [http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg20793.html recommended], yet package plib1.8.5-dev for Testing/Unstable does work as well.&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co https://plib.svn.sourceforge.net/svnroot/plib/trunk plib&lt;br /&gt;
 cd plib&lt;br /&gt;
 sed s/PLIB_TINY_VERSION\ \ 5/PLIB_TINY_VERSION\ \ 6/ -i src/util/ul.h&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
 ./configure --prefix=$prefix&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Boost Library ===&lt;br /&gt;
Version 1.37 is needed. At least for Lenny/Etch this means getting the sources because this is not available atm on backports.org. Testing/Unstable users may have more luck and a package is available, libboost-1.37-dev or newer.&lt;br /&gt;
&lt;br /&gt;
To build SimGear, FlightGear, fgrun and fgcom some boostlib header files are required, no need to compile and install it. If you have installed a libboost1.37-dev (or higher) package on your system you don't have to bother at all with it. If not, you have to tell each ./configure where the header files are. To do so, add the option &amp;lt;code&amp;gt;CPPFLAGS=-I$prefix/include&amp;lt;/code&amp;gt; to the SimGear, FlightGear and fgrun &amp;lt;code&amp;gt;./configure&amp;lt;/code&amp;gt; commands. We copy the header files to $prefix/include because fgcom will need them there.&lt;br /&gt;
&lt;br /&gt;
Get the newest version tar ball from http://sourceforge.net/projects/boost/files/boost/, extract it into &amp;lt;code&amp;gt;$srcdir&amp;lt;/code&amp;gt; then:&lt;br /&gt;
 cp -R $srcdir/boost-[version]/boost/ $prefix/include/&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can directly extract the required include files:&lt;br /&gt;
 tar xvf boost_1_37_0.tar.bz2 -C $prefix/include --strip 1 --wildcards --no-wildcards-match-slash '*/boost'&lt;br /&gt;
&lt;br /&gt;
=== OpenSceneGraph ===&lt;br /&gt;
For FlightGear 2.0.0 one may use the latest (or at least 2.9.6) developer release from http://www.openscenegraph.org/projects/osg/wiki/Downloads/DeveloperReleases and extract it into &amp;lt;code&amp;gt;$srcdir&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mostly this is ok for FlightGear GIT as well as it is stable. However, sometimes the release is not fresh enough and one have to get the latest developments via SVN:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk OpenSceneGraph&lt;br /&gt;
&lt;br /&gt;
cmake demands a build directory separate to its source directory. So &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; one and &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; into it.&lt;br /&gt;
 cmake -D CMAKE_BUILD_TYPE=&amp;quot;Release&amp;quot; -D CMAKE_CXX_FLAGS=&amp;quot;-O3&amp;quot; -D CMAKE_C_FLAGS=&amp;quot;-O3&amp;quot; \&lt;br /&gt;
    -D CMAKE_INSTALL_PREFIX:PATH=&amp;quot;$prefix&amp;quot; $srcdir/OpenSceneGraph[-version]&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SimGear ===&lt;br /&gt;
2.0.0:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 wget http://mirrors.ibiblio.org/pub/mirrors/simgear/ftp/Source/SimGear-2.0.0.tar.gz&lt;br /&gt;
 tar xzf SimGear-2.0.0.tar.gz&lt;br /&gt;
 cd SimGear-2.0.0&lt;br /&gt;
&lt;br /&gt;
GIT:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 git clone git://gitorious.org/fg/simgear.git simgear&lt;br /&gt;
 cd simgear&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
&lt;br /&gt;
2.0.0 and GIT:&lt;br /&gt;
 ./configure --prefix=$prefix [CPPFLAGS=-I$prefix/include LDFLAGS=&amp;quot;-L$prefix/lib -L$prefix/lib64&amp;quot;]&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== FlightGear source ===&lt;br /&gt;
2.0.0:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 wget http://mirrors.ibiblio.org/pub/mirrors/flightgear/ftp/Source/FlightGear-2.0.0.tar.gz&lt;br /&gt;
 tar xzf FlightGear-2.0.0.tar.gz&lt;br /&gt;
 cd FlightGear-2.0.0&lt;br /&gt;
&lt;br /&gt;
GIT:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 git clone git://gitorious.org/fg/flightgear.git flightgear&lt;br /&gt;
 cd flightgear&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
&lt;br /&gt;
2.0.0 and GIT:&lt;br /&gt;
 ./configure --prefix=$prefix [CPPFLAGS=-I$prefix/include/ LDFLAGS=&amp;quot;-L$prefix/lib -L$prefix/lib64&amp;quot;]&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== FlightGear data ===&lt;br /&gt;
2.0.0:&lt;br /&gt;
 cd $prefix&lt;br /&gt;
 wget http://mirrors.ibiblio.org/pub/mirrors/flightgear/ftp/Shared/FlightGear-data-2.0.0.tar.bz2&lt;br /&gt;
 tar xjf FlightGear-data-2.0.0.tar.bz2&lt;br /&gt;
&lt;br /&gt;
GIT:&lt;br /&gt;
 cd $prefix&lt;br /&gt;
 git clone git://gitorious.org/fg/fgdata.git data&lt;br /&gt;
&lt;br /&gt;
The primary gitorious source is known to have trouble cloning the data, the mapserver mirror usually has no problems:&lt;br /&gt;
 cd $prefix&lt;br /&gt;
 git clone git://mapserver.flightgear.org/fgdata data&lt;br /&gt;
&lt;br /&gt;
Also, there are bundles (snapshots) available that can be retrieved with your favorite download manager. This way you can resume interrupted downloads. After unpacking only a comparatively small amount of data has to be transferred from the git server to synchronize your repository.&lt;br /&gt;
 $ cd $prefix&lt;br /&gt;
 $ wget http://flightgear.mxchange.org/pub/fgfs/fgdata.bundle&lt;br /&gt;
 $ git clone fgdata.bundle fgdata&lt;br /&gt;
 Initialized empty Git repository in fgdata/.git/&lt;br /&gt;
 warning: unrecognized header: -deg&amp;quot; - /orientation/roll += &amp;quot;-deg&amp;quot; - /position/altitude += &amp;quot;-ft&amp;quot; - /position/altitude-agl += &amp;quot;-ft&amp;quot; - /position/latitude += &amp;quot;-deg&amp;quot; --/position/longitude += &amp;quot;-deg&amp;quot; - /radios/adf/frequencies/selected += &amp;quot;-khz&amp;quot; - /radios/adf/frequencies/&lt;br /&gt;
 warning: remote HEAD refers to nonexistent ref, unable to checkout.&lt;br /&gt;
 $ cd fgdata&lt;br /&gt;
 $ git branch master-tmp origin/master&lt;br /&gt;
 Branch master-tmp set up to track remote branch refs/remotes/origin/master.&lt;br /&gt;
 $ git remote rm origin&lt;br /&gt;
 $ git remote add origin git://gitorious.org/fg/fgdata&lt;br /&gt;
 $ git fetch origin&lt;br /&gt;
 remote: Counting objects: 5596, done.&lt;br /&gt;
 remote: Compressing objects: 100% (2919/2919), done.&lt;br /&gt;
 remote: Total 4266 (delta 2540), reused 2166 (delta 1297)&lt;br /&gt;
 Receiving objects: 100% (4266/4266), 117.93 MiB | 1374 KiB/s, done.&lt;br /&gt;
 Resolving deltas: 100% (2540/2540), completed with 628 local objects.&lt;br /&gt;
 From git://gitorious.org/fg/fgdata&lt;br /&gt;
  * [new branch]      PRE_OSG_PLIB_20061029 -&amp;gt; origin/PRE_OSG_PLIB_20061029&lt;br /&gt;
  * [new branch]      master     -&amp;gt; origin/master&lt;br /&gt;
  * [new tag]         last-cvs   -&amp;gt; last-cvs&lt;br /&gt;
  * [new tag]         mapserver  -&amp;gt; mapserver&lt;br /&gt;
 $ git branch -D master-tmp&lt;br /&gt;
 Deleted branch master-tmp.&lt;br /&gt;
 $ git branch --track master origin/master&lt;br /&gt;
 Branch master set up to track remote branch refs/remotes/origin/master.&lt;br /&gt;
 $ git checkout&lt;br /&gt;
&lt;br /&gt;
The bundle may be periodically updated and bundles from different sources need not be the same. The file size for the above bundle dated 2010-06-09 is 2394168314, while the md5 checksum is&lt;br /&gt;
 $ md5sum fgdata.bundle&lt;br /&gt;
 2996221bd2b8ab7740f332f49396cf56  fgdata.bundle&lt;br /&gt;
&lt;br /&gt;
=== Trial run ===&lt;br /&gt;
When all the builds are done and the data download has finished it is time for a test run:&lt;br /&gt;
 export LD_LIBRARY_PATH=$prefix/lib/:$LD_LIBRARY_PATH&lt;br /&gt;
 $prefix/bin/fgfs --fg-root=$prefix/data&lt;br /&gt;
&lt;br /&gt;
For the future, if you want to start FlightGear from command line have a look at [[fgfsrc]], if you prefer a graphical user interface continue with [[#fgrun|compiling fgrun]]. Have in mind that fgfs need to find our self compiled libraries and therefore we have to tell the linker (ld) where to find them. That is what the first line here does.&lt;br /&gt;
&lt;br /&gt;
== Optional Software ==&lt;br /&gt;
&lt;br /&gt;
=== fgrun ===&lt;br /&gt;
To build [[fgrun]] two more package is required:&lt;br /&gt;
*libfltk1.1-dev fluid&lt;br /&gt;
&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co http://fgrun.svn.sourceforge.net/svnroot/fgrun/trunk fgrun&lt;br /&gt;
 cd fgrun/fgrun/&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
 ./configure --prefix=$prefix  [CPPFLAGS=-I$prefix/include/]&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== fgcom ===&lt;br /&gt;
For [[fgcom]] unfortunately there is one more dependency which cannot be solved with packages on Lenny/Etch, see [[#libopenal|libopenal]].&lt;br /&gt;
&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co https://appfgcom.svn.sourceforge.net/svnroot/fgcom/trunk fgcom&lt;br /&gt;
 cd fgcom/src&lt;br /&gt;
 make INSTALL_BIN=$prefix/bin INSTALL_DIR=$prefix/fgcom \&lt;br /&gt;
    PLIB_PREFIX=$prefix OPENAL_PREFIX=$prefix install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Keeping the GIT version up to date ==&lt;br /&gt;
&lt;br /&gt;
...to be continued. ;-)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Building}}&lt;br /&gt;
&lt;br /&gt;
[[de:FlightGear_bauen_-_Debian]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Understand_console_output&amp;diff=23293</id>
		<title>Howto:Understand console output</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Understand_console_output&amp;diff=23293"/>
		<updated>2010-08-09T19:45:18Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* Errors without known solutions */  Removed &amp;quot;FGMultiplayerMgr::Open - Failed to bind recieve socket&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists '''[[FlightGear]] errors''', how to get rid of them and other '''console output'''. If FlightGear quits but does not give you any error, try increasing the [[FlightGear Launch Control#Debugging|Log Level]].&lt;br /&gt;
&lt;br /&gt;
Errors can appear in various locations, but the most common one is the console (a black window), which pops up when you run fgfs.exe.&lt;br /&gt;
&lt;br /&gt;
==Errors with known solutions==&lt;br /&gt;
===Airports/.... ... Done===&lt;br /&gt;
This is not an error. The message lets us know that [[TerraSync]] is updating the &amp;lt;tt&amp;gt;[[$FG_SCENERY]]/Airports&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===Base package check failed ... Found version [none] at: ...&amp;lt;br&amp;gt;Please upgrade to version:===&lt;br /&gt;
* FlightGear was unable to find the [[$FG_ROOT]] directory. Set it using the &amp;lt;tt&amp;gt;--fg-root=&amp;lt;/tt&amp;gt; commandline option.&lt;br /&gt;
* When using [[CVS]] with binaries, the data must match the binary. You cannot use data from a different date than the binary's release date.&lt;br /&gt;
&lt;br /&gt;
===condition: comparison without property[1] or value===&lt;br /&gt;
A condition (like &amp;lt;tt&amp;gt;&amp;lt;less-than&amp;gt;&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;&amp;lt;equals&amp;gt;&amp;lt;/tt&amp;gt;) exists, without either:&lt;br /&gt;
* a property to check&lt;br /&gt;
* a value to check the property against&lt;br /&gt;
&lt;br /&gt;
===Could not find at least one of the following objects for animation:===&lt;br /&gt;
This means that FlightGear is unable to find an object in a .ac file. Check the .xml file (where the animation is stored) to see if the object-names match those in the .ac file. If you are not the aircraft's author you can safely ignore such warnings.&lt;br /&gt;
&lt;br /&gt;
===creating 3D noise texture... DONE===&lt;br /&gt;
Tells you that a new noise texture is created. It is not an error and can be ignored.&lt;br /&gt;
&lt;br /&gt;
===Error: [Screen #0] GraphicsWindowWin32::setPixelFormat() - No matching pixel format found based on traits specified====&lt;br /&gt;
Try changing the [[FlightGear Launch Control#Page Four - Options and Run|BPP]] value of your FlightGear setup. If that does not work, your graphics card is probably not able to run FlightGear 1.9 and higher. Another graphics card, or an older FlightGear version will likely &amp;quot;fix&amp;quot; the problem.&lt;br /&gt;
&lt;br /&gt;
===Error: bind() failed in make_server_socket()===&lt;br /&gt;
When using [[Howto: Multiplayer|multiplayer]] or socket input, this usually means you specified an invalid ip address or the port is in use. Note: for multiplayer, you don't need to use the ''--multiplay=in,...'' option at all, FlightGear (since version 1.0) figures out the proper setting automatically. Only use when you know what you are doing.&lt;br /&gt;
&lt;br /&gt;
===Error Building Technique: findAttr: could not find attribute bool===&lt;br /&gt;
Make sure that your data and source (or binary) match. They must be from the same date, to provide the best performance.&lt;br /&gt;
&lt;br /&gt;
===Error: connect() failed in make_client_socket()&amp;lt;br&amp;gt;SG_IO_OUT socket creation failed===&lt;br /&gt;
Your computer is not connected with the internet.&lt;br /&gt;
&lt;br /&gt;
===Error: RenderTexture requires the following unsupported OpenGL extensions...===&lt;br /&gt;
Your graphics card doesn't support some graphics feature that FG requires. Update your drivers, change the BPP value and/or try disabling some of the visual goodies like [[3D Clouds]].&lt;br /&gt;
&lt;br /&gt;
===Failed to find .... in apt.dat.gz===&lt;br /&gt;
You need to edit ATC/default.tower and ATC/default.atis. You can open these files with any text editor. Either remove or fix the entries containing your airports ICAO code (like KSFO).&lt;br /&gt;
&lt;br /&gt;
===Failed to open file ...===&lt;br /&gt;
Check if the file exists on your system. If the missing file is a scenery object; be sure you have the latest [http://scenemodels.flightgear.org/download/SharedModels.tgz Shared Models] from the [[FlightGear Scenery Database]].&lt;br /&gt;
&lt;br /&gt;
===Fatal error: mismatched tag ...===&lt;br /&gt;
In some .xml file, an opening tag (like &amp;lt;tt&amp;gt;&amp;lt;sim&amp;gt;&amp;lt;/tt&amp;gt;) does not match its closing tag (like &amp;lt;tt&amp;gt;&amp;lt;/sim&amp;gt;&amp;lt;/tt&amp;gt;). This error is hard to track down, best method is to comment (place code between &amp;lt;nowiki&amp;gt;&amp;lt;!-- and --&amp;gt;&amp;lt;/nowiki&amp;gt;) most of the aircraft. Then uncomment code one by one, until the error appears again.&lt;br /&gt;
&lt;br /&gt;
===Fatal error: name must begin with alpha or '_'===&lt;br /&gt;
This error comes up when a property should be formed of which the name does not start with a letter of the alphabet or _. If this error only happens with certain planes, contact their authors.&lt;br /&gt;
&lt;br /&gt;
===Fatal error: unclosed token===&lt;br /&gt;
A token (&amp;lt;nowiki&amp;gt;&amp;lt;!-- --&amp;gt;&amp;lt;/nowiki&amp;gt;) has been started, but not closes. Add &amp;lt;nowiki&amp;gt;--&amp;gt;&amp;lt;/nowiki&amp;gt; at the correct line.&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayMgr::MP_ProcessData: No such file or directory===&lt;br /&gt;
This is telling you that there's someone online on the multiplayerserver, using a plane that you do not have installed on your own system. In order to remove the error (and see the other plane) you have to install the plane that the other pilot is using.&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayMgr - No receiver port, Multiplayermode disabled===&lt;br /&gt;
FlightGear [[Howto: Multiplayer|multiplayer]] has not been set.&lt;br /&gt;
&lt;br /&gt;
===FGPropertyManager::GetNode() No node found for ...&amp;lt;br&amp;gt;  In component: ... unknown property ... referenced. Aborting===&lt;br /&gt;
FlightGear found a reference in the [[FDM]] to a non-existing property.&lt;br /&gt;
&lt;br /&gt;
===FGPropertyManager::GetNode() No node found for ...&amp;lt;br&amp;gt; The property ... is undefined.===&lt;br /&gt;
FlightGear found a reference in the [[FDM]] to a non-existing property. Keep in mind that JSBSim reads the FDM from top to bottom. Properties should always be created before they are needed somewhere.&lt;br /&gt;
&lt;br /&gt;
===Fgtzfile_read(): : Invalid argument&amp;lt;br&amp;gt;Fatal error: Timezone reading failed===&lt;br /&gt;
This one is caused by wrong line ending in a timezone file. Solution might be to download the Timezone/time.tab file manually from [http://gitorious.org/fg/fgdata/blobs/raw/master/Timezone/zone.tab Gitorious] (Right mouseclick &amp;gt; Save target as) and overwrite the file in &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Timezone/time.tab&amp;lt;/tt&amp;gt; with it.&lt;br /&gt;
&lt;br /&gt;
===Found unexpected subsystem: system exiting. JSBSim failed to load aircraft and/or engine model===&lt;br /&gt;
You are probably trying to run an aircraft on a out-of-date version of FlightGear. The planes on the official download page are intended to be used with the latest version of FlightGear. Usage on any older systems may not work.&lt;br /&gt;
&lt;br /&gt;
===freeglut (fgfs): Unable to create direct context rendering for window 'FlightGear'&amp;lt;br&amp;gt;This may hurt performance===&lt;br /&gt;
This reports that you do not have proper hardware accelerated 3D (direct rendering) configured.&lt;br /&gt;
&lt;br /&gt;
===Gate ... doesn't seem to have routes associated with it===&lt;br /&gt;
A startup location in the [[Interactive Traffic#Ground networks|groundnetwork]] is not (properly) connected to a taxi route. Contact the airport author, or import the network to [[TaxiDraw]] and run the Verify network command to find the corrupted gate.&lt;br /&gt;
&lt;br /&gt;
===glLinkProgram &amp;quot;&amp;quot; Failed===&lt;br /&gt;
Update your drivers; they have to support atleast OpenGL 2.0 for FlightGear 2.0 and later.&lt;br /&gt;
&lt;br /&gt;
===loading scenario '...'===&lt;br /&gt;
This is not an error. It shows that an [[AI Systems#AI Models|AI scenario]] is loaded.&lt;br /&gt;
&lt;br /&gt;
===Model not found: ...===&lt;br /&gt;
This one tells you that FlightGear was unable to find a certain file. The nice thing is that it also tells you excactly what file. &lt;br /&gt;
&lt;br /&gt;
# Check if the file really does not exist at your computer.&lt;br /&gt;
# Try to locate the file in which the missing file is referenced. This is likely to be &amp;lt;tt&amp;gt;-set.xml&amp;lt;/tt&amp;gt; in the root directory of the loaded [[aircraft]]. Between the &amp;lt;model&amp;gt; tags, the base model file is referenced. This file references to all other models that are displayed with the aircraft.&lt;br /&gt;
# Contact the aircraft author with a detailed bug-report, in which you state the excact location of the missing file and (if you found it) the file in which it is referenced.&lt;br /&gt;
&lt;br /&gt;
===Nasal runtime error: nil used in numeric context===&lt;br /&gt;
This error is [[Nasal]] triggered by a Nasal file (the console should show what file (and line) and from where it was referenced). The Nasal script tried to do something with a [[Property Tree|property]] with an empty value. A solution is to fill the property before the Nasal is loaded. This can be done by setting the property in an [[aircraft]]'s &amp;lt;tt&amp;gt;-set.xml&amp;lt;/tt&amp;gt; file or by adding a [[Nasal scripting language#Listeners and Signals|listener]] to the script. &lt;br /&gt;
&lt;br /&gt;
[[Howto: Contact the developers|Contact the developers]] if this error is shown for a &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Nasal/&amp;lt;/tt&amp;gt; script.&lt;br /&gt;
&lt;br /&gt;
===Near camera not rendering===&lt;br /&gt;
[[Image:Near_camera_off.png|500px]]&lt;br /&gt;
&lt;br /&gt;
If you screen looks like the image above; make sure you have at least [[OSG]] version 2.7.6.&lt;br /&gt;
&lt;br /&gt;
===No render bin name specified in render bin section===&lt;br /&gt;
Update [[SimGear]] (or binary) and your data directory.&lt;br /&gt;
&lt;br /&gt;
===No render bin number specified in render bin section===&lt;br /&gt;
Update [[SimGear]] (or binary) and your data directory.&lt;br /&gt;
&lt;br /&gt;
===... not a valid win32 application===&lt;br /&gt;
This Windows error could have various reasons to pop up. Usually, the file that is causing troubles is mentioned. Re-installing this file might solve the problem.&lt;br /&gt;
&lt;br /&gt;
===OBJECT_SIGN: unsupported glyph `.'===&lt;br /&gt;
Check the OBJECT_SIGN lines in the .stg file of the tile that was loaded when this error showed up.&lt;br /&gt;
&lt;br /&gt;
===OpenAL error &amp;lt;AL_INVALID_VALUE&amp;gt;: bind source &amp;lt;alGenSources&amp;gt;&amp;lt;br&amp;gt;Failed to generate audio source.===&lt;br /&gt;
This error is probably displayed because of some misdirected audio settings in the [[aircraft]]s setup. Check the -sound.xml file of the aircraft and see if all files refered to really exist. If not, try to contact the author of the plane, so he can fix the problem in the [[FlightGear CVS|CVS]] version or solve the problem yourself and let someone commit the patch.&lt;br /&gt;
&lt;br /&gt;
===OpenAL error (AL_INVALID_VALUE): constructor (alBufferData)&amp;lt;br&amp;gt;Fatal error: Failed to buffer data.===&lt;br /&gt;
Disabling sound is a temporarily solution for this problem.&lt;br /&gt;
&lt;br /&gt;
===osgDB ac3d reader: could not find texture...===&lt;br /&gt;
See [[#Failed to open file ...|Failed to open file ...]]&lt;br /&gt;
&lt;br /&gt;
===osgDB ac3d reader: detected surface with less than 3 vertices!===&lt;br /&gt;
In one of the loaded models a non-existing surface is found. This can be a single line (sometimes used to simulate thin wires) or a fault in the model.&lt;br /&gt;
&lt;br /&gt;
===Program's vertex attrib binding ..., usrAttr...===&lt;br /&gt;
Tells you that an effect binded certain attributes to a [[Shaders|shader]].&lt;br /&gt;
&lt;br /&gt;
===QNAN===&lt;br /&gt;
(Q)NAN stands for (Quiet) Not A Number, produced by 0/0 or other floating point break downs. There can be various causes for this:&lt;br /&gt;
* Using a &amp;quot;flap start&amp;quot; value of 0 in the [[YASim]] [[FDM]]. Use some small value like 0.001 instead.&lt;br /&gt;
&lt;br /&gt;
===Scaling image...===&lt;br /&gt;
This means a texture, whether in the scenery on your aircraft or anyone elses (when multiplayer is enabled), is not sized to powers of two. All textures in FlightGear have to be sized to power of two (eg. 16*16, 32*64, 32*1024). As of version 1.9 textures are resized automaticly, but it does slow your computer down, so it's better to resize the noted textures.&lt;br /&gt;
&lt;br /&gt;
===ssgInit called without a valid OpenGL context===&lt;br /&gt;
In short, your GL libraries are broken. So far only Red Hat 7.x users have experienced this (see http://www.redhat.com/bugzilla/show_bug.cgi?id=18867). The only solutions are possibly complicated ones: you can either change distributions (most of us prefer Debian) or upgrade/downgrade your Mesa libs.&lt;br /&gt;
&lt;br /&gt;
===The system cannot find the file specified===&lt;br /&gt;
If you are running Windows Vista; start by looking in &amp;lt;tt&amp;gt;C:\Users\Owner\AppData\Local\VirtualStore&amp;lt;/tt&amp;gt; and seeing if you have a folder called FlightGear in there. If you do, cut-and-paste (merge) that one with &amp;lt;tt&amp;gt;C:\Program Files\Flightgear&amp;lt;/tt&amp;gt; and try to launch FlightGear again.&lt;br /&gt;
&lt;br /&gt;
'''Hint:''' you may need to go under Tools and Folder Options to specify &amp;quot;Show Hidden/System Files and Folders&amp;quot; in order for AppData to be visible.&lt;br /&gt;
&lt;br /&gt;
===Time zone reading failed===&lt;br /&gt;
This is probably caused by a line-ending problem in the timezone files. Win32 users can resolve the problem by downloading a DOS to UNIX conversion utility available at http://www.nottingham.ac.uk/~eazdluf/d2u.zip. Run as `d2u *.tab` from within the timezone directory to fix your timezone files&lt;br /&gt;
&lt;br /&gt;
===Traffic manager could not find airport===&lt;br /&gt;
There is either an airport missing from apt.dat, or there is a wrong ICAO code in a [[Interactive Traffic#Building Traffic Files|traffic file]]. An airport missing from apt.dat could be due to a recent opening.&lt;br /&gt;
&lt;br /&gt;
===Unable to choose requested pixel format===&lt;br /&gt;
Error should be solved as of version 1.9. If not, try changing your [[FlightGear Launch Control#Page Four - Options and Run|BPP]] and/or resolution.&lt;br /&gt;
&lt;br /&gt;
===Unable to find airport details for .... in FGTower::Init()===&lt;br /&gt;
This error can be surpressed by disabling [[Interactive Traffic|AI Traffic]], via the AI/ATC [[menu]].&lt;br /&gt;
&lt;br /&gt;
The error appears when an airport in &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Airports/apt.dat.gz&amp;lt;/tt&amp;gt; cannot be found in &amp;lt;tt&amp;gt;[[$FG_ROOT]]/ATC/default.tower&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;[[$FG_ROOT]]/ATC/default.atis&amp;lt;/tt&amp;gt;. Renaming the airports in the apt.dat.gz file ór in both default ATC files will fix the problem.&lt;br /&gt;
&lt;br /&gt;
===Unable to open aircraft directory===&lt;br /&gt;
The [[aircraft]] that you are trying to run most likely relies on another aircraft, which you did not install (yet). The error shows what aircraft, so go download that one!&lt;br /&gt;
=== Unexpected tag '...' found in YASim aircraft description===&lt;br /&gt;
FlightGear found a non-existing tag in the [[FDM]] of the aircraft you are trying to launch. If you have not changed the original aircraft, contact the aircraft author. Else, check the FDM througly for mistakes.&lt;br /&gt;
&lt;br /&gt;
=== Unknown ... aircraft: ... defaulting to C172 ===&lt;br /&gt;
FlightGear is unable to load the forced [[FDM]] (set through &amp;lt;tt&amp;gt;--fdm=...&amp;lt;/tt&amp;gt; or via &amp;lt;tt&amp;gt;Advanced &amp;gt; Flight Model&amp;lt;/tt&amp;gt; in [[FGRun]]) for this aircraft. FlightGear automatically picks the right FDM for each aircraft, so there is no need to set it manually, unless you know what you are doing. In the Flight Model dialog of FGRun, set the FDM to &amp;lt;tt&amp;gt;jsb&amp;lt;/tt&amp;gt;; that is the &amp;quot;auto setting&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Unknown exception to the main loop. Aborting... &amp;lt;br&amp;gt;Possible cause: No such file or directory===&lt;br /&gt;
This error could have a variety of sources, among them missing files but also other things. Increasing the [[FlightGear_Launch_Control#Debugging|log level]] to debug and repeating excactly what you did when the error came up, might provide some more information on what FlightGear was doing when the error occurred.&lt;br /&gt;
* Setting your [[FlightGear Launch Control#Page Four - Options and Run|BPP]] to a lower value might work.&lt;br /&gt;
* Changing the resolution to a smaller one might work as well.&lt;br /&gt;
&lt;br /&gt;
===WARNING: Couldn't convert texture...===&lt;br /&gt;
You are trying to run an aircraft not compatible with your FlightGear version. Most of the time, this error appears when you fly an aircraft, textured with .png files on versions older than 1.9. Convert the textures manually to .rgb or upgrade your FlightGear version.&lt;br /&gt;
&lt;br /&gt;
===Warning: Picked up TriangleIntersect===&lt;br /&gt;
Reduce your [[FlightGear Launch Control#Debugging|Log Level]] to alert. Or [[Showstoppers|send the fgfs output to /dev/null (unix systems) or 2&amp;gt;nul (Windows)]]. The errors might still be shown, but do not affect the sim anymore.&lt;br /&gt;
&lt;br /&gt;
===Warning: TangentSpaceGenerator: unknown primitive mode 9===&lt;br /&gt;
This is an [[OSG]] error, showing up when an effect needs tangent vectors, but polygons are not support. The error itself can be ignored, altough some [[shaders]] may look wrong. Shader developers should try to minimise the use of polygons and use triangles and quads instead.&lt;br /&gt;
&lt;br /&gt;
===YASim SOLUTION FAILURE: Solution failed to converge after 10000 iterations===&lt;br /&gt;
Some control in the [[YASim]] [[FDM]] is too weak, according to YASim, to control the aircraft. An effectiveness tag will be required in the FDM to solve this error.&lt;br /&gt;
&lt;br /&gt;
===YASim SOLUTION FAILURE:&amp;lt;br&amp;gt;Zero length fuselage===&lt;br /&gt;
There is a problem in the [[FDM]]. A fuselage section with similar ax and ay was created. Change the ax and/or ay values to match the aircraft.&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayerMgr::Open - Failed to bind receive socket===&lt;br /&gt;
&lt;br /&gt;
This means FlightGear was unable to open the listening network socket required by the --multiplay=in option. Frequently this option can be omitted and FlightGear will figure out the necessary parameters automatically.&lt;br /&gt;
Common reasons are:&lt;br /&gt;
* Address given in the option does not resolve to one of the IP addresses of the local machine. This parameter should only be required if you want to fine-tune the network behavior. Omitting it directs FlightGear to listen on all local interfaces automatically. Example:&lt;br /&gt;
 --multiplay=in,10,,5001&lt;br /&gt;
Notice that you still need the comma.&lt;br /&gt;
* The UDP port given in the option (or the default port 5000 if no option given) is already in use. Verify nothing is using the port.&lt;br /&gt;
&lt;br /&gt;
==Errors without known solutions==&lt;br /&gt;
Please take a look at the upcoming errors and see if you know a solution to get rid of them. Your additions are greatly appreciated!&lt;br /&gt;
&lt;br /&gt;
===AL Error (fx): Invalid Value at pitch and gain===&lt;br /&gt;
&lt;br /&gt;
===AL Error (sound manager): Invalid Operation at update===&lt;br /&gt;
&lt;br /&gt;
===AL Error (sound manager): Invalid Value at buffer add data&amp;lt;br&amp;gt;No such buffer!===&lt;br /&gt;
&lt;br /&gt;
===Failed to execute command nasal===&lt;br /&gt;
&lt;br /&gt;
===Failed to tie property ... to object methods===&lt;br /&gt;
A JSBSim error.&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayMgr::MP_ProcessData - message from ... has invalid length!===&lt;br /&gt;
&lt;br /&gt;
===GPS: malformed route, index=1===&lt;br /&gt;
&lt;br /&gt;
===Mesa 7.3 implementation error: bad texture level in r300UploadSubImage===&lt;br /&gt;
http://www.flightgear.org/forums/viewtopic.php?f=2&amp;amp;t=6706&amp;amp;start=0&amp;amp;st=0&amp;amp;sk=t&amp;amp;sd=a&lt;br /&gt;
&lt;br /&gt;
===Nasal runtime error: stack overflow===&lt;br /&gt;
&lt;br /&gt;
===No image file for texture, using white===&lt;br /&gt;
A [[Shaders|shader]] error&lt;br /&gt;
&lt;br /&gt;
===No path in /sim/sound/path===&lt;br /&gt;
&lt;br /&gt;
===OpenAL error (AL_ILLEGAL_COMMAND): set_source_pos===&lt;br /&gt;
&lt;br /&gt;
===OpenAL error (AL_ILLEGAL_COMMAND): set_volume===&lt;br /&gt;
&lt;br /&gt;
===PT_vs_hpt: ran out of layers===&lt;br /&gt;
&lt;br /&gt;
===Warning: detected OpenGL error 'invalid value' after RenderBin::draw(,)===&lt;br /&gt;
&lt;br /&gt;
===Warning: GraphicsWindowWin32::grabFocus() - Failed grabbing the focus===&lt;br /&gt;
&lt;br /&gt;
===WARNING: PUI: Too many live puInterfaces open at once!===&lt;br /&gt;
Appears when printing large outputs (very) frequently on the screen.&lt;br /&gt;
&lt;br /&gt;
===Warning: State::drawQuads(0, 154400) too large handle in remapping to ushort glDrawElements===&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|Get rid of common errors]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Howto: Débarrassez-vous des erreurs les plus fréquentes]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Understand_console_output&amp;diff=23292</id>
		<title>Howto:Understand console output</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Understand_console_output&amp;diff=23292"/>
		<updated>2010-08-09T19:44:39Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* Errors with known solutions */ added &amp;quot;Failed to bind receive socket&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists '''[[FlightGear]] errors''', how to get rid of them and other '''console output'''. If FlightGear quits but does not give you any error, try increasing the [[FlightGear Launch Control#Debugging|Log Level]].&lt;br /&gt;
&lt;br /&gt;
Errors can appear in various locations, but the most common one is the console (a black window), which pops up when you run fgfs.exe.&lt;br /&gt;
&lt;br /&gt;
==Errors with known solutions==&lt;br /&gt;
===Airports/.... ... Done===&lt;br /&gt;
This is not an error. The message lets us know that [[TerraSync]] is updating the &amp;lt;tt&amp;gt;[[$FG_SCENERY]]/Airports&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===Base package check failed ... Found version [none] at: ...&amp;lt;br&amp;gt;Please upgrade to version:===&lt;br /&gt;
* FlightGear was unable to find the [[$FG_ROOT]] directory. Set it using the &amp;lt;tt&amp;gt;--fg-root=&amp;lt;/tt&amp;gt; commandline option.&lt;br /&gt;
* When using [[CVS]] with binaries, the data must match the binary. You cannot use data from a different date than the binary's release date.&lt;br /&gt;
&lt;br /&gt;
===condition: comparison without property[1] or value===&lt;br /&gt;
A condition (like &amp;lt;tt&amp;gt;&amp;lt;less-than&amp;gt;&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;&amp;lt;equals&amp;gt;&amp;lt;/tt&amp;gt;) exists, without either:&lt;br /&gt;
* a property to check&lt;br /&gt;
* a value to check the property against&lt;br /&gt;
&lt;br /&gt;
===Could not find at least one of the following objects for animation:===&lt;br /&gt;
This means that FlightGear is unable to find an object in a .ac file. Check the .xml file (where the animation is stored) to see if the object-names match those in the .ac file. If you are not the aircraft's author you can safely ignore such warnings.&lt;br /&gt;
&lt;br /&gt;
===creating 3D noise texture... DONE===&lt;br /&gt;
Tells you that a new noise texture is created. It is not an error and can be ignored.&lt;br /&gt;
&lt;br /&gt;
===Error: [Screen #0] GraphicsWindowWin32::setPixelFormat() - No matching pixel format found based on traits specified====&lt;br /&gt;
Try changing the [[FlightGear Launch Control#Page Four - Options and Run|BPP]] value of your FlightGear setup. If that does not work, your graphics card is probably not able to run FlightGear 1.9 and higher. Another graphics card, or an older FlightGear version will likely &amp;quot;fix&amp;quot; the problem.&lt;br /&gt;
&lt;br /&gt;
===Error: bind() failed in make_server_socket()===&lt;br /&gt;
When using [[Howto: Multiplayer|multiplayer]] or socket input, this usually means you specified an invalid ip address or the port is in use. Note: for multiplayer, you don't need to use the ''--multiplay=in,...'' option at all, FlightGear (since version 1.0) figures out the proper setting automatically. Only use when you know what you are doing.&lt;br /&gt;
&lt;br /&gt;
===Error Building Technique: findAttr: could not find attribute bool===&lt;br /&gt;
Make sure that your data and source (or binary) match. They must be from the same date, to provide the best performance.&lt;br /&gt;
&lt;br /&gt;
===Error: connect() failed in make_client_socket()&amp;lt;br&amp;gt;SG_IO_OUT socket creation failed===&lt;br /&gt;
Your computer is not connected with the internet.&lt;br /&gt;
&lt;br /&gt;
===Error: RenderTexture requires the following unsupported OpenGL extensions...===&lt;br /&gt;
Your graphics card doesn't support some graphics feature that FG requires. Update your drivers, change the BPP value and/or try disabling some of the visual goodies like [[3D Clouds]].&lt;br /&gt;
&lt;br /&gt;
===Failed to find .... in apt.dat.gz===&lt;br /&gt;
You need to edit ATC/default.tower and ATC/default.atis. You can open these files with any text editor. Either remove or fix the entries containing your airports ICAO code (like KSFO).&lt;br /&gt;
&lt;br /&gt;
===Failed to open file ...===&lt;br /&gt;
Check if the file exists on your system. If the missing file is a scenery object; be sure you have the latest [http://scenemodels.flightgear.org/download/SharedModels.tgz Shared Models] from the [[FlightGear Scenery Database]].&lt;br /&gt;
&lt;br /&gt;
===Fatal error: mismatched tag ...===&lt;br /&gt;
In some .xml file, an opening tag (like &amp;lt;tt&amp;gt;&amp;lt;sim&amp;gt;&amp;lt;/tt&amp;gt;) does not match its closing tag (like &amp;lt;tt&amp;gt;&amp;lt;/sim&amp;gt;&amp;lt;/tt&amp;gt;). This error is hard to track down, best method is to comment (place code between &amp;lt;nowiki&amp;gt;&amp;lt;!-- and --&amp;gt;&amp;lt;/nowiki&amp;gt;) most of the aircraft. Then uncomment code one by one, until the error appears again.&lt;br /&gt;
&lt;br /&gt;
===Fatal error: name must begin with alpha or '_'===&lt;br /&gt;
This error comes up when a property should be formed of which the name does not start with a letter of the alphabet or _. If this error only happens with certain planes, contact their authors.&lt;br /&gt;
&lt;br /&gt;
===Fatal error: unclosed token===&lt;br /&gt;
A token (&amp;lt;nowiki&amp;gt;&amp;lt;!-- --&amp;gt;&amp;lt;/nowiki&amp;gt;) has been started, but not closes. Add &amp;lt;nowiki&amp;gt;--&amp;gt;&amp;lt;/nowiki&amp;gt; at the correct line.&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayMgr::MP_ProcessData: No such file or directory===&lt;br /&gt;
This is telling you that there's someone online on the multiplayerserver, using a plane that you do not have installed on your own system. In order to remove the error (and see the other plane) you have to install the plane that the other pilot is using.&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayMgr - No receiver port, Multiplayermode disabled===&lt;br /&gt;
FlightGear [[Howto: Multiplayer|multiplayer]] has not been set.&lt;br /&gt;
&lt;br /&gt;
===FGPropertyManager::GetNode() No node found for ...&amp;lt;br&amp;gt;  In component: ... unknown property ... referenced. Aborting===&lt;br /&gt;
FlightGear found a reference in the [[FDM]] to a non-existing property.&lt;br /&gt;
&lt;br /&gt;
===FGPropertyManager::GetNode() No node found for ...&amp;lt;br&amp;gt; The property ... is undefined.===&lt;br /&gt;
FlightGear found a reference in the [[FDM]] to a non-existing property. Keep in mind that JSBSim reads the FDM from top to bottom. Properties should always be created before they are needed somewhere.&lt;br /&gt;
&lt;br /&gt;
===Fgtzfile_read(): : Invalid argument&amp;lt;br&amp;gt;Fatal error: Timezone reading failed===&lt;br /&gt;
This one is caused by wrong line ending in a timezone file. Solution might be to download the Timezone/time.tab file manually from [http://gitorious.org/fg/fgdata/blobs/raw/master/Timezone/zone.tab Gitorious] (Right mouseclick &amp;gt; Save target as) and overwrite the file in &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Timezone/time.tab&amp;lt;/tt&amp;gt; with it.&lt;br /&gt;
&lt;br /&gt;
===Found unexpected subsystem: system exiting. JSBSim failed to load aircraft and/or engine model===&lt;br /&gt;
You are probably trying to run an aircraft on a out-of-date version of FlightGear. The planes on the official download page are intended to be used with the latest version of FlightGear. Usage on any older systems may not work.&lt;br /&gt;
&lt;br /&gt;
===freeglut (fgfs): Unable to create direct context rendering for window 'FlightGear'&amp;lt;br&amp;gt;This may hurt performance===&lt;br /&gt;
This reports that you do not have proper hardware accelerated 3D (direct rendering) configured.&lt;br /&gt;
&lt;br /&gt;
===Gate ... doesn't seem to have routes associated with it===&lt;br /&gt;
A startup location in the [[Interactive Traffic#Ground networks|groundnetwork]] is not (properly) connected to a taxi route. Contact the airport author, or import the network to [[TaxiDraw]] and run the Verify network command to find the corrupted gate.&lt;br /&gt;
&lt;br /&gt;
===glLinkProgram &amp;quot;&amp;quot; Failed===&lt;br /&gt;
Update your drivers; they have to support atleast OpenGL 2.0 for FlightGear 2.0 and later.&lt;br /&gt;
&lt;br /&gt;
===loading scenario '...'===&lt;br /&gt;
This is not an error. It shows that an [[AI Systems#AI Models|AI scenario]] is loaded.&lt;br /&gt;
&lt;br /&gt;
===Model not found: ...===&lt;br /&gt;
This one tells you that FlightGear was unable to find a certain file. The nice thing is that it also tells you excactly what file. &lt;br /&gt;
&lt;br /&gt;
# Check if the file really does not exist at your computer.&lt;br /&gt;
# Try to locate the file in which the missing file is referenced. This is likely to be &amp;lt;tt&amp;gt;-set.xml&amp;lt;/tt&amp;gt; in the root directory of the loaded [[aircraft]]. Between the &amp;lt;model&amp;gt; tags, the base model file is referenced. This file references to all other models that are displayed with the aircraft.&lt;br /&gt;
# Contact the aircraft author with a detailed bug-report, in which you state the excact location of the missing file and (if you found it) the file in which it is referenced.&lt;br /&gt;
&lt;br /&gt;
===Nasal runtime error: nil used in numeric context===&lt;br /&gt;
This error is [[Nasal]] triggered by a Nasal file (the console should show what file (and line) and from where it was referenced). The Nasal script tried to do something with a [[Property Tree|property]] with an empty value. A solution is to fill the property before the Nasal is loaded. This can be done by setting the property in an [[aircraft]]'s &amp;lt;tt&amp;gt;-set.xml&amp;lt;/tt&amp;gt; file or by adding a [[Nasal scripting language#Listeners and Signals|listener]] to the script. &lt;br /&gt;
&lt;br /&gt;
[[Howto: Contact the developers|Contact the developers]] if this error is shown for a &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Nasal/&amp;lt;/tt&amp;gt; script.&lt;br /&gt;
&lt;br /&gt;
===Near camera not rendering===&lt;br /&gt;
[[Image:Near_camera_off.png|500px]]&lt;br /&gt;
&lt;br /&gt;
If you screen looks like the image above; make sure you have at least [[OSG]] version 2.7.6.&lt;br /&gt;
&lt;br /&gt;
===No render bin name specified in render bin section===&lt;br /&gt;
Update [[SimGear]] (or binary) and your data directory.&lt;br /&gt;
&lt;br /&gt;
===No render bin number specified in render bin section===&lt;br /&gt;
Update [[SimGear]] (or binary) and your data directory.&lt;br /&gt;
&lt;br /&gt;
===... not a valid win32 application===&lt;br /&gt;
This Windows error could have various reasons to pop up. Usually, the file that is causing troubles is mentioned. Re-installing this file might solve the problem.&lt;br /&gt;
&lt;br /&gt;
===OBJECT_SIGN: unsupported glyph `.'===&lt;br /&gt;
Check the OBJECT_SIGN lines in the .stg file of the tile that was loaded when this error showed up.&lt;br /&gt;
&lt;br /&gt;
===OpenAL error &amp;lt;AL_INVALID_VALUE&amp;gt;: bind source &amp;lt;alGenSources&amp;gt;&amp;lt;br&amp;gt;Failed to generate audio source.===&lt;br /&gt;
This error is probably displayed because of some misdirected audio settings in the [[aircraft]]s setup. Check the -sound.xml file of the aircraft and see if all files refered to really exist. If not, try to contact the author of the plane, so he can fix the problem in the [[FlightGear CVS|CVS]] version or solve the problem yourself and let someone commit the patch.&lt;br /&gt;
&lt;br /&gt;
===OpenAL error (AL_INVALID_VALUE): constructor (alBufferData)&amp;lt;br&amp;gt;Fatal error: Failed to buffer data.===&lt;br /&gt;
Disabling sound is a temporarily solution for this problem.&lt;br /&gt;
&lt;br /&gt;
===osgDB ac3d reader: could not find texture...===&lt;br /&gt;
See [[#Failed to open file ...|Failed to open file ...]]&lt;br /&gt;
&lt;br /&gt;
===osgDB ac3d reader: detected surface with less than 3 vertices!===&lt;br /&gt;
In one of the loaded models a non-existing surface is found. This can be a single line (sometimes used to simulate thin wires) or a fault in the model.&lt;br /&gt;
&lt;br /&gt;
===Program's vertex attrib binding ..., usrAttr...===&lt;br /&gt;
Tells you that an effect binded certain attributes to a [[Shaders|shader]].&lt;br /&gt;
&lt;br /&gt;
===QNAN===&lt;br /&gt;
(Q)NAN stands for (Quiet) Not A Number, produced by 0/0 or other floating point break downs. There can be various causes for this:&lt;br /&gt;
* Using a &amp;quot;flap start&amp;quot; value of 0 in the [[YASim]] [[FDM]]. Use some small value like 0.001 instead.&lt;br /&gt;
&lt;br /&gt;
===Scaling image...===&lt;br /&gt;
This means a texture, whether in the scenery on your aircraft or anyone elses (when multiplayer is enabled), is not sized to powers of two. All textures in FlightGear have to be sized to power of two (eg. 16*16, 32*64, 32*1024). As of version 1.9 textures are resized automaticly, but it does slow your computer down, so it's better to resize the noted textures.&lt;br /&gt;
&lt;br /&gt;
===ssgInit called without a valid OpenGL context===&lt;br /&gt;
In short, your GL libraries are broken. So far only Red Hat 7.x users have experienced this (see http://www.redhat.com/bugzilla/show_bug.cgi?id=18867). The only solutions are possibly complicated ones: you can either change distributions (most of us prefer Debian) or upgrade/downgrade your Mesa libs.&lt;br /&gt;
&lt;br /&gt;
===The system cannot find the file specified===&lt;br /&gt;
If you are running Windows Vista; start by looking in &amp;lt;tt&amp;gt;C:\Users\Owner\AppData\Local\VirtualStore&amp;lt;/tt&amp;gt; and seeing if you have a folder called FlightGear in there. If you do, cut-and-paste (merge) that one with &amp;lt;tt&amp;gt;C:\Program Files\Flightgear&amp;lt;/tt&amp;gt; and try to launch FlightGear again.&lt;br /&gt;
&lt;br /&gt;
'''Hint:''' you may need to go under Tools and Folder Options to specify &amp;quot;Show Hidden/System Files and Folders&amp;quot; in order for AppData to be visible.&lt;br /&gt;
&lt;br /&gt;
===Time zone reading failed===&lt;br /&gt;
This is probably caused by a line-ending problem in the timezone files. Win32 users can resolve the problem by downloading a DOS to UNIX conversion utility available at http://www.nottingham.ac.uk/~eazdluf/d2u.zip. Run as `d2u *.tab` from within the timezone directory to fix your timezone files&lt;br /&gt;
&lt;br /&gt;
===Traffic manager could not find airport===&lt;br /&gt;
There is either an airport missing from apt.dat, or there is a wrong ICAO code in a [[Interactive Traffic#Building Traffic Files|traffic file]]. An airport missing from apt.dat could be due to a recent opening.&lt;br /&gt;
&lt;br /&gt;
===Unable to choose requested pixel format===&lt;br /&gt;
Error should be solved as of version 1.9. If not, try changing your [[FlightGear Launch Control#Page Four - Options and Run|BPP]] and/or resolution.&lt;br /&gt;
&lt;br /&gt;
===Unable to find airport details for .... in FGTower::Init()===&lt;br /&gt;
This error can be surpressed by disabling [[Interactive Traffic|AI Traffic]], via the AI/ATC [[menu]].&lt;br /&gt;
&lt;br /&gt;
The error appears when an airport in &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Airports/apt.dat.gz&amp;lt;/tt&amp;gt; cannot be found in &amp;lt;tt&amp;gt;[[$FG_ROOT]]/ATC/default.tower&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;[[$FG_ROOT]]/ATC/default.atis&amp;lt;/tt&amp;gt;. Renaming the airports in the apt.dat.gz file ór in both default ATC files will fix the problem.&lt;br /&gt;
&lt;br /&gt;
===Unable to open aircraft directory===&lt;br /&gt;
The [[aircraft]] that you are trying to run most likely relies on another aircraft, which you did not install (yet). The error shows what aircraft, so go download that one!&lt;br /&gt;
=== Unexpected tag '...' found in YASim aircraft description===&lt;br /&gt;
FlightGear found a non-existing tag in the [[FDM]] of the aircraft you are trying to launch. If you have not changed the original aircraft, contact the aircraft author. Else, check the FDM througly for mistakes.&lt;br /&gt;
&lt;br /&gt;
=== Unknown ... aircraft: ... defaulting to C172 ===&lt;br /&gt;
FlightGear is unable to load the forced [[FDM]] (set through &amp;lt;tt&amp;gt;--fdm=...&amp;lt;/tt&amp;gt; or via &amp;lt;tt&amp;gt;Advanced &amp;gt; Flight Model&amp;lt;/tt&amp;gt; in [[FGRun]]) for this aircraft. FlightGear automatically picks the right FDM for each aircraft, so there is no need to set it manually, unless you know what you are doing. In the Flight Model dialog of FGRun, set the FDM to &amp;lt;tt&amp;gt;jsb&amp;lt;/tt&amp;gt;; that is the &amp;quot;auto setting&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Unknown exception to the main loop. Aborting... &amp;lt;br&amp;gt;Possible cause: No such file or directory===&lt;br /&gt;
This error could have a variety of sources, among them missing files but also other things. Increasing the [[FlightGear_Launch_Control#Debugging|log level]] to debug and repeating excactly what you did when the error came up, might provide some more information on what FlightGear was doing when the error occurred.&lt;br /&gt;
* Setting your [[FlightGear Launch Control#Page Four - Options and Run|BPP]] to a lower value might work.&lt;br /&gt;
* Changing the resolution to a smaller one might work as well.&lt;br /&gt;
&lt;br /&gt;
===WARNING: Couldn't convert texture...===&lt;br /&gt;
You are trying to run an aircraft not compatible with your FlightGear version. Most of the time, this error appears when you fly an aircraft, textured with .png files on versions older than 1.9. Convert the textures manually to .rgb or upgrade your FlightGear version.&lt;br /&gt;
&lt;br /&gt;
===Warning: Picked up TriangleIntersect===&lt;br /&gt;
Reduce your [[FlightGear Launch Control#Debugging|Log Level]] to alert. Or [[Showstoppers|send the fgfs output to /dev/null (unix systems) or 2&amp;gt;nul (Windows)]]. The errors might still be shown, but do not affect the sim anymore.&lt;br /&gt;
&lt;br /&gt;
===Warning: TangentSpaceGenerator: unknown primitive mode 9===&lt;br /&gt;
This is an [[OSG]] error, showing up when an effect needs tangent vectors, but polygons are not support. The error itself can be ignored, altough some [[shaders]] may look wrong. Shader developers should try to minimise the use of polygons and use triangles and quads instead.&lt;br /&gt;
&lt;br /&gt;
===YASim SOLUTION FAILURE: Solution failed to converge after 10000 iterations===&lt;br /&gt;
Some control in the [[YASim]] [[FDM]] is too weak, according to YASim, to control the aircraft. An effectiveness tag will be required in the FDM to solve this error.&lt;br /&gt;
&lt;br /&gt;
===YASim SOLUTION FAILURE:&amp;lt;br&amp;gt;Zero length fuselage===&lt;br /&gt;
There is a problem in the [[FDM]]. A fuselage section with similar ax and ay was created. Change the ax and/or ay values to match the aircraft.&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayerMgr::Open - Failed to bind receive socket===&lt;br /&gt;
&lt;br /&gt;
This means FlightGear was unable to open the listening network socket required by the --multiplay=in option. Frequently this option can be omitted and FlightGear will figure out the necessary parameters automatically.&lt;br /&gt;
Common reasons are:&lt;br /&gt;
* Address given in the option does not resolve to one of the IP addresses of the local machine. This parameter should only be required if you want to fine-tune the network behavior. Omitting it directs FlightGear to listen on all local interfaces automatically. Example:&lt;br /&gt;
 --multiplay=in,10,,5001&lt;br /&gt;
Notice that you still need the comma.&lt;br /&gt;
* The UDP port given in the option (or the default port 5000 if no option given) is already in use. Verify nothing is using the port.&lt;br /&gt;
&lt;br /&gt;
==Errors without known solutions==&lt;br /&gt;
Please take a look at the upcoming errors and see if you know a solution to get rid of them. Your additions are greatly appreciated!&lt;br /&gt;
&lt;br /&gt;
===AL Error (fx): Invalid Value at pitch and gain===&lt;br /&gt;
&lt;br /&gt;
===AL Error (sound manager): Invalid Operation at update===&lt;br /&gt;
&lt;br /&gt;
===AL Error (sound manager): Invalid Value at buffer add data&amp;lt;br&amp;gt;No such buffer!===&lt;br /&gt;
&lt;br /&gt;
===Failed to execute command nasal===&lt;br /&gt;
&lt;br /&gt;
===Failed to tie property ... to object methods===&lt;br /&gt;
A JSBSim error.&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayMgr::MP_ProcessData - message from ... has invalid length!===&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayerMgr::Open - Failed to bind recieve socket===&lt;br /&gt;
&lt;br /&gt;
===GPS: malformed route, index=1===&lt;br /&gt;
&lt;br /&gt;
===Mesa 7.3 implementation error: bad texture level in r300UploadSubImage===&lt;br /&gt;
http://www.flightgear.org/forums/viewtopic.php?f=2&amp;amp;t=6706&amp;amp;start=0&amp;amp;st=0&amp;amp;sk=t&amp;amp;sd=a&lt;br /&gt;
&lt;br /&gt;
===Nasal runtime error: stack overflow===&lt;br /&gt;
&lt;br /&gt;
===No image file for texture, using white===&lt;br /&gt;
A [[Shaders|shader]] error&lt;br /&gt;
&lt;br /&gt;
===No path in /sim/sound/path===&lt;br /&gt;
&lt;br /&gt;
===OpenAL error (AL_ILLEGAL_COMMAND): set_source_pos===&lt;br /&gt;
&lt;br /&gt;
===OpenAL error (AL_ILLEGAL_COMMAND): set_volume===&lt;br /&gt;
&lt;br /&gt;
===PT_vs_hpt: ran out of layers===&lt;br /&gt;
&lt;br /&gt;
===Warning: detected OpenGL error 'invalid value' after RenderBin::draw(,)===&lt;br /&gt;
&lt;br /&gt;
===Warning: GraphicsWindowWin32::grabFocus() - Failed grabbing the focus===&lt;br /&gt;
&lt;br /&gt;
===WARNING: PUI: Too many live puInterfaces open at once!===&lt;br /&gt;
Appears when printing large outputs (very) frequently on the screen.&lt;br /&gt;
&lt;br /&gt;
===Warning: State::drawQuads(0, 154400) too large handle in remapping to ushort glDrawElements===&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|Get rid of common errors]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Howto: Débarrassez-vous des erreurs les plus fréquentes]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Understand_console_output&amp;diff=23290</id>
		<title>Howto:Understand console output</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Understand_console_output&amp;diff=23290"/>
		<updated>2010-08-09T19:29:06Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* Errors without known solutions */ fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists '''[[FlightGear]] errors''', how to get rid of them and other '''console output'''. If FlightGear quits but does not give you any error, try increasing the [[FlightGear Launch Control#Debugging|Log Level]].&lt;br /&gt;
&lt;br /&gt;
Errors can appear in various locations, but the most common one is the console (a black window), which pops up when you run fgfs.exe.&lt;br /&gt;
&lt;br /&gt;
==Errors with known solutions==&lt;br /&gt;
===Airports/.... ... Done===&lt;br /&gt;
This is not an error. The message lets us know that [[TerraSync]] is updating the &amp;lt;tt&amp;gt;[[$FG_SCENERY]]/Airports&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===Base package check failed ... Found version [none] at: ...&amp;lt;br&amp;gt;Please upgrade to version:===&lt;br /&gt;
* FlightGear was unable to find the [[$FG_ROOT]] directory. Set it using the &amp;lt;tt&amp;gt;--fg-root=&amp;lt;/tt&amp;gt; commandline option.&lt;br /&gt;
* When using [[CVS]] with binaries, the data must match the binary. You cannot use data from a different date than the binary's release date.&lt;br /&gt;
&lt;br /&gt;
===condition: comparison without property[1] or value===&lt;br /&gt;
A condition (like &amp;lt;tt&amp;gt;&amp;lt;less-than&amp;gt;&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;&amp;lt;equals&amp;gt;&amp;lt;/tt&amp;gt;) exists, without either:&lt;br /&gt;
* a property to check&lt;br /&gt;
* a value to check the property against&lt;br /&gt;
&lt;br /&gt;
===Could not find at least one of the following objects for animation:===&lt;br /&gt;
This means that FlightGear is unable to find an object in a .ac file. Check the .xml file (where the animation is stored) to see if the object-names match those in the .ac file. If you are not the aircraft's author you can safely ignore such warnings.&lt;br /&gt;
&lt;br /&gt;
===creating 3D noise texture... DONE===&lt;br /&gt;
Tells you that a new noise texture is created. It is not an error and can be ignored.&lt;br /&gt;
&lt;br /&gt;
===Error: [Screen #0] GraphicsWindowWin32::setPixelFormat() - No matching pixel format found based on traits specified====&lt;br /&gt;
Try changing the [[FlightGear Launch Control#Page Four - Options and Run|BPP]] value of your FlightGear setup. If that does not work, your graphics card is probably not able to run FlightGear 1.9 and higher. Another graphics card, or an older FlightGear version will likely &amp;quot;fix&amp;quot; the problem.&lt;br /&gt;
&lt;br /&gt;
===Error: bind() failed in make_server_socket()===&lt;br /&gt;
When using [[Howto: Multiplayer|multiplayer]] or socket input, this usually means you specified an invalid ip address or the port is in use. Note: for multiplayer, you don't need to use the ''--multiplay=in,...'' option at all, FlightGear (since version 1.0) figures out the proper setting automatically. Only use when you know what you are doing.&lt;br /&gt;
&lt;br /&gt;
===Error Building Technique: findAttr: could not find attribute bool===&lt;br /&gt;
Make sure that your data and source (or binary) match. They must be from the same date, to provide the best performance.&lt;br /&gt;
&lt;br /&gt;
===Error: connect() failed in make_client_socket()&amp;lt;br&amp;gt;SG_IO_OUT socket creation failed===&lt;br /&gt;
Your computer is not connected with the internet.&lt;br /&gt;
&lt;br /&gt;
===Error: RenderTexture requires the following unsupported OpenGL extensions...===&lt;br /&gt;
Your graphics card doesn't support some graphics feature that FG requires. Update your drivers, change the BPP value and/or try disabling some of the visual goodies like [[3D Clouds]].&lt;br /&gt;
&lt;br /&gt;
===Failed to find .... in apt.dat.gz===&lt;br /&gt;
You need to edit ATC/default.tower and ATC/default.atis. You can open these files with any text editor. Either remove or fix the entries containing your airports ICAO code (like KSFO).&lt;br /&gt;
&lt;br /&gt;
===Failed to open file ...===&lt;br /&gt;
Check if the file exists on your system. If the missing file is a scenery object; be sure you have the latest [http://scenemodels.flightgear.org/download/SharedModels.tgz Shared Models] from the [[FlightGear Scenery Database]].&lt;br /&gt;
&lt;br /&gt;
===Fatal error: mismatched tag ...===&lt;br /&gt;
In some .xml file, an opening tag (like &amp;lt;tt&amp;gt;&amp;lt;sim&amp;gt;&amp;lt;/tt&amp;gt;) does not match its closing tag (like &amp;lt;tt&amp;gt;&amp;lt;/sim&amp;gt;&amp;lt;/tt&amp;gt;). This error is hard to track down, best method is to comment (place code between &amp;lt;nowiki&amp;gt;&amp;lt;!-- and --&amp;gt;&amp;lt;/nowiki&amp;gt;) most of the aircraft. Then uncomment code one by one, until the error appears again.&lt;br /&gt;
&lt;br /&gt;
===Fatal error: name must begin with alpha or '_'===&lt;br /&gt;
This error comes up when a property should be formed of which the name does not start with a letter of the alphabet or _. If this error only happens with certain planes, contact their authors.&lt;br /&gt;
&lt;br /&gt;
===Fatal error: unclosed token===&lt;br /&gt;
A token (&amp;lt;nowiki&amp;gt;&amp;lt;!-- --&amp;gt;&amp;lt;/nowiki&amp;gt;) has been started, but not closes. Add &amp;lt;nowiki&amp;gt;--&amp;gt;&amp;lt;/nowiki&amp;gt; at the correct line.&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayMgr::MP_ProcessData: No such file or directory===&lt;br /&gt;
This is telling you that there's someone online on the multiplayerserver, using a plane that you do not have installed on your own system. In order to remove the error (and see the other plane) you have to install the plane that the other pilot is using.&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayMgr - No receiver port, Multiplayermode disabled===&lt;br /&gt;
FlightGear [[Howto: Multiplayer|multiplayer]] has not been set.&lt;br /&gt;
&lt;br /&gt;
===FGPropertyManager::GetNode() No node found for ...&amp;lt;br&amp;gt;  In component: ... unknown property ... referenced. Aborting===&lt;br /&gt;
FlightGear found a reference in the [[FDM]] to a non-existing property.&lt;br /&gt;
&lt;br /&gt;
===FGPropertyManager::GetNode() No node found for ...&amp;lt;br&amp;gt; The property ... is undefined.===&lt;br /&gt;
FlightGear found a reference in the [[FDM]] to a non-existing property. Keep in mind that JSBSim reads the FDM from top to bottom. Properties should always be created before they are needed somewhere.&lt;br /&gt;
&lt;br /&gt;
===Fgtzfile_read(): : Invalid argument&amp;lt;br&amp;gt;Fatal error: Timezone reading failed===&lt;br /&gt;
This one is caused by wrong line ending in a timezone file. Solution might be to download the Timezone/time.tab file manually from [http://gitorious.org/fg/fgdata/blobs/raw/master/Timezone/zone.tab Gitorious] (Right mouseclick &amp;gt; Save target as) and overwrite the file in &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Timezone/time.tab&amp;lt;/tt&amp;gt; with it.&lt;br /&gt;
&lt;br /&gt;
===Found unexpected subsystem: system exiting. JSBSim failed to load aircraft and/or engine model===&lt;br /&gt;
You are probably trying to run an aircraft on a out-of-date version of FlightGear. The planes on the official download page are intended to be used with the latest version of FlightGear. Usage on any older systems may not work.&lt;br /&gt;
&lt;br /&gt;
===freeglut (fgfs): Unable to create direct context rendering for window 'FlightGear'&amp;lt;br&amp;gt;This may hurt performance===&lt;br /&gt;
This reports that you do not have proper hardware accelerated 3D (direct rendering) configured.&lt;br /&gt;
&lt;br /&gt;
===Gate ... doesn't seem to have routes associated with it===&lt;br /&gt;
A startup location in the [[Interactive Traffic#Ground networks|groundnetwork]] is not (properly) connected to a taxi route. Contact the airport author, or import the network to [[TaxiDraw]] and run the Verify network command to find the corrupted gate.&lt;br /&gt;
&lt;br /&gt;
===glLinkProgram &amp;quot;&amp;quot; Failed===&lt;br /&gt;
Update your drivers; they have to support atleast OpenGL 2.0 for FlightGear 2.0 and later.&lt;br /&gt;
&lt;br /&gt;
===loading scenario '...'===&lt;br /&gt;
This is not an error. It shows that an [[AI Systems#AI Models|AI scenario]] is loaded.&lt;br /&gt;
&lt;br /&gt;
===Model not found: ...===&lt;br /&gt;
This one tells you that FlightGear was unable to find a certain file. The nice thing is that it also tells you excactly what file. &lt;br /&gt;
&lt;br /&gt;
# Check if the file really does not exist at your computer.&lt;br /&gt;
# Try to locate the file in which the missing file is referenced. This is likely to be &amp;lt;tt&amp;gt;-set.xml&amp;lt;/tt&amp;gt; in the root directory of the loaded [[aircraft]]. Between the &amp;lt;model&amp;gt; tags, the base model file is referenced. This file references to all other models that are displayed with the aircraft.&lt;br /&gt;
# Contact the aircraft author with a detailed bug-report, in which you state the excact location of the missing file and (if you found it) the file in which it is referenced.&lt;br /&gt;
&lt;br /&gt;
===Nasal runtime error: nil used in numeric context===&lt;br /&gt;
This error is [[Nasal]] triggered by a Nasal file (the console should show what file (and line) and from where it was referenced). The Nasal script tried to do something with a [[Property Tree|property]] with an empty value. A solution is to fill the property before the Nasal is loaded. This can be done by setting the property in an [[aircraft]]'s &amp;lt;tt&amp;gt;-set.xml&amp;lt;/tt&amp;gt; file or by adding a [[Nasal scripting language#Listeners and Signals|listener]] to the script. &lt;br /&gt;
&lt;br /&gt;
[[Howto: Contact the developers|Contact the developers]] if this error is shown for a &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Nasal/&amp;lt;/tt&amp;gt; script.&lt;br /&gt;
&lt;br /&gt;
===Near camera not rendering===&lt;br /&gt;
[[Image:Near_camera_off.png|500px]]&lt;br /&gt;
&lt;br /&gt;
If you screen looks like the image above; make sure you have at least [[OSG]] version 2.7.6.&lt;br /&gt;
&lt;br /&gt;
===No render bin name specified in render bin section===&lt;br /&gt;
Update [[SimGear]] (or binary) and your data directory.&lt;br /&gt;
&lt;br /&gt;
===No render bin number specified in render bin section===&lt;br /&gt;
Update [[SimGear]] (or binary) and your data directory.&lt;br /&gt;
&lt;br /&gt;
===... not a valid win32 application===&lt;br /&gt;
This Windows error could have various reasons to pop up. Usually, the file that is causing troubles is mentioned. Re-installing this file might solve the problem.&lt;br /&gt;
&lt;br /&gt;
===OBJECT_SIGN: unsupported glyph `.'===&lt;br /&gt;
Check the OBJECT_SIGN lines in the .stg file of the tile that was loaded when this error showed up.&lt;br /&gt;
&lt;br /&gt;
===OpenAL error &amp;lt;AL_INVALID_VALUE&amp;gt;: bind source &amp;lt;alGenSources&amp;gt;&amp;lt;br&amp;gt;Failed to generate audio source.===&lt;br /&gt;
This error is probably displayed because of some misdirected audio settings in the [[aircraft]]s setup. Check the -sound.xml file of the aircraft and see if all files refered to really exist. If not, try to contact the author of the plane, so he can fix the problem in the [[FlightGear CVS|CVS]] version or solve the problem yourself and let someone commit the patch.&lt;br /&gt;
&lt;br /&gt;
===OpenAL error (AL_INVALID_VALUE): constructor (alBufferData)&amp;lt;br&amp;gt;Fatal error: Failed to buffer data.===&lt;br /&gt;
Disabling sound is a temporarily solution for this problem.&lt;br /&gt;
&lt;br /&gt;
===osgDB ac3d reader: could not find texture...===&lt;br /&gt;
See [[#Failed to open file ...|Failed to open file ...]]&lt;br /&gt;
&lt;br /&gt;
===osgDB ac3d reader: detected surface with less than 3 vertices!===&lt;br /&gt;
In one of the loaded models a non-existing surface is found. This can be a single line (sometimes used to simulate thin wires) or a fault in the model.&lt;br /&gt;
&lt;br /&gt;
===Program's vertex attrib binding ..., usrAttr...===&lt;br /&gt;
Tells you that an effect binded certain attributes to a [[Shaders|shader]].&lt;br /&gt;
&lt;br /&gt;
===QNAN===&lt;br /&gt;
(Q)NAN stands for (Quiet) Not A Number, produced by 0/0 or other floating point break downs. There can be various causes for this:&lt;br /&gt;
* Using a &amp;quot;flap start&amp;quot; value of 0 in the [[YASim]] [[FDM]]. Use some small value like 0.001 instead.&lt;br /&gt;
&lt;br /&gt;
===Scaling image...===&lt;br /&gt;
This means a texture, whether in the scenery on your aircraft or anyone elses (when multiplayer is enabled), is not sized to powers of two. All textures in FlightGear have to be sized to power of two (eg. 16*16, 32*64, 32*1024). As of version 1.9 textures are resized automaticly, but it does slow your computer down, so it's better to resize the noted textures.&lt;br /&gt;
&lt;br /&gt;
===ssgInit called without a valid OpenGL context===&lt;br /&gt;
In short, your GL libraries are broken. So far only Red Hat 7.x users have experienced this (see http://www.redhat.com/bugzilla/show_bug.cgi?id=18867). The only solutions are possibly complicated ones: you can either change distributions (most of us prefer Debian) or upgrade/downgrade your Mesa libs.&lt;br /&gt;
&lt;br /&gt;
===The system cannot find the file specified===&lt;br /&gt;
If you are running Windows Vista; start by looking in &amp;lt;tt&amp;gt;C:\Users\Owner\AppData\Local\VirtualStore&amp;lt;/tt&amp;gt; and seeing if you have a folder called FlightGear in there. If you do, cut-and-paste (merge) that one with &amp;lt;tt&amp;gt;C:\Program Files\Flightgear&amp;lt;/tt&amp;gt; and try to launch FlightGear again.&lt;br /&gt;
&lt;br /&gt;
'''Hint:''' you may need to go under Tools and Folder Options to specify &amp;quot;Show Hidden/System Files and Folders&amp;quot; in order for AppData to be visible.&lt;br /&gt;
&lt;br /&gt;
===Time zone reading failed===&lt;br /&gt;
This is probably caused by a line-ending problem in the timezone files. Win32 users can resolve the problem by downloading a DOS to UNIX conversion utility available at http://www.nottingham.ac.uk/~eazdluf/d2u.zip. Run as `d2u *.tab` from within the timezone directory to fix your timezone files&lt;br /&gt;
&lt;br /&gt;
===Traffic manager could not find airport===&lt;br /&gt;
There is either an airport missing from apt.dat, or there is a wrong ICAO code in a [[Interactive Traffic#Building Traffic Files|traffic file]]. An airport missing from apt.dat could be due to a recent opening.&lt;br /&gt;
&lt;br /&gt;
===Unable to choose requested pixel format===&lt;br /&gt;
Error should be solved as of version 1.9. If not, try changing your [[FlightGear Launch Control#Page Four - Options and Run|BPP]] and/or resolution.&lt;br /&gt;
&lt;br /&gt;
===Unable to find airport details for .... in FGTower::Init()===&lt;br /&gt;
This error can be surpressed by disabling [[Interactive Traffic|AI Traffic]], via the AI/ATC [[menu]].&lt;br /&gt;
&lt;br /&gt;
The error appears when an airport in &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Airports/apt.dat.gz&amp;lt;/tt&amp;gt; cannot be found in &amp;lt;tt&amp;gt;[[$FG_ROOT]]/ATC/default.tower&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;[[$FG_ROOT]]/ATC/default.atis&amp;lt;/tt&amp;gt;. Renaming the airports in the apt.dat.gz file ór in both default ATC files will fix the problem.&lt;br /&gt;
&lt;br /&gt;
===Unable to open aircraft directory===&lt;br /&gt;
The [[aircraft]] that you are trying to run most likely relies on another aircraft, which you did not install (yet). The error shows what aircraft, so go download that one!&lt;br /&gt;
=== Unexpected tag '...' found in YASim aircraft description===&lt;br /&gt;
FlightGear found a non-existing tag in the [[FDM]] of the aircraft you are trying to launch. If you have not changed the original aircraft, contact the aircraft author. Else, check the FDM througly for mistakes.&lt;br /&gt;
&lt;br /&gt;
=== Unknown ... aircraft: ... defaulting to C172 ===&lt;br /&gt;
FlightGear is unable to load the forced [[FDM]] (set through &amp;lt;tt&amp;gt;--fdm=...&amp;lt;/tt&amp;gt; or via &amp;lt;tt&amp;gt;Advanced &amp;gt; Flight Model&amp;lt;/tt&amp;gt; in [[FGRun]]) for this aircraft. FlightGear automatically picks the right FDM for each aircraft, so there is no need to set it manually, unless you know what you are doing. In the Flight Model dialog of FGRun, set the FDM to &amp;lt;tt&amp;gt;jsb&amp;lt;/tt&amp;gt;; that is the &amp;quot;auto setting&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Unknown exception to the main loop. Aborting... &amp;lt;br&amp;gt;Possible cause: No such file or directory===&lt;br /&gt;
This error could have a variety of sources, among them missing files but also other things. Increasing the [[FlightGear_Launch_Control#Debugging|log level]] to debug and repeating excactly what you did when the error came up, might provide some more information on what FlightGear was doing when the error occurred.&lt;br /&gt;
* Setting your [[FlightGear Launch Control#Page Four - Options and Run|BPP]] to a lower value might work.&lt;br /&gt;
* Changing the resolution to a smaller one might work as well.&lt;br /&gt;
&lt;br /&gt;
===WARNING: Couldn't convert texture...===&lt;br /&gt;
You are trying to run an aircraft not compatible with your FlightGear version. Most of the time, this error appears when you fly an aircraft, textured with .png files on versions older than 1.9. Convert the textures manually to .rgb or upgrade your FlightGear version.&lt;br /&gt;
&lt;br /&gt;
===Warning: Picked up TriangleIntersect===&lt;br /&gt;
Reduce your [[FlightGear Launch Control#Debugging|Log Level]] to alert. Or [[Showstoppers|send the fgfs output to /dev/null (unix systems) or 2&amp;gt;nul (Windows)]]. The errors might still be shown, but do not affect the sim anymore.&lt;br /&gt;
&lt;br /&gt;
===Warning: TangentSpaceGenerator: unknown primitive mode 9===&lt;br /&gt;
This is an [[OSG]] error, showing up when an effect needs tangent vectors, but polygons are not support. The error itself can be ignored, altough some [[shaders]] may look wrong. Shader developers should try to minimise the use of polygons and use triangles and quads instead.&lt;br /&gt;
&lt;br /&gt;
===YASim SOLUTION FAILURE: Solution failed to converge after 10000 iterations===&lt;br /&gt;
Some control in the [[YASim]] [[FDM]] is too weak, according to YASim, to control the aircraft. An effectiveness tag will be required in the FDM to solve this error.&lt;br /&gt;
&lt;br /&gt;
===YASim SOLUTION FAILURE:&amp;lt;br&amp;gt;Zero length fuselage===&lt;br /&gt;
There is a problem in the [[FDM]]. A fuselage section with similar ax and ay was created. Change the ax and/or ay values to match the aircraft.&lt;br /&gt;
&lt;br /&gt;
==Errors without known solutions==&lt;br /&gt;
Please take a look at the upcoming errors and see if you know a solution to get rid of them. Your additions are greatly appreciated!&lt;br /&gt;
&lt;br /&gt;
===AL Error (fx): Invalid Value at pitch and gain===&lt;br /&gt;
&lt;br /&gt;
===AL Error (sound manager): Invalid Operation at update===&lt;br /&gt;
&lt;br /&gt;
===AL Error (sound manager): Invalid Value at buffer add data&amp;lt;br&amp;gt;No such buffer!===&lt;br /&gt;
&lt;br /&gt;
===Failed to execute command nasal===&lt;br /&gt;
&lt;br /&gt;
===Failed to tie property ... to object methods===&lt;br /&gt;
A JSBSim error.&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayMgr::MP_ProcessData - message from ... has invalid length!===&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayerMgr::Open - Failed to bind recieve socket===&lt;br /&gt;
&lt;br /&gt;
===GPS: malformed route, index=1===&lt;br /&gt;
&lt;br /&gt;
===Mesa 7.3 implementation error: bad texture level in r300UploadSubImage===&lt;br /&gt;
http://www.flightgear.org/forums/viewtopic.php?f=2&amp;amp;t=6706&amp;amp;start=0&amp;amp;st=0&amp;amp;sk=t&amp;amp;sd=a&lt;br /&gt;
&lt;br /&gt;
===Nasal runtime error: stack overflow===&lt;br /&gt;
&lt;br /&gt;
===No image file for texture, using white===&lt;br /&gt;
A [[Shaders|shader]] error&lt;br /&gt;
&lt;br /&gt;
===No path in /sim/sound/path===&lt;br /&gt;
&lt;br /&gt;
===OpenAL error (AL_ILLEGAL_COMMAND): set_source_pos===&lt;br /&gt;
&lt;br /&gt;
===OpenAL error (AL_ILLEGAL_COMMAND): set_volume===&lt;br /&gt;
&lt;br /&gt;
===PT_vs_hpt: ran out of layers===&lt;br /&gt;
&lt;br /&gt;
===Warning: detected OpenGL error 'invalid value' after RenderBin::draw(,)===&lt;br /&gt;
&lt;br /&gt;
===Warning: GraphicsWindowWin32::grabFocus() - Failed grabbing the focus===&lt;br /&gt;
&lt;br /&gt;
===WARNING: PUI: Too many live puInterfaces open at once!===&lt;br /&gt;
Appears when printing large outputs (very) frequently on the screen.&lt;br /&gt;
&lt;br /&gt;
===Warning: State::drawQuads(0, 154400) too large handle in remapping to ushort glDrawElements===&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|Get rid of common errors]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Howto: Débarrassez-vous des erreurs les plus fréquentes]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Building_FlightGear_-_Debian&amp;diff=23289</id>
		<title>Building FlightGear - Debian</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Building_FlightGear_-_Debian&amp;diff=23289"/>
		<updated>2010-08-09T19:23:05Z</updated>

		<summary type="html">&lt;p&gt;Jester: Extended git instructions for the data bundle&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= HowTo build on Debian =&lt;br /&gt;
&lt;br /&gt;
HowTo build FlightGear 2.0.0 or GIT on GNU/Linux Debian '''Stable''' 5.x (Lenny).&lt;br /&gt;
&lt;br /&gt;
This HowTo may also work with '''Testing'''/'''Unstable''' except that some things are easier because of more up to date packages. So, before fetching something check the version of the available -dev package for it.&lt;br /&gt;
&lt;br /&gt;
It even *should* work with '''Etch''', but I am not certain about some dependencies. [http://wiki.flightgear.org/index.php?title=Talk:Building_Flightgear_-_Debian&amp;amp;action=edit Reports] are welcome.&lt;br /&gt;
&lt;br /&gt;
If you don't want to make your hands dirty, have a look at [[Scripted_Compilation_on_Linux_Debian/Ubuntu]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements and Preparations ==&lt;br /&gt;
You need an OpenGL capable graphics including a proper installed driver.&amp;lt;BR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also a bunch of packages (and some of their dependencies) are required:&lt;br /&gt;
*gcc, g++, make, automake1.9, pkg-config&lt;br /&gt;
*mawk (or gawk)&lt;br /&gt;
*cmake   (min. version 2.6.0-5,  for Etch available on backports.org!)&lt;br /&gt;
*git, subversion, wget&lt;br /&gt;
&amp;lt;!--*libsvn-dev, for [[Terrasync]]s proper operation.--&amp;gt;&lt;br /&gt;
*freeglut3-dev, libgl1-mesa-dev, libxrandr-dev&lt;br /&gt;
*libxi-dev, libxmu-dev, libxext-dev&lt;br /&gt;
*libopenal-dev (see [[#libopenal|libopenal]]), libalut-dev&lt;br /&gt;
*libjpeg62-dev, libtiff4-dev, libpng12-dev&lt;br /&gt;
*libboost1.37-dev  (Not available for Lenny atm, see [[#Boost Library|Boost Library]] below.)&lt;br /&gt;
&lt;br /&gt;
During installation packages ''simgear-dev'' and ''openscenegraph-dev'' *must not* be installed. They can safely be re-installed after compilation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Build and install ==&lt;br /&gt;
Because we are going to install versions different to the ones in the repositries it is recommended to install FG-2.0.0 and/or GIT in a place independent to the base system such as /usr/local/FG-2.0.0, /opt/FG-2.0.0 or in a subdirectory of your $HOME. I suggest to make it writeable by the user that there is no need to become root for the &amp;lt;code&amp;gt;make install&amp;lt;/code&amp;gt; commands. I'll use &amp;lt;code&amp;gt;$prefix&amp;lt;/code&amp;gt; as a placeholder for this directory. &amp;lt;BR&amp;gt;&lt;br /&gt;
Another one will be &amp;lt;code&amp;gt;$srcdir&amp;lt;/code&amp;gt;, it stands for the absolute path to the directory which contains the folders of the various source codes. So in the following instructions you have to replace these with the local paths or even &amp;lt;code&amp;gt;export&amp;lt;/code&amp;gt; them during the process.&lt;br /&gt;
&lt;br /&gt;
Follow the instructions to fetch the sources and the data needed by FlightGear and the commands to build/install each source.&lt;br /&gt;
&lt;br /&gt;
Have in mind that the data is relatively large (GIT about 3.5 GB and 2.0.0 300 MB) so, to save some time, it is a good idea to fetch it while building the sources.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== libopenal ===&lt;br /&gt;
The libopenal-dev package in Lenny/Etch is too old for [[fgcom]]. For FlightGear it does work but not all features (like Doppler) are available, so installing an up to date version is recommended anyway.&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 wget http://kcat.strangesoft.net/openal-releases/openal-soft-1.11.753.tar.bz2&lt;br /&gt;
 tar xjf openal-soft-1.11.753.tar.bz2&lt;br /&gt;
 cd openal-soft-1.11.753/build&lt;br /&gt;
 cmake  -D CMAKE_INSTALL_PREFIX:PATH=&amp;quot;$prefix&amp;quot; ..&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== plib ===&lt;br /&gt;
Latest SVN is [http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg20793.html recommended], yet package plib1.8.5-dev for Testing/Unstable does work as well.&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co https://plib.svn.sourceforge.net/svnroot/plib/trunk plib&lt;br /&gt;
 cd plib&lt;br /&gt;
 sed s/PLIB_TINY_VERSION\ \ 5/PLIB_TINY_VERSION\ \ 6/ -i src/util/ul.h&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
 ./configure --prefix=$prefix&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Boost Library ===&lt;br /&gt;
Version 1.37 is needed. At least for Lenny/Etch this means getting the sources because this is not available atm on backports.org. Testing/Unstable users may have more luck and a package is available, libboost-1.37-dev or newer.&lt;br /&gt;
&lt;br /&gt;
To build SimGear, FlightGear, fgrun and fgcom some boostlib header files are required, no need to compile and install it. If you have installed a libboost1.37-dev (or higher) package on your system you don't have to bother at all with it. If not, you have to tell each ./configure where the header files are. To do so, add the option &amp;lt;code&amp;gt;CPPFLAGS=-I$prefix/include&amp;lt;/code&amp;gt; to the SimGear, FlightGear and fgrun &amp;lt;code&amp;gt;./configure&amp;lt;/code&amp;gt; commands. We copy the header files to $prefix/include because fgcom will need them there.&lt;br /&gt;
&lt;br /&gt;
Get the newest version tar ball from http://sourceforge.net/projects/boost/files/boost/, extract it into &amp;lt;code&amp;gt;$srcdir&amp;lt;/code&amp;gt; then:&lt;br /&gt;
 cp -R $srcdir/boost-[version]/boost/ $prefix/include/&lt;br /&gt;
&lt;br /&gt;
=== OpenSceneGraph ===&lt;br /&gt;
For FlightGear 2.0.0 one may use the latest (or at least 2.9.6) developer release from http://www.openscenegraph.org/projects/osg/wiki/Downloads/DeveloperReleases and extract it into &amp;lt;code&amp;gt;$srcdir&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mostly this is ok for FlightGear GIT as well as it is stable. However, sometimes the release is not fresh enough and one have to get the latest developments via SVN:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk OpenSceneGraph&lt;br /&gt;
&lt;br /&gt;
cmake demands a build directory separate to its source directory. So &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; one and &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; into it.&lt;br /&gt;
 cmake -D CMAKE_BUILD_TYPE=&amp;quot;Release&amp;quot; -D CMAKE_CXX_FLAGS=&amp;quot;-O3&amp;quot; -D CMAKE_C_FLAGS=&amp;quot;-O3&amp;quot; \&lt;br /&gt;
    -D CMAKE_INSTALL_PREFIX:PATH=&amp;quot;$prefix&amp;quot; $srcdir/OpenSceneGraph[-version]&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SimGear ===&lt;br /&gt;
2.0.0:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 wget http://mirrors.ibiblio.org/pub/mirrors/simgear/ftp/Source/SimGear-2.0.0.tar.gz&lt;br /&gt;
 tar xzf SimGear-2.0.0.tar.gz&lt;br /&gt;
 cd SimGear-2.0.0&lt;br /&gt;
&lt;br /&gt;
GIT:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 git clone git://gitorious.org/fg/simgear.git simgear&lt;br /&gt;
 cd simgear&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
&lt;br /&gt;
2.0.0 and GIT:&lt;br /&gt;
 ./configure --prefix=$prefix [CPPFLAGS=-I$prefix/include LDFLAGS=&amp;quot;-L$prefix/lib -L$prefix/lib64&amp;quot;]&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== FlightGear source ===&lt;br /&gt;
2.0.0:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 wget http://mirrors.ibiblio.org/pub/mirrors/flightgear/ftp/Source/FlightGear-2.0.0.tar.gz&lt;br /&gt;
 tar xzf FlightGear-2.0.0.tar.gz&lt;br /&gt;
 cd FlightGear-2.0.0&lt;br /&gt;
&lt;br /&gt;
GIT:&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 git clone git://gitorious.org/fg/flightgear.git flightgear&lt;br /&gt;
 cd flightgear&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
&lt;br /&gt;
2.0.0 and GIT:&lt;br /&gt;
 ./configure --prefix=$prefix [CPPFLAGS=-I$prefix/include/ LDFLAGS=&amp;quot;-L$prefix/lib -L$prefix/lib64&amp;quot;]&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== FlightGear data ===&lt;br /&gt;
2.0.0:&lt;br /&gt;
 cd $prefix&lt;br /&gt;
 wget http://mirrors.ibiblio.org/pub/mirrors/flightgear/ftp/Shared/FlightGear-data-2.0.0.tar.bz2&lt;br /&gt;
 tar xjf FlightGear-data-2.0.0.tar.bz2&lt;br /&gt;
&lt;br /&gt;
GIT:&lt;br /&gt;
 cd $prefix&lt;br /&gt;
 git clone git://gitorious.org/fg/fgdata.git data&lt;br /&gt;
&lt;br /&gt;
The primary gitorious source is known to have trouble cloning the data, the mapserver mirror usually has no problems:&lt;br /&gt;
 cd $prefix&lt;br /&gt;
 git clone git://mapserver.flightgear.org/fgdata data&lt;br /&gt;
&lt;br /&gt;
Also, there are bundles (snapshots) available that can be retrieved with your favorite download manager. This way you can resume interrupted downloads. After unpacking only a comparatively small amount of data has to be transferred from the git server to synchronize your repository.&lt;br /&gt;
 $ cd $prefix&lt;br /&gt;
 $ wget http://flightgear.mxchange.org/pub/fgfs/fgdata.bundle&lt;br /&gt;
 $ git clone fgdata.bundle fgdata&lt;br /&gt;
 Initialized empty Git repository in fgdata/.git/&lt;br /&gt;
 warning: unrecognized header: -deg&amp;quot; - /orientation/roll += &amp;quot;-deg&amp;quot; - /position/altitude += &amp;quot;-ft&amp;quot; - /position/altitude-agl += &amp;quot;-ft&amp;quot; - /position/latitude += &amp;quot;-deg&amp;quot; --/position/longitude += &amp;quot;-deg&amp;quot; - /radios/adf/frequencies/selected += &amp;quot;-khz&amp;quot; - /radios/adf/frequencies/&lt;br /&gt;
 warning: remote HEAD refers to nonexistent ref, unable to checkout.&lt;br /&gt;
 $ cd fgdata&lt;br /&gt;
 $ git branch master-tmp origin/master&lt;br /&gt;
 Branch master-tmp set up to track remote branch refs/remotes/origin/master.&lt;br /&gt;
 $ git remote rm origin&lt;br /&gt;
 $ git remote add origin git://gitorious.org/fg/fgdata&lt;br /&gt;
 $ git fetch origin&lt;br /&gt;
 remote: Counting objects: 5596, done.&lt;br /&gt;
 remote: Compressing objects: 100% (2919/2919), done.&lt;br /&gt;
 remote: Total 4266 (delta 2540), reused 2166 (delta 1297)&lt;br /&gt;
 Receiving objects: 100% (4266/4266), 117.93 MiB | 1374 KiB/s, done.&lt;br /&gt;
 Resolving deltas: 100% (2540/2540), completed with 628 local objects.&lt;br /&gt;
 From git://gitorious.org/fg/fgdata&lt;br /&gt;
  * [new branch]      PRE_OSG_PLIB_20061029 -&amp;gt; origin/PRE_OSG_PLIB_20061029&lt;br /&gt;
  * [new branch]      master     -&amp;gt; origin/master&lt;br /&gt;
  * [new tag]         last-cvs   -&amp;gt; last-cvs&lt;br /&gt;
  * [new tag]         mapserver  -&amp;gt; mapserver&lt;br /&gt;
 $ git branch -D master-tmp&lt;br /&gt;
 Deleted branch master-tmp.&lt;br /&gt;
 $ git branch --track master origin/master&lt;br /&gt;
 Branch master set up to track remote branch refs/remotes/origin/master.&lt;br /&gt;
 $ git checkout&lt;br /&gt;
&lt;br /&gt;
The bundle may be periodically updated and bundles from different sources need not be the same. The file size for the above bundle dated 2010-06-09 is 2394168314, while the md5 checksum is&lt;br /&gt;
 $ md5sum fgdata.bundle&lt;br /&gt;
 2996221bd2b8ab7740f332f49396cf56  fgdata.bundle&lt;br /&gt;
&lt;br /&gt;
=== Trial run ===&lt;br /&gt;
When all the builds are done and the data download has finished it is time for a test run:&lt;br /&gt;
 export LD_LIBRARY_PATH=$prefix/lib/:$LD_LIBRARY_PATH&lt;br /&gt;
 $prefix/bin/fgfs --fg-root=$prefix/data&lt;br /&gt;
&lt;br /&gt;
For the future, if you want to start FlightGear from command line have a look at [[fgfsrc]], if you prefer a graphical user interface continue with [[#fgrun|compiling fgrun]]. Have in mind that fgfs need to find our self compiled libraries and therefore we have to tell the linker (ld) where to find them. That is what the first line here does.&lt;br /&gt;
&lt;br /&gt;
== Optional Software ==&lt;br /&gt;
&lt;br /&gt;
=== fgrun ===&lt;br /&gt;
To build [[fgrun]] two more package is required:&lt;br /&gt;
*libfltk1.1-dev fluid&lt;br /&gt;
&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co http://fgrun.svn.sourceforge.net/svnroot/fgrun/trunk fgrun&lt;br /&gt;
 cd fgrun/fgrun/&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
 ./configure --prefix=$prefix  [CPPFLAGS=-I$prefix/include/]&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
=== fgcom ===&lt;br /&gt;
For [[fgcom]] unfortunately there is one more dependency which cannot be solved with packages on Lenny/Etch, see [[#libopenal|libopenal]].&lt;br /&gt;
&lt;br /&gt;
 cd $srcdir&lt;br /&gt;
 svn co https://appfgcom.svn.sourceforge.net/svnroot/fgcom/trunk fgcom&lt;br /&gt;
 cd fgcom/src&lt;br /&gt;
 make INSTALL_BIN=$prefix/bin INSTALL_DIR=$prefix/fgcom \&lt;br /&gt;
    PLIB_PREFIX=$prefix OPENAL_PREFIX=$prefix install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Keeping the GIT version up to date ==&lt;br /&gt;
&lt;br /&gt;
...to be continued. ;-)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Building}}&lt;br /&gt;
&lt;br /&gt;
[[de:FlightGear_bauen_-_Debian]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=TerraSync&amp;diff=21617</id>
		<title>TerraSync</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=TerraSync&amp;diff=21617"/>
		<updated>2010-05-25T13:32:51Z</updated>

		<summary type="html">&lt;p&gt;Jester: Replaced /tmp terrasync directory with $HOME&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To see the terrain below your aircraft, you have to install the respective [[scenery]]. This can happen by downloading certain bits of scenery before flying as described in the article [[Installing Scenery]]. &lt;br /&gt;
&lt;br /&gt;
Alternatively you can use '''TerraSync'''. It is a utility that automatically downloads the newest version of the needed [[FlightGear]] [[scenery]] while the simulator is running. TerraSync runs in the background in a separate process, monitors your position, and downloads (or updates) the latest greatest scenery from the master scenery server &amp;quot;just in time&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The master repository for terrasync, i.e. the online resource from which TerraSync downloads its files, is synchronized with the [http://scenemodels.flightgear.org/ FlightGear Scenery Database] once a day. So when using TerraSync, you will always have 1) the latest [[File_Formats#.2A.stg|.stg-files]], which tell FlightGear where to place an object and 2) the latest '''static''' scenery objects. Static scenery objects are such objects that exist in one place only. &lt;br /&gt;
&lt;br /&gt;
: Important note: TerraSync does not download the newest '''shared''' scenery objects. Shared objects are such objects that are used more than once in the scenery, like generic houses or ships etc. If the set of shared scenery objects has changed since your version of FlightGear was released (usually that is the case), you need to install the newest [http://scenemodels.flightgear.org/download/SharedModels.tgz '''shared''' models archive] from the [http://scenemodels.flightgear.org/ FlightGear Scenery Database] to see all objects. Unpack it to &amp;lt;code&amp;gt;[FG_ROOT]\data\Models&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It is recommended to use a separate scenery directory for TerraSync (i.e. do not run it on your main scenery directory) as network interruptions may upset the synchronization protocol - if/when that happens the easiest solution is to delete the affected subdirectory and let terrasync download it again.&lt;br /&gt;
&lt;br /&gt;
===Usage example (for POSIX compliant [[command line]] shell)===&lt;br /&gt;
&lt;br /&gt;
Start terrasync:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;% nice terrasync -p 5500 -S -d &amp;quot;$HOME/fgfsScenery&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The -S option tells terrasync to use the SVN protocol to fetch data. If you omit it terrasync will use the rsync program instead (which has to be installed on your system).&lt;br /&gt;
&lt;br /&gt;
Start FlightGear:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;% fgfs --atlas=socket,out,1,localhost,5500,udp --fg-scenery=&amp;quot;$FG_ROOT/Scenery/:$HOME/fgfsScenery&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The full documentation and source for TerraSync is located in the FlightGear source distribution (in &amp;lt;code&amp;gt;utils/TerraSync/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Start TerraSync from fgrun.exe (Wizard in Windows) in FlightGear 1.9.1===&lt;br /&gt;
&lt;br /&gt;
1. Make sure you are in the first screen where you can set up directories. To get there, start fgrun.exe. You'll first be in the Aircraft selection screen, then hit &amp;quot;Back&amp;quot;. You are now here:&lt;br /&gt;
&lt;br /&gt;
[[Image:TerraSync 1.png]]&lt;br /&gt;
&lt;br /&gt;
2. Select the destination folder for all files downloaded by terrasync. Usually the folder &amp;lt;code&amp;gt;[FG_ROOT]\terrasync&amp;lt;/code&amp;gt; already exists and you only have to add it to the list (as in the above example). Insure that it is positioned '''above''' your standard scenery folder (here that is &amp;lt;code&amp;gt;FlightGear191\scenery&amp;lt;/code&amp;gt;) and all other directories over which the terrasync folder is supposed to have priority. When two directories contain information for the same region, FlightGear will take the information from the directory higher in the list.&lt;br /&gt;
&lt;br /&gt;
3. For TerraSync to know where to deposit the downloaded files, you have to tell the program which folder is the destination folder. In the above example, it is the 3&amp;lt;sup&amp;gt;rd&amp;lt;/sup&amp;gt; in the list.&lt;br /&gt;
&lt;br /&gt;
4. Finally, go to the last screen. There you have to activate TerraSync as in the following screenshot. Now TerraSync should work.&lt;br /&gt;
&lt;br /&gt;
[[Image:TerraSync 2.png]]&lt;br /&gt;
&lt;br /&gt;
''Note: Expect your firewall to block in first place, since you request a new port (5505) in ud-protocol (UDP)'' .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See [[Installing Scenery]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Carrier&amp;diff=10759</id>
		<title>Howto:Carrier</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Carrier&amp;diff=10759"/>
		<updated>2009-02-23T15:01:12Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* Land */ Added table of aircraft carriers w/ TACAN frequencies&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''AJ MacLeod'''&lt;br /&gt;
&lt;br /&gt;
30th September 2005&lt;br /&gt;
Current Status (1st March 2006)&lt;br /&gt;
[[Image:Carrier3.jpg|thumb|300px|The Nimitz carrier in the San Fransisco bay]]&lt;br /&gt;
At the time of writing, it is possible with Flightgear 0.9.9 or a recent CVS copy to:&lt;br /&gt;
&lt;br /&gt;
* start FG with your chosen aircraft placed on the aircraft carrier &amp;quot;Nimitz&amp;quot; or &amp;quot;Eisenhower&amp;quot;&lt;br /&gt;
* Engage the launchbar in the steam catapult&lt;br /&gt;
* Have the carrier set course into the prevailing wind direction and attempt to get wind speed over the deck at a suitable value for launch&lt;br /&gt;
* Launch from the deck when ready&lt;br /&gt;
* Set the TACAN reciever in the aircraft to Nimitz's channel (029Y) and have the heading and range to the carrier displayed on the cockpit instruments&lt;br /&gt;
* Land on the deck and be halted by the arrestor cables&lt;br /&gt;
* Taxi onto the deck elevators, operate them and park on the hangar deck (0.9.10 and later)&lt;br /&gt;
&lt;br /&gt;
==What to do first==&lt;br /&gt;
Note: as of version 1.0, the default preferences has the Nimitz enabled, so you don't need to do the editing described below. Also, there is a command line option --ai-scenario you can use instead of editing.&lt;br /&gt;
&lt;br /&gt;
To enable the carrier, you must edit your &amp;lt;tt&amp;gt;preferences.xml&amp;lt;/tt&amp;gt; file. This lives in your FlightGear data directory, the one under which your Aircraft, Scenery etc directories reside. Open this file in a text editor (such as notepad on Windows, or TextEdit on OSX - Linux users are probably familiar with such software... try kedit or gedit if not.)&lt;br /&gt;
&lt;br /&gt;
Search for the word ``nimitz'. You ought to find something that looks like this :&lt;br /&gt;
 &amp;lt;!-- &amp;lt;scenario&amp;gt;nimitz_demo&amp;lt;/scenario&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should remove the ``comment' marks so that it looks like this:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;scenario&amp;gt;nimitz_demo&amp;lt;/scenario&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also ensure that the line above that referring to ai being enabled is set to &amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Save the file and quit the text editor.&lt;br /&gt;
[[Image:Carrier4.jpg|thumb|300px|The [[FlightGear Wizard]]]]&lt;br /&gt;
You are now ready to start FlightGear. To position your [[aircraft]] on the carrier at startup, use the following [[Command Line Parameters|command line options]] (noting the upper-case &amp;quot;N&amp;quot;) :&lt;br /&gt;
 --carrier=Nimitz --aircraft=seahawk&lt;br /&gt;
or&lt;br /&gt;
 --carrier=Eisenhower --aircraft=seahawk&lt;br /&gt;
&lt;br /&gt;
Note that several FG aircraft are carrier capable, but the [[Hawker Seahawk|Seahawk]] is possibly the easiest to fly to begin with.&lt;br /&gt;
&lt;br /&gt;
If you are using the Windows or OSX launcher to run FG, you should find a text entry box in the gui that allows you to specify command line options, add the above options there. Linux or Cygwin users can just add them to their usual startup command; ``fgfs --carrier=Nimitz --aircraft=seahawk'. Please note the uppercase ``N' in ``Nimitz'.&lt;br /&gt;
&lt;br /&gt;
In the [[FlightGear Wizard]]: go to Advanced... &amp;gt; Properties and make a new property with &lt;br /&gt;
 sim/ai/scenario[0]=nimitz_demo --carrier=Nimitz&lt;br /&gt;
&lt;br /&gt;
With version 1.0.0 there comes a special box for the carriers on the Airport selection page of the Wizard.&lt;br /&gt;
&lt;br /&gt;
==Takeoff==&lt;br /&gt;
[[Image:Carrier1.jpg|thumb|300px|The [[Hawker Seahawk|Seahawk]] aircraft ready for takeoff]]&lt;br /&gt;
Once FlightGear has started, you should ensure that the parking brakes are off, ease the plane a little way down the catapult pressing ``L' to engage the launchbar (this might be best done from an external view initially.) You should notice the aircraft being pulled into alignment with the catapult and see the strops appear and hold down the aircraft.  This will only happen if your aircraft is close enough to the correct spot on the catapult; as a rough guide, for the default parking position the seahawk's nose should be rougly level with the deck observation bubble.&lt;br /&gt;
&lt;br /&gt;
To get the carrier into as good a position as possible for launch, select the ``ATC/AI' menu, then check the ``Turn into wind' box under the ``AI Carrier' section.&lt;br /&gt;
&lt;br /&gt;
You should now notice the carrier begin to pick up speed and turn into the wind, and naturally the deck may tilt somewhat as it turns. You should wait for this maneuver to finish and the deck to return to level before moving on to the next stage.&lt;br /&gt;
[[Image:Carrier6.jpg|thumb|300px|'''1:''' The takeoff part of the carrier with the catapults &lt;br /&gt;
'''2:''' The land part of the carrier with the wires]]&lt;br /&gt;
Being engaged to the catapult, you should spool up the engines to full power, ensure the brakes are off and that all flight controls are in a suitable position for launch. When ready, press ``C' to release the catapult. Your aircraft will be hurled forward off the deck, and you should be able to raise the undercarriage and climb slowly away, being careful to avoid stalling.&lt;br /&gt;
&lt;br /&gt;
==Land==&lt;br /&gt;
Actually finding the carrier in a vast expanse of open water can be very difficult, especially if visibility is poor. To assist with this task, the carriers are equipped with [[TACAN]], which allows a suitably-equipped aircraft (Seahawk at present) to obtain a range and bearing to the carrier. First, you must set the appropriate TACAN channel, 029Y in this case, in the radios dialogue (ctrl-r or choose Equipment/Radio Settings from the FG [[menubar]]). You should, if within range, notice the DME instrument show your distance from the carrier, and the ADF instrument (next to the DME in the seahawk) should indicate a bearing to the carrier. Turn to the indicated heading and you should see the DME dial indicate your closing in on the carrier.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Carrier || Scenario || TACAN&lt;br /&gt;
|-&lt;br /&gt;
| Nimitz || nimitz_demo || 029Y&lt;br /&gt;
|-&lt;br /&gt;
| Eisenhower || nimitz_demo || 030Y&lt;br /&gt;
|-&lt;br /&gt;
| Clemenceau || clemenceau_demo || 026Y&lt;br /&gt;
|-&lt;br /&gt;
| Foch || foch_demo || 026X&lt;br /&gt;
|-&lt;br /&gt;
| Akagi || akagi || N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This is the most difficult part of the operation, as in real life. You might well find Andy Ross' [[A-4F Skyhawk Operations Manual]] useful here.  Basically, though, you should use the TACAN to locate the carrier, and line up with the rear of the deck. As this part of the deck is at an angle to the course of the vessel, you may need to correct your alignment often. Ensure that the aircraft is in the correct configuration for approach (the Help/Aircraft Help menu should contain useful data for your aircraft) and that the gear and the arrestor hook are down.&lt;br /&gt;
[[Image:Carrier5.jpg|thumb|300px|The Fresnel Lens Optical landing System]]&lt;br /&gt;
As you approach you should see, on the left hand side of the deck, a set of brightly coloured lights - called the Fresnel Lens Optical landing System (FLOLS). This indicates your position on the landing glideslope. You will see a horizontal row of green lights, and when approximately on the glideslope, an orange light ( known in some circles as the ``meatball') approximately in line with the green lights. When approaching correctly, the meatball appears in line with the green lights. If you are high it is above, and when low it is below. If you are very low the meatball turns red. If you fly to keep the meatball aligned you should catch number 3 wire.&lt;br /&gt;
&lt;br /&gt;
Carrier landings are often described as ``controlled crashes' and you shouldn't waste your time attempting to flare and place the aircraft gently on the deck like you would with a conventional landing - ensuring that you catch the wires is the main thing.&lt;br /&gt;
&lt;br /&gt;
Immediately your wheels touch the deck, you should open the throttles to full power, in case you have missed the wires and need to ``go around' again; the wires will hold the aircraft if you have caught them, even at full power.&lt;br /&gt;
&lt;br /&gt;
If you wish, you can then (with 0.9.10 and later) raise the elevators from the ATC/AI menu,  taxy onto one of the elevators, lower it (uncheck the box on the menu and don't worry, they are VERY slow...) and taxy off into the hangar.&lt;br /&gt;
&lt;br /&gt;
Don't be discouraged if you don't succeed at first with carrier landings - it's not an easy maneouver to master. If after a little practice you find the Seahawk too easy, you could move on to the Seafire for more of a challenge!&lt;br /&gt;
&lt;br /&gt;
==Related content==&lt;br /&gt;
* [[Carrier over MP]] to find out how you could control the carrier and/or use the carrier over the multiplayer network.&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|Carrier]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Carrier&amp;diff=10758</id>
		<title>Howto:Carrier</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Carrier&amp;diff=10758"/>
		<updated>2009-02-23T14:46:51Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* What to do first */ Mention that editing preferences.xml is no longer necessary&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''AJ MacLeod'''&lt;br /&gt;
&lt;br /&gt;
30th September 2005&lt;br /&gt;
Current Status (1st March 2006)&lt;br /&gt;
[[Image:Carrier3.jpg|thumb|300px|The Nimitz carrier in the San Fransisco bay]]&lt;br /&gt;
At the time of writing, it is possible with Flightgear 0.9.9 or a recent CVS copy to:&lt;br /&gt;
&lt;br /&gt;
* start FG with your chosen aircraft placed on the aircraft carrier &amp;quot;Nimitz&amp;quot; or &amp;quot;Eisenhower&amp;quot;&lt;br /&gt;
* Engage the launchbar in the steam catapult&lt;br /&gt;
* Have the carrier set course into the prevailing wind direction and attempt to get wind speed over the deck at a suitable value for launch&lt;br /&gt;
* Launch from the deck when ready&lt;br /&gt;
* Set the TACAN reciever in the aircraft to Nimitz's channel (029Y) and have the heading and range to the carrier displayed on the cockpit instruments&lt;br /&gt;
* Land on the deck and be halted by the arrestor cables&lt;br /&gt;
* Taxi onto the deck elevators, operate them and park on the hangar deck (0.9.10 and later)&lt;br /&gt;
&lt;br /&gt;
==What to do first==&lt;br /&gt;
Note: as of version 1.0, the default preferences has the Nimitz enabled, so you don't need to do the editing described below. Also, there is a command line option --ai-scenario you can use instead of editing.&lt;br /&gt;
&lt;br /&gt;
To enable the carrier, you must edit your &amp;lt;tt&amp;gt;preferences.xml&amp;lt;/tt&amp;gt; file. This lives in your FlightGear data directory, the one under which your Aircraft, Scenery etc directories reside. Open this file in a text editor (such as notepad on Windows, or TextEdit on OSX - Linux users are probably familiar with such software... try kedit or gedit if not.)&lt;br /&gt;
&lt;br /&gt;
Search for the word ``nimitz'. You ought to find something that looks like this :&lt;br /&gt;
 &amp;lt;!-- &amp;lt;scenario&amp;gt;nimitz_demo&amp;lt;/scenario&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should remove the ``comment' marks so that it looks like this:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;scenario&amp;gt;nimitz_demo&amp;lt;/scenario&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also ensure that the line above that referring to ai being enabled is set to &amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Save the file and quit the text editor.&lt;br /&gt;
[[Image:Carrier4.jpg|thumb|300px|The [[FlightGear Wizard]]]]&lt;br /&gt;
You are now ready to start FlightGear. To position your [[aircraft]] on the carrier at startup, use the following [[Command Line Parameters|command line options]] (noting the upper-case &amp;quot;N&amp;quot;) :&lt;br /&gt;
 --carrier=Nimitz --aircraft=seahawk&lt;br /&gt;
or&lt;br /&gt;
 --carrier=Eisenhower --aircraft=seahawk&lt;br /&gt;
&lt;br /&gt;
Note that several FG aircraft are carrier capable, but the [[Hawker Seahawk|Seahawk]] is possibly the easiest to fly to begin with.&lt;br /&gt;
&lt;br /&gt;
If you are using the Windows or OSX launcher to run FG, you should find a text entry box in the gui that allows you to specify command line options, add the above options there. Linux or Cygwin users can just add them to their usual startup command; ``fgfs --carrier=Nimitz --aircraft=seahawk'. Please note the uppercase ``N' in ``Nimitz'.&lt;br /&gt;
&lt;br /&gt;
In the [[FlightGear Wizard]]: go to Advanced... &amp;gt; Properties and make a new property with &lt;br /&gt;
 sim/ai/scenario[0]=nimitz_demo --carrier=Nimitz&lt;br /&gt;
&lt;br /&gt;
With version 1.0.0 there comes a special box for the carriers on the Airport selection page of the Wizard.&lt;br /&gt;
&lt;br /&gt;
==Takeoff==&lt;br /&gt;
[[Image:Carrier1.jpg|thumb|300px|The [[Hawker Seahawk|Seahawk]] aircraft ready for takeoff]]&lt;br /&gt;
Once FlightGear has started, you should ensure that the parking brakes are off, ease the plane a little way down the catapult pressing ``L' to engage the launchbar (this might be best done from an external view initially.) You should notice the aircraft being pulled into alignment with the catapult and see the strops appear and hold down the aircraft.  This will only happen if your aircraft is close enough to the correct spot on the catapult; as a rough guide, for the default parking position the seahawk's nose should be rougly level with the deck observation bubble.&lt;br /&gt;
&lt;br /&gt;
To get the carrier into as good a position as possible for launch, select the ``ATC/AI' menu, then check the ``Turn into wind' box under the ``AI Carrier' section.&lt;br /&gt;
&lt;br /&gt;
You should now notice the carrier begin to pick up speed and turn into the wind, and naturally the deck may tilt somewhat as it turns. You should wait for this maneuver to finish and the deck to return to level before moving on to the next stage.&lt;br /&gt;
[[Image:Carrier6.jpg|thumb|300px|'''1:''' The takeoff part of the carrier with the catapults &lt;br /&gt;
'''2:''' The land part of the carrier with the wires]]&lt;br /&gt;
Being engaged to the catapult, you should spool up the engines to full power, ensure the brakes are off and that all flight controls are in a suitable position for launch. When ready, press ``C' to release the catapult. Your aircraft will be hurled forward off the deck, and you should be able to raise the undercarriage and climb slowly away, being careful to avoid stalling.&lt;br /&gt;
&lt;br /&gt;
==Land==&lt;br /&gt;
Actually finding the carrier in a vast expanse of open water can be very difficult, especially if visibility is poor. To assist with this task, the carriers are equipped with [[TACAN]], which allows a suitably-equipped aircraft (Seahawk at present) to obtain a range and bearing to the carrier. First, you must set the appropriate TACAN channel, 029Y in this case, in the radios dialogue (ctrl-r or choose Equipment/Radio Settings from the FG [[menubar]]). You should, if within range, notice the DME instrument show your distance from the carrier, and the ADF instrument (next to the DME in the seahawk) should indicate a bearing to the carrier. Turn to the indicated heading and you should see the DME dial indicate your closing in on the carrier.&lt;br /&gt;
&lt;br /&gt;
This is the most difficult part of the operation, as in real life. You might well find Andy Ross' [[A-4F Skyhawk Operations Manual]] useful here.  Basically, though, you should use the TACAN to locate the carrier, and line up with the rear of the deck. As this part of the deck is at an angle to the course of the vessel, you may need to correct your alignment often. Ensure that the aircraft is in the correct configuration for approach (the Help/Aircraft Help menu should contain useful data for your aircraft) and that the gear and the arrestor hook are down.&lt;br /&gt;
[[Image:Carrier5.jpg|thumb|300px|The Fresnel Lens Optical landing System]]&lt;br /&gt;
As you approach you should see, on the left hand side of the deck, a set of brightly coloured lights - called the Fresnel Lens Optical landing System (FLOLS). This indicates your position on the landing glideslope. You will see a horizontal row of green lights, and when approximately on the glideslope, an orange light ( known in some circles as the ``meatball') approximately in line with the green lights. When approaching correctly, the meatball appears in line with the green lights. If you are high it is above, and when low it is below. If you are very low the meatball turns red. If you fly to keep the meatball aligned you should catch number 3 wire.&lt;br /&gt;
&lt;br /&gt;
Carrier landings are often described as ``controlled crashes' and you shouldn't waste your time attempting to flare and place the aircraft gently on the deck like you would with a conventional landing - ensuring that you catch the wires is the main thing.&lt;br /&gt;
&lt;br /&gt;
Immediately your wheels touch the deck, you should open the throttles to full power, in case you have missed the wires and need to ``go around' again; the wires will hold the aircraft if you have caught them, even at full power.&lt;br /&gt;
&lt;br /&gt;
If you wish, you can then (with 0.9.10 and later) raise the elevators from the ATC/AI menu,  taxy onto one of the elevators, lower it (uncheck the box on the menu and don't worry, they are VERY slow...) and taxy off into the hangar.&lt;br /&gt;
&lt;br /&gt;
Don't be discouraged if you don't succeed at first with carrier landings - it's not an easy maneouver to master. If after a little practice you find the Seahawk too easy, you could move on to the Seafire for more of a challenge!&lt;br /&gt;
&lt;br /&gt;
==Related content==&lt;br /&gt;
* [[Carrier over MP]] to find out how you could control the carrier and/or use the carrier over the multiplayer network.&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|Carrier]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FGCom_(before_3.0)&amp;diff=10625</id>
		<title>FGCom (before 3.0)</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FGCom_(before_3.0)&amp;diff=10625"/>
		<updated>2009-02-14T19:24:39Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* Status */  fixed typo in server name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{cleanup}}&lt;br /&gt;
&lt;br /&gt;
'''FGCom''' is an addon for [[FlightGear]]. With FGCom (and the infrastructure behind), FlightGear gets a realtime voice communication system which could be used for [[ATC]]. The current version of fgcom is airport based - that means radio frequencies are based towards the location of the tower. Further version will fix this for a more realistic radio implementation (see [[Development]])&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
*'''18 November, 2008:'''&lt;br /&gt;
Latest SVN (rev 163) has the compile problems fixed. Also we have a '''new server: fgcom.flightgear.org.uk'''. User accounts not required (ie. do '''not''' use -U or -P)&lt;br /&gt;
*'''31 October, 2008:''' &lt;br /&gt;
&lt;br /&gt;
The latest SVN release at this time is the '''r149''' which does not compile due to a constant that is not defined (STL_STRING). Such constant appears at line 57 in the file ''src/fgcom_init.cpp'' which is:&lt;br /&gt;
''#include STL_STRING''&lt;br /&gt;
&lt;br /&gt;
I guess that such constant must point to the STL library include file but I am not sure.&lt;br /&gt;
I revert to the '''r148''' SVN version which successfully compiles.&lt;br /&gt;
&lt;br /&gt;
Command to get such version is: ''svn co -r148 svn://svn.dfn.de:/fgcom/trunk fgcom-r148''&lt;br /&gt;
&lt;br /&gt;
* '''19 June, 2008:''' Currently the server is &amp;lt;u&amp;gt;down&amp;lt;/u&amp;gt; due to hardware problems. It is unknown when the service comes back becuase he currently has no time to fix the problems.&lt;br /&gt;
&lt;br /&gt;
* '''22 November 2007:''' Due to heavy development at this time there may be some differences between the information on the web pages and the installation. Please follow the discussions on the FlightGear development list!&lt;br /&gt;
&lt;br /&gt;
==Client installation==&lt;br /&gt;
Before you start, make sure that your speakers and mic are working and tested to sensible volumes.&lt;br /&gt;
===Linux===&lt;br /&gt;
Fetch FGCom (a copy of a working iaxclient is inside)&lt;br /&gt;
&lt;br /&gt;
 svn checkout svn://svn.dfn.de:/fgcom/trunk fgcom&lt;br /&gt;
&lt;br /&gt;
Optional: edit iaxclient/lib/Makefile&lt;br /&gt;
&lt;br /&gt;
To use OpenAl (Recommended and the default for now. Note however, that it requires OpenAl with capture support.)&lt;br /&gt;
 &lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
 AUDIO_OPENAL=1&lt;br /&gt;
&lt;br /&gt;
To use oss emulation&lt;br /&gt;
 &lt;br /&gt;
 USE_PA_OSS=1&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
 AUDIO_OPENAL=0&lt;br /&gt;
&lt;br /&gt;
To use native alsa (WARNING: PTT won't work)&lt;br /&gt;
&lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=1&lt;br /&gt;
 AUDIO_OPENAL=0&lt;br /&gt;
&lt;br /&gt;
To use portaudio alsa (WARNING: only if your card natively supports 8000Hz sample rate)&lt;br /&gt;
&lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=1&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
 AUDIO_OPENAL=0&lt;br /&gt;
&lt;br /&gt;
Edit fgcom/src/Makefile and check the pathes for PLIB_PREFIX and OPENAL_PREFIX.&lt;br /&gt;
&lt;br /&gt;
Compile iaxclient and fgcom. To do so, do the following:&lt;br /&gt;
&lt;br /&gt;
 cd fgcom/src &amp;amp;&amp;amp; make&lt;br /&gt;
&lt;br /&gt;
Install&lt;br /&gt;
&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
and you should be ready for a quick test...&lt;br /&gt;
&lt;br /&gt;
==Using==&lt;br /&gt;
===Testing===&lt;br /&gt;
quick test&lt;br /&gt;
&lt;br /&gt;
    $ fgcom -Sfgcom.flightgear.org.uk -f910      &lt;br /&gt;
&lt;br /&gt;
will give the following output--&lt;br /&gt;
    fgcom - a communication radio based on VoIP with IAX/Asterisk&lt;br /&gt;
    (c)2007 by H. Wirtz &amp;lt;wirtz@dfn.de&amp;gt;&lt;br /&gt;
    Version 1.2.2 build 163M&lt;br /&gt;
    Using iaxclient library Version SVN 163M&lt;br /&gt;
    &lt;br /&gt;
    Successfully parsed commandline options.&lt;br /&gt;
    Reading list of airports...done.&lt;br /&gt;
    Initializing IAX client as guest:xxxxxxxxxxx@fgcom.flightgear.org.uk&lt;br /&gt;
    Call 0 accepted&lt;br /&gt;
    Call 0 answered&lt;br /&gt;
&lt;br /&gt;
speak into the mic and your words will be echoed back with a short delay.&lt;br /&gt;
&lt;br /&gt;
type &amp;lt;nowiki&amp;gt;ctrl-C&amp;lt;/nowiki&amp;gt; to exit this test&lt;br /&gt;
&lt;br /&gt;
===Configuration===&lt;br /&gt;
&lt;br /&gt;
''Or if it didn't work perfectly first time''&lt;br /&gt;
&lt;br /&gt;
    fgcom --help&lt;br /&gt;
&lt;br /&gt;
returns the following useful info&lt;br /&gt;
&lt;br /&gt;
    fgcom - a communication radio based on VoIP with IAX/Asterisk&lt;br /&gt;
    (c)2007 by H. Wirtz &amp;lt;wirtz@dfn.de&amp;gt;&lt;br /&gt;
    Version 1.2.2 build 163M&lt;br /&gt;
    Using iaxclient library Version SVN 163M&lt;br /&gt;
&lt;br /&gt;
  OPTION                                        DESCRIPTION&lt;br /&gt;
&lt;br /&gt;
  -d, -debug, --debug=                          show debugging information&lt;br /&gt;
  -S, -voipserver, --voipserver=                voip server to connect to (default: 'fgcom1.parasitstudio.de')&lt;br /&gt;
  -s, -fgserver, --fgserver=                    fg to connect to  (default: 'localhost')&lt;br /&gt;
  -p, -port, --port=                            where we should listen to FG (default: '16661')&lt;br /&gt;
  -a, -airport, --airport=                      airport-id (ICAO) for ATC-mode&lt;br /&gt;
  -f, -frequency, --frequency=                  frequency for ATC-mode&lt;br /&gt;
  -U, -user, --user=                            username for VoIP account (default: 'guest')&lt;br /&gt;
  -P, -password, --password=                    password for VoIP account (default: 'guest')&lt;br /&gt;
  -i, -mic, --mic=                              mic input level (0.0 - 1.0)&lt;br /&gt;
  -o, -speaker, --speaker=                      speaker output level (0.0 - 1.0)&lt;br /&gt;
  -b, -mic-boost, --mic-boost=                  enable mic boost&lt;br /&gt;
  -l, -list-audio, --list-audio=                list audio devices&lt;br /&gt;
  -r, -set-audio-in, --set-audio-in=            use &amp;lt;devicename&amp;gt; as audio input&lt;br /&gt;
  -k, -set-audio-out, --set-audio-out=          use &amp;lt;devicename&amp;gt; as audio output&lt;br /&gt;
  -c, -codec, --codec=                          use codec &amp;lt;codec&amp;gt; as transfer codec (default: 'u')&lt;br /&gt;
&lt;br /&gt;
  Available codecs:&lt;br /&gt;
        u - ulaw (default and best codec because the mixing is based onto ulaw)&lt;br /&gt;
        a - alaw&lt;br /&gt;
        g - gsm&lt;br /&gt;
        s - speex&lt;br /&gt;
        7 - G.723&lt;br /&gt;
&lt;br /&gt;
  Mode 1: client for COM1 of flightgear:&lt;br /&gt;
        $ fgcom&lt;br /&gt;
  - connects fgcom to fgfs at localhost:16661&lt;br /&gt;
        $ fgcom -sother.host.tld -p23456&lt;br /&gt;
  - connects fgcom to fgfs at other.host.tld:23456&lt;br /&gt;
&lt;br /&gt;
  Mode 2: client for an ATC at &amp;lt;airport&amp;gt; on &amp;lt;frequency&amp;gt;:&lt;br /&gt;
        $ fgcom -aKSFO -f120.500&lt;br /&gt;
  - sets up fgcom for an ATC radio at KSFO 120.500 MHz&lt;br /&gt;
&lt;br /&gt;
    Note that /home/hcs/src/fgcom/trunk/src/fgcom starts with a guest account unless you use -U and -P!&lt;br /&gt;
&lt;br /&gt;
Also note that the current server (fgcom.flightgear.co.uk) works with guest account, so '''do not use -U or -P'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Server installation==&lt;br /&gt;
&lt;br /&gt;
For running a FGCOM server you need Asterisk and depending on the amount of users much bandwith and CPU power. Because of putting pilots and ATCs in a VoIP conference the server-admin has to assure that there is enough network and cpu power to avoid drop-outs of the voice stream.&lt;br /&gt;
&lt;br /&gt;
===Prerequirements===&lt;br /&gt;
&lt;br /&gt;
Install Asterisk on top of your favorite distribution. Please refer to installation manuals (e.g. [[http://www.asteriskguru.com/|Asterisk-Guru]]) you can find on the net. You do not need H.323 or SIP because the fgcom client uses IAX2 as VoIP signaling protocol. Only if you think about connecting external VoIP applications to FGCOM you should consider to activate H.323 or SIP (but this is not the scope of this small howto).&lt;br /&gt;
&lt;br /&gt;
Notice: You need to install the zaptel driver modules - even if you won't use any hardware for telecom interfacing. You need the ztdummy kernel module for the asterisk conference application MeetMe() because it simulates a hardware clock needed by this application. Further development of FGCOM might use app_conference which don't needs any timing device.&lt;br /&gt;
&lt;br /&gt;
For now we want to use /etc/asterisk as the base configuration directory.&lt;br /&gt;
&lt;br /&gt;
===Setting up the radio frequencies===&lt;br /&gt;
&lt;br /&gt;
The radio frequencies are &amp;quot;simple&amp;quot; Conferences and realized due to the Asterisk application MeetMe().&lt;br /&gt;
&lt;br /&gt;
====Part 1: General configuration====&lt;br /&gt;
&lt;br /&gt;
First you have to set up the general configuration of the system. Put the following at the top of your &amp;quot;extensions.conf&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
  [general]&lt;br /&gt;
  static=yes&lt;br /&gt;
  writeprotect=yes&lt;br /&gt;
  ;&lt;br /&gt;
  [globals]&lt;br /&gt;
  ;&lt;br /&gt;
  [macro-com]&lt;br /&gt;
  exten =&amp;gt; s,1,Answer()&lt;br /&gt;
  exten =&amp;gt; s,n,MeetMe(${MACRO_EXTEN},qd)&lt;br /&gt;
  exten =&amp;gt; s,n,Hangup()&lt;br /&gt;
  ;&lt;br /&gt;
  [macro-echo]&lt;br /&gt;
  exten =&amp;gt; s,1,Answer()&lt;br /&gt;
  exten =&amp;gt; s,n,Echo()&lt;br /&gt;
  exten =&amp;gt; s,n,Hangup()&lt;br /&gt;
  ;&lt;br /&gt;
  [guest]&lt;br /&gt;
  ; ATC-Help&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-911.000,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252591100,1,Dial(Local/01-ZZZZ-911.000)&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-910.000,1,Macro(echo)&lt;br /&gt;
  exten =&amp;gt; 012525252591000,1,Dial(Local/01-ZZZZ-910.000)&lt;br /&gt;
  ;&lt;br /&gt;
  [default]&lt;br /&gt;
  include =&amp;gt; guest&lt;br /&gt;
  ;&lt;br /&gt;
  ; Code:&lt;br /&gt;
  ; 01 - FlightGear&lt;br /&gt;
  ; 02 - Microsoft Flight-Simulator&lt;br /&gt;
  ; 03 - ...&lt;br /&gt;
  ;&lt;br /&gt;
  ; Air2Air&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-123.450,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252512345,1,Dial(Local/01-ZZZZ-123.450)&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-122.750,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252512275,1,Dial(Local/01-ZZZZ-122.750)&lt;br /&gt;
&lt;br /&gt;
====Part 2: Adding your favorite (all?) frequencies====&lt;br /&gt;
&lt;br /&gt;
For this you have simply to create an extension for every touple of airport/frequency in extensions.conf. The following is an example for Berlin-Tempelhof (EDDI). The information comes from the file &amp;quot;apt.dat.gz&amp;quot; of your FlightGear installation.&lt;br /&gt;
&lt;br /&gt;
  ; EDDI ATIS 126.020 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-126.020,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812602,1,Dial(Local/01-EDDI-126.020)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DEP 120.620 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-120.620,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812062,1,Dial(Local/01-EDDI-120.620)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DIRECTOR 121.120 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-121.120,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812112,1,Dial(Local/01-EDDI-121.120)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN ARR 126.420 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-126.420,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812642,1,Dial(Local/01-EDDI-126.420)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI GND 121.950 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-121.950,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812195,1,Dial(Local/01-EDDI-121.950)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI TWR 119.570 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.570,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811957,1,Dial(Local/01-EDDI-119.570)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DIRECTOR 136.100 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-136.100,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030813610,1,Dial(Local/01-EDDI-136.100)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI TWR 118.100 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-118.100,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811810,1,Dial(Local/01-EDDI-118.100)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DEP 119.500 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.500,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811950,1,Dial(Local/01-EDDI-119.500)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN ARR 119.620 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.620,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811962,1,Dial(Local/01-EDDI-119.620)&lt;br /&gt;
&lt;br /&gt;
What does the above mean? There are two lines (three with the comment) for each frequency: The first one sets up an extension named &amp;quot;01-EDDI-119.500&amp;quot;. Yes, for VoIP you can use textual extensions but be careful if you want to setup your Asterisk-Server with POTS (=Plain old telephone service). Therefor you need the second line which is the same as above but without dashes and the letters in the decimal representation of the ASCII Code. The second line does only a &amp;quot;rewrite&amp;quot; of the numerical representation to the textual one.&lt;br /&gt;
&lt;br /&gt;
For setting up all airports you can write your own simple script. But this maybe also not needed in further versions of FGCOM.&lt;br /&gt;
&lt;br /&gt;
After editing the extensions.conf file you have to reload the extensions file (e.g. &amp;quot;asterisk -rx extensions reload&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
You can add further nice goodies to your extensions.conf: MorseCode() for morsing the code of the VOR (MorseCode() will only work in Asterisk &amp;gt;= 1.4), Recording of metar data and playing this recording back when using the frequency of the metar information, ...&lt;br /&gt;
 &lt;br /&gt;
===Setting up user accounts===&lt;br /&gt;
&lt;br /&gt;
The user accounts are located in the file iax.conf (and perhaps also in sip.conf, but this is not necessary). The top of the file should look like this:&lt;br /&gt;
&lt;br /&gt;
  [general]&lt;br /&gt;
  bandwith=low&lt;br /&gt;
  disallow=lpc10&lt;br /&gt;
  jitterbuffer=yes&lt;br /&gt;
  forcejitterbuffer=no&lt;br /&gt;
  tos=lowdelay&lt;br /&gt;
  autokill=yes&lt;br /&gt;
  disallow=all&lt;br /&gt;
  allow=alaw&lt;br /&gt;
  allow=gsm&lt;br /&gt;
  allow=ilbc&lt;br /&gt;
  allow=g726&lt;br /&gt;
  allow=ulaw&lt;br /&gt;
  language=en&lt;br /&gt;
  maxauthreq=10&lt;br /&gt;
  context=guest&lt;br /&gt;
  ;&lt;br /&gt;
  [guest]&lt;br /&gt;
  type=user&lt;br /&gt;
  username=guest&lt;br /&gt;
  context=guest&lt;br /&gt;
  qualify=yes&lt;br /&gt;
  callerid=Guest IAX User&lt;br /&gt;
  host=dynamic&lt;br /&gt;
  ;&lt;br /&gt;
&lt;br /&gt;
You may want to disallow more codecs or want to allow additional codecs (such as speex). But have in mind that the internal mixing of the conferences are done in &amp;quot;ulaw&amp;quot;. But &amp;quot;ulaw&amp;quot; needs about 80 kBit/s because it does no compression. So you have to think about what's better for you: less bandwidth (per user) and more CPU usage or  more bandwidth (per user) and less CPU usage... you should also consider the &amp;quot;sound&amp;quot; of some codecs may not have the 'real radio sound'.&lt;br /&gt;
&lt;br /&gt;
For each user you have to add a bunch of lines to your iax.conf file:&lt;br /&gt;
&lt;br /&gt;
  [&amp;lt;USERNAME&amp;gt;]&lt;br /&gt;
  type=user&lt;br /&gt;
  username=&amp;lt;USERNAME&amp;gt;&lt;br /&gt;
  secret=&amp;lt;PASSWORD&amp;gt;&lt;br /&gt;
  context=default&lt;br /&gt;
  host=dynamic&lt;br /&gt;
  nat=yes&lt;br /&gt;
  notransfer=yes&lt;br /&gt;
&lt;br /&gt;
You just have to fill in the &amp;lt;USERNAME&amp;gt; and &amp;lt;PASSWORD&amp;gt;. After each change you have to reload the configuration (e.g. &amp;quot;asterisk -rx reload chan_iax2.so&amp;quot;). Perhaps you want to write scripts for automatic configuration and so on. But be warned: Further versions of fgcom may use the multiplayer servers for getting usernames and position data and you have to change your scripts.&lt;br /&gt;
&lt;br /&gt;
===Problems?===&lt;br /&gt;
&lt;br /&gt;
If you have problems you can contact me via email at &amp;quot;dcoredump AT gmail.com&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
* [http://squonk.abacab.org/dokuwiki/fgcom Official website]&lt;br /&gt;
* [http://squonk.abacab.org/dokuwiki/fgcom-manual Manual]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[FlightGear related projects]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Understand_console_output&amp;diff=10485</id>
		<title>Howto:Understand console output</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Understand_console_output&amp;diff=10485"/>
		<updated>2009-01-25T00:18:51Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* Near camera not rendering */ formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''This document is intended to list common errors and how to get rid of them.'''&lt;br /&gt;
&lt;br /&gt;
===OpenAL error &amp;lt;AL_INVALID_VALUE&amp;gt;: bind source &amp;lt;alGenSources&amp;gt;&amp;lt;br&amp;gt;Failed to generate audio source.===&lt;br /&gt;
This error is probably displayed because of some misdirected audio settings in the aircrafts setup. Check the -sound.xml file of the aircraft and see if all files refered to really exist. If not, try to contact the author of the plane, so he can fix the problem in the CVS version or solve the problem yourself and let someone commit the patch.&lt;br /&gt;
&lt;br /&gt;
===Found unexpected subsystem: system exiting. JSBSim failed to load aircraft and/or engine model===&lt;br /&gt;
You are probably trying to run an aircraft on a out-of-date version of FlightGear. The planes on the official download page are intended to be used with the latest version of FlightGear. Usage on any older systems may nog work.&lt;br /&gt;
&lt;br /&gt;
===Unkown exeption to the main loop. Abording... &amp;lt;br&amp;gt;Possible cause: No such file or directory===&lt;br /&gt;
Setting your BPP to a lower value might work.&lt;br /&gt;
&lt;br /&gt;
===OpenAL error (AL_INVALID_VALUE): constructor (alBufferData)&amp;lt;br&amp;gt;Fatal error: Failed to buffer data.===&lt;br /&gt;
Disabling sound is a temporarily solution for this problem.&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayMgr::MP_ProcessData: No such file or directory===&lt;br /&gt;
This is telling you that there's someone online on the multiplayerserver, using a plane that you do not have installed on your own system. In order to remove the error (and see the other plane) you have to install the plane that pilot is using.&lt;br /&gt;
&lt;br /&gt;
===Error: bind() failed in make_server_socket()===&lt;br /&gt;
When using multiplayer or socket input, this usually means you specified an invalid ip address or the port is in use. Note: for multiplayer, you don't need to use the ''--multiplay=in,...'' option at all, FlightGear (since version 1.0) figures out the proper setting automatically. Only use when you know what you are doing.&lt;br /&gt;
&lt;br /&gt;
===Near camera not rendering===&lt;br /&gt;
[[Image:Near_camera_off.png]]&lt;br /&gt;
&lt;br /&gt;
Make sure you have at least OSG version 2.7.6.&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|Get rid of common errors]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Understand_console_output&amp;diff=10484</id>
		<title>Howto:Understand console output</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Understand_console_output&amp;diff=10484"/>
		<updated>2009-01-25T00:17:51Z</updated>

		<summary type="html">&lt;p&gt;Jester: Added &amp;quot;near camera not rendering&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''This document is intended to list common errors and how to get rid of them.'''&lt;br /&gt;
&lt;br /&gt;
===OpenAL error &amp;lt;AL_INVALID_VALUE&amp;gt;: bind source &amp;lt;alGenSources&amp;gt;&amp;lt;br&amp;gt;Failed to generate audio source.===&lt;br /&gt;
This error is probably displayed because of some misdirected audio settings in the aircrafts setup. Check the -sound.xml file of the aircraft and see if all files refered to really exist. If not, try to contact the author of the plane, so he can fix the problem in the CVS version or solve the problem yourself and let someone commit the patch.&lt;br /&gt;
&lt;br /&gt;
===Found unexpected subsystem: system exiting. JSBSim failed to load aircraft and/or engine model===&lt;br /&gt;
You are probably trying to run an aircraft on a out-of-date version of FlightGear. The planes on the official download page are intended to be used with the latest version of FlightGear. Usage on any older systems may nog work.&lt;br /&gt;
&lt;br /&gt;
===Unkown exeption to the main loop. Abording... &amp;lt;br&amp;gt;Possible cause: No such file or directory===&lt;br /&gt;
Setting your BPP to a lower value might work.&lt;br /&gt;
&lt;br /&gt;
===OpenAL error (AL_INVALID_VALUE): constructor (alBufferData)&amp;lt;br&amp;gt;Fatal error: Failed to buffer data.===&lt;br /&gt;
Disabling sound is a temporarily solution for this problem.&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayMgr::MP_ProcessData: No such file or directory===&lt;br /&gt;
This is telling you that there's someone online on the multiplayerserver, using a plane that you do not have installed on your own system. In order to remove the error (and see the other plane) you have to install the plane that pilot is using.&lt;br /&gt;
&lt;br /&gt;
===Error: bind() failed in make_server_socket()===&lt;br /&gt;
When using multiplayer or socket input, this usually means you specified an invalid ip address or the port is in use. Note: for multiplayer, you don't need to use the ''--multiplay=in,...'' option at all, FlightGear (since version 1.0) figures out the proper setting automatically. Only use when you know what you are doing.&lt;br /&gt;
&lt;br /&gt;
===Near camera not rendering===&lt;br /&gt;
Make sure you have at least OSG version 2.7.6.&lt;br /&gt;
[[Image:Near_camera_off.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|Get rid of common errors]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=File:Near_camera_off.png&amp;diff=10483</id>
		<title>File:Near camera off.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=File:Near_camera_off.png&amp;diff=10483"/>
		<updated>2009-01-25T00:16:06Z</updated>

		<summary type="html">&lt;p&gt;Jester: Illustration for near camera not rendering&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Illustration for near camera not rendering&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Understand_console_output&amp;diff=10466</id>
		<title>Howto:Understand console output</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Understand_console_output&amp;diff=10466"/>
		<updated>2009-01-23T14:32:35Z</updated>

		<summary type="html">&lt;p&gt;Jester: Added bind() error&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''This document is intended to list common errors and how to get rid of them.'''&lt;br /&gt;
&lt;br /&gt;
===OpenAL error &amp;lt;AL_INVALID_VALUE&amp;gt;: bind source &amp;lt;alGenSources&amp;gt;&amp;lt;br&amp;gt;Failed to generate audio source.===&lt;br /&gt;
This error is probably displayed because of some misdirected audio settings in the aircrafts setup. Check the -sound.xml file of the aircraft and see if all files refered to really exist. If not, try to contact the author of the plane, so he can fix the problem in the CVS version or solve the problem yourself and let someone commit the patch.&lt;br /&gt;
&lt;br /&gt;
===Found unexpected subsystem: system exiting. JSBSim failed to load aircraft and/or engine model===&lt;br /&gt;
You are probably trying to run an aircraft on a out-of-date version of FlightGear. The planes on the official download page are intended to be used with the latest version of FlightGear. Usage on any older systems may nog work.&lt;br /&gt;
&lt;br /&gt;
===Unkown exeption to the main loop. Abording... &amp;lt;br&amp;gt;Possible cause: No such file or directory===&lt;br /&gt;
Setting your BPP to a lower value might work.&lt;br /&gt;
&lt;br /&gt;
===OpenAL error (AL_INVALID_VALUE): constructor (alBufferData)&amp;lt;br&amp;gt;Fatal error: Failed to buffer data.===&lt;br /&gt;
Disabling sound is a temporarily solution for this problem.&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayMgr::MP_ProcessData: No such file or directory===&lt;br /&gt;
This is telling you that there's someone online on the multiplayerserver, using a plane that you do not have installed on your own system. In order to remove the error (and see the other plane) you have to install the plane that pilot is using.&lt;br /&gt;
&lt;br /&gt;
===Error: bind() failed in make_server_socket()===&lt;br /&gt;
When using multiplayer or socket input, this usually means you specified an invalid ip address or the port is in use. Note: for multiplayer, you don't need to use the ''--multiplay=in,...'' option at all, FlightGear (since version 1.0) figures out the proper setting automatically. Only use when you know what you are doing.&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|Get rid of common errors]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Understand_console_output&amp;diff=10463</id>
		<title>Howto:Understand console output</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Understand_console_output&amp;diff=10463"/>
		<updated>2009-01-23T14:26:50Z</updated>

		<summary type="html">&lt;p&gt;Jester: Fixed typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''This document is intended to list common errors and how to get rid of them.'''&lt;br /&gt;
&lt;br /&gt;
===OpenAL error &amp;lt;AL_INVALID_VALUE&amp;gt;: bind source &amp;lt;alGenSources&amp;gt;&amp;lt;br&amp;gt;Failed to generate audio source.===&lt;br /&gt;
This error is probably displayed because of some misdirected audio settings in the aircrafts setup. Check the -sound.xml file of the aircraft and see if all files refered to really exist. If not, try to contact the author of the plane, so he can fix the problem in the CVS version or solve the problem yourself and let someone commit the patch.&lt;br /&gt;
&lt;br /&gt;
===Found unexpected subsystem: system exiting. JSBSim failed to load aircraft and/or engine model===&lt;br /&gt;
You are probably trying to run an aircraft on a out-of-date version of FlightGear. The planes on the official download page are intended to be used with the latest version of FlightGear. Usage on any older systems may nog work.&lt;br /&gt;
&lt;br /&gt;
===Unkown exeption to the main loop. Abording... &amp;lt;br&amp;gt;Possible cause: No such file or directory===&lt;br /&gt;
Setting your BPP to a lower value might work.&lt;br /&gt;
&lt;br /&gt;
===OpenAL error (AL_INVALID_VALUE): constructor (alBufferData)&amp;lt;br&amp;gt;Fatal error: Failed to buffer data.===&lt;br /&gt;
Disabling sound is a temporarily solution for this problem.&lt;br /&gt;
&lt;br /&gt;
===FGMultiplayMgr::MP_ProcessData: No such file or directory===&lt;br /&gt;
This is telling you that there's someone online on the multiplayerserver, using a plane that you do not have installed on your own system. In order to remove the error (and see the other plane) you have to install the plane that pilot is using.&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|Get rid of common errors]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FGCom_(before_3.0)&amp;diff=10108</id>
		<title>FGCom (before 3.0)</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FGCom_(before_3.0)&amp;diff=10108"/>
		<updated>2008-12-28T03:56:35Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* Registration */  Removed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{cleanup}}&lt;br /&gt;
&lt;br /&gt;
'''FGCom''' is an addon for [[FlightGear]]. With FGCom (and the infrastructure behind), FlightGear gets a realtime voice communication system which could be used for [[ATC]]. The current version of fgcom is airport based - that means radio frequencies are based towards the location of the tower. Further version will fix this for a more realistic radio implementation (see [[Development]])&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
*'''18 November, 2008:'''&lt;br /&gt;
Latest SVN (rev 163) has the compile problems fixed. Also we have a '''new server: fgcom.flightgear.co.uk'''. User accounts not required (ie. do '''not''' use -U or -P)&lt;br /&gt;
*'''31 October, 2008:''' &lt;br /&gt;
&lt;br /&gt;
The latest SVN release at this time is the '''r149''' which does not compile due to a constant that is not defined (STL_STRING). Such constant appears at line 57 in the file ''src/fgcom_init.cpp'' which is:&lt;br /&gt;
''#include STL_STRING''&lt;br /&gt;
&lt;br /&gt;
I guess that such constant must point to the STL library include file but I am not sure.&lt;br /&gt;
I revert to the '''r148''' SVN version which successfully compiles.&lt;br /&gt;
&lt;br /&gt;
Command to get such version is: ''svn co -r148 svn://svn.dfn.de:/fgcom/trunk fgcom-r148''&lt;br /&gt;
&lt;br /&gt;
* '''19 June, 2008:''' Currently the server is &amp;lt;u&amp;gt;down&amp;lt;/u&amp;gt; due to hardware problems. It is unknown when the service comes back becuase he currently has no time to fix the problems.&lt;br /&gt;
&lt;br /&gt;
* '''22 November 2007:''' Due to heavy development at this time there may be some differences between the information on the web pages and the installation. Please follow the discussions on the FlightGear development list!&lt;br /&gt;
&lt;br /&gt;
==Client installation==&lt;br /&gt;
Before you start, make sure that your speakers and mic are working and tested to sensible volumes.&lt;br /&gt;
===Linux===&lt;br /&gt;
Fetch FGCom (a copy of a working iaxclient is inside)&lt;br /&gt;
&lt;br /&gt;
 svn checkout svn://svn.dfn.de:/fgcom/trunk fgcom&lt;br /&gt;
&lt;br /&gt;
Optional: edit iaxclient/lib/Makefile&lt;br /&gt;
&lt;br /&gt;
To use OpenAl (Recommended and the default for now. Note however, that it requires OpenAl with capture support.)&lt;br /&gt;
 &lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
 AUDIO_OPENAL=1&lt;br /&gt;
&lt;br /&gt;
To use oss emulation&lt;br /&gt;
 &lt;br /&gt;
 USE_PA_OSS=1&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
 AUDIO_OPENAL=0&lt;br /&gt;
&lt;br /&gt;
To use native alsa (WARNING: PTT won't work)&lt;br /&gt;
&lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=1&lt;br /&gt;
 AUDIO_OPENAL=0&lt;br /&gt;
&lt;br /&gt;
To use portaudio alsa (WARNING: only if your card natively supports 8000Hz sample rate)&lt;br /&gt;
&lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=1&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
 AUDIO_OPENAL=0&lt;br /&gt;
&lt;br /&gt;
Edit fgcom/src/Makefile and check the pathes for PLIB_PREFIX and OPENAL_PREFIX.&lt;br /&gt;
&lt;br /&gt;
Compile iaxclient and fgcom. To do so, do the following:&lt;br /&gt;
&lt;br /&gt;
 cd fgcom/src &amp;amp;&amp;amp; make&lt;br /&gt;
&lt;br /&gt;
Install&lt;br /&gt;
&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
and you should be ready for a quick test...&lt;br /&gt;
&lt;br /&gt;
==Using==&lt;br /&gt;
===Testing===&lt;br /&gt;
quick test&lt;br /&gt;
&lt;br /&gt;
    $ fgcom -Sfgcom.flightgear.org.uk -f910      &lt;br /&gt;
&lt;br /&gt;
will give the following output--&lt;br /&gt;
    fgcom - a communication radio based on VoIP with IAX/Asterisk&lt;br /&gt;
    (c)2007 by H. Wirtz &amp;lt;wirtz@dfn.de&amp;gt;&lt;br /&gt;
    Version 1.2.2 build 163M&lt;br /&gt;
    Using iaxclient library Version SVN 163M&lt;br /&gt;
    &lt;br /&gt;
    Successfully parsed commandline options.&lt;br /&gt;
    Reading list of airports...done.&lt;br /&gt;
    Initializing IAX client as guest:xxxxxxxxxxx@fgcom.flightgear.org.uk&lt;br /&gt;
    Call 0 accepted&lt;br /&gt;
    Call 0 answered&lt;br /&gt;
&lt;br /&gt;
speak into the mic and your words will be echoed back with a short delay.&lt;br /&gt;
&lt;br /&gt;
type &amp;lt;nowiki&amp;gt;ctrl-C&amp;lt;/nowiki&amp;gt; to exit this test&lt;br /&gt;
&lt;br /&gt;
===Configuration===&lt;br /&gt;
&lt;br /&gt;
''Or if it didn't work perfectly first time''&lt;br /&gt;
&lt;br /&gt;
    fgcom --help&lt;br /&gt;
&lt;br /&gt;
returns the following useful info&lt;br /&gt;
&lt;br /&gt;
    fgcom - a communication radio based on VoIP with IAX/Asterisk&lt;br /&gt;
    (c)2007 by H. Wirtz &amp;lt;wirtz@dfn.de&amp;gt;&lt;br /&gt;
    Version 1.2.2 build 163M&lt;br /&gt;
    Using iaxclient library Version SVN 163M&lt;br /&gt;
&lt;br /&gt;
  OPTION                                        DESCRIPTION&lt;br /&gt;
&lt;br /&gt;
  -d, -debug, --debug=                          show debugging information&lt;br /&gt;
  -S, -voipserver, --voipserver=                voip server to connect to (default: 'fgcom1.parasitstudio.de')&lt;br /&gt;
  -s, -fgserver, --fgserver=                    fg to connect to  (default: 'localhost')&lt;br /&gt;
  -p, -port, --port=                            where we should listen to FG (default: '16661')&lt;br /&gt;
  -a, -airport, --airport=                      airport-id (ICAO) for ATC-mode&lt;br /&gt;
  -f, -frequency, --frequency=                  frequency for ATC-mode&lt;br /&gt;
  -U, -user, --user=                            username for VoIP account (default: 'guest')&lt;br /&gt;
  -P, -password, --password=                    password for VoIP account (default: 'guest')&lt;br /&gt;
  -i, -mic, --mic=                              mic input level (0.0 - 1.0)&lt;br /&gt;
  -o, -speaker, --speaker=                      speaker output level (0.0 - 1.0)&lt;br /&gt;
  -b, -mic-boost, --mic-boost=                  enable mic boost&lt;br /&gt;
  -l, -list-audio, --list-audio=                list audio devices&lt;br /&gt;
  -r, -set-audio-in, --set-audio-in=            use &amp;lt;devicename&amp;gt; as audio input&lt;br /&gt;
  -k, -set-audio-out, --set-audio-out=          use &amp;lt;devicename&amp;gt; as audio output&lt;br /&gt;
  -c, -codec, --codec=                          use codec &amp;lt;codec&amp;gt; as transfer codec (default: 'u')&lt;br /&gt;
&lt;br /&gt;
  Available codecs:&lt;br /&gt;
        u - ulaw (default and best codec because the mixing is based onto ulaw)&lt;br /&gt;
        a - alaw&lt;br /&gt;
        g - gsm&lt;br /&gt;
        s - speex&lt;br /&gt;
        7 - G.723&lt;br /&gt;
&lt;br /&gt;
  Mode 1: client for COM1 of flightgear:&lt;br /&gt;
        $ fgcom&lt;br /&gt;
  - connects fgcom to fgfs at localhost:16661&lt;br /&gt;
        $ fgcom -sother.host.tld -p23456&lt;br /&gt;
  - connects fgcom to fgfs at other.host.tld:23456&lt;br /&gt;
&lt;br /&gt;
  Mode 2: client for an ATC at &amp;lt;airport&amp;gt; on &amp;lt;frequency&amp;gt;:&lt;br /&gt;
        $ fgcom -aKSFO -f120.500&lt;br /&gt;
  - sets up fgcom for an ATC radio at KSFO 120.500 MHz&lt;br /&gt;
&lt;br /&gt;
    Note that /home/hcs/src/fgcom/trunk/src/fgcom starts with a guest account unless you use -U and -P!&lt;br /&gt;
&lt;br /&gt;
Also note that the current server (fgcom.flightgear.co.uk) works with guest account, so '''do not use -U or -P'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Server installation==&lt;br /&gt;
&lt;br /&gt;
For running a FGCOM server you need Asterisk and depending on the amount of users much bandwith and CPU power. Because of putting pilots and ATCs in a VoIP conference the server-admin has to assure that there is enough network and cpu power to avoid drop-outs of the voice stream.&lt;br /&gt;
&lt;br /&gt;
===Prerequirements===&lt;br /&gt;
&lt;br /&gt;
Install Asterisk on top of your favorite distribution. Please refer to installation manuals (e.g. [[http://www.asteriskguru.com/|Asterisk-Guru]]) you can find on the net. You do not need H.323 or SIP because the fgcom client uses IAX2 as VoIP signaling protocol. Only if you think about connecting external VoIP applications to FGCOM you should consider to activate H.323 or SIP (but this is not the scope of this small howto).&lt;br /&gt;
&lt;br /&gt;
Notice: You need to install the zaptel driver modules - even if you won't use any hardware for telecom interfacing. You need the ztdummy kernel module for the asterisk conference application MeetMe() because it simulates a hardware clock needed by this application. Further development of FGCOM might use app_conference which don't needs any timing device.&lt;br /&gt;
&lt;br /&gt;
For now we want to use /etc/asterisk as the base configuration directory.&lt;br /&gt;
&lt;br /&gt;
===Setting up the radio frequencies===&lt;br /&gt;
&lt;br /&gt;
The radio frequencies are &amp;quot;simple&amp;quot; Conferences and realized due to the Asterisk application MeetMe().&lt;br /&gt;
&lt;br /&gt;
====Part 1: General configuration====&lt;br /&gt;
&lt;br /&gt;
First you have to set up the general configuration of the system. Put the following at the top of your &amp;quot;extensions.conf&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
  [general]&lt;br /&gt;
  static=yes&lt;br /&gt;
  writeprotect=yes&lt;br /&gt;
  ;&lt;br /&gt;
  [globals]&lt;br /&gt;
  ;&lt;br /&gt;
  [macro-com]&lt;br /&gt;
  exten =&amp;gt; s,1,Answer()&lt;br /&gt;
  exten =&amp;gt; s,n,MeetMe(${MACRO_EXTEN},qd)&lt;br /&gt;
  exten =&amp;gt; s,n,Hangup()&lt;br /&gt;
  ;&lt;br /&gt;
  [macro-echo]&lt;br /&gt;
  exten =&amp;gt; s,1,Answer()&lt;br /&gt;
  exten =&amp;gt; s,n,Echo()&lt;br /&gt;
  exten =&amp;gt; s,n,Hangup()&lt;br /&gt;
  ;&lt;br /&gt;
  [guest]&lt;br /&gt;
  ; ATC-Help&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-911.000,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252591100,1,Dial(Local/01-ZZZZ-911.000)&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-910.000,1,Macro(echo)&lt;br /&gt;
  exten =&amp;gt; 012525252591000,1,Dial(Local/01-ZZZZ-910.000)&lt;br /&gt;
  ;&lt;br /&gt;
  [default]&lt;br /&gt;
  include =&amp;gt; guest&lt;br /&gt;
  ;&lt;br /&gt;
  ; Code:&lt;br /&gt;
  ; 01 - FlightGear&lt;br /&gt;
  ; 02 - Microsoft Flight-Simulator&lt;br /&gt;
  ; 03 - ...&lt;br /&gt;
  ;&lt;br /&gt;
  ; Air2Air&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-123.450,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252512345,1,Dial(Local/01-ZZZZ-123.450)&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-122.750,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252512275,1,Dial(Local/01-ZZZZ-122.750)&lt;br /&gt;
&lt;br /&gt;
====Part 2: Adding your favorite (all?) frequencies====&lt;br /&gt;
&lt;br /&gt;
For this you have simply to create an extension for every touple of airport/frequency in extensions.conf. The following is an example for Berlin-Tempelhof (EDDI). The information comes from the file &amp;quot;apt.dat.gz&amp;quot; of your FlightGear installation.&lt;br /&gt;
&lt;br /&gt;
  ; EDDI ATIS 126.020 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-126.020,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812602,1,Dial(Local/01-EDDI-126.020)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DEP 120.620 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-120.620,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812062,1,Dial(Local/01-EDDI-120.620)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DIRECTOR 121.120 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-121.120,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812112,1,Dial(Local/01-EDDI-121.120)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN ARR 126.420 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-126.420,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812642,1,Dial(Local/01-EDDI-126.420)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI GND 121.950 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-121.950,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812195,1,Dial(Local/01-EDDI-121.950)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI TWR 119.570 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.570,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811957,1,Dial(Local/01-EDDI-119.570)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DIRECTOR 136.100 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-136.100,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030813610,1,Dial(Local/01-EDDI-136.100)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI TWR 118.100 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-118.100,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811810,1,Dial(Local/01-EDDI-118.100)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DEP 119.500 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.500,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811950,1,Dial(Local/01-EDDI-119.500)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN ARR 119.620 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.620,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811962,1,Dial(Local/01-EDDI-119.620)&lt;br /&gt;
&lt;br /&gt;
What does the above mean? There are two lines (three with the comment) for each frequency: The first one sets up an extension named &amp;quot;01-EDDI-119.500&amp;quot;. Yes, for VoIP you can use textual extensions but be careful if you want to setup your Asterisk-Server with POTS (=Plain old telephone service). Therefor you need the second line which is the same as above but without dashes and the letters in the decimal representation of the ASCII Code. The second line does only a &amp;quot;rewrite&amp;quot; of the numerical representation to the textual one.&lt;br /&gt;
&lt;br /&gt;
For setting up all airports you can write your own simple script. But this maybe also not needed in further versions of FGCOM.&lt;br /&gt;
&lt;br /&gt;
After editing the extensions.conf file you have to reload the extensions file (e.g. &amp;quot;asterisk -rx extensions reload&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
You can add further nice goodies to your extensions.conf: MorseCode() for morsing the code of the VOR (MorseCode() will only work in Asterisk &amp;gt;= 1.4), Recording of metar data and playing this recording back when using the frequency of the metar information, ...&lt;br /&gt;
 &lt;br /&gt;
===Setting up user accounts===&lt;br /&gt;
&lt;br /&gt;
The user accounts are located in the file iax.conf (and perhaps also in sip.conf, but this is not necessary). The top of the file should look like this:&lt;br /&gt;
&lt;br /&gt;
  [general]&lt;br /&gt;
  bandwith=low&lt;br /&gt;
  disallow=lpc10&lt;br /&gt;
  jitterbuffer=yes&lt;br /&gt;
  forcejitterbuffer=no&lt;br /&gt;
  tos=lowdelay&lt;br /&gt;
  autokill=yes&lt;br /&gt;
  disallow=all&lt;br /&gt;
  allow=alaw&lt;br /&gt;
  allow=gsm&lt;br /&gt;
  allow=ilbc&lt;br /&gt;
  allow=g726&lt;br /&gt;
  allow=ulaw&lt;br /&gt;
  language=en&lt;br /&gt;
  maxauthreq=10&lt;br /&gt;
  context=guest&lt;br /&gt;
  ;&lt;br /&gt;
  [guest]&lt;br /&gt;
  type=user&lt;br /&gt;
  username=guest&lt;br /&gt;
  context=guest&lt;br /&gt;
  qualify=yes&lt;br /&gt;
  callerid=Guest IAX User&lt;br /&gt;
  host=dynamic&lt;br /&gt;
  ;&lt;br /&gt;
&lt;br /&gt;
You may want to disallow more codecs or want to allow additional codecs (such as speex). But have in mind that the internal mixing of the conferences are done in &amp;quot;ulaw&amp;quot;. But &amp;quot;ulaw&amp;quot; needs about 80 kBit/s because it does no compression. So you have to think about what's better for you: less bandwidth (per user) and more CPU usage or  more bandwidth (per user) and less CPU usage... you should also consider the &amp;quot;sound&amp;quot; of some codecs may not have the 'real radio sound'.&lt;br /&gt;
&lt;br /&gt;
For each user you have to add a bunch of lines to your iax.conf file:&lt;br /&gt;
&lt;br /&gt;
  [&amp;lt;USERNAME&amp;gt;]&lt;br /&gt;
  type=user&lt;br /&gt;
  username=&amp;lt;USERNAME&amp;gt;&lt;br /&gt;
  secret=&amp;lt;PASSWORD&amp;gt;&lt;br /&gt;
  context=default&lt;br /&gt;
  host=dynamic&lt;br /&gt;
  nat=yes&lt;br /&gt;
  notransfer=yes&lt;br /&gt;
&lt;br /&gt;
You just have to fill in the &amp;lt;USERNAME&amp;gt; and &amp;lt;PASSWORD&amp;gt;. After each change you have to reload the configuration (e.g. &amp;quot;asterisk -rx reload chan_iax2.so&amp;quot;). Perhaps you want to write scripts for automatic configuration and so on. But be warned: Further versions of fgcom may use the multiplayer servers for getting usernames and position data and you have to change your scripts.&lt;br /&gt;
&lt;br /&gt;
===Problems?===&lt;br /&gt;
&lt;br /&gt;
If you have problems you can contact me via email at &amp;quot;dcoredump AT gmail.com&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
* [http://squonk.abacab.org/dokuwiki/fgcom Official website]&lt;br /&gt;
* [http://squonk.abacab.org/dokuwiki/fgcom-manual Manual]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[FlightGear related projects]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FGCom_(before_3.0)&amp;diff=10107</id>
		<title>FGCom (before 3.0)</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FGCom_(before_3.0)&amp;diff=10107"/>
		<updated>2008-12-28T03:55:17Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* Configuration */ Updated&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{cleanup}}&lt;br /&gt;
&lt;br /&gt;
'''FGCom''' is an addon for [[FlightGear]]. With FGCom (and the infrastructure behind), FlightGear gets a realtime voice communication system which could be used for [[ATC]]. The current version of fgcom is airport based - that means radio frequencies are based towards the location of the tower. Further version will fix this for a more realistic radio implementation (see [[Development]])&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
*'''18 November, 2008:'''&lt;br /&gt;
Latest SVN (rev 163) has the compile problems fixed. Also we have a '''new server: fgcom.flightgear.co.uk'''. User accounts not required (ie. do '''not''' use -U or -P)&lt;br /&gt;
*'''31 October, 2008:''' &lt;br /&gt;
&lt;br /&gt;
The latest SVN release at this time is the '''r149''' which does not compile due to a constant that is not defined (STL_STRING). Such constant appears at line 57 in the file ''src/fgcom_init.cpp'' which is:&lt;br /&gt;
''#include STL_STRING''&lt;br /&gt;
&lt;br /&gt;
I guess that such constant must point to the STL library include file but I am not sure.&lt;br /&gt;
I revert to the '''r148''' SVN version which successfully compiles.&lt;br /&gt;
&lt;br /&gt;
Command to get such version is: ''svn co -r148 svn://svn.dfn.de:/fgcom/trunk fgcom-r148''&lt;br /&gt;
&lt;br /&gt;
* '''19 June, 2008:''' Currently the server is &amp;lt;u&amp;gt;down&amp;lt;/u&amp;gt; due to hardware problems. It is unknown when the service comes back becuase he currently has no time to fix the problems.&lt;br /&gt;
&lt;br /&gt;
* '''22 November 2007:''' Due to heavy development at this time there may be some differences between the information on the web pages and the installation. Please follow the discussions on the FlightGear development list!&lt;br /&gt;
&lt;br /&gt;
==Client installation==&lt;br /&gt;
Before you start, make sure that your speakers and mic are working and tested to sensible volumes.&lt;br /&gt;
===Linux===&lt;br /&gt;
Fetch FGCom (a copy of a working iaxclient is inside)&lt;br /&gt;
&lt;br /&gt;
 svn checkout svn://svn.dfn.de:/fgcom/trunk fgcom&lt;br /&gt;
&lt;br /&gt;
Optional: edit iaxclient/lib/Makefile&lt;br /&gt;
&lt;br /&gt;
To use OpenAl (Recommended and the default for now. Note however, that it requires OpenAl with capture support.)&lt;br /&gt;
 &lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
 AUDIO_OPENAL=1&lt;br /&gt;
&lt;br /&gt;
To use oss emulation&lt;br /&gt;
 &lt;br /&gt;
 USE_PA_OSS=1&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
 AUDIO_OPENAL=0&lt;br /&gt;
&lt;br /&gt;
To use native alsa (WARNING: PTT won't work)&lt;br /&gt;
&lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=1&lt;br /&gt;
 AUDIO_OPENAL=0&lt;br /&gt;
&lt;br /&gt;
To use portaudio alsa (WARNING: only if your card natively supports 8000Hz sample rate)&lt;br /&gt;
&lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=1&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
 AUDIO_OPENAL=0&lt;br /&gt;
&lt;br /&gt;
Edit fgcom/src/Makefile and check the pathes for PLIB_PREFIX and OPENAL_PREFIX.&lt;br /&gt;
&lt;br /&gt;
Compile iaxclient and fgcom. To do so, do the following:&lt;br /&gt;
&lt;br /&gt;
 cd fgcom/src &amp;amp;&amp;amp; make&lt;br /&gt;
&lt;br /&gt;
Install&lt;br /&gt;
&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
and you should be ready for a quick test...&lt;br /&gt;
&lt;br /&gt;
==Using==&lt;br /&gt;
===Testing===&lt;br /&gt;
quick test&lt;br /&gt;
&lt;br /&gt;
    $ fgcom -Sfgcom.flightgear.org.uk -f910      &lt;br /&gt;
&lt;br /&gt;
will give the following output--&lt;br /&gt;
    fgcom - a communication radio based on VoIP with IAX/Asterisk&lt;br /&gt;
    (c)2007 by H. Wirtz &amp;lt;wirtz@dfn.de&amp;gt;&lt;br /&gt;
    Version 1.2.2 build 163M&lt;br /&gt;
    Using iaxclient library Version SVN 163M&lt;br /&gt;
    &lt;br /&gt;
    Successfully parsed commandline options.&lt;br /&gt;
    Reading list of airports...done.&lt;br /&gt;
    Initializing IAX client as guest:xxxxxxxxxxx@fgcom.flightgear.org.uk&lt;br /&gt;
    Call 0 accepted&lt;br /&gt;
    Call 0 answered&lt;br /&gt;
&lt;br /&gt;
speak into the mic and your words will be echoed back with a short delay.&lt;br /&gt;
&lt;br /&gt;
type &amp;lt;nowiki&amp;gt;ctrl-C&amp;lt;/nowiki&amp;gt; to exit this test&lt;br /&gt;
&lt;br /&gt;
===Configuration===&lt;br /&gt;
&lt;br /&gt;
''Or if it didn't work perfectly first time''&lt;br /&gt;
&lt;br /&gt;
    fgcom --help&lt;br /&gt;
&lt;br /&gt;
returns the following useful info&lt;br /&gt;
&lt;br /&gt;
    fgcom - a communication radio based on VoIP with IAX/Asterisk&lt;br /&gt;
    (c)2007 by H. Wirtz &amp;lt;wirtz@dfn.de&amp;gt;&lt;br /&gt;
    Version 1.2.2 build 163M&lt;br /&gt;
    Using iaxclient library Version SVN 163M&lt;br /&gt;
&lt;br /&gt;
  OPTION                                        DESCRIPTION&lt;br /&gt;
&lt;br /&gt;
  -d, -debug, --debug=                          show debugging information&lt;br /&gt;
  -S, -voipserver, --voipserver=                voip server to connect to (default: 'fgcom1.parasitstudio.de')&lt;br /&gt;
  -s, -fgserver, --fgserver=                    fg to connect to  (default: 'localhost')&lt;br /&gt;
  -p, -port, --port=                            where we should listen to FG (default: '16661')&lt;br /&gt;
  -a, -airport, --airport=                      airport-id (ICAO) for ATC-mode&lt;br /&gt;
  -f, -frequency, --frequency=                  frequency for ATC-mode&lt;br /&gt;
  -U, -user, --user=                            username for VoIP account (default: 'guest')&lt;br /&gt;
  -P, -password, --password=                    password for VoIP account (default: 'guest')&lt;br /&gt;
  -i, -mic, --mic=                              mic input level (0.0 - 1.0)&lt;br /&gt;
  -o, -speaker, --speaker=                      speaker output level (0.0 - 1.0)&lt;br /&gt;
  -b, -mic-boost, --mic-boost=                  enable mic boost&lt;br /&gt;
  -l, -list-audio, --list-audio=                list audio devices&lt;br /&gt;
  -r, -set-audio-in, --set-audio-in=            use &amp;lt;devicename&amp;gt; as audio input&lt;br /&gt;
  -k, -set-audio-out, --set-audio-out=          use &amp;lt;devicename&amp;gt; as audio output&lt;br /&gt;
  -c, -codec, --codec=                          use codec &amp;lt;codec&amp;gt; as transfer codec (default: 'u')&lt;br /&gt;
&lt;br /&gt;
  Available codecs:&lt;br /&gt;
        u - ulaw (default and best codec because the mixing is based onto ulaw)&lt;br /&gt;
        a - alaw&lt;br /&gt;
        g - gsm&lt;br /&gt;
        s - speex&lt;br /&gt;
        7 - G.723&lt;br /&gt;
&lt;br /&gt;
  Mode 1: client for COM1 of flightgear:&lt;br /&gt;
        $ fgcom&lt;br /&gt;
  - connects fgcom to fgfs at localhost:16661&lt;br /&gt;
        $ fgcom -sother.host.tld -p23456&lt;br /&gt;
  - connects fgcom to fgfs at other.host.tld:23456&lt;br /&gt;
&lt;br /&gt;
  Mode 2: client for an ATC at &amp;lt;airport&amp;gt; on &amp;lt;frequency&amp;gt;:&lt;br /&gt;
        $ fgcom -aKSFO -f120.500&lt;br /&gt;
  - sets up fgcom for an ATC radio at KSFO 120.500 MHz&lt;br /&gt;
&lt;br /&gt;
    Note that /home/hcs/src/fgcom/trunk/src/fgcom starts with a guest account unless you use -U and -P!&lt;br /&gt;
&lt;br /&gt;
Also note that the current server (fgcom.flightgear.co.uk) works with guest account, so '''do not use -U or -P'''&lt;br /&gt;
&lt;br /&gt;
===Registration===&lt;br /&gt;
'''To make full use of FGCOM you will need an account!'''&lt;br /&gt;
&lt;br /&gt;
Please email &amp;lt;nowiki&amp;gt; wirtz &amp;lt;at&amp;gt; dfn &amp;lt;dot&amp;gt; de&amp;lt;/nowiki&amp;gt; (replace with @ and .) and login details will be sent to you shortly. Accounts will not be made until Autumn 2008. But you can test without an account (by default the used account is guest, password guest) with restricted frequency use. As guest you can only use the following frequencies:&lt;br /&gt;
&lt;br /&gt;
* 911.000 MHz (ATC-Help)&lt;br /&gt;
* 910.000 MHz (Echo-Box)&lt;br /&gt;
* 123.450 MHz (Air2Air 1)&lt;br /&gt;
* 122.750 Mhz (Air2Air 2)&lt;br /&gt;
&lt;br /&gt;
==Server installation==&lt;br /&gt;
&lt;br /&gt;
For running a FGCOM server you need Asterisk and depending on the amount of users much bandwith and CPU power. Because of putting pilots and ATCs in a VoIP conference the server-admin has to assure that there is enough network and cpu power to avoid drop-outs of the voice stream.&lt;br /&gt;
&lt;br /&gt;
===Prerequirements===&lt;br /&gt;
&lt;br /&gt;
Install Asterisk on top of your favorite distribution. Please refer to installation manuals (e.g. [[http://www.asteriskguru.com/|Asterisk-Guru]]) you can find on the net. You do not need H.323 or SIP because the fgcom client uses IAX2 as VoIP signaling protocol. Only if you think about connecting external VoIP applications to FGCOM you should consider to activate H.323 or SIP (but this is not the scope of this small howto).&lt;br /&gt;
&lt;br /&gt;
Notice: You need to install the zaptel driver modules - even if you won't use any hardware for telecom interfacing. You need the ztdummy kernel module for the asterisk conference application MeetMe() because it simulates a hardware clock needed by this application. Further development of FGCOM might use app_conference which don't needs any timing device.&lt;br /&gt;
&lt;br /&gt;
For now we want to use /etc/asterisk as the base configuration directory.&lt;br /&gt;
&lt;br /&gt;
===Setting up the radio frequencies===&lt;br /&gt;
&lt;br /&gt;
The radio frequencies are &amp;quot;simple&amp;quot; Conferences and realized due to the Asterisk application MeetMe().&lt;br /&gt;
&lt;br /&gt;
====Part 1: General configuration====&lt;br /&gt;
&lt;br /&gt;
First you have to set up the general configuration of the system. Put the following at the top of your &amp;quot;extensions.conf&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
  [general]&lt;br /&gt;
  static=yes&lt;br /&gt;
  writeprotect=yes&lt;br /&gt;
  ;&lt;br /&gt;
  [globals]&lt;br /&gt;
  ;&lt;br /&gt;
  [macro-com]&lt;br /&gt;
  exten =&amp;gt; s,1,Answer()&lt;br /&gt;
  exten =&amp;gt; s,n,MeetMe(${MACRO_EXTEN},qd)&lt;br /&gt;
  exten =&amp;gt; s,n,Hangup()&lt;br /&gt;
  ;&lt;br /&gt;
  [macro-echo]&lt;br /&gt;
  exten =&amp;gt; s,1,Answer()&lt;br /&gt;
  exten =&amp;gt; s,n,Echo()&lt;br /&gt;
  exten =&amp;gt; s,n,Hangup()&lt;br /&gt;
  ;&lt;br /&gt;
  [guest]&lt;br /&gt;
  ; ATC-Help&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-911.000,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252591100,1,Dial(Local/01-ZZZZ-911.000)&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-910.000,1,Macro(echo)&lt;br /&gt;
  exten =&amp;gt; 012525252591000,1,Dial(Local/01-ZZZZ-910.000)&lt;br /&gt;
  ;&lt;br /&gt;
  [default]&lt;br /&gt;
  include =&amp;gt; guest&lt;br /&gt;
  ;&lt;br /&gt;
  ; Code:&lt;br /&gt;
  ; 01 - FlightGear&lt;br /&gt;
  ; 02 - Microsoft Flight-Simulator&lt;br /&gt;
  ; 03 - ...&lt;br /&gt;
  ;&lt;br /&gt;
  ; Air2Air&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-123.450,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252512345,1,Dial(Local/01-ZZZZ-123.450)&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-122.750,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252512275,1,Dial(Local/01-ZZZZ-122.750)&lt;br /&gt;
&lt;br /&gt;
====Part 2: Adding your favorite (all?) frequencies====&lt;br /&gt;
&lt;br /&gt;
For this you have simply to create an extension for every touple of airport/frequency in extensions.conf. The following is an example for Berlin-Tempelhof (EDDI). The information comes from the file &amp;quot;apt.dat.gz&amp;quot; of your FlightGear installation.&lt;br /&gt;
&lt;br /&gt;
  ; EDDI ATIS 126.020 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-126.020,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812602,1,Dial(Local/01-EDDI-126.020)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DEP 120.620 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-120.620,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812062,1,Dial(Local/01-EDDI-120.620)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DIRECTOR 121.120 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-121.120,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812112,1,Dial(Local/01-EDDI-121.120)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN ARR 126.420 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-126.420,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812642,1,Dial(Local/01-EDDI-126.420)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI GND 121.950 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-121.950,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812195,1,Dial(Local/01-EDDI-121.950)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI TWR 119.570 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.570,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811957,1,Dial(Local/01-EDDI-119.570)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DIRECTOR 136.100 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-136.100,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030813610,1,Dial(Local/01-EDDI-136.100)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI TWR 118.100 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-118.100,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811810,1,Dial(Local/01-EDDI-118.100)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DEP 119.500 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.500,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811950,1,Dial(Local/01-EDDI-119.500)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN ARR 119.620 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.620,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811962,1,Dial(Local/01-EDDI-119.620)&lt;br /&gt;
&lt;br /&gt;
What does the above mean? There are two lines (three with the comment) for each frequency: The first one sets up an extension named &amp;quot;01-EDDI-119.500&amp;quot;. Yes, for VoIP you can use textual extensions but be careful if you want to setup your Asterisk-Server with POTS (=Plain old telephone service). Therefor you need the second line which is the same as above but without dashes and the letters in the decimal representation of the ASCII Code. The second line does only a &amp;quot;rewrite&amp;quot; of the numerical representation to the textual one.&lt;br /&gt;
&lt;br /&gt;
For setting up all airports you can write your own simple script. But this maybe also not needed in further versions of FGCOM.&lt;br /&gt;
&lt;br /&gt;
After editing the extensions.conf file you have to reload the extensions file (e.g. &amp;quot;asterisk -rx extensions reload&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
You can add further nice goodies to your extensions.conf: MorseCode() for morsing the code of the VOR (MorseCode() will only work in Asterisk &amp;gt;= 1.4), Recording of metar data and playing this recording back when using the frequency of the metar information, ...&lt;br /&gt;
 &lt;br /&gt;
===Setting up user accounts===&lt;br /&gt;
&lt;br /&gt;
The user accounts are located in the file iax.conf (and perhaps also in sip.conf, but this is not necessary). The top of the file should look like this:&lt;br /&gt;
&lt;br /&gt;
  [general]&lt;br /&gt;
  bandwith=low&lt;br /&gt;
  disallow=lpc10&lt;br /&gt;
  jitterbuffer=yes&lt;br /&gt;
  forcejitterbuffer=no&lt;br /&gt;
  tos=lowdelay&lt;br /&gt;
  autokill=yes&lt;br /&gt;
  disallow=all&lt;br /&gt;
  allow=alaw&lt;br /&gt;
  allow=gsm&lt;br /&gt;
  allow=ilbc&lt;br /&gt;
  allow=g726&lt;br /&gt;
  allow=ulaw&lt;br /&gt;
  language=en&lt;br /&gt;
  maxauthreq=10&lt;br /&gt;
  context=guest&lt;br /&gt;
  ;&lt;br /&gt;
  [guest]&lt;br /&gt;
  type=user&lt;br /&gt;
  username=guest&lt;br /&gt;
  context=guest&lt;br /&gt;
  qualify=yes&lt;br /&gt;
  callerid=Guest IAX User&lt;br /&gt;
  host=dynamic&lt;br /&gt;
  ;&lt;br /&gt;
&lt;br /&gt;
You may want to disallow more codecs or want to allow additional codecs (such as speex). But have in mind that the internal mixing of the conferences are done in &amp;quot;ulaw&amp;quot;. But &amp;quot;ulaw&amp;quot; needs about 80 kBit/s because it does no compression. So you have to think about what's better for you: less bandwidth (per user) and more CPU usage or  more bandwidth (per user) and less CPU usage... you should also consider the &amp;quot;sound&amp;quot; of some codecs may not have the 'real radio sound'.&lt;br /&gt;
&lt;br /&gt;
For each user you have to add a bunch of lines to your iax.conf file:&lt;br /&gt;
&lt;br /&gt;
  [&amp;lt;USERNAME&amp;gt;]&lt;br /&gt;
  type=user&lt;br /&gt;
  username=&amp;lt;USERNAME&amp;gt;&lt;br /&gt;
  secret=&amp;lt;PASSWORD&amp;gt;&lt;br /&gt;
  context=default&lt;br /&gt;
  host=dynamic&lt;br /&gt;
  nat=yes&lt;br /&gt;
  notransfer=yes&lt;br /&gt;
&lt;br /&gt;
You just have to fill in the &amp;lt;USERNAME&amp;gt; and &amp;lt;PASSWORD&amp;gt;. After each change you have to reload the configuration (e.g. &amp;quot;asterisk -rx reload chan_iax2.so&amp;quot;). Perhaps you want to write scripts for automatic configuration and so on. But be warned: Further versions of fgcom may use the multiplayer servers for getting usernames and position data and you have to change your scripts.&lt;br /&gt;
&lt;br /&gt;
===Problems?===&lt;br /&gt;
&lt;br /&gt;
If you have problems you can contact me via email at &amp;quot;dcoredump AT gmail.com&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
* [http://squonk.abacab.org/dokuwiki/fgcom Official website]&lt;br /&gt;
* [http://squonk.abacab.org/dokuwiki/fgcom-manual Manual]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[FlightGear related projects]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FGCom_(before_3.0)&amp;diff=10106</id>
		<title>FGCom (before 3.0)</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FGCom_(before_3.0)&amp;diff=10106"/>
		<updated>2008-12-28T03:49:58Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* Testing */  Added server and updated output&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{cleanup}}&lt;br /&gt;
&lt;br /&gt;
'''FGCom''' is an addon for [[FlightGear]]. With FGCom (and the infrastructure behind), FlightGear gets a realtime voice communication system which could be used for [[ATC]]. The current version of fgcom is airport based - that means radio frequencies are based towards the location of the tower. Further version will fix this for a more realistic radio implementation (see [[Development]])&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
*'''18 November, 2008:'''&lt;br /&gt;
Latest SVN (rev 163) has the compile problems fixed. Also we have a '''new server: fgcom.flightgear.co.uk'''. User accounts not required (ie. do '''not''' use -U or -P)&lt;br /&gt;
*'''31 October, 2008:''' &lt;br /&gt;
&lt;br /&gt;
The latest SVN release at this time is the '''r149''' which does not compile due to a constant that is not defined (STL_STRING). Such constant appears at line 57 in the file ''src/fgcom_init.cpp'' which is:&lt;br /&gt;
''#include STL_STRING''&lt;br /&gt;
&lt;br /&gt;
I guess that such constant must point to the STL library include file but I am not sure.&lt;br /&gt;
I revert to the '''r148''' SVN version which successfully compiles.&lt;br /&gt;
&lt;br /&gt;
Command to get such version is: ''svn co -r148 svn://svn.dfn.de:/fgcom/trunk fgcom-r148''&lt;br /&gt;
&lt;br /&gt;
* '''19 June, 2008:''' Currently the server is &amp;lt;u&amp;gt;down&amp;lt;/u&amp;gt; due to hardware problems. It is unknown when the service comes back becuase he currently has no time to fix the problems.&lt;br /&gt;
&lt;br /&gt;
* '''22 November 2007:''' Due to heavy development at this time there may be some differences between the information on the web pages and the installation. Please follow the discussions on the FlightGear development list!&lt;br /&gt;
&lt;br /&gt;
==Client installation==&lt;br /&gt;
Before you start, make sure that your speakers and mic are working and tested to sensible volumes.&lt;br /&gt;
===Linux===&lt;br /&gt;
Fetch FGCom (a copy of a working iaxclient is inside)&lt;br /&gt;
&lt;br /&gt;
 svn checkout svn://svn.dfn.de:/fgcom/trunk fgcom&lt;br /&gt;
&lt;br /&gt;
Optional: edit iaxclient/lib/Makefile&lt;br /&gt;
&lt;br /&gt;
To use OpenAl (Recommended and the default for now. Note however, that it requires OpenAl with capture support.)&lt;br /&gt;
 &lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
 AUDIO_OPENAL=1&lt;br /&gt;
&lt;br /&gt;
To use oss emulation&lt;br /&gt;
 &lt;br /&gt;
 USE_PA_OSS=1&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
 AUDIO_OPENAL=0&lt;br /&gt;
&lt;br /&gt;
To use native alsa (WARNING: PTT won't work)&lt;br /&gt;
&lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=1&lt;br /&gt;
 AUDIO_OPENAL=0&lt;br /&gt;
&lt;br /&gt;
To use portaudio alsa (WARNING: only if your card natively supports 8000Hz sample rate)&lt;br /&gt;
&lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=1&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
 AUDIO_OPENAL=0&lt;br /&gt;
&lt;br /&gt;
Edit fgcom/src/Makefile and check the pathes for PLIB_PREFIX and OPENAL_PREFIX.&lt;br /&gt;
&lt;br /&gt;
Compile iaxclient and fgcom. To do so, do the following:&lt;br /&gt;
&lt;br /&gt;
 cd fgcom/src &amp;amp;&amp;amp; make&lt;br /&gt;
&lt;br /&gt;
Install&lt;br /&gt;
&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
and you should be ready for a quick test...&lt;br /&gt;
&lt;br /&gt;
==Using==&lt;br /&gt;
===Testing===&lt;br /&gt;
quick test&lt;br /&gt;
&lt;br /&gt;
    $ fgcom -Sfgcom.flightgear.org.uk -f910      &lt;br /&gt;
&lt;br /&gt;
will give the following output--&lt;br /&gt;
    fgcom - a communication radio based on VoIP with IAX/Asterisk&lt;br /&gt;
    (c)2007 by H. Wirtz &amp;lt;wirtz@dfn.de&amp;gt;&lt;br /&gt;
    Version 1.2.2 build 163M&lt;br /&gt;
    Using iaxclient library Version SVN 163M&lt;br /&gt;
    &lt;br /&gt;
    Successfully parsed commandline options.&lt;br /&gt;
    Reading list of airports...done.&lt;br /&gt;
    Initializing IAX client as guest:xxxxxxxxxxx@fgcom.flightgear.org.uk&lt;br /&gt;
    Call 0 accepted&lt;br /&gt;
    Call 0 answered&lt;br /&gt;
&lt;br /&gt;
speak into the mic and your words will be echoed back with a short delay.&lt;br /&gt;
&lt;br /&gt;
type &amp;lt;nowiki&amp;gt;ctrl-C&amp;lt;/nowiki&amp;gt; to exit this test&lt;br /&gt;
&lt;br /&gt;
===Configuration===&lt;br /&gt;
&lt;br /&gt;
''Or if it didn't work perfectly first time''&lt;br /&gt;
&lt;br /&gt;
    fgcom --help&lt;br /&gt;
&lt;br /&gt;
returns the following useful info&lt;br /&gt;
&lt;br /&gt;
fgcom - a communication radio based on VoIP with IAX/Asterisk&lt;br /&gt;
&lt;br /&gt;
(c)2007 by H. Wirtz &amp;lt;wirtz@dfn.de&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Version 1.1.0 build 42&lt;br /&gt;
&lt;br /&gt;
Using iaxclient library Version SVN 42&lt;br /&gt;
&lt;br /&gt;
fgcom: unrecognized option `--help'&lt;br /&gt;
&lt;br /&gt;
Usage: fgcom [-u user] -w [password] [[-s voipserver] [-p port]] | [[-a airport] [-f frequency]] [-d]&lt;br /&gt;
&lt;br /&gt;
====Account options====&lt;br /&gt;
FGCom starts with a guest account unless you use -U and -P!&lt;br /&gt;
&lt;br /&gt;
 --user          | -U     username for VoIP account (default: 'guest')&lt;br /&gt;
 --password      | -P     password for VoIP account (default: 'guest')&lt;br /&gt;
 --voipserver    | -s     voip server to ceonnect to (default 'localhost')&lt;br /&gt;
 --port          | -p     where we should listen to FG(default '16661')&lt;br /&gt;
&lt;br /&gt;
====ATC mode options====&lt;br /&gt;
 --airport       | -a     airport-id (ICAO) for ATC-mode&lt;br /&gt;
 --frequency     | -f     frequency for ATC-mode&lt;br /&gt;
&lt;br /&gt;
====Audio options====&lt;br /&gt;
 --mic           | -i     mic input level (0.0 - 1.0)&lt;br /&gt;
 --speaker       | -o     speaker output level (0.0 - 1.0)&lt;br /&gt;
 --mic-boost     | -b     enable mic boost&lt;br /&gt;
 --list-audio    | -l     list audio devices&lt;br /&gt;
 --set-audio-in  | -r     use &amp;lt;devicename&amp;gt; as audio input&lt;br /&gt;
 --set-audio-out | -k     use &amp;lt;devicename&amp;gt; as audio output&lt;br /&gt;
&lt;br /&gt;
====Misc options====&lt;br /&gt;
 --debug         | -d     show debugging information&lt;br /&gt;
&lt;br /&gt;
Mode 1: client for COM1 of flightgear:&lt;br /&gt;
&lt;br /&gt;
$ fgcom&lt;br /&gt;
&lt;br /&gt;
- connects fgcom to fgfs at localhost:16661&lt;br /&gt;
&lt;br /&gt;
$ fgcom -sother.host.tld -p23456&lt;br /&gt;
&lt;br /&gt;
- connects fgcom to fgfs at other.host.tld:23456&lt;br /&gt;
&lt;br /&gt;
Mode 2: client for an ATC at &amp;lt;airport&amp;gt; on &amp;lt;frequency&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$ fgcom -aKSFO -d120.500&lt;br /&gt;
&lt;br /&gt;
- sets up fgcom for an ATC radio at KSFO 120.500 MHz&lt;br /&gt;
&lt;br /&gt;
===Registration===&lt;br /&gt;
'''To make full use of FGCOM you will need an account!'''&lt;br /&gt;
&lt;br /&gt;
Please email &amp;lt;nowiki&amp;gt; wirtz &amp;lt;at&amp;gt; dfn &amp;lt;dot&amp;gt; de&amp;lt;/nowiki&amp;gt; (replace with @ and .) and login details will be sent to you shortly. Accounts will not be made until Autumn 2008. But you can test without an account (by default the used account is guest, password guest) with restricted frequency use. As guest you can only use the following frequencies:&lt;br /&gt;
&lt;br /&gt;
* 911.000 MHz (ATC-Help)&lt;br /&gt;
* 910.000 MHz (Echo-Box)&lt;br /&gt;
* 123.450 MHz (Air2Air 1)&lt;br /&gt;
* 122.750 Mhz (Air2Air 2)&lt;br /&gt;
&lt;br /&gt;
==Server installation==&lt;br /&gt;
&lt;br /&gt;
For running a FGCOM server you need Asterisk and depending on the amount of users much bandwith and CPU power. Because of putting pilots and ATCs in a VoIP conference the server-admin has to assure that there is enough network and cpu power to avoid drop-outs of the voice stream.&lt;br /&gt;
&lt;br /&gt;
===Prerequirements===&lt;br /&gt;
&lt;br /&gt;
Install Asterisk on top of your favorite distribution. Please refer to installation manuals (e.g. [[http://www.asteriskguru.com/|Asterisk-Guru]]) you can find on the net. You do not need H.323 or SIP because the fgcom client uses IAX2 as VoIP signaling protocol. Only if you think about connecting external VoIP applications to FGCOM you should consider to activate H.323 or SIP (but this is not the scope of this small howto).&lt;br /&gt;
&lt;br /&gt;
Notice: You need to install the zaptel driver modules - even if you won't use any hardware for telecom interfacing. You need the ztdummy kernel module for the asterisk conference application MeetMe() because it simulates a hardware clock needed by this application. Further development of FGCOM might use app_conference which don't needs any timing device.&lt;br /&gt;
&lt;br /&gt;
For now we want to use /etc/asterisk as the base configuration directory.&lt;br /&gt;
&lt;br /&gt;
===Setting up the radio frequencies===&lt;br /&gt;
&lt;br /&gt;
The radio frequencies are &amp;quot;simple&amp;quot; Conferences and realized due to the Asterisk application MeetMe().&lt;br /&gt;
&lt;br /&gt;
====Part 1: General configuration====&lt;br /&gt;
&lt;br /&gt;
First you have to set up the general configuration of the system. Put the following at the top of your &amp;quot;extensions.conf&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
  [general]&lt;br /&gt;
  static=yes&lt;br /&gt;
  writeprotect=yes&lt;br /&gt;
  ;&lt;br /&gt;
  [globals]&lt;br /&gt;
  ;&lt;br /&gt;
  [macro-com]&lt;br /&gt;
  exten =&amp;gt; s,1,Answer()&lt;br /&gt;
  exten =&amp;gt; s,n,MeetMe(${MACRO_EXTEN},qd)&lt;br /&gt;
  exten =&amp;gt; s,n,Hangup()&lt;br /&gt;
  ;&lt;br /&gt;
  [macro-echo]&lt;br /&gt;
  exten =&amp;gt; s,1,Answer()&lt;br /&gt;
  exten =&amp;gt; s,n,Echo()&lt;br /&gt;
  exten =&amp;gt; s,n,Hangup()&lt;br /&gt;
  ;&lt;br /&gt;
  [guest]&lt;br /&gt;
  ; ATC-Help&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-911.000,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252591100,1,Dial(Local/01-ZZZZ-911.000)&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-910.000,1,Macro(echo)&lt;br /&gt;
  exten =&amp;gt; 012525252591000,1,Dial(Local/01-ZZZZ-910.000)&lt;br /&gt;
  ;&lt;br /&gt;
  [default]&lt;br /&gt;
  include =&amp;gt; guest&lt;br /&gt;
  ;&lt;br /&gt;
  ; Code:&lt;br /&gt;
  ; 01 - FlightGear&lt;br /&gt;
  ; 02 - Microsoft Flight-Simulator&lt;br /&gt;
  ; 03 - ...&lt;br /&gt;
  ;&lt;br /&gt;
  ; Air2Air&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-123.450,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252512345,1,Dial(Local/01-ZZZZ-123.450)&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-122.750,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252512275,1,Dial(Local/01-ZZZZ-122.750)&lt;br /&gt;
&lt;br /&gt;
====Part 2: Adding your favorite (all?) frequencies====&lt;br /&gt;
&lt;br /&gt;
For this you have simply to create an extension for every touple of airport/frequency in extensions.conf. The following is an example for Berlin-Tempelhof (EDDI). The information comes from the file &amp;quot;apt.dat.gz&amp;quot; of your FlightGear installation.&lt;br /&gt;
&lt;br /&gt;
  ; EDDI ATIS 126.020 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-126.020,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812602,1,Dial(Local/01-EDDI-126.020)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DEP 120.620 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-120.620,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812062,1,Dial(Local/01-EDDI-120.620)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DIRECTOR 121.120 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-121.120,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812112,1,Dial(Local/01-EDDI-121.120)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN ARR 126.420 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-126.420,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812642,1,Dial(Local/01-EDDI-126.420)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI GND 121.950 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-121.950,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812195,1,Dial(Local/01-EDDI-121.950)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI TWR 119.570 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.570,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811957,1,Dial(Local/01-EDDI-119.570)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DIRECTOR 136.100 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-136.100,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030813610,1,Dial(Local/01-EDDI-136.100)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI TWR 118.100 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-118.100,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811810,1,Dial(Local/01-EDDI-118.100)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DEP 119.500 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.500,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811950,1,Dial(Local/01-EDDI-119.500)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN ARR 119.620 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.620,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811962,1,Dial(Local/01-EDDI-119.620)&lt;br /&gt;
&lt;br /&gt;
What does the above mean? There are two lines (three with the comment) for each frequency: The first one sets up an extension named &amp;quot;01-EDDI-119.500&amp;quot;. Yes, for VoIP you can use textual extensions but be careful if you want to setup your Asterisk-Server with POTS (=Plain old telephone service). Therefor you need the second line which is the same as above but without dashes and the letters in the decimal representation of the ASCII Code. The second line does only a &amp;quot;rewrite&amp;quot; of the numerical representation to the textual one.&lt;br /&gt;
&lt;br /&gt;
For setting up all airports you can write your own simple script. But this maybe also not needed in further versions of FGCOM.&lt;br /&gt;
&lt;br /&gt;
After editing the extensions.conf file you have to reload the extensions file (e.g. &amp;quot;asterisk -rx extensions reload&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
You can add further nice goodies to your extensions.conf: MorseCode() for morsing the code of the VOR (MorseCode() will only work in Asterisk &amp;gt;= 1.4), Recording of metar data and playing this recording back when using the frequency of the metar information, ...&lt;br /&gt;
 &lt;br /&gt;
===Setting up user accounts===&lt;br /&gt;
&lt;br /&gt;
The user accounts are located in the file iax.conf (and perhaps also in sip.conf, but this is not necessary). The top of the file should look like this:&lt;br /&gt;
&lt;br /&gt;
  [general]&lt;br /&gt;
  bandwith=low&lt;br /&gt;
  disallow=lpc10&lt;br /&gt;
  jitterbuffer=yes&lt;br /&gt;
  forcejitterbuffer=no&lt;br /&gt;
  tos=lowdelay&lt;br /&gt;
  autokill=yes&lt;br /&gt;
  disallow=all&lt;br /&gt;
  allow=alaw&lt;br /&gt;
  allow=gsm&lt;br /&gt;
  allow=ilbc&lt;br /&gt;
  allow=g726&lt;br /&gt;
  allow=ulaw&lt;br /&gt;
  language=en&lt;br /&gt;
  maxauthreq=10&lt;br /&gt;
  context=guest&lt;br /&gt;
  ;&lt;br /&gt;
  [guest]&lt;br /&gt;
  type=user&lt;br /&gt;
  username=guest&lt;br /&gt;
  context=guest&lt;br /&gt;
  qualify=yes&lt;br /&gt;
  callerid=Guest IAX User&lt;br /&gt;
  host=dynamic&lt;br /&gt;
  ;&lt;br /&gt;
&lt;br /&gt;
You may want to disallow more codecs or want to allow additional codecs (such as speex). But have in mind that the internal mixing of the conferences are done in &amp;quot;ulaw&amp;quot;. But &amp;quot;ulaw&amp;quot; needs about 80 kBit/s because it does no compression. So you have to think about what's better for you: less bandwidth (per user) and more CPU usage or  more bandwidth (per user) and less CPU usage... you should also consider the &amp;quot;sound&amp;quot; of some codecs may not have the 'real radio sound'.&lt;br /&gt;
&lt;br /&gt;
For each user you have to add a bunch of lines to your iax.conf file:&lt;br /&gt;
&lt;br /&gt;
  [&amp;lt;USERNAME&amp;gt;]&lt;br /&gt;
  type=user&lt;br /&gt;
  username=&amp;lt;USERNAME&amp;gt;&lt;br /&gt;
  secret=&amp;lt;PASSWORD&amp;gt;&lt;br /&gt;
  context=default&lt;br /&gt;
  host=dynamic&lt;br /&gt;
  nat=yes&lt;br /&gt;
  notransfer=yes&lt;br /&gt;
&lt;br /&gt;
You just have to fill in the &amp;lt;USERNAME&amp;gt; and &amp;lt;PASSWORD&amp;gt;. After each change you have to reload the configuration (e.g. &amp;quot;asterisk -rx reload chan_iax2.so&amp;quot;). Perhaps you want to write scripts for automatic configuration and so on. But be warned: Further versions of fgcom may use the multiplayer servers for getting usernames and position data and you have to change your scripts.&lt;br /&gt;
&lt;br /&gt;
===Problems?===&lt;br /&gt;
&lt;br /&gt;
If you have problems you can contact me via email at &amp;quot;dcoredump AT gmail.com&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
* [http://squonk.abacab.org/dokuwiki/fgcom Official website]&lt;br /&gt;
* [http://squonk.abacab.org/dokuwiki/fgcom-manual Manual]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[FlightGear related projects]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FGCom_(before_3.0)&amp;diff=10105</id>
		<title>FGCom (before 3.0)</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FGCom_(before_3.0)&amp;diff=10105"/>
		<updated>2008-12-28T03:43:31Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* Linux */  Added OpenAl&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{cleanup}}&lt;br /&gt;
&lt;br /&gt;
'''FGCom''' is an addon for [[FlightGear]]. With FGCom (and the infrastructure behind), FlightGear gets a realtime voice communication system which could be used for [[ATC]]. The current version of fgcom is airport based - that means radio frequencies are based towards the location of the tower. Further version will fix this for a more realistic radio implementation (see [[Development]])&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
*'''18 November, 2008:'''&lt;br /&gt;
Latest SVN (rev 163) has the compile problems fixed. Also we have a '''new server: fgcom.flightgear.co.uk'''. User accounts not required (ie. do '''not''' use -U or -P)&lt;br /&gt;
*'''31 October, 2008:''' &lt;br /&gt;
&lt;br /&gt;
The latest SVN release at this time is the '''r149''' which does not compile due to a constant that is not defined (STL_STRING). Such constant appears at line 57 in the file ''src/fgcom_init.cpp'' which is:&lt;br /&gt;
''#include STL_STRING''&lt;br /&gt;
&lt;br /&gt;
I guess that such constant must point to the STL library include file but I am not sure.&lt;br /&gt;
I revert to the '''r148''' SVN version which successfully compiles.&lt;br /&gt;
&lt;br /&gt;
Command to get such version is: ''svn co -r148 svn://svn.dfn.de:/fgcom/trunk fgcom-r148''&lt;br /&gt;
&lt;br /&gt;
* '''19 June, 2008:''' Currently the server is &amp;lt;u&amp;gt;down&amp;lt;/u&amp;gt; due to hardware problems. It is unknown when the service comes back becuase he currently has no time to fix the problems.&lt;br /&gt;
&lt;br /&gt;
* '''22 November 2007:''' Due to heavy development at this time there may be some differences between the information on the web pages and the installation. Please follow the discussions on the FlightGear development list!&lt;br /&gt;
&lt;br /&gt;
==Client installation==&lt;br /&gt;
Before you start, make sure that your speakers and mic are working and tested to sensible volumes.&lt;br /&gt;
===Linux===&lt;br /&gt;
Fetch FGCom (a copy of a working iaxclient is inside)&lt;br /&gt;
&lt;br /&gt;
 svn checkout svn://svn.dfn.de:/fgcom/trunk fgcom&lt;br /&gt;
&lt;br /&gt;
Optional: edit iaxclient/lib/Makefile&lt;br /&gt;
&lt;br /&gt;
To use OpenAl (Recommended and the default for now. Note however, that it requires OpenAl with capture support.)&lt;br /&gt;
 &lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
 AUDIO_OPENAL=1&lt;br /&gt;
&lt;br /&gt;
To use oss emulation&lt;br /&gt;
 &lt;br /&gt;
 USE_PA_OSS=1&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
 AUDIO_OPENAL=0&lt;br /&gt;
&lt;br /&gt;
To use native alsa (WARNING: PTT won't work)&lt;br /&gt;
&lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=1&lt;br /&gt;
 AUDIO_OPENAL=0&lt;br /&gt;
&lt;br /&gt;
To use portaudio alsa (WARNING: only if your card natively supports 8000Hz sample rate)&lt;br /&gt;
&lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=1&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
 AUDIO_OPENAL=0&lt;br /&gt;
&lt;br /&gt;
Edit fgcom/src/Makefile and check the pathes for PLIB_PREFIX and OPENAL_PREFIX.&lt;br /&gt;
&lt;br /&gt;
Compile iaxclient and fgcom. To do so, do the following:&lt;br /&gt;
&lt;br /&gt;
 cd fgcom/src &amp;amp;&amp;amp; make&lt;br /&gt;
&lt;br /&gt;
Install&lt;br /&gt;
&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
and you should be ready for a quick test...&lt;br /&gt;
&lt;br /&gt;
==Using==&lt;br /&gt;
===Testing===&lt;br /&gt;
quick test&lt;br /&gt;
&lt;br /&gt;
    $ fgcom -f910      &lt;br /&gt;
&lt;br /&gt;
will give the following output--&lt;br /&gt;
&lt;br /&gt;
fgcom - a communication radio based on VoIP with IAX/Asterisk&lt;br /&gt;
&lt;br /&gt;
(c)2007 by H. Wirtz &amp;lt;wirtz@dfn.de&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Version 1.1.0 build 42&lt;br /&gt;
&lt;br /&gt;
Using iaxclient library Version SVN 42&lt;br /&gt;
&lt;br /&gt;
Reading list of airports...done.&lt;br /&gt;
&lt;br /&gt;
Initializing IAX client as guest:xxxxxxxxxxx@fgcom1.parasitstudio.de&lt;br /&gt;
&lt;br /&gt;
Call 0 accepted&lt;br /&gt;
&lt;br /&gt;
Echo-Box&lt;br /&gt;
&lt;br /&gt;
Call 0 answered&lt;br /&gt;
&lt;br /&gt;
speak into the mic and your words will be echoed back with a short delay.&lt;br /&gt;
&lt;br /&gt;
type &amp;lt;nowiki&amp;gt;ctrl-C&amp;lt;/nowiki&amp;gt; to exit this test&lt;br /&gt;
&lt;br /&gt;
===Configuration===&lt;br /&gt;
&lt;br /&gt;
''Or if it didn't work perfectly first time''&lt;br /&gt;
&lt;br /&gt;
    fgcom --help&lt;br /&gt;
&lt;br /&gt;
returns the following useful info&lt;br /&gt;
&lt;br /&gt;
fgcom - a communication radio based on VoIP with IAX/Asterisk&lt;br /&gt;
&lt;br /&gt;
(c)2007 by H. Wirtz &amp;lt;wirtz@dfn.de&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Version 1.1.0 build 42&lt;br /&gt;
&lt;br /&gt;
Using iaxclient library Version SVN 42&lt;br /&gt;
&lt;br /&gt;
fgcom: unrecognized option `--help'&lt;br /&gt;
&lt;br /&gt;
Usage: fgcom [-u user] -w [password] [[-s voipserver] [-p port]] | [[-a airport] [-f frequency]] [-d]&lt;br /&gt;
&lt;br /&gt;
====Account options====&lt;br /&gt;
FGCom starts with a guest account unless you use -U and -P!&lt;br /&gt;
&lt;br /&gt;
 --user          | -U     username for VoIP account (default: 'guest')&lt;br /&gt;
 --password      | -P     password for VoIP account (default: 'guest')&lt;br /&gt;
 --voipserver    | -s     voip server to ceonnect to (default 'localhost')&lt;br /&gt;
 --port          | -p     where we should listen to FG(default '16661')&lt;br /&gt;
&lt;br /&gt;
====ATC mode options====&lt;br /&gt;
 --airport       | -a     airport-id (ICAO) for ATC-mode&lt;br /&gt;
 --frequency     | -f     frequency for ATC-mode&lt;br /&gt;
&lt;br /&gt;
====Audio options====&lt;br /&gt;
 --mic           | -i     mic input level (0.0 - 1.0)&lt;br /&gt;
 --speaker       | -o     speaker output level (0.0 - 1.0)&lt;br /&gt;
 --mic-boost     | -b     enable mic boost&lt;br /&gt;
 --list-audio    | -l     list audio devices&lt;br /&gt;
 --set-audio-in  | -r     use &amp;lt;devicename&amp;gt; as audio input&lt;br /&gt;
 --set-audio-out | -k     use &amp;lt;devicename&amp;gt; as audio output&lt;br /&gt;
&lt;br /&gt;
====Misc options====&lt;br /&gt;
 --debug         | -d     show debugging information&lt;br /&gt;
&lt;br /&gt;
Mode 1: client for COM1 of flightgear:&lt;br /&gt;
&lt;br /&gt;
$ fgcom&lt;br /&gt;
&lt;br /&gt;
- connects fgcom to fgfs at localhost:16661&lt;br /&gt;
&lt;br /&gt;
$ fgcom -sother.host.tld -p23456&lt;br /&gt;
&lt;br /&gt;
- connects fgcom to fgfs at other.host.tld:23456&lt;br /&gt;
&lt;br /&gt;
Mode 2: client for an ATC at &amp;lt;airport&amp;gt; on &amp;lt;frequency&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$ fgcom -aKSFO -d120.500&lt;br /&gt;
&lt;br /&gt;
- sets up fgcom for an ATC radio at KSFO 120.500 MHz&lt;br /&gt;
&lt;br /&gt;
===Registration===&lt;br /&gt;
'''To make full use of FGCOM you will need an account!'''&lt;br /&gt;
&lt;br /&gt;
Please email &amp;lt;nowiki&amp;gt; wirtz &amp;lt;at&amp;gt; dfn &amp;lt;dot&amp;gt; de&amp;lt;/nowiki&amp;gt; (replace with @ and .) and login details will be sent to you shortly. Accounts will not be made until Autumn 2008. But you can test without an account (by default the used account is guest, password guest) with restricted frequency use. As guest you can only use the following frequencies:&lt;br /&gt;
&lt;br /&gt;
* 911.000 MHz (ATC-Help)&lt;br /&gt;
* 910.000 MHz (Echo-Box)&lt;br /&gt;
* 123.450 MHz (Air2Air 1)&lt;br /&gt;
* 122.750 Mhz (Air2Air 2)&lt;br /&gt;
&lt;br /&gt;
==Server installation==&lt;br /&gt;
&lt;br /&gt;
For running a FGCOM server you need Asterisk and depending on the amount of users much bandwith and CPU power. Because of putting pilots and ATCs in a VoIP conference the server-admin has to assure that there is enough network and cpu power to avoid drop-outs of the voice stream.&lt;br /&gt;
&lt;br /&gt;
===Prerequirements===&lt;br /&gt;
&lt;br /&gt;
Install Asterisk on top of your favorite distribution. Please refer to installation manuals (e.g. [[http://www.asteriskguru.com/|Asterisk-Guru]]) you can find on the net. You do not need H.323 or SIP because the fgcom client uses IAX2 as VoIP signaling protocol. Only if you think about connecting external VoIP applications to FGCOM you should consider to activate H.323 or SIP (but this is not the scope of this small howto).&lt;br /&gt;
&lt;br /&gt;
Notice: You need to install the zaptel driver modules - even if you won't use any hardware for telecom interfacing. You need the ztdummy kernel module for the asterisk conference application MeetMe() because it simulates a hardware clock needed by this application. Further development of FGCOM might use app_conference which don't needs any timing device.&lt;br /&gt;
&lt;br /&gt;
For now we want to use /etc/asterisk as the base configuration directory.&lt;br /&gt;
&lt;br /&gt;
===Setting up the radio frequencies===&lt;br /&gt;
&lt;br /&gt;
The radio frequencies are &amp;quot;simple&amp;quot; Conferences and realized due to the Asterisk application MeetMe().&lt;br /&gt;
&lt;br /&gt;
====Part 1: General configuration====&lt;br /&gt;
&lt;br /&gt;
First you have to set up the general configuration of the system. Put the following at the top of your &amp;quot;extensions.conf&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
  [general]&lt;br /&gt;
  static=yes&lt;br /&gt;
  writeprotect=yes&lt;br /&gt;
  ;&lt;br /&gt;
  [globals]&lt;br /&gt;
  ;&lt;br /&gt;
  [macro-com]&lt;br /&gt;
  exten =&amp;gt; s,1,Answer()&lt;br /&gt;
  exten =&amp;gt; s,n,MeetMe(${MACRO_EXTEN},qd)&lt;br /&gt;
  exten =&amp;gt; s,n,Hangup()&lt;br /&gt;
  ;&lt;br /&gt;
  [macro-echo]&lt;br /&gt;
  exten =&amp;gt; s,1,Answer()&lt;br /&gt;
  exten =&amp;gt; s,n,Echo()&lt;br /&gt;
  exten =&amp;gt; s,n,Hangup()&lt;br /&gt;
  ;&lt;br /&gt;
  [guest]&lt;br /&gt;
  ; ATC-Help&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-911.000,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252591100,1,Dial(Local/01-ZZZZ-911.000)&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-910.000,1,Macro(echo)&lt;br /&gt;
  exten =&amp;gt; 012525252591000,1,Dial(Local/01-ZZZZ-910.000)&lt;br /&gt;
  ;&lt;br /&gt;
  [default]&lt;br /&gt;
  include =&amp;gt; guest&lt;br /&gt;
  ;&lt;br /&gt;
  ; Code:&lt;br /&gt;
  ; 01 - FlightGear&lt;br /&gt;
  ; 02 - Microsoft Flight-Simulator&lt;br /&gt;
  ; 03 - ...&lt;br /&gt;
  ;&lt;br /&gt;
  ; Air2Air&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-123.450,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252512345,1,Dial(Local/01-ZZZZ-123.450)&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-122.750,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252512275,1,Dial(Local/01-ZZZZ-122.750)&lt;br /&gt;
&lt;br /&gt;
====Part 2: Adding your favorite (all?) frequencies====&lt;br /&gt;
&lt;br /&gt;
For this you have simply to create an extension for every touple of airport/frequency in extensions.conf. The following is an example for Berlin-Tempelhof (EDDI). The information comes from the file &amp;quot;apt.dat.gz&amp;quot; of your FlightGear installation.&lt;br /&gt;
&lt;br /&gt;
  ; EDDI ATIS 126.020 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-126.020,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812602,1,Dial(Local/01-EDDI-126.020)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DEP 120.620 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-120.620,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812062,1,Dial(Local/01-EDDI-120.620)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DIRECTOR 121.120 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-121.120,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812112,1,Dial(Local/01-EDDI-121.120)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN ARR 126.420 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-126.420,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812642,1,Dial(Local/01-EDDI-126.420)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI GND 121.950 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-121.950,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812195,1,Dial(Local/01-EDDI-121.950)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI TWR 119.570 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.570,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811957,1,Dial(Local/01-EDDI-119.570)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DIRECTOR 136.100 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-136.100,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030813610,1,Dial(Local/01-EDDI-136.100)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI TWR 118.100 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-118.100,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811810,1,Dial(Local/01-EDDI-118.100)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DEP 119.500 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.500,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811950,1,Dial(Local/01-EDDI-119.500)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN ARR 119.620 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.620,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811962,1,Dial(Local/01-EDDI-119.620)&lt;br /&gt;
&lt;br /&gt;
What does the above mean? There are two lines (three with the comment) for each frequency: The first one sets up an extension named &amp;quot;01-EDDI-119.500&amp;quot;. Yes, for VoIP you can use textual extensions but be careful if you want to setup your Asterisk-Server with POTS (=Plain old telephone service). Therefor you need the second line which is the same as above but without dashes and the letters in the decimal representation of the ASCII Code. The second line does only a &amp;quot;rewrite&amp;quot; of the numerical representation to the textual one.&lt;br /&gt;
&lt;br /&gt;
For setting up all airports you can write your own simple script. But this maybe also not needed in further versions of FGCOM.&lt;br /&gt;
&lt;br /&gt;
After editing the extensions.conf file you have to reload the extensions file (e.g. &amp;quot;asterisk -rx extensions reload&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
You can add further nice goodies to your extensions.conf: MorseCode() for morsing the code of the VOR (MorseCode() will only work in Asterisk &amp;gt;= 1.4), Recording of metar data and playing this recording back when using the frequency of the metar information, ...&lt;br /&gt;
 &lt;br /&gt;
===Setting up user accounts===&lt;br /&gt;
&lt;br /&gt;
The user accounts are located in the file iax.conf (and perhaps also in sip.conf, but this is not necessary). The top of the file should look like this:&lt;br /&gt;
&lt;br /&gt;
  [general]&lt;br /&gt;
  bandwith=low&lt;br /&gt;
  disallow=lpc10&lt;br /&gt;
  jitterbuffer=yes&lt;br /&gt;
  forcejitterbuffer=no&lt;br /&gt;
  tos=lowdelay&lt;br /&gt;
  autokill=yes&lt;br /&gt;
  disallow=all&lt;br /&gt;
  allow=alaw&lt;br /&gt;
  allow=gsm&lt;br /&gt;
  allow=ilbc&lt;br /&gt;
  allow=g726&lt;br /&gt;
  allow=ulaw&lt;br /&gt;
  language=en&lt;br /&gt;
  maxauthreq=10&lt;br /&gt;
  context=guest&lt;br /&gt;
  ;&lt;br /&gt;
  [guest]&lt;br /&gt;
  type=user&lt;br /&gt;
  username=guest&lt;br /&gt;
  context=guest&lt;br /&gt;
  qualify=yes&lt;br /&gt;
  callerid=Guest IAX User&lt;br /&gt;
  host=dynamic&lt;br /&gt;
  ;&lt;br /&gt;
&lt;br /&gt;
You may want to disallow more codecs or want to allow additional codecs (such as speex). But have in mind that the internal mixing of the conferences are done in &amp;quot;ulaw&amp;quot;. But &amp;quot;ulaw&amp;quot; needs about 80 kBit/s because it does no compression. So you have to think about what's better for you: less bandwidth (per user) and more CPU usage or  more bandwidth (per user) and less CPU usage... you should also consider the &amp;quot;sound&amp;quot; of some codecs may not have the 'real radio sound'.&lt;br /&gt;
&lt;br /&gt;
For each user you have to add a bunch of lines to your iax.conf file:&lt;br /&gt;
&lt;br /&gt;
  [&amp;lt;USERNAME&amp;gt;]&lt;br /&gt;
  type=user&lt;br /&gt;
  username=&amp;lt;USERNAME&amp;gt;&lt;br /&gt;
  secret=&amp;lt;PASSWORD&amp;gt;&lt;br /&gt;
  context=default&lt;br /&gt;
  host=dynamic&lt;br /&gt;
  nat=yes&lt;br /&gt;
  notransfer=yes&lt;br /&gt;
&lt;br /&gt;
You just have to fill in the &amp;lt;USERNAME&amp;gt; and &amp;lt;PASSWORD&amp;gt;. After each change you have to reload the configuration (e.g. &amp;quot;asterisk -rx reload chan_iax2.so&amp;quot;). Perhaps you want to write scripts for automatic configuration and so on. But be warned: Further versions of fgcom may use the multiplayer servers for getting usernames and position data and you have to change your scripts.&lt;br /&gt;
&lt;br /&gt;
===Problems?===&lt;br /&gt;
&lt;br /&gt;
If you have problems you can contact me via email at &amp;quot;dcoredump AT gmail.com&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
* [http://squonk.abacab.org/dokuwiki/fgcom Official website]&lt;br /&gt;
* [http://squonk.abacab.org/dokuwiki/fgcom-manual Manual]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[FlightGear related projects]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FGCom_(before_3.0)&amp;diff=10104</id>
		<title>FGCom (before 3.0)</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FGCom_(before_3.0)&amp;diff=10104"/>
		<updated>2008-12-28T03:39:42Z</updated>

		<summary type="html">&lt;p&gt;Jester: /* Status */  We are up again!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{cleanup}}&lt;br /&gt;
&lt;br /&gt;
'''FGCom''' is an addon for [[FlightGear]]. With FGCom (and the infrastructure behind), FlightGear gets a realtime voice communication system which could be used for [[ATC]]. The current version of fgcom is airport based - that means radio frequencies are based towards the location of the tower. Further version will fix this for a more realistic radio implementation (see [[Development]])&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
*'''18 November, 2008:'''&lt;br /&gt;
Latest SVN (rev 163) has the compile problems fixed. Also we have a '''new server: fgcom.flightgear.co.uk'''. User accounts not required (ie. do '''not''' use -U or -P)&lt;br /&gt;
*'''31 October, 2008:''' &lt;br /&gt;
&lt;br /&gt;
The latest SVN release at this time is the '''r149''' which does not compile due to a constant that is not defined (STL_STRING). Such constant appears at line 57 in the file ''src/fgcom_init.cpp'' which is:&lt;br /&gt;
''#include STL_STRING''&lt;br /&gt;
&lt;br /&gt;
I guess that such constant must point to the STL library include file but I am not sure.&lt;br /&gt;
I revert to the '''r148''' SVN version which successfully compiles.&lt;br /&gt;
&lt;br /&gt;
Command to get such version is: ''svn co -r148 svn://svn.dfn.de:/fgcom/trunk fgcom-r148''&lt;br /&gt;
&lt;br /&gt;
* '''19 June, 2008:''' Currently the server is &amp;lt;u&amp;gt;down&amp;lt;/u&amp;gt; due to hardware problems. It is unknown when the service comes back becuase he currently has no time to fix the problems.&lt;br /&gt;
&lt;br /&gt;
* '''22 November 2007:''' Due to heavy development at this time there may be some differences between the information on the web pages and the installation. Please follow the discussions on the FlightGear development list!&lt;br /&gt;
&lt;br /&gt;
==Client installation==&lt;br /&gt;
Before you start, make sure that your speakers and mic are working and tested to sensible volumes.&lt;br /&gt;
===Linux===&lt;br /&gt;
Fetch FGCom (a copy of a working iaxclient is inside)&lt;br /&gt;
&lt;br /&gt;
 svn checkout svn://svn.dfn.de:/fgcom/trunk fgcom&lt;br /&gt;
&lt;br /&gt;
Optional: edit iaxclient/lib/Makefile&lt;br /&gt;
&lt;br /&gt;
To use oss emulation (recommended and the default for now)&lt;br /&gt;
 &lt;br /&gt;
 USE_PA_OSS=1&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
&lt;br /&gt;
To use native alsa (WARNING: PTT won't work)&lt;br /&gt;
&lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=0&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=1&lt;br /&gt;
&lt;br /&gt;
To use portaudio alsa (WARNING: only if your card natively supports 8000Hz sample rate)&lt;br /&gt;
&lt;br /&gt;
 USE_PA_OSS=0&lt;br /&gt;
 USE_PA_ALSA=1&lt;br /&gt;
 USE_PA_JACK=0&lt;br /&gt;
 AUDIO_ALSA=0&lt;br /&gt;
&lt;br /&gt;
Edit fgcom/src/Makefile and check the pathes for PLIB_PREFIX and OPENAL_PREFIX.&lt;br /&gt;
&lt;br /&gt;
Compile iaxclient and fgcom. To do so, do the following:&lt;br /&gt;
&lt;br /&gt;
 cd fgcom/src &amp;amp;&amp;amp; make&lt;br /&gt;
&lt;br /&gt;
Install&lt;br /&gt;
&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
and you should be ready for a quick test...&lt;br /&gt;
&lt;br /&gt;
==Using==&lt;br /&gt;
===Testing===&lt;br /&gt;
quick test&lt;br /&gt;
&lt;br /&gt;
    $ fgcom -f910      &lt;br /&gt;
&lt;br /&gt;
will give the following output--&lt;br /&gt;
&lt;br /&gt;
fgcom - a communication radio based on VoIP with IAX/Asterisk&lt;br /&gt;
&lt;br /&gt;
(c)2007 by H. Wirtz &amp;lt;wirtz@dfn.de&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Version 1.1.0 build 42&lt;br /&gt;
&lt;br /&gt;
Using iaxclient library Version SVN 42&lt;br /&gt;
&lt;br /&gt;
Reading list of airports...done.&lt;br /&gt;
&lt;br /&gt;
Initializing IAX client as guest:xxxxxxxxxxx@fgcom1.parasitstudio.de&lt;br /&gt;
&lt;br /&gt;
Call 0 accepted&lt;br /&gt;
&lt;br /&gt;
Echo-Box&lt;br /&gt;
&lt;br /&gt;
Call 0 answered&lt;br /&gt;
&lt;br /&gt;
speak into the mic and your words will be echoed back with a short delay.&lt;br /&gt;
&lt;br /&gt;
type &amp;lt;nowiki&amp;gt;ctrl-C&amp;lt;/nowiki&amp;gt; to exit this test&lt;br /&gt;
&lt;br /&gt;
===Configuration===&lt;br /&gt;
&lt;br /&gt;
''Or if it didn't work perfectly first time''&lt;br /&gt;
&lt;br /&gt;
    fgcom --help&lt;br /&gt;
&lt;br /&gt;
returns the following useful info&lt;br /&gt;
&lt;br /&gt;
fgcom - a communication radio based on VoIP with IAX/Asterisk&lt;br /&gt;
&lt;br /&gt;
(c)2007 by H. Wirtz &amp;lt;wirtz@dfn.de&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Version 1.1.0 build 42&lt;br /&gt;
&lt;br /&gt;
Using iaxclient library Version SVN 42&lt;br /&gt;
&lt;br /&gt;
fgcom: unrecognized option `--help'&lt;br /&gt;
&lt;br /&gt;
Usage: fgcom [-u user] -w [password] [[-s voipserver] [-p port]] | [[-a airport] [-f frequency]] [-d]&lt;br /&gt;
&lt;br /&gt;
====Account options====&lt;br /&gt;
FGCom starts with a guest account unless you use -U and -P!&lt;br /&gt;
&lt;br /&gt;
 --user          | -U     username for VoIP account (default: 'guest')&lt;br /&gt;
 --password      | -P     password for VoIP account (default: 'guest')&lt;br /&gt;
 --voipserver    | -s     voip server to ceonnect to (default 'localhost')&lt;br /&gt;
 --port          | -p     where we should listen to FG(default '16661')&lt;br /&gt;
&lt;br /&gt;
====ATC mode options====&lt;br /&gt;
 --airport       | -a     airport-id (ICAO) for ATC-mode&lt;br /&gt;
 --frequency     | -f     frequency for ATC-mode&lt;br /&gt;
&lt;br /&gt;
====Audio options====&lt;br /&gt;
 --mic           | -i     mic input level (0.0 - 1.0)&lt;br /&gt;
 --speaker       | -o     speaker output level (0.0 - 1.0)&lt;br /&gt;
 --mic-boost     | -b     enable mic boost&lt;br /&gt;
 --list-audio    | -l     list audio devices&lt;br /&gt;
 --set-audio-in  | -r     use &amp;lt;devicename&amp;gt; as audio input&lt;br /&gt;
 --set-audio-out | -k     use &amp;lt;devicename&amp;gt; as audio output&lt;br /&gt;
&lt;br /&gt;
====Misc options====&lt;br /&gt;
 --debug         | -d     show debugging information&lt;br /&gt;
&lt;br /&gt;
Mode 1: client for COM1 of flightgear:&lt;br /&gt;
&lt;br /&gt;
$ fgcom&lt;br /&gt;
&lt;br /&gt;
- connects fgcom to fgfs at localhost:16661&lt;br /&gt;
&lt;br /&gt;
$ fgcom -sother.host.tld -p23456&lt;br /&gt;
&lt;br /&gt;
- connects fgcom to fgfs at other.host.tld:23456&lt;br /&gt;
&lt;br /&gt;
Mode 2: client for an ATC at &amp;lt;airport&amp;gt; on &amp;lt;frequency&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$ fgcom -aKSFO -d120.500&lt;br /&gt;
&lt;br /&gt;
- sets up fgcom for an ATC radio at KSFO 120.500 MHz&lt;br /&gt;
&lt;br /&gt;
===Registration===&lt;br /&gt;
'''To make full use of FGCOM you will need an account!'''&lt;br /&gt;
&lt;br /&gt;
Please email &amp;lt;nowiki&amp;gt; wirtz &amp;lt;at&amp;gt; dfn &amp;lt;dot&amp;gt; de&amp;lt;/nowiki&amp;gt; (replace with @ and .) and login details will be sent to you shortly. Accounts will not be made until Autumn 2008. But you can test without an account (by default the used account is guest, password guest) with restricted frequency use. As guest you can only use the following frequencies:&lt;br /&gt;
&lt;br /&gt;
* 911.000 MHz (ATC-Help)&lt;br /&gt;
* 910.000 MHz (Echo-Box)&lt;br /&gt;
* 123.450 MHz (Air2Air 1)&lt;br /&gt;
* 122.750 Mhz (Air2Air 2)&lt;br /&gt;
&lt;br /&gt;
==Server installation==&lt;br /&gt;
&lt;br /&gt;
For running a FGCOM server you need Asterisk and depending on the amount of users much bandwith and CPU power. Because of putting pilots and ATCs in a VoIP conference the server-admin has to assure that there is enough network and cpu power to avoid drop-outs of the voice stream.&lt;br /&gt;
&lt;br /&gt;
===Prerequirements===&lt;br /&gt;
&lt;br /&gt;
Install Asterisk on top of your favorite distribution. Please refer to installation manuals (e.g. [[http://www.asteriskguru.com/|Asterisk-Guru]]) you can find on the net. You do not need H.323 or SIP because the fgcom client uses IAX2 as VoIP signaling protocol. Only if you think about connecting external VoIP applications to FGCOM you should consider to activate H.323 or SIP (but this is not the scope of this small howto).&lt;br /&gt;
&lt;br /&gt;
Notice: You need to install the zaptel driver modules - even if you won't use any hardware for telecom interfacing. You need the ztdummy kernel module for the asterisk conference application MeetMe() because it simulates a hardware clock needed by this application. Further development of FGCOM might use app_conference which don't needs any timing device.&lt;br /&gt;
&lt;br /&gt;
For now we want to use /etc/asterisk as the base configuration directory.&lt;br /&gt;
&lt;br /&gt;
===Setting up the radio frequencies===&lt;br /&gt;
&lt;br /&gt;
The radio frequencies are &amp;quot;simple&amp;quot; Conferences and realized due to the Asterisk application MeetMe().&lt;br /&gt;
&lt;br /&gt;
====Part 1: General configuration====&lt;br /&gt;
&lt;br /&gt;
First you have to set up the general configuration of the system. Put the following at the top of your &amp;quot;extensions.conf&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
  [general]&lt;br /&gt;
  static=yes&lt;br /&gt;
  writeprotect=yes&lt;br /&gt;
  ;&lt;br /&gt;
  [globals]&lt;br /&gt;
  ;&lt;br /&gt;
  [macro-com]&lt;br /&gt;
  exten =&amp;gt; s,1,Answer()&lt;br /&gt;
  exten =&amp;gt; s,n,MeetMe(${MACRO_EXTEN},qd)&lt;br /&gt;
  exten =&amp;gt; s,n,Hangup()&lt;br /&gt;
  ;&lt;br /&gt;
  [macro-echo]&lt;br /&gt;
  exten =&amp;gt; s,1,Answer()&lt;br /&gt;
  exten =&amp;gt; s,n,Echo()&lt;br /&gt;
  exten =&amp;gt; s,n,Hangup()&lt;br /&gt;
  ;&lt;br /&gt;
  [guest]&lt;br /&gt;
  ; ATC-Help&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-911.000,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252591100,1,Dial(Local/01-ZZZZ-911.000)&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-910.000,1,Macro(echo)&lt;br /&gt;
  exten =&amp;gt; 012525252591000,1,Dial(Local/01-ZZZZ-910.000)&lt;br /&gt;
  ;&lt;br /&gt;
  [default]&lt;br /&gt;
  include =&amp;gt; guest&lt;br /&gt;
  ;&lt;br /&gt;
  ; Code:&lt;br /&gt;
  ; 01 - FlightGear&lt;br /&gt;
  ; 02 - Microsoft Flight-Simulator&lt;br /&gt;
  ; 03 - ...&lt;br /&gt;
  ;&lt;br /&gt;
  ; Air2Air&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-123.450,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252512345,1,Dial(Local/01-ZZZZ-123.450)&lt;br /&gt;
  exten =&amp;gt; 01-ZZZZ-122.750,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 012525252512275,1,Dial(Local/01-ZZZZ-122.750)&lt;br /&gt;
&lt;br /&gt;
====Part 2: Adding your favorite (all?) frequencies====&lt;br /&gt;
&lt;br /&gt;
For this you have simply to create an extension for every touple of airport/frequency in extensions.conf. The following is an example for Berlin-Tempelhof (EDDI). The information comes from the file &amp;quot;apt.dat.gz&amp;quot; of your FlightGear installation.&lt;br /&gt;
&lt;br /&gt;
  ; EDDI ATIS 126.020 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-126.020,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812602,1,Dial(Local/01-EDDI-126.020)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DEP 120.620 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-120.620,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812062,1,Dial(Local/01-EDDI-120.620)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DIRECTOR 121.120 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-121.120,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812112,1,Dial(Local/01-EDDI-121.120)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN ARR 126.420 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-126.420,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812642,1,Dial(Local/01-EDDI-126.420)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI GND 121.950 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-121.950,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030812195,1,Dial(Local/01-EDDI-121.950)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI TWR 119.570 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.570,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811957,1,Dial(Local/01-EDDI-119.570)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DIRECTOR 136.100 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-136.100,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030813610,1,Dial(Local/01-EDDI-136.100)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI TWR 118.100 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-118.100,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811810,1,Dial(Local/01-EDDI-118.100)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN DEP 119.500 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.500,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811950,1,Dial(Local/01-EDDI-119.500)&lt;br /&gt;
  ;&lt;br /&gt;
  ; EDDI BERLIN ARR 119.620 - Berlin Tempelhof&lt;br /&gt;
  exten =&amp;gt; 01-EDDI-119.620,1,Macro(com)&lt;br /&gt;
  exten =&amp;gt; 010403030811962,1,Dial(Local/01-EDDI-119.620)&lt;br /&gt;
&lt;br /&gt;
What does the above mean? There are two lines (three with the comment) for each frequency: The first one sets up an extension named &amp;quot;01-EDDI-119.500&amp;quot;. Yes, for VoIP you can use textual extensions but be careful if you want to setup your Asterisk-Server with POTS (=Plain old telephone service). Therefor you need the second line which is the same as above but without dashes and the letters in the decimal representation of the ASCII Code. The second line does only a &amp;quot;rewrite&amp;quot; of the numerical representation to the textual one.&lt;br /&gt;
&lt;br /&gt;
For setting up all airports you can write your own simple script. But this maybe also not needed in further versions of FGCOM.&lt;br /&gt;
&lt;br /&gt;
After editing the extensions.conf file you have to reload the extensions file (e.g. &amp;quot;asterisk -rx extensions reload&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
You can add further nice goodies to your extensions.conf: MorseCode() for morsing the code of the VOR (MorseCode() will only work in Asterisk &amp;gt;= 1.4), Recording of metar data and playing this recording back when using the frequency of the metar information, ...&lt;br /&gt;
 &lt;br /&gt;
===Setting up user accounts===&lt;br /&gt;
&lt;br /&gt;
The user accounts are located in the file iax.conf (and perhaps also in sip.conf, but this is not necessary). The top of the file should look like this:&lt;br /&gt;
&lt;br /&gt;
  [general]&lt;br /&gt;
  bandwith=low&lt;br /&gt;
  disallow=lpc10&lt;br /&gt;
  jitterbuffer=yes&lt;br /&gt;
  forcejitterbuffer=no&lt;br /&gt;
  tos=lowdelay&lt;br /&gt;
  autokill=yes&lt;br /&gt;
  disallow=all&lt;br /&gt;
  allow=alaw&lt;br /&gt;
  allow=gsm&lt;br /&gt;
  allow=ilbc&lt;br /&gt;
  allow=g726&lt;br /&gt;
  allow=ulaw&lt;br /&gt;
  language=en&lt;br /&gt;
  maxauthreq=10&lt;br /&gt;
  context=guest&lt;br /&gt;
  ;&lt;br /&gt;
  [guest]&lt;br /&gt;
  type=user&lt;br /&gt;
  username=guest&lt;br /&gt;
  context=guest&lt;br /&gt;
  qualify=yes&lt;br /&gt;
  callerid=Guest IAX User&lt;br /&gt;
  host=dynamic&lt;br /&gt;
  ;&lt;br /&gt;
&lt;br /&gt;
You may want to disallow more codecs or want to allow additional codecs (such as speex). But have in mind that the internal mixing of the conferences are done in &amp;quot;ulaw&amp;quot;. But &amp;quot;ulaw&amp;quot; needs about 80 kBit/s because it does no compression. So you have to think about what's better for you: less bandwidth (per user) and more CPU usage or  more bandwidth (per user) and less CPU usage... you should also consider the &amp;quot;sound&amp;quot; of some codecs may not have the 'real radio sound'.&lt;br /&gt;
&lt;br /&gt;
For each user you have to add a bunch of lines to your iax.conf file:&lt;br /&gt;
&lt;br /&gt;
  [&amp;lt;USERNAME&amp;gt;]&lt;br /&gt;
  type=user&lt;br /&gt;
  username=&amp;lt;USERNAME&amp;gt;&lt;br /&gt;
  secret=&amp;lt;PASSWORD&amp;gt;&lt;br /&gt;
  context=default&lt;br /&gt;
  host=dynamic&lt;br /&gt;
  nat=yes&lt;br /&gt;
  notransfer=yes&lt;br /&gt;
&lt;br /&gt;
You just have to fill in the &amp;lt;USERNAME&amp;gt; and &amp;lt;PASSWORD&amp;gt;. After each change you have to reload the configuration (e.g. &amp;quot;asterisk -rx reload chan_iax2.so&amp;quot;). Perhaps you want to write scripts for automatic configuration and so on. But be warned: Further versions of fgcom may use the multiplayer servers for getting usernames and position data and you have to change your scripts.&lt;br /&gt;
&lt;br /&gt;
===Problems?===&lt;br /&gt;
&lt;br /&gt;
If you have problems you can contact me via email at &amp;quot;dcoredump AT gmail.com&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
* [http://squonk.abacab.org/dokuwiki/fgcom Official website]&lt;br /&gt;
* [http://squonk.abacab.org/dokuwiki/fgcom-manual Manual]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[FlightGear related projects]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;/div&gt;</summary>
		<author><name>Jester</name></author>
	</entry>
</feed>