DACS App Note
How to Generate ATIS Messages for DACS (#64)
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.”
Clever Model Builder
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.
- The In_Message object allows the host computer to supply a list of single-byte integer values as a single block within the host input value, up to some pre-determined length (perhaps 40 bytes, which allows 40 single-byte values to be passed, or whatever number is needed).
- Each of the integer values is used as an index into a sound group. Remember that a sound group is a collection of soundfiles that are identified by an index number within the group, with the group name used as the overall identifier.
- The sound group is used within our PlaySound object (soundfile player) and the In_Message is used as the control value in the Index field.
- The clever part is that the collection of the In_Message, PlaySound and Sound Group objects all work together in a rather cunning way.
- Basically, once the In_Message is triggered, it looks at the first byte, and if non-zero, passes this index over to the PlaySound object.
- This causes the Soundfile with the corresponding index to start playing.
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:
Others might include:
|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:
   
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.
Getting the Sound Files
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  you would hear “This is Dulles information Charlie”—the  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.
- Right-click to download the .ZIP file.
- Unpack the ZIP archive, and copy its contents to a floppy disk.
- Insert the disk into the DACS and copy the model to the c:\mbuilder\user\models directory.
- Copy the sound files (they have the .au file extension) to the c:\mbuilder\user\sounds8 directory.
- Launch Model Builder and load the model.