Note: The following applies to the DACS platform running Model Builder only.
“Automatic Terminal Information Service (ATIS) is the continuous broadcast of recorded non-control information in high activity terminal areas. Its purpose is to improve controller effectiveness and to relieve frequency congestion by automating the repetitive transmission of essential but routine information.”
So how do we generate an ATIS message? Lucky for us, ATIS is one of those systems with a relatively tightly defined vocabulary. In fact, the ATIS message has a fixed structure defined by the FAA.
So how does this help? Well, we use a combination of our “In_Message” control (or Message List depending what/where you look). See page 16 in Chapter 18 of the Model Builder Reference Manual. This object works in conjunction with our PlaySound object, and Soundfile Groups concept.
Here’s the clever bit. While the soundfile is playing, nothing else happens; but once the file reaches the End-Of-File point, the PlaySound object flags to the In_Message object that it is done. The In_Message object then looks at the second byte in the message list, and again if non-zero, passes the second index value to the PlaySound object.
This is clever because the timing interaction between the elements is totally self-contained, which is a major bonus. The process continues until the In_Message reaches either a value of zero in the list, or the end of the list as defined by the size parameter of the In_Message object.
The In_Message object can be set-up to either stop once it reaches the end, repeat continuously, or repeat continuously with a pause of ‘N’ seconds between the last index, and restarting. Of course, the trigger value will determine whether the message plays at all.
OK, so how does this solve ATIS? What we usually do is split the message into two aspects, one part being the fixed elements which never change, and the other being the variables - take for example the first line of the message:
“Boston Tower Information Delta”
Of these, the word “Information” is always included in every repetition of the message. The other parts “Boston Tower” and “Delta” are the variables.
Although the scheme that we come up with to drive the message is arbitrary, one approach is to assign all the fixed elements to high order numbers, and the low order numbers to the variables, so you might assign the words as follows:
Word | Index |
---|---|
Information | 200 |
Boston tower | 20 |
Delta | 103 |
Others might include:
Word | Index |
---|---|
One | 1 |
Two | 2 |
Three | 3 |
Four | 4 |
… | |
Alpha | 100 |
Bravo | 101 |
Charlie | 102 |
Delta | 103 (as already assigned, repeated for clarity!) |
… and so on for the entire vocabulary. |
So to play the phrase:
“Boston Tower Information Delta”
… you need to send the following numbers in the message list:
[20] [200] [103] [0]
The last zero value tells the In_Message object that you are done.
So what you need to do is map out all the words or phrases that are possible elements of your messages, and assign them to indices. Then the host simply sends over the required In_Message control.
How to get the soundfiles is another trick. Implementations have previously used someone speaking into a microphone, and then edited the files offline to produce the required files. Another option is to use one of the online text-to-speech generators and save the soundfiles for use. The advantage of the synthesized voice is that you can always add to the vocabulary without having to find the first person that did the recordings.
We have used the AT&T Natural Voice. This used to have no restrictions on use, so you could use the demo online version to generate your messages, but they have now added a restriction policy statement preventing non-private use of the demo version. The license costs $295 per voice selected, so it is not a particularly costly piece of software to buy. There are probably several others of equal or better quality.
The sample model below is fairly self-explanitory. The key is to understand that the control “ATIS_Message” defines a series of one byte integers that are passed over as a sequence that define the message content.
In this example a value of 1 represents the phrase “This is”, a value of 2 represents the word “information” and so on. Look in the soundgroup called ‘ATIS_SoundGroup’ to see the words/phrases and their associated index numbers.
If you passed over the sequence [1][100][2][202][0] you would hear “This is Dulles information Charlie”—the [0] value terminates the message.
The enable for the message is the boolean value “ATIS_Active”.
The “ATIS_Transmit” object is the radio object that broadcasts the message.
Download sample model & sound files.