I recently had the itch to do a little virtual flying and fired up X-Plane with the goal of learning to fly the famous Zibo Boeing 737-800. If you haven’t checked it out, I would highly recommend you do so! By all accounts, it is one of the most accurate simulated 737-800’s out there in the consumer flight sim world and best of all: it’s free (big thanks to the developers)! I’ve had a great time learning the systems and have managed to get to a point where I can reliably input and execute a flight plan successfully. Woohoo!

With that said, one thing that stood out was how dated the nav data was on the Zibo’s Flight Management Computer (FMC). This is due to X-Plane 11 being old (yes, still rocking version 11 over here) and the nav data being from whenever it was last updated by the devs over at Laminar Research. I’m not sure if the data got updated with point releases, but it doesn’t really matter given nav data updates in the US are apparently released every 28 days(!). Quite frequently..

In an attempt to get updated navigation data, I started doing a bit of research. What I discovered were two options:

  1. Pay for a subscription service to get updated nav data (global, I imagine)
  2. Download, convert and install the US CIFP nav data provided by the FAA for free (covers US ONLY)

Naturally, I went with option two as I only tend to fly in the US and this fits the bill swimmingly. If you wish to fly outside of the US with updated nav data, look elsewhere!

Note on X-Plane 12: According to this article on X-Plane Developer, X-Plane 11 & 12 use the same nav data hierarchy and formats, so this process should also work for X-Plane 12. For further details, read the linked article - it explains a lot.

The Process

I used this post over on the x-plane.org forums to understand the process and ran through it on my Windows box running X-Plane successfully. For details, read the mentioned post but in a nutshell, it looks like:

  1. Download CIFP data from FAA site
  2. Download converter program
  3. Run converter program against the CIFP data
  4. Transfer certain outputs to X-Plane’s Custom Data directory
  5. Profit

The Why

While going through the motions, I noticed there was a Linux version of the converter tool used to turn the FAA CIFS data into something X-Plane can use. Queue thinking it would be fun to script the process for future updates. And it was. And it works! So now anytime I want to update the US nav data, I just run a little script on one of my Linux boxes. The two advantages for me is 1) it’s easy this way and 2) I don’t have to re-learn how to do this whole process whenever I want to update the nav data.

As for why having updated nav data is beneficial:

  1. Obviously, it makes for a more realistic experience
  2. Flight plans generated with something like simbrief actually align to the in-game data (ie: SIDs/STARs/Runway info/etc.) vs. not

The Script

As the script is pretty well commented, I will just leave it here. Please feel free to reach out if questions.

#!/bin/bash

#######################################
# This script updates the US nav data #
# in X-Plane from the official FAA    #
# Coded Instrument Flight Procedures  #
# data in an automated fashion        #
#######################################

## Requirements
## 1. Set a working directory in the WORKING_DIR variable below (you create this)
## 2. Set the XPLANE_DIR variable to your X-Plane "Custom Data" directory
## 3. Download the appropriate "convert424toxplane" tool to the specified working directory

## Notes
## - Dropbox link to tool (could go stale):
##     https://www.dropbox.com/sh/k9gkuztcogzk8ik/AACWQljNVNAjlApLtpbGCM70a/linux?dl=0&subfolder_nav_tracking=1
## - Note the dependencies.txt file in the dropbox folder and ensure you have the proper libraries
##     (if you cannot find the exact versions called out, symlinking to a newer version worked for me)
##     (ie: # ln -s /usr/lib64/libboost_serialization.so.1.81.0 /usr/lib64/libboost_serialization.so.1.78.0)
## - Once executed, *ONLY* US nav data will be available in X-Plane

## User Variables
WORKING_DIR=</path/to/working/directory>
ULIMIT=$(ulimit -n)
XPLANE_DIR=</path/to/X-Plane Custom Data directory> ## NOTE: If using smb mount, set this as "$WORKING_DIR/mountdir"
## If using an smb mount back to a Windows box where X-Plane is installed, uncomment and set the following two
## variables appropriately. The expectation is that X-Plane's "Custom Data" directory is shared with that name
## and is accessible & writable by guest without a password. You could also change the mount parameters below if
## you want to use a specifc user, provide a password, change the mount path, etc.
#SMB_XPLANE_HOST=<IP or hostname of system running X-Plane>
#SMB_XPLANE_CUSTOM_DATA_SHARE="Custom Data"

## Uncomment the following two lines if using smb mount (adjusting if necessary)
#mkdir $WORKING_DIR/mountdir
#mount.smb3 //$SMB_XPLANE_HOST/"SMB_$XPLANE_CUSTOM_DATA_SHARE" $WORKING_DIR/mountdir -o user=guest,password=''

## Set variables to check to see if newer nav data is available
LATEST_CIFP_URL=`curl -s https://www.faa.gov/air_traffic/flight_info/aeronav/digital_products/cifp/download/ | grep Zip | tail -1 | cut -d'"' -f2`
LATEST_CIFP_LAST_MOD=`curl -sI $(curl -s https://www.faa.gov/air_traffic/flight_info/aeronav/digital_products/cifp/download/ | grep Zip | tail -1 | cut -d'"' -f2) | grep -i Last-Modified | cut -d" " -f3,4,5 | tr 'a-z' 'A-Z' | sed s/" "/""/g`
CURRENT_XPLANE_NAV_DATA=`head -n1 $XPLANE_DIR/earth_424.dat | awk -F" " '{print$3}' | cut -b-11 | sed s/"-"/""/g`
LATEST_CIFP_ZIP=`echo $LATEST_CIFP_URL |  awk -F "/" '{print $NF}'`

## Check to see if nav data needs an update
if [[ "$LATEST_CIFP_LAST_MOD" == "$CURRENT_XPLANE_NAV_DATA" ]];
then
        echo -e "\nNav data is current. No update necessary. Exiting.\n"
        echo -e "LATEST ONLINE RELEASE:         $LATEST_CIFP_LAST_MOD"
        echo -e "CURRENT X-PLANE RELEASE:       $CURRENT_XPLANE_NAV_DATA\n"
        umount -q $WORKING_DIR/mountdir
        rmdir $WORKING_DIR/mountdir
        exit
fi

bold=$(tput bold)
normal=$(tput sgr0)

## Safety Check
if [ ! -d "$WORKING_DIR" ]
then
        echo -e "\nWorking directory not found. Please verify WORKING_DIR variable is correct.\n"
        exit
else

## Retrieve latest CIFP archive
echo -e "\nLATEST ONLINE RELEASE:               $LATEST_CIFP_LAST_MOD"
echo -e "CURRENT X-PLANE RELEASE:       $CURRENT_XPLANE_NAV_DATA\n"
echo -e "\nDownloading latest CIFP archive.. ($LATEST_CIFP_URL)\n"
wget --quiet -N $LATEST_CIFP_URL

## Create dir for extraction & extract CIFP package
mkdir $WORKING_DIR/extracted
echo -e "Extracting archive..\n"
unzip -q -o $WORKING_DIR/$LATEST_CIFP_ZIP -d $WORKING_DIR/extracted

## Rename file for converter program
cd $WORKING_DIR/extracted
mv FAACIFP18 FAACIFP18.dat

## File descriptor check (needs at least 2048 set or convert will fail)
if (( $ULIMIT < 2048 ))
then
        echo $ULIMIT > $WORKING_DIR/orig_ulimit.out
        ORIG_ULIMIT=$(cat $WORKING_DIR/orig_ulimit.out)
        echo -e "${normal}ulimit of $ULIMIT is too low. Increasing to 2048.\n"
        ulimit -n 2048
fi

## Run conversion
echo -e "Running convert424toxplane..\n"
echo -e "==========PROGRAM OUTPUT=========="
$WORKING_DIR/convert424toxplane FAACIFP18.dat ""
echo -e "==================================\n"

## Copy files to X-Plane directory (via the smb mount in this case)
cp -r earth_nav.dat earth_fix.dat earth_awy.dat CIFP/ FAACIFP18.dat $XPLANE_DIR
cd $XPLANE_DIR
rm earth_424.dat
mv FAACIFP18.dat earth_424.dat
echo -e "Copied new data to X-Plane directory.\n"
echo -e "New Data Effective Date: ${bold}$(grep EFFECTIVE earth_424.dat | awk '{print $9 $10 $11}')\n"

## Cleanup
echo -e "${normal}Cleaning up..\n"
cd $WORKING_DIR
umount -q $XPLANE_DIR
ulimit -n $ORIG_ULIMIT
rm -rf aeronav.faa.gov extracted orig_ulimit.out $LATEST_CIFP_ZIP
rmdir mountdir
fi
exit

Expected Output

If update is needed:

# ./update_nav_data.sh

LATEST ONLINE RELEASE:          04JAN2024
CURRENT X-PLANE RELEASE:        03JAN2024


Downloading latest CIFP archive.. (https://aeronav.faa.gov/Upload_313-d/cifp/CIFP_240125.zip)

Extracting archive..

ulimit of 1024 is too low. Increasing to 2048.

Running convert424toxplane..

==========PROGRAM OUTPUT==========
WARNING: No orthometric height given for KGAO R18
WARNING: No orthometric height given for KGAO R36
WARNING: No orthometric height given for KMSY R20-Y
WARNING: No orthometric height given for KTRM R30
Overlapping PI: IBUR K2 - at KVNY and KBUR
Overlapping PI: IVDG K1 - at KVUO and KPDX
==================================

Copied new data to X-Plane directory.

New Data Effective Date: 25JAN2024

Cleaning up..

If no updated is needed:

# ./update_nav_data.sh

Nav data is current. No update necessary. Exiting.

LATEST ONLINE RELEASE:          04JAN2024
CURRENT X-PLANE RELEASE:        04JAN2024

Verify in X-Plane

If all goes well, you should no longer see the NAV DATA OUT OF DATE message on FMC and GPS units across X-Plane aircraft. On the Zibo 737-800 FMC for example, you can verify via the IDENT page:

Modify at will and enjoy - cheers!