diff --git a/.gitignore b/.gitignore index 4eff553..2d1de33 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ .DS_Store _build + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] diff --git a/README.md b/README.md deleted file mode 100644 index 3160a69..0000000 --- a/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# ADS-B Decoding Guide - -This is a small research project conducted by [Junzi Sun](http://junzisun.com) and Air Traffic Management group at the Aerospace Engineering Faculty of TU Delft. While we were trying to work with ADS-B data collected from our receiver, we notice that there are very few documents available which can explain the ADS-B data comprehensively. So, we created this guide, along with a decoder written in python - [pyModeS](https://github.com/junzis/pyModeS). - -The main focus of the guide is on reading different types of messages, understanding the information in the message, and decoding/computing aircraft status. This document and related library are shared on GitHub and ReadTheDoc. Please feel free to help us improving them. - -Links to the live document and python library: - -* (Document) http://adsb-decode-guide.readthedocs.org/ -* (GitHub) https://github.com/junzis/pyModeS - -Have Fun! diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..70b8769 --- /dev/null +++ b/README.rst @@ -0,0 +1,17 @@ +============================================================ +The 1090MHz Riddle +============================================================ +------------------------------------------------------------ +The book about decoding Mode-S and ADS-B data +------------------------------------------------------------ + +Access the online book at: `mode-s.org `_ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Begun with a frustration on the lack of technical public information on ADS-B and Mode-S in the year of 2015, I created an live online document to recorded my understanding of ADS-B data. Previously, this was known as `"ADS-B Decoding Guide" `_ project. Together with the tutorial, we also developed its related python library, the `pyModeS `_. With time, I received many feedbacks, compliments, and contributions from open-source community users. + +From beginning of 2017, the interests of tapping into Enhanced Mode-S (EHS) data brought us a whole new chapter of Mode-S inference and decoding into the pyModeS. This also enriches the "ADS-B" guide. With the advance in this area, I am planning to compile a more comprehensive online book to cover both ADS-B and Mode-S decoding and related topic. + +That's the starting of this new repository. I am also starting host the online book on my own server to allow more flexibility of editing and publishing. You can read the most up-to-date book on `mode-s.org `_. + +Oh, it is still GNU GPL. It was great to see the pull request from different contributors previously. I am looking forward to seeing more comments and pulls from the community. Enjoy! diff --git a/_ext/edit_on_github.py b/_ext/edit_on_github.py new file mode 100644 index 0000000..cb6a45f --- /dev/null +++ b/_ext/edit_on_github.py @@ -0,0 +1,47 @@ +""" +Sphinx extension to add ReadTheDocs-style "Edit on GitHub" links to the +sidebar. + +Loosely based on https://github.com/astropy/astropy/pull/347 +""" + +import os +import warnings + + +__licence__ = 'BSD (3 clause)' + + +def get_github_url(app, view, path): + return ( + 'https://github.com/{project}/{view}/{branch}/{src_path}{path}'.format( + project=app.config.edit_on_github_project, + view=view, + branch=app.config.edit_on_github_branch, + src_path=app.config.edit_on_github_src_path, + path=path)) + + +def html_page_context(app, pagename, templatename, context, doctree): + if templatename != 'page.html': + return + + if not app.config.edit_on_github_project: + warnings.warn("edit_on_github_project not specified") + return + if not doctree: + warnings.warn("doctree is None") + return + path = os.path.relpath(doctree.get('source'), app.builder.srcdir) + show_url = get_github_url(app, 'blob', path) + edit_url = get_github_url(app, 'edit', path) + + context['show_on_github_url'] = show_url + context['edit_on_github_url'] = edit_url + + +def setup(app): + app.add_config_value('edit_on_github_project', '', True) + app.add_config_value('edit_on_github_branch', 'master', True) + app.add_config_value('edit_on_github_src_path', '', True) # 'eg' "docs/" + app.connect('html-page-context', html_page_context) diff --git a/_static/custom.css b/_static/custom.css new file mode 100644 index 0000000..1396e45 --- /dev/null +++ b/_static/custom.css @@ -0,0 +1,27 @@ +pre { + padding: 10px 15px; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 14px; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 13px; +} + +div.sphinxsidebar ul li.toctree-l3 > a { + font-size: 12px; +} + +div.section { + margin-bottom: 30px +} + +div.section h2 { + border-bottom: 1px solid; +} + +div.sphinxsidebar { + border-right: 1px dashed #cccccc; +} diff --git a/_templates/sourcelink.html b/_templates/sourcelink.html new file mode 100644 index 0000000..d6f7c2b --- /dev/null +++ b/_templates/sourcelink.html @@ -0,0 +1,16 @@ +{%- if show_source and has_source and sourcename %} +
+

{{ _('Page Source') }}

+ +{%- endif %} diff --git a/_templates/title.html b/_templates/title.html new file mode 100644 index 0000000..dacfab2 --- /dev/null +++ b/_templates/title.html @@ -0,0 +1,5 @@ +

The 1090MHz Riddle

+ +An Open access book on Mode-S/ADS-B decoding and related topics + +

diff --git a/content/introduction.rst b/adsb.rst similarity index 76% rename from content/introduction.rst rename to adsb.rst index 5cea24f..7a34926 100644 --- a/content/introduction.rst +++ b/adsb.rst @@ -1,17 +1,12 @@ -Introduction -============ - -.. Hardware -.. -------- -.. TODO: add an introduction of the hardware used for the project here - +ADS-B (Automatic Dependent Surveillance – Broadcast) +==================================================== -ADS-B ------ +Introduction +------------ ADS-B is short for Automatic Dependent Surveillance–Broadcast. it is a satellite based surveillance system. Aircraft position, velocity, together with identification are transmitted through Mode-S Extended Squitter (1090 MHz). -Majority of the aircraft nowadays are broadcasting ADS-B messages constantly. There are many ways you can set up you own receiver and antenna to start tapping into those signals (DVB-T usb stick, ModeSBeast, Raspberry Pi, RadarScape, etc). +Majority of the aircraft nowadays are broadcasting ADS-B messages constantly. There are many ways you can set up you own receiver and antenna to start tapping into those signals (DVB-T usb stick, ModeSBeast, Raspberry Pi, RadarScape, etc). An ADS-B message is 112 bits long, and consist of 5 parts: @@ -32,7 +27,7 @@ This table lists the key bits of a message: +----------+------------+----------+----------------------------------------+ | 3 | 6 - 8 | CA | Capability (additional identifier) | +----------+------------+----------+----------------------------------------+ -| 24 | 9- 32 | ICAO | ICAO aircraft address | +| 24 | 9 - 32 | ICAO | ICAO aircraft address | +----------+------------+----------+----------------------------------------+ | 56 | 33 - 88 | DATA | Data | + +------------+----------+----------------------------------------+ @@ -46,7 +41,7 @@ Example: :: Raw message in hexadecimal: - 8D4840D6202CC371C32CE0576098 + 8D4840D6202CC371C32CE0576098 -----+------------+--------------+-------------------------------+-------------- @@ -58,14 +53,23 @@ Example: DEC | 17 5 | | [4] ....................... | -----+------------+--------------+-------------------------------+-------------- DF CA ICAO [TC] ------ DATA ---------- PI - + Any ADS-B must start with the Downlink Format 17 or 18 (10001 or 10010 in binary code) for the first 5 bits. Bits 6-8 are used as additional identifier, which has different meanings within different types of ADS-B message. +ICAO address +~~~~~~~~~~~~ + +In each ADS-B message, the sender (originated aircraft) can be identified using the icao address. It is located from 9 to 32 bits in binary (or 3 to 8 in hexadecimal). In above example, it is ``4840D6`` or ``010010000100``. + +An unique ICAO address is assigned to each Mode-S transponder of an aircraft. Thus this is a unique identifier for aircraft. You can use the query tool (`World Aircraft Database `_) from mode-s.org to find out more about the aircraft wiht the ICAO address. For instance, using previous ICAO ``4840D6`` example will return the result of a ``Fokker 70`` (wow, it must be one of last in its kind in operation) with registration of ``PH-KZD``. + +In addition, you can down the datebase from aforementioned website in CSV format. + ADS-B message types -------------------- +~~~~~~~~~~~~~~~~~~~ To identify what information is contained in a ADS-B message. We need to take a look at the ``Type Code`` of the message, indicated at bits 33 - 37 of the ADS-B message (or first 5 bits of the ``DATA`` segment) @@ -91,12 +95,12 @@ Following are the relationship between each ``Type Code`` and its information co ADS-B Checksum --------------- +~~~~~~~~~~~~~~~ ADS-B uses cyclic redundancy check to validate the correctness of received message, where the last 24 bits are the parity bits. Following pseudo-code describes the CRC process: :: - + GENERATOR = 1111111111111010000001001 MSG = binary(8D4840D6202CC371C32CE0576098) # 112 bits @@ -118,5 +122,13 @@ A comprehensive documentation on Mode-S parity coding can be found: :: - Gertz, Jeffrey L. Fundamentals of mode s parity coding. No. ATC-117. - MASSACHUSETTS INST OF TECH LEXINGTON LINCOLN LAB, 1984. APA + Gertz, Jeffrey L. Fundamentals of mode s parity coding. No. ATC-117. + MASSACHUSETTS INST OF TECH LEXINGTON LINCOLN LAB, 1984. APA + + +.. include:: sections/adsb-identification.rst +.. include:: sections/compact-position-report.rst +.. include:: sections/adsb-airborne-position.rst +.. include:: sections/adsb-airborne-velocity.rst +.. include:: sections/adsb-surface-movment.rst +.. include:: sections/adsb-integrity-accuracy.rst diff --git a/conf.py b/conf.py index 269298b..004311d 100644 --- a/conf.py +++ b/conf.py @@ -16,113 +16,74 @@ import os import shlex import datetime -import sphinx_rtd_theme +import alabaster +sys.path.insert(0, os.path.abspath('_ext')) -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. extensions = [ - 'sphinx.ext.mathjax', + 'sphinx.ext.mathjax', 'alabaster', + 'edit_on_github', ] -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. +source_encoding = 'utf-8' master_doc = 'index' +exclude_patterns = ['_build'] -# General information about the project. -project = 'ADS-B Mode-S Decoding Guide' +project = 'The 1090MHz Riddle' copyright = '%s, Junzi Sun' % datetime.datetime.now().year author = 'Junzi Sun' +language = 'en' +today_fmt = '%d %B %Y' -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -# version = '0.3' -# The full version, including alpha/beta/rc tags. -# release = '0.3' +show_authors = True -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ['_build'] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +# pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] +# modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False +# keep_warnings = False # If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False +# todo_include_todos = False + +# --------- Options Edit on Github --------- +edit_on_github_project = 'junzis/the-1090mhz-riddle' +edit_on_github_branch = 'master' +# edit_on_github_src = 'docs/' # optional. default: '' -# -- Options for HTML output ---------------------------------------------- -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'sphinx_rtd_theme' +# --------- Options for HTML output --------- +templates_path = ['_templates'] -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} +html_theme_path = [alabaster.get_path()] +html_theme = 'alabaster' -# Add any paths that contain custom themes here, relative to this directory. -html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] +# Guzzle theme options (see theme.conf for more information) +html_theme_options = { + 'font_size': '16px', + 'page_width': '1200px', + 'sidebar_width': '300px', + 'fixed_sidebar': True, + 'sidebar_collapse': False, +} + +html_sidebars = { + '**': [ + 'title.html', + # 'about.html', + 'navigation.html', + 'sourcelink.html', + 'searchbox.html', + # 'donate.html', + ] +} # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". -#html_title = None +html_title = "The 1090MHz Riddle Book" # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None @@ -139,7 +100,7 @@ # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -# html_static_path = ['_static'] +html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied @@ -202,9 +163,9 @@ #html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. -htmlhelp_basename = 'adsb-decode-guidedoc' +# htmlhelp_basename = '' -# -- Options for LaTeX output --------------------------------------------- +# ------------- Options for LaTeX output ------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). @@ -247,40 +208,3 @@ # If false, no module index is generated. #latex_domain_indices = True - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'adsb-decode-guide', 'ADS-B Decoding Guide', - [author], 1) -] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'adsb-decode-guide', 'ADS-B Decoding Guide', - author, 'adsb-decode-guide', 'One line description of project.', - 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False diff --git a/content/modes-ehs.rst b/content/modes-ehs.rst deleted file mode 100644 index bfc2900..0000000 --- a/content/modes-ehs.rst +++ /dev/null @@ -1,442 +0,0 @@ -Mode S Enhanced Surveillance (EHS) -================================== - -Let's hack into the EHS messaged too! more information on aircraft air speeds. - -[under editing] - -For a complete Python implementation: -https://github.com/junzis/pyModeS/blob/master/pyModeS/ehs.py - - -The Mode-S Enhanced Surveillance (EHS) provides air traffic controller more information that what is included in the ADS-B (a.k.a Mode-S Elementary Surveillance). It responds to ATC Secondary Surveillance Radar, and broadcast specific parameters non-independently. Hence it is only available in the area where ATC presents. - -There are quite a few very interesting data contained within various types of the EHS messages. Such as: airspeeds (IAS, TAS, Mach), roll angles, track angles, track angle rates, selected altitude, magnetic heading, vertical rate, etc.. - -There are a few challenges to decode those information: - - Which aircraft does one message come from? - - What is the type of one message (a.k.a. which BDS code) most likely to be? - - How confident is the information that has been decoded? - -.. Example: - 40: A0001838CA380031440000F24177 - 50: A00015B7801DBB3BE00CF7B8856D - 60: A0000294B409D117224C47609A81 - - -Downlink Format and message structure -------------------------------------- -DF 20 and DF 21 are used for downlink messages. - -The same as ADS-B, in all Mode-S messages, the first 5 bit contains the Downlink Format. The same identification process can be used for discover EHS messages. So the EHS messages starting bits are: - -:: - - DF20 - 10100 - DF21 - 10101 - - -The message is structured as following, where the digit represents the number of binary digits: - -:: - - +--------+--------+--------+--------+-------------+------------------+------------+ - | DF 5 | FS 3 | DR 5 | UM 6 | AC 13 | MB 56 | AP/DP 24 | - +-----------------+--------+-----------------------------------------+------------+ - | <---------+ 32 bits +--------> | - - - DF: downlink format - FS: flight status - DR: downlink request - UM: utility message - ID: identity - MB: message, Comm-B - AP/DP: address/parity or data/parity - -Except the DF, the first 32 bits does not contain useful information for decode the message. The exact definitions can be found in ICAO annex 10 (Aeronautical Telecommunications). - - -Parity and ICAO address recovery --------------------------------- - -Unlike ADS-B, the ICAO address is not broadcast along with the EHS messages. We will have to "decode" the ICAO address before decoding other information, and ICAO is hidden in the message and checksum. - -Mode-S uses two types of parity checksum Address Parity (AP) and Data Parity (DP). Majority of the time Address Parity is used. - - -Address Parity -************** - -For AP, message parity field is produced by XOR ICAO with message data CRC checksum. So, to recover the ICAO bits, simply reverse XOR process will work, shown as follows: - -:: - - +-------------------------------+ +------------------+ - | DATA FIELD (32 OR 88 BIT) | | PARITY BITS | - +--------------+----------------+ +------------------+ - | - | XOR - v - +--------------+-----------+ +------------------+ - | ENCODER | +--> | CHECKSUM (24BIT) | - +--------------------------+ +------------------+ - || - +------------------+ - | ICAO (24BIT) | - +------------------+ - - -An example: -:: - - Message: A0001838CA380031440000F24177 - - Data: A0001838CA380031440000 - Parity: F24177 - - Encode data: CE2CA7 - - ICAO: [F24177] XOR [CE2CA7] => [3C6DD0] - -For the implementation of CRC encoder, refer to the pyModeS library ``pyModeS.util.crc(msg, encode=True)`` - -.. Data parity - - - -BDS (Comm-B Data Selector) --------------------------- - -In simply words, BDS is a number (usually a 2-digit hexadecimal) that defines the type of message we are looking at. Both ADS-B messages and other types of Mods-S messages are all assigned their distinctive BDS number. However, it is **no where** to be found in the messages. - -When SSR interrogates aircraft, a BDS code is included in request message ( Uplink Format - UF 4, 5, 20, or 21). This BDS code are then used by the aircraft transponder to register the type of message to be sent. But when the downlink message is transmitted, its BDS code is not included in the message (because the SSR knows what kind message it requested). Good new for them, but challenges for us. - -Here are some BDS codes that we are interested, where additional parameters about aircraft can be found: -:: - - BDS 2,0 Aircraft identification - BDS 2,1 Aircraft and airline registration markings - BDS 4,0 Selected vertical intention - BDS 4,4 Meteorological routine air report - BDS 5,0 Track and turn report - BDS 6,0 Heading and speed report - - -BDS 2,0 (Aircraft identification) ---------------------------------- -Similar to ADS-B aircraft identification message, the callsign of aircraft can be decode in the same way. For the 56-bit MB (message, Comm-B) field, information decodes as follows: - -:: - - +--------------+---------+---------+---------+---------+---------+---------+---------+---------+ - | BDS2,0 (8) | C1 (6) | C2 (6) | C3 (6) | C4 (6) | C5 (6) | C6 (6) | C7 (6) | C8 (6) | - +--------------+---------+---------+---------+---------+---------+---------+---------+---------+ - 0010 0000 6 bits - -Here, 8 bits are 0010 0000 (2,0 in hexadecimal) and the rest of chars are 6 bits each. To decode the chars, the same char map as ADS-B is used: - -:: - - '#ABCDEFGHIJKLMNOPQRSTUVWXYZ#####_###############0123456789######' - - -Example: - -:: - - MSG: A000083E202CC371C31DE0AA1CCF - DATA: 202CC371C31DE0 - - BIN: 0010 0000 001011 001100 001101 110001 110000 110001 110111 100000 - HEX: 2 0 - DEC: 11 12 13 49 48 49 55 32 - CHR: K L M 1 0 1 7 _ - - ID: KLM1017 - - -BDS 4,0 (Selected aircraft intention) -------------------------------------- - -In BDS 4,0, information such as aircraft select altitude and barometric pressure settings are given. The 56-bit MB filed is structure as following: - - -:: - - FIELD START N-BITS - (END) - +---------------------------------------+------+------+ - | Status | 1 | 1 | - +---------------------------------------+------+------+ - | MCP/FCU selected altitude | 2 | 12 | ** - | | | | - | range = [0, 65520] ft | | | - | | | | - | LSB: 16 ft | 13 | | - +---------------------------------------+------+------+ - | Status | 14 | 1 | - +---------------------------------------+------+------+ - | FMS selected altitude | 15 | 12 | ** - | | | | - | range = [0, 65520] ft | | | - | | | | - | LSB: 16 ft | 26 | | - +---------------------------------------+------+------+ - | Status | 27 | 1 | - +---------------------------------------+------+------+ - | Barometric pressure setting | 28 | 12 | ** - | -> Note: actual value minus 800 | | | - | | | | - | range = [0, 410] mb | | | - | | | | - | LSB: 0.1 mb | 39 | | - +---------------------------------------+------+------+ - | Reserved | 40 | 8 | - | -> set to ZEROS | | | - | | 47 | | - +---------------------------------------+------+------+ - | Status | 48 | 1 | - | -> next 3 fields | | | - +---------------------------------------+------+------+ - | Mode: VNAV | 49 | 1 | - +---------------------------------------+------+------+ - | Mode: Alt hold | 50 | 1 | - +---------------------------------------+------+------+ - | Mode: Approach | 51 | 1 | - +---------------------------------------+------+------+ - | Reserved | 52 | 2 | - | -> set to ZEROS | 53 | | - +---------------------------------------+------+------+ - | Status | 54 | 1 | - +---------------------------------------+------+------+ - | Target alt source | 55 | 2 | - | -> 00: Unknown | | | - | -> 01: Aircraft altitude | | | - | -> 10: FCU/MCP selected altitude | | | - | -> 11: FMS selected altitude | 56 | | - +---------------------------------------+------+------+ - - -An example: - -:: - - MSG: A000029C85E42F313000007047D3 - MB: 85E42F31300000 - - --------------------------------------------------------------------------------- - MB BIN: 1 000010111100 1 000010111100 1 100010011000 00000000 0 0 0 0 00 0 00 - --------------------------------------------------------------------------------- - STATUS: 1 - MCP: 188 (x16) - --------------------------------------------------------------------------------- - STATUS: 1 - FMS: 188 (x16) - --------------------------------------------------------------------------------- - STATUS: 1 - BARO: 2200 (x0.1 + 800) - --------------------------------------------------------------------------------- - FINAL: 3008 ft 3008 ft 1020 mb - --------------------------------------------------------------------------------- - - -BDS 4,4 (Meteorological routine air report) -------------------------------------------- - -under construction - -BDS 5,0 (Track and turn report) -------------------------------------------- - -Within the BDS 5,0 message, five different types of aircraft states are given, mostly related with the turns: - -- roll angle -- true track angle -- ground speed -- track angle rate -- true airspeend - -The 56-bit MB filed is structure as following: - -:: - - FIELD START N-BITS - (END) - +---------------------------------------+------+------+ - | Status | 1 | 1 | - +---------------------------------------+------+------+ - | Sign, 1 -> left wing down | 1 | 1 | - +---------------------------------------+------+------+ - | Roll angle | 3 | 9 | - | | | | - | range = [-90, 90] degrees | | | - | | | | - | LSB: 45/256 degree | 11 | | - +---------------------------------------+------+------+ - | Status | 12 | 1 | - +---------------------------------------+------+------+ - | Sign, 1 -> west | 13 | 1 | - +---------------------------------------+------+------+ - | True track angle | 14 | 10 | - | | | | - | range = [-180, 180] degrees | | | - | | | | - | LSB: 90/512 degree | 23 | | - +---------------------------------------+------+------+ - | Status | 24 | 1 | - +---------------------------------------+------+------+ - | Ground speed | 25 | 10 | - | | | | - | range = [0, 2046] knots | | | - | | | | - | LSB: 2 knots | 34 | | - +---------------------------------------+------+------+ - | Status | 35 | 1 | - +---------------------------------------+------+------+ - | Sign, 1 -> negative value | 36 | 1 | - +---------------------------------------+------+------+ - | Track angle rate | 37 | 9 | - | | | | - | range = [-16, 16] degrees | | | - | | | | - | LSB: 8/256 degree / second | 45 | | - +---------------------------------------+------+------+ - | Status | 46 | 1 | - +---------------------------------------+------+------+ - | True airspeed | 47 | 10 | - | | | | - | range = [0, 2046] knots | | | - | | | | - | LSB: 2 knots | 56 | | - +---------------------------------------+------+------+ - -An example: - -:: - - MSG: A000139381951536E024D4CCF6B5 - MB: 81951536E024D4 - - --------------------------------------------------------------------------------- - MB BIN: 1 0 000001100 1 0 1010001010 1 0011011011 1 0 000000100 1 0011010100 - --------------------------------------------------------------------------------- - STATUS: 1 - SIGN: + - ROLL: 12 (x45/256) - --------------------------------------------------------------------------------- - STATUS: 1 - SIGN: + - TRACK ANGLE: 650 (x90/512) - --------------------------------------------------------------------------------- - STATUS: 1 - GROUND SPEED: 219 (x2) - --------------------------------------------------------------------------------- - STATUS: 1 - SIGN: + - TRACK ANGLE RATE: 4 (x8/256) - --------------------------------------------------------------------------------- - STATUS: 1 - TRUE AIRSPEED: 212 (x2) - --------------------------------------------------------------------------------- - FINAL: 2.1 deg 114.3 deg 438 kt 0.1 deg/s 424 kt - --------------------------------------------------------------------------------- - -Of course, all fields are not always available in each of DBS 5,0 message. For those information that are not available, status bits are set to 0. - - -BDS 6,0 (Heading and speed report) -------------------------------------------- - -Within the BDS 6,0 message, five different types of aircraft states are given: - -- magnetic heading -- indicated airspeed -- Mach number -- barometric altitude rate -- inertial vertical rate - -The 56-bit MB filed is structure as following: - -:: - - FIELD START N-BITS - (END) - +---------------------------------------+------+------+ - | Status | 1 | 1 | - +---------------------------------------+------+------+ - | Sign, 1 -> West | 1 | 1 | - +---------------------------------------+------+------+ - | Magnetic heading | 3 | 10 | - | | | | - | range = [-180, 180] degrees | | | - | | | | - | LSB: 90/512 degree | 12 | | - +---------------------------------------+------+------+ - | Status | 13 | 1 | - +---------------------------------------+------+------+ - | Indicated airspeed | 14 | 10 | - | | | | - | range = [0, 1023] knots | | | - | | | | - | LSB: 1 knots | 23 | | - +---------------------------------------+------+------+ - | Status | 24 | 1 | - +---------------------------------------+------+------+ - | Mach number | 25 | 10 | - | | | | - | range = [0, 4.092] Mach | | | - | | | | - | LSB: 2.048 / 512 Mach | 34 | | - +---------------------------------------+------+------+ - | Status | 35 | 1 | - +---------------------------------------+------+------+ - | SIGN 1 -> Below | 36 | 1 | - +---------------------------------------+------+------+ - | Barometric altitude rate | 37 | 9 | - | | | | - | range = [-16384, 16352] ft/min | | | - | | | | - | LSB: 32 ft/min | 45 | | - +---------------------------------------+------+------+ - | Status | 46 | 1 | - +---------------------------------------+------+------+ - | SIGN 1 -> Below | 47 | 1 | - +---------------------------------------+------+------+ - | Inertial altitude rate | 48 | 9 | - | | | | - | range = [-16384, 16352] ft/min | | | - | | | | - | LSB: 32 ft/min | 56 | | - +---------------------------------------+------+------+ - -An example: - -:: - - MSG: A000029CFFBAA11E2004727281F1 - MB: FFBAA11E200472 - - --------------------------------------------------------------------------------- - MB BIN: 1 1 1111111011 1 0101010000 1 0001111000 1 0 000000000 1 0 001110010 - --------------------------------------------------------------------------------- - STATUS: 1 - SIGN: - - HEADING: 1019 (x90/512) - --------------------------------------------------------------------------------- - STATUS: 1 - IAS: 336 - --------------------------------------------------------------------------------- - STATUS: 1 - MACH: 120 (x2.048/512) - --------------------------------------------------------------------------------- - STATUS: 1 - SIGN: + - VERTIVAL RATE - BARO: 0 (x32) - --------------------------------------------------------------------------------- - STATUS: 1 - SIGN: - - VERTICAL RATE - INERTIAL: 114 (x32) - --------------------------------------------------------------------------------- - FINAL: -179.1 deg 336 kt 0.48 Mach 0 ft/min -3648 ft/min - --------------------------------------------------------------------------------- diff --git a/ehs.rst b/ehs.rst new file mode 100644 index 0000000..eefc561 --- /dev/null +++ b/ehs.rst @@ -0,0 +1,133 @@ +EHS (Mode-S Enhanced Surveillance) +================================== + +Introduction +------------ + +Let's hack into the EHS messaged too! more information on aircraft air speeds. + + +The Mode-S Enhanced Surveillance (EHS) provides air traffic controller more information that what is included in the ADS-B (a.k.a Mode-S Elementary Surveillance). It responds to ATC Secondary Surveillance Radar, and broadcast specific parameters non-independently. Hence it is only available in the area where ATC presents. + +There are quite a few very interesting data contained within various types of the EHS messages. Such as: airspeeds (IAS, TAS, Mach), roll angles, track angles, track angle rates, selected altitude, magnetic heading, vertical rate, etc.. + +There are a few challenges to decode those information: + - Which aircraft does one message come from? + - What is the type of one message (a.k.a. which BDS code) most likely to be? + - How confident is the information that has been decoded? + +.. Example: + 40: A0001838CA380031440000F24177 + 50: A00015B7801DBB3BE00CF7B8856D + 60: A0000294B409D117224C47609A81 + + +This part of the book covers only a selected common type of EHS messages. For a complete Python implementation: +https://github.com/junzis/pyModeS/blob/master/pyModeS/ehs.py + + + +Downlink Format and message structure +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +DF 20 and DF 21 are used for downlink messages. + +The same as ADS-B, in all Mode-S messages, the first 5 bit contains the Downlink Format. The same identification process can be used for discover EHS messages. So the EHS messages starting bits are: + +:: + + DF20 - 10100 + DF21 - 10101 + + +The message is structured as following, where the digit represents the number of binary digits: + +:: + + +--------+--------+--------+--------+-------------+------------------+------------+ + | DF 5 | FS 3 | DR 5 | UM 6 | AC 13 | MB 56 | AP/DP 24 | + +-----------------+--------+-----------------------------------------+------------+ + | <---------+ 32 bits +--------> | + + + DF: downlink format + FS: flight status + DR: downlink request + UM: utility message + ID: identity + MB: message, Comm-B + AP/DP: address/parity or data/parity + +Except the DF, the first 32 bits does not contain useful information for decode the message. The exact definitions can be found in ICAO annex 10 (Aeronautical Telecommunications). + + +Parity and ICAO address recovery +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Unlike ADS-B, the ICAO address is not broadcast along with the EHS messages. We will have to "decode" the ICAO address before decoding other information, and ICAO is hidden in the message and checksum. + +Mode-S uses two types of parity checksum Address Parity (AP) and Data Parity (DP). Majority of the time Address Parity is used. + + +Address Parity +************** + +For AP, message parity field is produced by XOR ICAO with message data CRC checksum. So, to recover the ICAO bits, simply reverse XOR process will work, shown as follows: + +:: + + +-------------------------------+ +------------------+ + | DATA FIELD (32 OR 88 BIT) | | PARITY BITS | + +--------------+----------------+ +------------------+ + | + | XOR + v + +--------------+-----------+ +------------------+ + | ENCODER | +--> | CHECKSUM (24BIT) | + +--------------------------+ +------------------+ + || + +------------------+ + | ICAO (24BIT) | + +------------------+ + + +An example: +:: + + Message: A0001838CA380031440000F24177 + + Data: A0001838CA380031440000 + Parity: F24177 + + Encode data: CE2CA7 + + ICAO: [F24177] XOR [CE2CA7] => [3C6DD0] + +For the implementation of CRC encoder, refer to the pyModeS library ``pyModeS.util.crc(msg, encode=True)`` + +.. Data parity + + + +BDS (Comm-B Data Selector) +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In simply words, BDS is a number (usually a 2-digit hexadecimal) that defines the type of message we are looking at. Both ADS-B messages and other types of Mods-S messages are all assigned their distinctive BDS number. However, it is **no where** to be found in the messages. + +When SSR interrogates aircraft, a BDS code is included in request message ( Uplink Format - UF 4, 5, 20, or 21). This BDS code are then used by the aircraft transponder to register the type of message to be sent. But when the downlink message is transmitted, its BDS code is not included in the message (because the SSR knows what kind message it requested). Good new for them, but challenges for us. + +Here are some BDS codes that we are interested, where additional parameters about aircraft can be found: +:: + + BDS 2,0 Aircraft identification + BDS 2,1 Aircraft and airline registration markings + BDS 4,0 Selected vertical intention + BDS 4,4 Meteorological routine air report + BDS 5,0 Track and turn report + BDS 6,0 Heading and speed report + + +.. include:: sections/ehs-bds20-identification.rst +.. include:: sections/ehs-bds40-intention.rst +.. include:: sections/ehs-bds50-track-n-turn.rst +.. include:: sections/ehs-bds60-airspeed.rst diff --git a/index.rst b/index.rst index 021362c..12691d4 100644 --- a/index.rst +++ b/index.rst @@ -1,65 +1,75 @@ -ADS-B Decoding Guide -==================== +============================================================ +The 1090MHz Riddle +============================================================ +------------------------------------------------------------ +The book about decoding Mode-S and ADS-B data +------------------------------------------------------------ -This is a small research project conducted by `Junzi Sun `_ at TuDelft. While we were trying to work with ADS-B data collected from our receiver, we notice that there are very few documents available which can explain the ADS-B data comprehensively. So, we created this guide, along with a decoder written in python (https://github.com/junzis/pyModeS). Have Fun! +Preface +======= -The main focus of the guide is on reading different types of messages, understanding the information in the message, and decoding/computing aircraft status. +Begun with a frustration on the lack of technical public information on ADS-B and Mode-S in the year of 2015, I created an live online document to recorded my understanding of ADS-B data. Previously, this was known as `"ADS-B Decoding Guide" `_ project. Together with the tutorial, we also developed its related python library, the `pyModeS `_. With time, I received many feedbacks, compliments, and contributions from open-source community users. + +From beginning of 2017, the interests of tapping into Enhanced Mode-S (EHS) data brought us a whole new chapter of Mode-S inference and decoding into the pyModeS. This also enriches the "ADS-B" guide. With the advance in this area, I am planning to compile a more comprehensive online book to cover both ADS-B and Mode-S decoding and related topic. + +That's the starting of this new repository. I am also starting host the online book on my own server to allow more flexibility of editing and publishing. You can read the most up-to-date book on `mode-s.org `_. + +Oh, it is still GNU GPL. It was great to see the pull request from different contributors previously. I am looking forward to seeing more comments and pulls from the community. Enjoy! + +Table of content +---------------- .. toctree:: - :maxdepth: 3 + :maxdepth: 2 :numbered: - self - content/introduction - content/identification - content/cpr - content/airborne-position - content/airborne-velocity - content/nicnac - content/modes-ehs + adsb + ehs -Apendix -------- - -Documents, code, and data -************************* +Related resources +----------------- This guide document is shared on GitHub and ReadTheDoc. Please feel free to help us improving it. Links to this guide document: -* (GitHub) https://github.com/junzis/pyModeS -* (Document) http://adsb-decode-guide.readthedocs.org/ +- (Rst source) https://github.com/junzis/the-1090mhz-riddle +- (Live book) http://mode-s.org -You can download from GitHub the python decoder, as well as some data samples we collected: +You can download the pyModeS tool from GitHub, which is a Python implementation of all (and more) message types described here: -* https://github.com/junzis/py-adsb-decoder +- (GitHub) https://github.com/junzis/pyModeS -Contact -******* -Feel free to drop me a messages at: **j.sun-1[at]tudelft.nl** +Original contributors +--------------------- -About us -******** +- Junzi Sun, PhD Candidate, TuDelft +- Jacco Hoekstra, Prof.dr.ir, TuDelft +- Joost EllerBroek, Dr.ir, TuDelft +- Huy Vu, Master Student, TuDelft -We are a group at TuDelft working on aircraft operations and controls. -* Junzi Sun, PhD Student -* Jacco Hoekstra, Prof.dr.ir -* Joost EllerBroek, Dr.ir +Contact +------- +Since the start of the this project, I have received many questions by email. However, the best way to post your questions is using the **GitHub Issues**. This way, your questions and my answers can help others as well: +- Related with this book: https://github.com/junzis/the-1090mhz-riddle/issues +- Related with pyModeS: https://github.com/junzis/pyModes/issues -References -********** +Anyhow, still feel free to drop me a messages at: **j.sun-1[at]tudelft.nl** + + +References +---------- Some good source of documents: -* RTCA/EUROCAE: Minimum Operational Performance Standards for 1090 MHz Extended Squitter Automatic Dependent Surveillance – Broadcast (ADS-B) and Traffic Information Services – Broadcast (TIS-B) -* ICAO: Technical Provisions for Mode S Services and Extended Squitter -* `ICAO ADS-B Guide `_ -* `Dump1090 Project `_ -* `A Very Simple ADSB Receiver, `_ +- RTCA: Minimum Operational Performance Standards for 1090 MHz Extended Squitter +- ICAO: Technical Provisions for Mode S Services and Extended Squitter +- `ICAO ADS-B Guide `_ +- `Dump1090 Project `_ +- `A Very Simple ADSB Receiver, `_ diff --git a/make.bat b/make.bat deleted file mode 100644 index e7d42ab..0000000 --- a/make.bat +++ /dev/null @@ -1,263 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=_build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. xml to make Docutils-native XML files - echo. pseudoxml to make pseudoxml-XML files for display purposes - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - echo. coverage to run coverage check of the documentation if enabled - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - - -REM Check if sphinx-build is available and fallback to Python version if any -%SPHINXBUILD% 2> nul -if errorlevel 9009 goto sphinx_python -goto sphinx_ok - -:sphinx_python - -set SPHINXBUILD=python -m sphinx.__init__ -%SPHINXBUILD% 2> nul -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -:sphinx_ok - - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\adsb-decode-guide.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\adsb-decode-guide.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdf" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdfja" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf-ja - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -if "%1" == "coverage" ( - %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage - if errorlevel 1 exit /b 1 - echo. - echo.Testing of coverage in the sources finished, look at the ^ -results in %BUILDDIR%/coverage/python.txt. - goto end -) - -if "%1" == "xml" ( - %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The XML files are in %BUILDDIR%/xml. - goto end -) - -if "%1" == "pseudoxml" ( - %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. - goto end -) - -:end diff --git a/readthedocs.yml b/readthedocs.yml deleted file mode 100644 index 9f0ed98..0000000 --- a/readthedocs.yml +++ /dev/null @@ -1,4 +0,0 @@ -# Build PDF & ePub -formats: - - epub - - pdf diff --git a/content/airborne-position.rst b/sections/adsb-airborne-position.rst similarity index 78% rename from content/airborne-position.rst rename to sections/adsb-airborne-position.rst index 340d669..016766c 100644 --- a/content/airborne-position.rst +++ b/sections/adsb-airborne-position.rst @@ -1,7 +1,7 @@ Airborne Positions -================== +------------------ -An aircraft airborne position message has ``DownlinkFormat: 17 or 18`` and ``TypeCode: from 9 to 18``. +An aircraft airborne position message has ``Downlink Format: 17 or 18`` and ``Type Code: from 9 to 18``. Messages are composed as following: @@ -38,21 +38,19 @@ Note: The definition of functions ``NL(lat)``, ``floor(x)``, and ``mod(x,y)`` ar Globally unambiguous position (decoding with two messages) --------------------------------------------------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ odd" or "even" message? ************************** -For each frame, bit 54 determines whether it is an "odd" or "even" frame: -:: +For each frame, bit 54 determines whether it is an "odd" or "even" frame: :: 0 -> Even frame 1 -> Odd frame -For example, the two following messages are received: -:: +For example, the two following messages are received: :: 8D40621D58C382D690C8AC2863A7 8D40621D58C386435CC412692AD6 @@ -109,7 +107,7 @@ Use the following equation: .. math:: - j = floor \left( 59 \cdot Lat_{cprEven} - 60 \cdot Lat_{cprOdd} + \frac{1}{2} \right) + j = floor \left( 59 \cdot \mathrm{Lat}_\mathrm{cprEven} - 60 \cdot \mathrm{Lat}_\mathrm{cprOdd} + \frac{1}{2} \right) :: @@ -124,27 +122,27 @@ First, two constants will be used: .. math:: - dLat_{even} &= \frac{360}{4 \cdot NZ} = \frac{360}{60} + \mathrm{dLat}_\mathrm{even} &= \frac{360}{4 \cdot NZ} = \frac{360}{60} - dLat_{odd} &= \frac{360}{4 \cdot NZ - 1} = \frac{360}{59} + \mathrm{dLat}_\mathrm{odd} &= \frac{360}{4 \cdot NZ - 1} = \frac{360}{59} Then we can use the following equations to compute the relative latitudes: .. math:: - Lat_{even} &= dLat_{even} \cdot (mod(j, 60) + Lat_{cprEven}) + \mathrm{Lat}_\mathrm{even} &= \mathrm{dLat}_\mathrm{even} \cdot [mod(j, 60) + \mathrm{Lat}_\mathrm{cprEven}] - Lat_{odd} &= dLat_{odd} \cdot (mod(j, 59) + Lat_{cprOdd}) + \mathrm{Lat}_\mathrm{odd} &= \mathrm{dLat}_\mathrm{odd} \cdot [mod(j, 59) + \mathrm{Lat}_\mathrm{cprOdd}] For southern hemisphere, values will fall from 270 to 360 degrees. we need to make sure the latitude is within range ``[-90, +90]``: .. math:: - Lat_{even} &= Lat_{even} - 360 \quad \text{if } (Lat_{even} \geq 270) + \mathrm{Lat}_\mathrm{even} &= \mathrm{Lat}_\mathrm{even} - 360 \quad \text{if } (\mathrm{Lat}_\mathrm{even} \geq 270) - Lat_{odd} &= Lat_{odd} - 360 \quad \text{if } (Lat_{odd} \geq 270) + \mathrm{Lat}_\mathrm{odd} &= \mathrm{Lat}_\mathrm{odd} - 360 \quad \text{if } (\mathrm{Lat}_\mathrm{odd} \geq 270) Final latitude is chosen depending on the time stamp of the frames--the newest one is @@ -152,10 +150,10 @@ used: .. math:: - Lat = + \mathrm{Lat} = \begin{cases} - Lat_{even} & \text{if } (T_{even} \geq T_{odd}) \\ - Lat_{odd} & \text{else} + \mathrm{Lat}_\mathrm{even} & \text{if } (T_\mathrm{even} \geq T_\mathrm{odd}) \\ + \mathrm{Lat}_\mathrm{odd} & \text{else} \end{cases} In the example: @@ -180,33 +178,33 @@ If the even frame come latest ``T_EVEN > T_ODD``: .. math:: - ni &= max \left( NL(Lat_{even}), 1 \right) + ni &= max \left( NL(\mathrm{Lat}_\mathrm{even}), 1 \right) - dLon &= \frac{360}{ni} + \mathrm{dLon} &= \frac{360}{ni} - m &= floor \left( Lon_{cprEven} \cdot [NL(Lat_{even})-1] - Lon_{cprOdd} \cdot NL(Lat_{even}) + \frac{1}{2} \right) + m &= floor \left\{ Lon_\mathrm{cprEven} \cdot [NL(\mathrm{Lat}_\mathrm{even})-1] - Lon_\mathrm{cprOdd} \cdot NL(\mathrm{Lat}_\mathrm{even}) + \frac{1}{2} \right\} - Lon &= dLon \cdot \left( mod(m, ni) + Lon_{cprEven} \right) + \mathrm{Lon} &= \mathrm{dLon} \cdot \left( mod(m, ni) + Lon_\mathrm{cprEven} \right) In case where the odd frame come latest ``T_EVEN < T_ODD``: .. math:: - ni &= max \left( NL(Lat_{odd})-1, 1 \right) + ni &= max \left( NL(\mathrm{Lat}_\mathrm{odd})-1, 1 \right) - dLon &= \frac{360}{ni} + \mathrm{dLon} &= \frac{360}{ni} - m &= floor \left( Lon_{cprEven} \cdot [NL(Lat_{odd})-1] - Lon_{cprOdd} \cdot NL(Lat_{odd}) + \frac{1}{2} \right) + m &= floor \left\{ Lon_\mathrm{cprEven} \cdot [NL(\mathrm{Lat}_\mathrm{odd})-1] - Lon_\mathrm{cprOdd} \cdot NL(\mathrm{Lat}_\mathrm{odd}) + \frac{1}{2} \right\} - Lon &= dLon \cdot \left( mod(m, ni) + Lon_{cprOdd} \right) + \mathrm{Lon} &= \mathrm{dLon} \cdot \left( mod(m, ni) + Lon_\mathrm{cprOdd} \right) if the result is larger than 180 degrees: .. math:: - Lon = Lon - 360 \quad \text{if } (Lon \geq 180) + \mathrm{Lon} = \mathrm{Lon} - 360 \quad \text{if } (\mathrm{Lon} \geq 180) @@ -243,7 +241,7 @@ The final altitude value will be: .. math:: - Alt = N * 25 - 1000 \text { (ft.)} + Alt = N \cdot 25 - 1000 \quad \text{(ft.)} In this example, the altitude at which aircraft is flying is: :: @@ -266,7 +264,7 @@ Finally, we have all three components (latitude/longitude/altitude) of the aircr Locally unambiguous position (decoding with one message) ----------------------------------------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This method gives the possibility of decoding aircraft using only one message knowing a reference position. This method compute the latitude index (j) and longitude index (m) based on such reference, and can be used with either type of the messages. @@ -294,7 +292,7 @@ Calculate the latitude index j .. math:: - j = floor(\frac{Lat_{ref}}{dLat}) + floor \left( \frac{mod(Lat_{ref}, dLat)}{dLat} - Lat_{cpr} + \frac{1}{2} \right) + j = floor \left (\frac{\mathrm{Lat}_{ref}}{dLat} \right) + floor \left( \frac{mod(\mathrm{Lat}_{ref}, dLat)}{dLat} - \mathrm{Lat}_\mathrm{cpr} + \frac{1}{2} \right) @@ -303,7 +301,7 @@ Calculate latitude .. math:: - Lat = dLat \cdot (j + Lat_{cpr}) + \mathrm{Lat} = dLat \cdot (j + \mathrm{Lat}_\mathrm{cpr}) @@ -312,7 +310,7 @@ Calculate dLon .. math:: - dLon = + \mathrm{dLon} = \begin{cases} \frac{360}{NL(Lat)} & \text{if } NL(Lat) > 0 \\ 360 & \text{if } NL(Lat) = 0 @@ -324,7 +322,7 @@ Calculate longitude index m .. math:: - m = floor(\frac{Lon_{ref}}{dLon}) + floor \left( \frac{mod(Lon_{ref}, dLon)}{dLon} - Lon_{cpr} + \frac{1}{2} \right) + m = floor \left( \frac{Lon_{ref}}{\mathrm{dLon}} \right) + floor \left( \frac{mod(Lon_{ref}, \mathrm{dLon})}{\mathrm{dLon}} - Lon_\mathrm{cpr} + \frac{1}{2} \right) Calculate longitude @@ -332,7 +330,7 @@ Calculate longitude .. math:: - Lon = dLon \cdot (m + Lon_{cpr}) + Lon = \mathrm{dLon} \cdot (m + Lon_\mathrm{cpr}) Example diff --git a/content/airborne-velocity.rst b/sections/adsb-airborne-velocity.rst similarity index 99% rename from content/airborne-velocity.rst rename to sections/adsb-airborne-velocity.rst index 0153e9d..b74c58c 100644 --- a/content/airborne-velocity.rst +++ b/sections/adsb-airborne-velocity.rst @@ -1,5 +1,5 @@ Airborne Velocity -================= +----------------- There are two different types of messages for velocities, determined by 3-bit subtype in the message. With subtype 1 and 2, surface velocity (ground speed) is reported. And in subtype 3 and 4, aircraft airspeed are reported. @@ -11,7 +11,7 @@ An aircraft velocity message has ``DF: 17 or 18``, ``TC: 19``. and the subtype c Subtype 1 (Ground Speed) ------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~ Subtype 1 (subsonic, ground speed), are broadcast when ground velocity information are available. The aircraft velocity contains speed and heading information. The speed and heading are also decomposed into North-South, and East-West components. @@ -162,7 +162,7 @@ The Vertical Rate Source (VrSrc) field determine whether if it is a measurement Subtype 3 (Airspeed) -------------------------- +~~~~~~~~~~~~~~~~~~~~ Subtype 3 (subsonic, aripseed), are broadcast when ground speed information are NOT available, while airspeed is available. The structure of the message is similar to previous one. Let's take a close look at an example for decoding here. diff --git a/content/identification.rst b/sections/adsb-identification.rst similarity index 69% rename from content/identification.rst rename to sections/adsb-identification.rst index 7d4331a..5505aed 100644 --- a/content/identification.rst +++ b/sections/adsb-identification.rst @@ -1,38 +1,39 @@ + Aircraft Identification -======================= +----------------------- An aircraft identification message has ``DF: 17 or 18``, and ``TC: 1 to 4``, the 56-bit ``DATA`` field is configured as follows: :: - +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+ - | TC (5) | EC (3) | C1 (6) | C2 (6) | C3 (6) | C4 (6) | C5 (6) | C6 (6) | C7 (6) | C8 (6) | - +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+ + +--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+ + | TC (5) | EC (3) | C1 (6) | C2 (6) | C3 (6) | C4 (6) | C5 (6) | C6 (6) | C7 (6) | C8 (6) | + +--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+ TC: Type code EC: Emitter category - C*: Charactor + C*: A character -For decode charactors, a lookup table is needed for mapping numbers to characters. It is defines as follows, where the ``#`` is not used, and ``_`` represents a sepration. +For decode characters, a lookup table is needed for mapping numbers to characters. It is defines as follows, where the ``#`` is not used, and ``_`` represents a separation. :: #ABCDEFGHIJKLMNOPQRSTUVWXYZ#####_###############0123456789###### -In summary, characters and there decimal reprsentations are: +In summary, characters and there decimal representations are: :: - A - Z : 1 - 26 + A - Z : 1 - 26 0 - 9 : 48 - 57 _ : 32 -The ``EC`` value in combination with ``TC`` value defines the category of the aircraft (such as: heavy, large, small, light, glider, etc.). When ``EC`` is set to zeros, such information is not avaiable. +The ``EC`` value in combination with ``TC`` value defines the category of the aircraft (such as: heavy, large, small, light, glider, etc.). When ``EC`` is set to zeros, such information is not available. Example -------- +~~~~~~~ For example: :: @@ -43,12 +44,12 @@ For example: The structure of the message is: :: - - DF--- CA- ICAO-- DATA------------------ PI---- + + DF--- CA- ICAO-- DATA------------------ PI---- HEX: 8 D 4840D6 2 0 2CC371C32CE0 576098 BIN: 10001|101 ****** 00100|000 ************ ****** DEC: 17 |4 4 0 - TC * + TC * Note that ``Type Code`` is inside of the DATA frame (first 5 bits). With ``DF=17`` and ``TC=4``, we can confirm this is a aircraft identification message. Aircraft ``callsign`` then can be decoded. diff --git a/content/nicnac.rst b/sections/adsb-integrity-accuracy.rst similarity index 97% rename from content/nicnac.rst rename to sections/adsb-integrity-accuracy.rst index 9a11b18..322f982 100644 --- a/content/nicnac.rst +++ b/sections/adsb-integrity-accuracy.rst @@ -1,5 +1,5 @@ -NIC / NAC -======================= +Integrity and Accuracy +---------------------- NIC, NAC, NUC, and SIL, those acronyms do sound confusing. They are measurement for the integrity, accuracy, or uncertainties of the position measurement from @@ -16,12 +16,12 @@ represent the position integrity and velocity accuracy respectively. Before dive into decoding and interpolation, let's introduce two parameters: -- ``Rc``: Horizontal Containment Radius Limit, interpolated from ``NICp`` number +- ``Rc``: Horizontal Containment Radius Limit, interpolated from ``NICp`` number - ``HFOM``: Horizontal Figure of Merit, interpolated from ``NACv`` number NIC and Rc ------------ +~~~~~~~~~~~ Bring back the message from position decoding previously: @@ -108,6 +108,6 @@ positions. NAC and HFOM ------------- +~~~~~~~~~~~~ NAC is reported in the Airborne Velocity Message. diff --git a/content/surface-message.rst b/sections/adsb-surface-movment.rst similarity index 100% rename from content/surface-message.rst rename to sections/adsb-surface-movment.rst diff --git a/content/cpr.rst b/sections/compact-position-report.rst similarity index 98% rename from content/cpr.rst rename to sections/compact-position-report.rst index 0504c2f..dd916c2 100644 --- a/content/cpr.rst +++ b/sections/compact-position-report.rst @@ -1,10 +1,10 @@ Compact Position Reporting -========================== +-------------------------- The position information in ADS-B messages is encoded in a compact position reporting (CPR) format. The general idea behind CPR is to be able to encode more coordinate decimals using less bits. It is achieved by trading global position ambiguity and time with local position accuracy. Example -------- +~~~~~~~ An easy example to understand the principle behind CPR: @@ -32,7 +32,7 @@ From lower bits ``00 -> 01``, we have four different possibility of movement as The CPR and functions ---------------------- +~~~~~~~~~~~~~~~~~~~~~ The actual CPR algorithm of course is more complicated, but the principle is very similar to previous example. If only one message is given, it is possible to find multiple solutions that are spaced around the world. The combination of two (different types of) messages will yield the final result. diff --git a/sections/ehs-bds20-identification.rst b/sections/ehs-bds20-identification.rst new file mode 100644 index 0000000..185cd96 --- /dev/null +++ b/sections/ehs-bds20-identification.rst @@ -0,0 +1,32 @@ +Aircraft identification (BDS 2,0) +--------------------------------- + +Similar to ADS-B aircraft identification message, the callsign of aircraft can be decode in the same way. For the 56-bit MB (message, Comm-B) field, information decodes as follows: + +:: + + +--------------+---------+---------+---------+---------+---------+---------+---------+---------+ + | BDS2,0 (8) | C1 (6) | C2 (6) | C3 (6) | C4 (6) | C5 (6) | C6 (6) | C7 (6) | C8 (6) | + +--------------+---------+---------+---------+---------+---------+---------+---------+---------+ + 0010 0000 6 bits + +Here, 8 bits are 0010 0000 (2,0 in hexadecimal) and the rest of chars are 6 bits each. To decode the chars, the same char map as ADS-B is used: + +:: + + '#ABCDEFGHIJKLMNOPQRSTUVWXYZ#####_###############0123456789######' + + +Example: + +:: + + MSG: A000083E202CC371C31DE0AA1CCF + DATA: 202CC371C31DE0 + + BIN: 0010 0000 001011 001100 001101 110001 110000 110001 110111 100000 + HEX: 2 0 + DEC: 11 12 13 49 48 49 55 32 + CHR: K L M 1 0 1 7 _ + + ID: KLM1017 diff --git a/sections/ehs-bds40-intention.rst b/sections/ehs-bds40-intention.rst new file mode 100644 index 0000000..dc14d76 --- /dev/null +++ b/sections/ehs-bds40-intention.rst @@ -0,0 +1,83 @@ +Selected intention (BDS 4,0) +------------------------------------- + +In BDS 4,0, information such as aircraft select altitude and barometric pressure settings are given. The 56-bit MB filed is structure as following: + + +:: + + FIELD START N-BITS + (END) + +---------------------------------------+------+------+ + | Status | 1 | 1 | + +---------------------------------------+------+------+ + | MCP/FCU selected altitude | 2 | 12 | ** + | | | | + | range = [0, 65520] ft | | | + | | | | + | LSB: 16 ft | 13 | | + +---------------------------------------+------+------+ + | Status | 14 | 1 | + +---------------------------------------+------+------+ + | FMS selected altitude | 15 | 12 | ** + | | | | + | range = [0, 65520] ft | | | + | | | | + | LSB: 16 ft | 26 | | + +---------------------------------------+------+------+ + | Status | 27 | 1 | + +---------------------------------------+------+------+ + | Barometric pressure setting | 28 | 12 | ** + | -> Note: actual value minus 800 | | | + | | | | + | range = [0, 410] mb | | | + | | | | + | LSB: 0.1 mb | 39 | | + +---------------------------------------+------+------+ + | Reserved | 40 | 8 | + | -> set to ZEROS | | | + | | 47 | | + +---------------------------------------+------+------+ + | Status | 48 | 1 | + | -> next 3 fields | | | + +---------------------------------------+------+------+ + | Mode: VNAV | 49 | 1 | + +---------------------------------------+------+------+ + | Mode: Alt hold | 50 | 1 | + +---------------------------------------+------+------+ + | Mode: Approach | 51 | 1 | + +---------------------------------------+------+------+ + | Reserved | 52 | 2 | + | -> set to ZEROS | 53 | | + +---------------------------------------+------+------+ + | Status | 54 | 1 | + +---------------------------------------+------+------+ + | Target alt source | 55 | 2 | + | -> 00: Unknown | | | + | -> 01: Aircraft altitude | | | + | -> 10: FCU/MCP selected altitude | | | + | -> 11: FMS selected altitude | 56 | | + +---------------------------------------+------+------+ + + +An example: + +:: + + MSG: A000029C85E42F313000007047D3 + MB: 85E42F31300000 + + --------------------------------------------------------------------------------- + MB BIN: 1 000010111100 1 000010111100 1 100010011000 00000000 0 0 0 0 00 0 00 + --------------------------------------------------------------------------------- + STATUS: 1 + MCP: 188 (x16) + --------------------------------------------------------------------------------- + STATUS: 1 + FMS: 188 (x16) + --------------------------------------------------------------------------------- + STATUS: 1 + BARO: 2200 (x0.1 + 800) + --------------------------------------------------------------------------------- + FINAL: 3008 ft 3008 ft 1020 mb + --------------------------------------------------------------------------------- diff --git a/sections/ehs-bds44-mrar.rst b/sections/ehs-bds44-mrar.rst new file mode 100644 index 0000000..c5cc85d --- /dev/null +++ b/sections/ehs-bds44-mrar.rst @@ -0,0 +1,4 @@ +Meteorological routine air report (BDS 4,4) +------------------------------------------- + +under construction diff --git a/sections/ehs-bds50-track-n-turn.rst b/sections/ehs-bds50-track-n-turn.rst new file mode 100644 index 0000000..e780db7 --- /dev/null +++ b/sections/ehs-bds50-track-n-turn.rst @@ -0,0 +1,97 @@ +Track and turn (BDS 5,0) +------------------------------- + +Within the BDS 5,0 message, five different types of aircraft states are given, mostly related with the turns: + +- roll angle +- true track angle +- ground speed +- track angle rate +- true airspeed + +The 56-bit MB filed is structure as following: + +:: + + FIELD START N-BITS + (END) + +---------------------------------------+------+------+ + | Status | 1 | 1 | + +---------------------------------------+------+------+ + | Sign, 1 -> left wing down | 1 | 1 | + +---------------------------------------+------+------+ + | Roll angle | 3 | 9 | + | | | | + | range = [-90, 90] degrees | | | + | | | | + | LSB: 45/256 degree | 11 | | + +---------------------------------------+------+------+ + | Status | 12 | 1 | + +---------------------------------------+------+------+ + | Sign, 1 -> west | 13 | 1 | + +---------------------------------------+------+------+ + | True track angle | 14 | 10 | + | | | | + | range = [-180, 180] degrees | | | + | | | | + | LSB: 90/512 degree | 23 | | + +---------------------------------------+------+------+ + | Status | 24 | 1 | + +---------------------------------------+------+------+ + | Ground speed | 25 | 10 | + | | | | + | range = [0, 2046] knots | | | + | | | | + | LSB: 2 knots | 34 | | + +---------------------------------------+------+------+ + | Status | 35 | 1 | + +---------------------------------------+------+------+ + | Sign, 1 -> negative value | 36 | 1 | + +---------------------------------------+------+------+ + | Track angle rate | 37 | 9 | + | | | | + | range = [-16, 16] degrees | | | + | | | | + | LSB: 8/256 degree / second | 45 | | + +---------------------------------------+------+------+ + | Status | 46 | 1 | + +---------------------------------------+------+------+ + | True airspeed | 47 | 10 | + | | | | + | range = [0, 2046] knots | | | + | | | | + | LSB: 2 knots | 56 | | + +---------------------------------------+------+------+ + +An example: + +:: + + MSG: A000139381951536E024D4CCF6B5 + MB: 81951536E024D4 + + --------------------------------------------------------------------------------- + MB BIN: 1 0 000001100 1 0 1010001010 1 0011011011 1 0 000000100 1 0011010100 + --------------------------------------------------------------------------------- + STATUS: 1 + SIGN: + + ROLL: 12 (x45/256) + --------------------------------------------------------------------------------- + STATUS: 1 + SIGN: + + TRACK ANGLE: 650 (x90/512) + --------------------------------------------------------------------------------- + STATUS: 1 + GROUND SPEED: 219 (x2) + --------------------------------------------------------------------------------- + STATUS: 1 + SIGN: + + TRACK ANGLE RATE: 4 (x8/256) + --------------------------------------------------------------------------------- + STATUS: 1 + TRUE AIRSPEED: 212 (x2) + --------------------------------------------------------------------------------- + FINAL: 2.1 deg 114.3 deg 438 kt 0.1 deg/s 424 kt + --------------------------------------------------------------------------------- + +Of course, all fields are not always available in each of DBS 5,0 message. For those information that are not available, status bits are set to 0. diff --git a/sections/ehs-bds60-airspeed.rst b/sections/ehs-bds60-airspeed.rst new file mode 100644 index 0000000..12eef01 --- /dev/null +++ b/sections/ehs-bds60-airspeed.rst @@ -0,0 +1,95 @@ +Heading and speed (BDS 6,0) +---------------------------------- + +Within the BDS 6,0 message, five different types of aircraft states are given: + +- magnetic heading +- indicated airspeed +- Mach number +- barometric altitude rate +- inertial vertical rate + +The 56-bit MB filed is structure as following: + +:: + + FIELD START N-BITS + (END) + +---------------------------------------+------+------+ + | Status | 1 | 1 | + +---------------------------------------+------+------+ + | Sign, 1 -> West | 1 | 1 | + +---------------------------------------+------+------+ + | Magnetic heading | 3 | 10 | + | | | | + | range = [-180, 180] degrees | | | + | | | | + | LSB: 90/512 degree | 12 | | + +---------------------------------------+------+------+ + | Status | 13 | 1 | + +---------------------------------------+------+------+ + | Indicated airspeed | 14 | 10 | + | | | | + | range = [0, 1023] knots | | | + | | | | + | LSB: 1 knots | 23 | | + +---------------------------------------+------+------+ + | Status | 24 | 1 | + +---------------------------------------+------+------+ + | Mach number | 25 | 10 | + | | | | + | range = [0, 4.092] Mach | | | + | | | | + | LSB: 2.048 / 512 Mach | 34 | | + +---------------------------------------+------+------+ + | Status | 35 | 1 | + +---------------------------------------+------+------+ + | SIGN 1 -> Below | 36 | 1 | + +---------------------------------------+------+------+ + | Barometric altitude rate | 37 | 9 | + | | | | + | range = [-16384, 16352] ft/min | | | + | | | | + | LSB: 32 ft/min | 45 | | + +---------------------------------------+------+------+ + | Status | 46 | 1 | + +---------------------------------------+------+------+ + | SIGN 1 -> Below | 47 | 1 | + +---------------------------------------+------+------+ + | Inertial altitude rate | 48 | 9 | + | | | | + | range = [-16384, 16352] ft/min | | | + | | | | + | LSB: 32 ft/min | 56 | | + +---------------------------------------+------+------+ + +An example: + +:: + + MSG: A000029CFFBAA11E2004727281F1 + MB: FFBAA11E200472 + + --------------------------------------------------------------------------------- + MB BIN: 1 1 1111111011 1 0101010000 1 0001111000 1 0 000000000 1 0 001110010 + --------------------------------------------------------------------------------- + STATUS: 1 + SIGN: - + HEADING: 1019 (x90/512) + --------------------------------------------------------------------------------- + STATUS: 1 + IAS: 336 + --------------------------------------------------------------------------------- + STATUS: 1 + MACH: 120 (x2.048/512) + --------------------------------------------------------------------------------- + STATUS: 1 + SIGN: + + VERTIVAL RATE - BARO: 0 (x32) + --------------------------------------------------------------------------------- + STATUS: 1 + SIGN: - + VERTICAL RATE - INERTIAL: 114 (x32) + --------------------------------------------------------------------------------- + FINAL: -179.1 deg 336 kt 0.48 Mach 0 ft/min -3648 ft/min + ---------------------------------------------------------------------------------