update docs
[web/altusmetrum] / AltOS / doc / telemetry.html
index dc7c6069c4ff47a5cd5bca8e749ae3090c9ab57a..185642e8842f7674364e5a2f1082156087c34c34 100644 (file)
-<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>AltOS Telemetry</title><meta name="generator" content="DocBook XSL Stylesheets V1.76.1"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="article" title="AltOS Telemetry"><div class="titlepage"><div><div><h2 class="title"><a name="idp5944"></a>AltOS Telemetry</h2></div><div><h3 class="subtitle"><i>Packet Definitions</i></h3></div><div><div class="author"><h3 class="author"><span class="firstname">Keith</span> <span class="surname">Packard</span></h3></div></div><div><p class="copyright">Copyright © 2011 Keith Packard</p></div><div><div class="legalnotice" title="Legal Notice"><a name="idp168352"></a><p>
-       This document is released under the terms of the
-       <a class="ulink" href="http://creativecommons.org/licenses/by-sa/3.0/" target="_top">
-         Creative Commons ShareAlike 3.0
-       </a>
-       license.
-      </p></div></div><div><div class="revhistory"><table border="1" width="100%" summary="Revision history"><tr><th align="left" valign="top" colspan="2"><b>Revision History</b></th></tr><tr><td align="left">Revision 0.1</td><td align="left">01 July 2011</td></tr><tr><td align="left" colspan="2">Initial content</td></tr></table></div></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="#idp170376">1. Packet Format Design</a></span></dt><dt><span class="section"><a href="#idp1362904">2. Packet Formats</a></span></dt><dd><dl><dt><span class="section"><a href="#idp2549840">2.1. Packet Header</a></span></dt><dt><span class="section"><a href="#idp2084496">2.2. Sensor Data</a></span></dt><dt><span class="section"><a href="#idp251296">2.3. Configuration Data</a></span></dt><dt><span class="section"><a href="#idp113992">2.4. GPS Location</a></span></dt><dt><span class="section"><a href="#idp3522960">2.5. GPS Satellite Data</a></span></dt></dl></dd><dt><span class="section"><a href="#idp3542464">3. Data Transmission</a></span></dt><dd><dl><dt><span class="section"><a href="#idp3543312">3.1. Modulation Scheme</a></span></dt><dt><span class="section"><a href="#idp3551696">3.2. Error Correction</a></span></dt></dl></dd><dt><span class="section"><a href="#idp3558512">4. TeleDongle packet format</a></span></dt><dt><span class="section"><a href="#idp3569800">5. History and Motivation</a></span></dt></dl></div><div class="section" title="1. Packet Format Design"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idp170376"></a>1. Packet Format Design</h2></div></div></div><p>
-      AltOS telemetry data is split into multiple different packets,
-      all the same size, but each includs an identifier so that the
-      ground station can distinguish among different types. A single
-      flight board will transmit multiple packet types, each type on a
-      different schedule. The ground software need look for only a
-      single packet size, and then decode the information within the
-      packet and merge data from multiple packets to construct the
-      full flight computer state.
-    </p><p>
-      Each AltOS packet is 32 bytes long. This size was chosen based
-      on the known telemetry data requirements. The power of two size
-      allows them to be stored easily in flash memory without having
-      them split across blocks or leaving gaps at the end.
-    </p><p>
-      All packet types start with a five byte header which encodes the
-      device serial number, device clock value and the packet
-      type. The remaining 27 bytes encode type-specific data.
-    </p></div><div class="section" title="2. Packet Formats"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idp1362904"></a>2. Packet Formats</h2></div></div></div>
-    This section first defines the packet header common to all packets
-    and then the per-packet data layout.
-    <div class="section" title="2.1. Packet Header"><div class="titlepage"><div><div><h3 class="title"><a name="idp2549840"></a>2.1. Packet Header</h3></div></div></div><div class="table"><a name="idp3308064"></a><p class="title"><b>Table 1. Telemetry Packet Header</b></p><div class="table-contents"><table summary="Telemetry Packet Header" border="1"><colgroup><col align="center" class="Offset"><col align="center" class="Data Type"><col align="left" class="Name"><col align="left" class="Description"></colgroup><thead><tr><th align="center">Offset</th><th align="center">Data Type</th><th align="center">Name</th><th align="center">Description</th></tr></thead><tbody><tr><td align="center">0</td><td align="center">uint16_t</td><td align="left">serial</td><td align="left">Device serial Number</td></tr><tr><td align="center">2</td><td align="center">uint16_t</td><td align="left">tick</td><td align="left">Device time in 100ths of a second</td></tr><tr><td align="center">4</td><td align="center">uint8_t</td><td align="left">type</td><td align="left">Packet type</td></tr><tr><td align="center">5</td><td class="auto-generated"> </td><td class="auto-generated"> </td><td class="auto-generated"> </td></tr></tbody></table></div></div><br class="table-break"><p>
-      Each packet starts with these five bytes which serve to identify
-      which device has transmitted the packet, when it was transmitted
-      and what the rest of the packet contains.
-      </p></div><div class="section" title="2.2. Sensor Data"><div class="titlepage"><div><div><h3 class="title"><a name="idp2084496"></a>2.2. Sensor Data</h3></div></div></div><div class="informaltable"><table border="0"><colgroup><col align="center" class="Offset"><col align="left" class="Description"></colgroup><thead><tr><th align="center">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="center">0x01</td><td align="left">TeleMetrum Sensor Data</td></tr><tr><td align="center">0x02</td><td align="left">TeleMini Sensor Data</td></tr><tr><td align="center">0x03</td><td align="left">TeleNano Sensor Data</td></tr></tbody></table></div><p>
-       TeleMetrum, TeleMini and TeleNano share this same packet
-       format for sensor data. Each uses a distinct packet type so
-       that the receiver knows which data values are valid and which
-       are undefined.
-      </p><p>
-       Sensor Data packets are transmitted once per second on the
-       ground, 10 times per second during ascent and once per second
-       during descent and landing
-      </p><div class="table"><a name="idp810984"></a><p class="title"><b>Table 2. Sensor Packet Contents</b></p><div class="table-contents"><table summary="Sensor Packet Contents" border="1"><colgroup><col align="center" class="Offset"><col align="center" class="Data Type"><col align="left" class="Name"><col align="left" class="Description"></colgroup><thead><tr><th align="center">Offset</th><th align="center">Data Type</th><th align="center">Name</th><th align="center">Description</th></tr></thead><tbody><tr><td align="center">5</td><td align="center">uint8_t</td><td align="left">state</td><td align="left">Flight state</td></tr><tr><td align="center">6</td><td align="center">int16_t</td><td align="left">accel</td><td align="left">accelerometer (TM only)</td></tr><tr><td align="center">8</td><td align="center">int16_t</td><td align="left">pres</td><td align="left">pressure sensor</td></tr><tr><td align="center">10</td><td align="center">int16_t</td><td align="left">temp</td><td align="left">temperature sensor</td></tr><tr><td align="center">12</td><td align="center">int16_t</td><td align="left">v_batt</td><td align="left">battery voltage</td></tr><tr><td align="center">14</td><td align="center">int16_t</td><td align="left">sense_d</td><td align="left">drogue continuity sense (TM/Tm)</td></tr><tr><td align="center">16</td><td align="center">int16_t</td><td align="left">sense_m</td><td align="left">main continuity sense (TM/Tm)</td></tr><tr><td align="center">18</td><td align="center">int16_t</td><td align="left">acceleration</td><td align="left">m/s² * 16</td></tr><tr><td align="center">20</td><td align="center">int16_t</td><td align="left">speed</td><td align="left">m/s * 16</td></tr><tr><td align="center">22</td><td align="center">int16_t</td><td align="left">height</td><td align="left">m</td></tr><tr><td align="center">24</td><td align="center">int16_t</td><td align="left">ground_pres</td><td align="left">Average barometer reading on ground</td></tr><tr><td align="center">26</td><td align="center">int16_t</td><td align="left">ground_accel</td><td align="left">TM</td></tr><tr><td align="center">28</td><td align="center">int16_t</td><td align="left">accel_plus_g</td><td align="left">TM</td></tr><tr><td align="center">30</td><td align="center">int16_t</td><td align="left">accel_minus_g</td><td align="left">TM</td></tr><tr><td align="center">32</td><td class="auto-generated"> </td><td class="auto-generated"> </td><td class="auto-generated"> </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="2.3. Configuration Data"><div class="titlepage"><div><div><h3 class="title"><a name="idp251296"></a>2.3. Configuration Data</h3></div></div></div><div class="informaltable"><table border="0"><colgroup><col align="center" class="Offset"><col align="left" class="Description"></colgroup><thead><tr><th align="center">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="center">0x04</td><td align="left">Configuration Data</td></tr></tbody></table></div><p>
-       This provides a description of the software installed on the
-       flight computer as well as any user-specified configuration data.
-      </p><p>
-       Configuration data packets are transmitted once per second
-       during all phases of the flight
-      </p><div class="table"><a name="idp256184"></a><p class="title"><b>Table 3. Sensor Packet Contents</b></p><div class="table-contents"><table summary="Sensor Packet Contents" border="1"><colgroup><col align="center" class="Offset"><col align="center" class="Data Type"><col align="left" class="Name"><col align="left" class="Description"></colgroup><thead><tr><th align="center">Offset</th><th align="center">Data Type</th><th align="center">Name</th><th align="center">Description</th></tr></thead><tbody><tr><td align="center">5</td><td align="center">uint8_t</td><td align="left">type</td><td align="left">Device type</td></tr><tr><td align="center">6</td><td align="center">uint16_t</td><td align="left">flight</td><td align="left">Flight number</td></tr><tr><td align="center">8</td><td align="center">uint8_t</td><td align="left">config_major</td><td align="left">Config major version</td></tr><tr><td align="center">9</td><td align="center">uint8_t</td><td align="left">config_minor</td><td align="left">Config minor version</td></tr><tr><td align="center">10</td><td align="center">uint16_t</td><td align="left">apogee_delay</td><td align="left">Apogee deploy delay in seconds</td></tr><tr><td align="center">12</td><td align="center">uint16_t</td><td align="left">main_deploy</td><td align="left">Main deploy alt in meters</td></tr><tr><td align="center">14</td><td align="center">uint16_t</td><td align="left">flight_log_max</td><td align="left">Maximum flight log size (kB)</td></tr><tr><td align="center">16</td><td align="center">char</td><td align="left">callsign[8]</td><td align="left">Radio operator identifier</td></tr><tr><td align="center">24</td><td align="center">char</td><td align="left">version[8]</td><td align="left">Software version identifier</td></tr><tr><td align="center">32</td><td class="auto-generated"> </td><td class="auto-generated"> </td><td class="auto-generated"> </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="2.4. GPS Location"><div class="titlepage"><div><div><h3 class="title"><a name="idp113992"></a>2.4. GPS Location</h3></div></div></div><div class="informaltable"><table border="0"><colgroup><col align="center" class="Offset"><col align="left" class="Description"></colgroup><thead><tr><th align="center">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="center">0x05</td><td align="left">GPS Location</td></tr></tbody></table></div><p>
-       This packet provides all of the information available from the
-       Venus SkyTraq GPS receiver&#8212;position, time, speed and precision
-       estimates. 
-      </p><p>
-       GPS Location packets are transmitted once per second during
-       all phases of the flight
-      </p><div class="table"><a name="idp119040"></a><p class="title"><b>Table 4. GPS Location Packet Contents</b></p><div class="table-contents"><table summary="GPS Location Packet Contents" border="1"><colgroup><col align="center" class="Offset"><col align="center" class="Data Type"><col align="left" class="Name"><col align="left" class="Description"></colgroup><thead><tr><th align="center">Offset</th><th align="center">Data Type</th><th align="center">Name</th><th align="center">Description</th></tr></thead><tbody><tr><td align="center">5</td><td align="center">uint8_t</td><td align="left">flags</td><td align="left">See GPS Flags table below</td></tr><tr><td align="center">6</td><td align="center">int16_t</td><td align="left">altitude</td><td align="left">m</td></tr><tr><td align="center">8</td><td align="center">int32_t</td><td align="left">latitude</td><td align="left">degrees * 10<sup>7</sup></td></tr><tr><td align="center">12</td><td align="center">int32_t</td><td align="left">longitude</td><td align="left">degrees * 10<sup>7</sup></td></tr><tr><td align="center">16</td><td align="center">uint8_t</td><td align="left">year</td><td class="auto-generated"> </td></tr><tr><td align="center">17</td><td align="center">uint8_t</td><td align="left">month</td><td class="auto-generated"> </td></tr><tr><td align="center">18</td><td align="center">uint8_t</td><td align="left">day</td><td class="auto-generated"> </td></tr><tr><td align="center">19</td><td align="center">uint8_t</td><td align="left">hour</td><td class="auto-generated"> </td></tr><tr><td align="center">20</td><td align="center">uint8_t</td><td align="left">minute</td><td class="auto-generated"> </td></tr><tr><td align="center">21</td><td align="center">uint8_t</td><td align="left">second</td><td class="auto-generated"> </td></tr><tr><td align="center">22</td><td align="center">uint8_t</td><td align="left">pdop</td><td align="left">* 5</td></tr><tr><td align="center">23</td><td align="center">uint8_t</td><td align="left">hdop</td><td align="left">* 5</td></tr><tr><td align="center">24</td><td align="center">uint8_t</td><td align="left">vdop</td><td align="left">* 5</td></tr><tr><td align="center">25</td><td align="center">uint8_t</td><td align="left">mode</td><td align="left">See GPS Mode table below</td></tr><tr><td align="center">26</td><td align="center">uint16_t</td><td align="left">ground_speed</td><td align="left">cm/s</td></tr><tr><td align="center">28</td><td align="center">int16_t</td><td align="left">climb_rate</td><td align="left">cm/s</td></tr><tr><td align="center">30</td><td align="center">uint8_t</td><td align="left">course</td><td align="left">/ 2</td></tr><tr><td align="center">31</td><td align="center">uint8_t</td><td align="left">unused[1]</td><td class="auto-generated"> </td></tr><tr><td align="center">32</td><td class="auto-generated"> </td><td class="auto-generated"> </td><td class="auto-generated"> </td></tr></tbody></table></div></div><br class="table-break"><p>
-       Packed into a one byte field are status flags and the count of
-       satellites used to compute the position fix. Note that this
-       number may be lower than the number of satellites being
-       tracked; the receiver will not use information from satellites
-       with weak signals or which are close enough to the horizon to
-       have significantly degraded position accuracy.
-      </p><div class="table"><a name="idp139368"></a><p class="title"><b>Table 5. GPS Flags</b></p><div class="table-contents"><table summary="GPS Flags" border="1"><colgroup><col align="center" class="bits"><col align="left" class="name"><col align="left" class="description"></colgroup><thead><tr><th align="center">Bits</th><th align="center">Name</th><th align="center">Description</th></tr></thead><tbody><tr><td align="center">0-3</td><td align="left">nsats</td><td align="left">Number of satellites in solution</td></tr><tr><td align="center">4</td><td align="left">valid</td><td align="left">GPS solution is valid</td></tr><tr><td align="center">5</td><td align="left">running</td><td align="left">GPS receiver is operational</td></tr><tr><td align="center">6</td><td align="left">date_valid</td><td align="left">Reported date is valid</td></tr><tr><td align="center">7</td><td align="left">course_valid</td><td align="left">ground speed, course and climb rates are valid</td></tr></tbody></table></div></div><br class="table-break"><p>
-       Here are all of the valid GPS operational modes. Altus Metrum
-       products will only ever report 'N' (not valid), 'A'
-       (Autonomous) modes or 'E' (Estimated). The remaining modes
-       are either testing modes or require additional data.
-      </p><div class="table"><a name="idp3514016"></a><p class="title"><b>Table 6. GPS Mode</b></p><div class="table-contents"><table summary="GPS Mode" border="1"><colgroup><col align="center" class="value"><col align="center" class="name"><col align="left" class="description"></colgroup><thead><tr><th align="center">Mode</th><th align="center">Name</th><th align="center">Decsription</th></tr></thead><tbody><tr><td align="center">N</td><td align="center">Not Valid</td><td align="left">All data are invalid</td></tr><tr><td align="center">A</td><td align="center">Autonomous mode</td><td align="left">Data are derived from satellite data</td></tr><tr><td align="center">D</td><td align="center">Differential Mode</td><td align="left">
-                 Data are augmented with differential data from a
-                 known ground station. The SkyTraq unit in TeleMetrum
-                 does not support this mode
-               </td></tr><tr><td align="center">E</td><td align="center">Estimated</td><td align="left">
-                 Data are estimated using dead reckoning from the
-                 last known data
-               </td></tr><tr><td align="center">M</td><td align="center">Manual</td><td align="left">Data were entered manually</td></tr><tr><td align="center">S</td><td align="center">Simulated</td><td align="left">GPS receiver testing mode</td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="2.5. GPS Satellite Data"><div class="titlepage"><div><div><h3 class="title"><a name="idp3522960"></a>2.5. GPS Satellite Data</h3></div></div></div><div class="informaltable"><table border="0"><colgroup><col align="center" class="Offset"><col align="left" class="Description"></colgroup><thead><tr><th align="center">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="center">0x06</td><td align="left">GPS Satellite Data</td></tr></tbody></table></div><p>
-       This packet provides space vehicle identifiers and signal
-       quality information in the form of a C/N1 number for up to 12
-       satellites. The order of the svids is not specified.
-      </p><p>
-       GPS Satellite data are transmitted once per second during all
-       phases of the flight.
-      </p><div class="table"><a name="idp3527696"></a><p class="title"><b>Table 7. GPS Satellite Data Contents</b></p><div class="table-contents"><table summary="GPS Satellite Data Contents" border="1"><colgroup><col align="right" class="Offset"><col align="center" class="Data Type"><col align="left" class="Name"><col align="left" class="Description"></colgroup><thead><tr><th align="center">Offset</th><th align="center">Data Type</th><th align="center">Name</th><th align="center">Description</th></tr></thead><tbody><tr><td align="right">5</td><td align="center">uint8_t</td><td align="left">channels</td><td align="left">Number of reported satellite information</td></tr><tr><td align="right">6</td><td align="center">sat_info_t</td><td align="left">sats[12]</td><td align="left">See Per-Satellite data table below</td></tr><tr><td align="right">30</td><td align="center">uint8_t</td><td align="left">unused[2]</td><td class="auto-generated"> </td></tr><tr><td align="right">32</td><td class="auto-generated"> </td><td class="auto-generated"> </td><td class="auto-generated"> </td></tr></tbody></table></div></div><br class="table-break"><div class="table"><a name="idp3535336"></a><p class="title"><b>Table 8. GPS Per-Satellite data (sat_info_t)</b></p><div class="table-contents"><table summary="GPS Per-Satellite data (sat_info_t)" border="1"><colgroup><col align="right" class="Offset"><col align="center" class="Data Type"><col align="left" class="Name"><col align="left" class="Description"></colgroup><thead><tr><th align="center">Offset</th><th align="center">Data Type</th><th align="center">Name</th><th align="center">Description</th></tr></thead><tbody><tr><td align="right">0</td><td align="center">uint8_t</td><td align="left">svid</td><td align="left">Space Vehicle Identifier</td></tr><tr><td align="right">1</td><td align="center">uint8_t</td><td align="left">c_n_1</td><td align="left">C/N1 signal quality indicator</td></tr><tr><td align="right">2</td><td class="auto-generated"> </td><td class="auto-generated"> </td><td class="auto-generated"> </td></tr></tbody></table></div></div><br class="table-break"></div></div><div class="section" title="3. Data Transmission"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idp3542464"></a>3. Data Transmission</h2></div></div></div><p>
-      Altus Metrum devices use the Texas Instruments CC1111
-      microcontroller which includes an integrated sub-GHz digital
-      transceiver. This transceiver is used to both transmit and
-      receive the telemetry packets. This section discusses what
-      modulation scheme is used and how this device is configured.
-    </p><div class="section" title="3.1. Modulation Scheme"><div class="titlepage"><div><div><h3 class="title"><a name="idp3543312"></a>3.1. Modulation Scheme</h3></div></div></div><p>
-       Texas Instruments provides a tool for computing modulation
-       parameters given a desired modulation format and basic bit
-       rate. For AltOS, the basic bit rate was specified as 38 kBaud,
-       resulting in the following signal parmeters:
-      </p><div class="table"><a name="idp3544072"></a><p class="title"><b>Table 9. </b></p><div class="table-contents"><table border="1"><colgroup><col align="center" class="parameter"><col align="center" class="value"><col align="center" class="description"></colgroup><thead><tr><th align="center">Parameter</th><th align="center">Value</th><th align="center">Description</th></tr></thead><tbody><tr><td align="center">Modulation</td><td align="center">GFSK</td><td align="center">Gaussian Frequency Shift Keying</td></tr><tr><td align="center">Deviation</td><td align="center">20.507812 kHz</td><td align="center">Frequency modulation</td></tr><tr><td align="center">Data rate</td><td align="center">38.360596 kBaud</td><td align="center">Raw bit rate</td></tr><tr><td align="center">RX Filter Bandwidth</td><td align="center">93.75 kHz</td><td align="center">Receiver Band pass filter bandwidth</td></tr><tr><td align="center">IF Frequency</td><td align="center">140.62 kHz</td><td align="center">Receiver intermediate frequency</td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="3.2. Error Correction"><div class="titlepage"><div><div><h3 class="title"><a name="idp3551696"></a>3.2. Error Correction</h3></div></div></div><p>
-       The cc1111 provides forward error correction in hardware,
-       which AltOS uses to improve reception of weak signals. The
-       overall effect of this is to halve the available bandwidth for
-       data from 38 kBaud to 19 kBaud.
-      </p><div class="table"><a name="idp3552440"></a><p class="title"><b>Table 10. </b></p><div class="table-contents"><table border="1"><colgroup><col align="center" class="parameter"><col align="center" class="value"><col align="center" class="description"></colgroup><thead><tr><th align="center">Parameter</th><th align="center">Value</th><th align="center">Description</th></tr></thead><tbody><tr><td align="center">Error Correction</td><td align="center">Convolutional coding FEC</td><td align="center">1/2 code, constraint length m=4</td></tr><tr><td align="center">Interleaving</td><td align="center">4 x 4</td><td align="center">Reduce effect of noise burst</td></tr><tr><td align="center">Data Whitening</td><td align="center">XOR with 9-bit PNR</td><td align="center">Rotate right with bit 8 = bit 0 xor bit 5, initial
-             value 111111111</td></tr></tbody></table></div></div><br class="table-break"></div></div><div class="section" title="4. TeleDongle packet format"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idp3558512"></a>4. TeleDongle packet format</h2></div></div></div><p>
-      TeleDongle does not do any interpretation of the packet data,
-      instead it is configured to receive packets of a specified
-      length (32 bytes in this case). For each received packet,
-      TeleDongle produces a single line of text. This line starts with
-      the string "TELEM " and is followed by a list of hexadecimal
-      encoded bytes.
-    </p><pre class="programlisting">TELEM 224f01080b05765e00701f1a1bbeb8d7b60b070605140c000600000000000000003fa988</pre><p>
-      The hexadecimal encoded string of bytes contains a length byte,
-      the packet data, two bytes added by the cc1111 radio receiver
-      hardware and finally a checksum so that the host software can
-      validate that the line was transmitted without any errors.
-    </p><div class="table"><a name="idp3560272"></a><p class="title"><b>Table 11. </b></p><div class="table-contents"><table border="1"><colgroup><col align="center" class="offset"><col align="center" class="name"><col align="center" class="value"><col align="center" class="description"></colgroup><thead><tr><th align="center">Offset</th><th align="center">Name</th><th align="center">Example</th><th align="center">Description</th></tr></thead><tbody><tr><td align="center">0</td><td align="center">length</td><td align="center">22</td><td align="center">Total length of data bytes in the line. Note that
-           this includes the added RSSI and status bytes</td></tr><tr><td align="center">1 ·· length-3</td><td align="center">packet</td><td align="center">4f ·· 00</td><td align="center">Bytes of actual packet data</td></tr><tr><td align="center">length-2</td><td align="center">rssi</td><td align="center">3f</td><td align="center">Received signal strength. dBm = rssi / 2 - 74</td></tr><tr><td align="center">length-1</td><td align="center">lqi</td><td align="center">a9</td><td align="center">Link Quality Indicator and CRC status. Bit 7
-           is set when the CRC is correct</td></tr><tr><td align="center">length</td><td align="center">checksum</td><td align="center">88</td><td align="center">(0x5a + sum(bytes 1 ·· length-1)) % 256</td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="5. History and Motivation"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idp3569800"></a>5. History and Motivation</h2></div></div></div><p>
-      The original AltoOS telemetry mechanism encoded everything
-      available piece of information on the TeleMetrum hardware into a
-      single unified packet. Initially, the packets contained very
-      little data&#8212;some raw sensor readings along with the current GPS
-      coordinates when a GPS receiver was connected. Over time, the
-      amount of data grew to include sensor calibration data, GPS
-      satellite information and a host of internal state information
-      designed to help diagnose flight failures in case of a loss of
-      the on-board flight data.
-    </p><p>
-      Because every packet contained all of the data, packets were
-      huge&#8212;95 bytes long. Much of the information was also specific to
-      the TeleMetrum hardware. With the introduction of the TeleMini
-      flight computer, most of the data contained in the telemetry
-      packets was unavailable. Initially, a shorter, but still
-      comprehensive packet was implemented. This required that the
-      ground station be pre-configured as to which kind of packet to
-      expect.
-    </p><p>
-      The development of several companion boards also made the
-      shortcomings evident&#8212;each companion board would want to include
-      telemetry data in the radio link; with the original design, the
-      packet would have to hold the new data as well, requiring
-      additional TeleMetrum and ground station changes.
-    </p></div></div></body></html>
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="generator" content="Asciidoctor 2.0.10">
+<meta name="author" content="Keith Packard, Bdale Garbee">
+<meta name="copyright" content="Bdale Garbee and Keith Packard 2020">
+<title>AltOS Telemetry</title>
+<link rel="stylesheet" href="./am.css">
+</head>
+<body class="article">
+<div id="header">
+<h1>AltOS Telemetry</h1>
+<div class="details">
+<span id="author" class="author">Keith Packard</span><br>
+<span id="email" class="email"><a href="mailto:keithp@keithp.com">keithp@keithp.com</a></span><br>
+<span id="author2" class="author">Bdale Garbee</span><br>
+<span id="email2" class="email"><a href="mailto:bdale@gag.com">bdale@gag.com</a></span><br>
+<span id="revnumber">version v1.9.6,</span>
+<span id="revdate">29 Sep 2020</span>
+</div>
+<div id="toc" class="toc">
+<div id="toctitle">Table of Contents</div>
+<ul class="sectlevel1">
+<li><a href="#_license">License</a></li>
+<li><a href="#_packet_format_design">1. Packet Format Design</a></li>
+<li><a href="#_packet_formats">2. Packet Formats</a>
+<ul class="sectlevel2">
+<li><a href="#_packet_header">2.1. Packet Header</a></li>
+<li><a href="#_telemetrum_v1_x_telemini_v1_0_and_telenano_sensor_data">2.2. TeleMetrum v1.x, TeleMini v1.0 and TeleNano Sensor Data</a></li>
+<li><a href="#_telemega_sensor_data">2.3. TeleMega Sensor Data</a></li>
+<li><a href="#_telemetrum_v2_and_newer_sensor_data">2.4. TeleMetrum v2 and newer Sensor Data</a></li>
+<li><a href="#_telemini_v3_0_sensor_data">2.5. TeleMini v3.0 Sensor Data</a></li>
+<li><a href="#_configuration_data">2.6. Configuration Data</a></li>
+<li><a href="#_gps_location">2.7. GPS Location</a></li>
+<li><a href="#_gps_satellite_data">2.8. GPS Satellite Data</a></li>
+<li><a href="#_companion_data">2.9. Companion Data</a></li>
+</ul>
+</li>
+<li><a href="#_data_transmission">3. Data Transmission</a>
+<ul class="sectlevel2">
+<li><a href="#_modulation_scheme">3.1. Modulation Scheme</a></li>
+<li><a href="#_error_correction">3.2. Error Correction</a></li>
+</ul>
+</li>
+<li><a href="#_teledongle_serial_packet_format">4. TeleDongle serial packet format</a></li>
+<li><a href="#_history_and_motivation">5. History and Motivation</a></li>
+</ul>
+</div>
+</div>
+<div id="content">
+<div id="preamble">
+<div class="sectionbody">
+<div id="logo" class="imageblock">
+<div class="content">
+<a class="image" href="https://altusmetrum.org"><img src="altusmetrum-oneline.svg" alt="Altus Metrum"></a>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_license">License</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Copyright © 2018 Bdale Garbee and Keith Packard</p>
+</div>
+<div class="paragraph">
+<p>This document is released under the terms of the <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons ShareAlike 3.0 License</a></p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_packet_format_design">1. Packet Format Design</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>AltOS telemetry data is split into multiple different packets,
+all the same size, but each includs an identifier so that the
+ground station can distinguish among different types. A single
+flight board will transmit multiple packet types, each type on
+a different schedule. The ground software need look for only a
+single packet size, and then decode the information within the
+packet and merge data from multiple packets to construct the
+full flight computer state.</p>
+</div>
+<div class="paragraph">
+<p>Each AltOS packet is 32 bytes long. This size was chosen based
+on the known telemetry data requirements. The power of two
+size allows them to be stored easily in flash memory without
+having them split across blocks or leaving gaps at the end.</p>
+</div>
+<div class="paragraph">
+<p>All packet types start with a five byte header which encodes
+the device serial number, device clock value and the packet
+type. The remaining 27 bytes encode type-specific data.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_packet_formats">2. Packet Formats</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>This section first defines the packet header common to all packets
+and then the per-packet data layout.</p>
+</div>
+<div class="sect2">
+<h3 id="_packet_header">2.1. Packet Header</h3>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 1. Telemetry Packet Header</caption>
+<colgroup>
+<col style="width: 11.7647%;">
+<col style="width: 17.647%;">
+<col style="width: 17.647%;">
+<col style="width: 52.9413%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Offset</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Name</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">serial</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Device serial Number</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">tick</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Device time in 100ths of a second</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Packet type</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Each packet starts with these five bytes which serve to identify
+which device has transmitted the packet, when it was transmitted
+and what the rest of the packet contains.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_telemetrum_v1_x_telemini_v1_0_and_telenano_sensor_data">2.2. TeleMetrum v1.x, TeleMini v1.0 and TeleNano Sensor Data</h3>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 2. Sensor Packet Type</caption>
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 75%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0x01</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">TeleMetrum v1.x Sensor Data</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0x02</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">TeleMini v1.0 Sensor Data</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0x03</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">TeleNano Sensor Data</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>TeleMetrum v1.x, TeleMini v1.0 and TeleNano share this same
+packet format for sensor data. Each uses a distinct
+packet type so that the receiver knows which data
+values are valid and which are undefined.</p>
+</div>
+<div class="paragraph">
+<p>Sensor Data packets are transmitted once per second on
+the ground, 10 times per second during ascent and once
+per second during descent and landing</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 3. Sensor Packet Contents</caption>
+<colgroup>
+<col style="width: 11.7647%;">
+<col style="width: 17.647%;">
+<col style="width: 17.647%;">
+<col style="width: 52.9413%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Offset</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Name</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">state</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Flight state</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">6</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">accel</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">accelerometer (TM only)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">8</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pres</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pressure sensor</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">10</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">temp</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">temperature sensor</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">12</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">v_batt</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">battery voltage</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">14</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">sense_d</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">drogue continuity sense (TM/Tm)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">16</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">sense_m</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">main continuity sense (TM/Tm)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">18</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">acceleration</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">m/s² * 16</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">20</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">speed</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">m/s * 16</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">22</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">height</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">m</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">24</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">ground_pres</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Average barometer reading on ground</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">26</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">ground_accel</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">TM</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">28</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">accel_plus_g</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">TM</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">30</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">accel_minus_g</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">TM</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_telemega_sensor_data">2.3. TeleMega Sensor Data</h3>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 4. TeleMega Packet Type</caption>
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 75%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0x08</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">TeleMega IMU Sensor Data</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0x09</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">TeleMega Kalman and Voltage Data</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>TeleMega has a lot of sensors, and so it splits the sensor
+data into two packets. The raw IMU data are sent more often;
+the voltage values don&#8217;t change very fast, and the Kalman
+values can be reconstructed from the IMU data.</p>
+</div>
+<div class="paragraph">
+<p>IMU Sensor Data packets are transmitted once per second on the
+ground, 10 times per second during ascent and once per second
+during descent and landing</p>
+</div>
+<div class="paragraph">
+<p>Kalman and Voltage Data packets are transmitted once per second on the
+ground, 5 times per second during ascent and once per second
+during descent and landing</p>
+</div>
+<div class="paragraph">
+<p>The high-g accelerometer is reported separately from the data
+for the 9-axis IMU (accel/gyro/mag). The 9-axis IMU is mounted
+so that the X axis is "across" the board (along the short
+axis0, the Y axis is "along" the board (along the long axis,
+with the high-g accelerometer) and the Z axis is "through" the
+board (perpendicular to the board). Rotation measurements are
+around the respective axis, so Y rotation measures the spin
+rate of the rocket while X and Z rotation measure the tilt
+rate.</p>
+</div>
+<div class="paragraph">
+<p>The overall tilt angle of the rocket is computed by first
+measuring the orientation of the rocket on the pad using the 3
+axis accelerometer, and then integrating the overall tilt rate
+from the 3 axis gyroscope to compute the total orientation
+change of the airframe since liftoff.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 5. TeleMega IMU Sensor Packet Contents</caption>
+<colgroup>
+<col style="width: 11.7647%;">
+<col style="width: 17.647%;">
+<col style="width: 17.647%;">
+<col style="width: 52.9413%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Offset</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Name</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">orient</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Angle from vertical in degrees</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">6</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">accel</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">High G accelerometer</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">8</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int32_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pres</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pressure (Pa * 10)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">12</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">temp</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">temperature (°C * 100)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">14</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">accel_x</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">X axis acceleration (across)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">16</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">accel_y</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Y axis acceleration (along)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">18</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">accel_z</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Z axis acceleration (through)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">20</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">gyro_x</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">X axis rotation (across)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">22</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">gyro_y</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Y axis rotation (along)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">24</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">gyro_z</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Z axis rotation (through)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">26</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">mag_x</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">X field strength (across)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">28</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">mag_y</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Y field strength (along)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">30</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">mag_z</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Z field strength (through)</p></td>
+</tr>
+</tbody>
+</table>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 6. TeleMega Kalman and Voltage Data Packet Contents</caption>
+<colgroup>
+<col style="width: 11.7647%;">
+<col style="width: 17.647%;">
+<col style="width: 17.647%;">
+<col style="width: 52.9413%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Offset</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Name</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">state</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Flight state</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">6</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">v_batt</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">battery voltage</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">8</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">v_pyro</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pyro battery voltage</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">10</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int8_t[6]</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">sense</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pyro continuity sense</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">16</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int32_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">ground_pres</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Average barometer reading on ground</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">20</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">ground_accel</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Average accelerometer reading on ground</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">22</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">accel_plus_g</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Accel calibration at +1g</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">24</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">accel_minus_g</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Accel calibration at -1g</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">26</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">acceleration</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">m/s² * 16</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">28</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">speed</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">m/s * 16</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">30</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">height</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">m</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_telemetrum_v2_and_newer_sensor_data">2.4. TeleMetrum v2 and newer Sensor Data</h3>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 7. TeleMetrum v2 Packet Type</caption>
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 75%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0x0A</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">TeleMetrum v2 Sensor Data</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0x0B</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">TeleMetrum v2 Calibration Data</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>TeleMetrum v2 and newer have higher resolution barometric data than
+TeleMetrum v1, and so the constant calibration data is
+split out into a separate packet.</p>
+</div>
+<div class="paragraph">
+<p>TeleMetrum v2 and newer Sensor Data packets are transmitted once per second on the
+ground, 10 times per second during ascent and once per second
+during descent and landing</p>
+</div>
+<div class="paragraph">
+<p>TeleMetrum v2 and newer Calibration Data packets are always transmitted once per second.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 8. TeleMetrum v2 and newer Sensor Packet Contents</caption>
+<colgroup>
+<col style="width: 11.7647%;">
+<col style="width: 17.647%;">
+<col style="width: 17.647%;">
+<col style="width: 52.9413%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Offset</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Name</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">state</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Flight state</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">6</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">accel</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">accelerometer</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">8</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int32_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pres</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pressure sensor (Pa * 10)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">12</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">temp</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">temperature sensor (°C * 100)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">14</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">acceleration</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">m/s² * 16</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">16</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">speed</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">m/s * 16</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">18</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">height</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">m</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">20</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">v_batt</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">battery voltage</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">22</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">sense_d</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">drogue continuity sense</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">24</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">sense_m</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">main continuity sense</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">26</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pad[6]</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pad bytes</p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+</tbody>
+</table>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 9. TeleMetrum v2 and newer Calibration Data Packet Contents</caption>
+<colgroup>
+<col style="width: 11.7647%;">
+<col style="width: 17.647%;">
+<col style="width: 17.647%;">
+<col style="width: 52.9413%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Offset</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Name</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pad[3]</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pad bytes</p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">8</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int32_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">ground_pres</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Average barometer reading on ground</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">12</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">ground_accel</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Average accelerometer reading on ground</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">14</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">accel_plus_g</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Accel calibration at +1g</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">16</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">accel_minus_g</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Accel calibration at -1g</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">18</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pad[14]</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pad bytes</p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_telemini_v3_0_sensor_data">2.5. TeleMini v3.0 Sensor Data</h3>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 10. Sensor Packet Type</caption>
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 75%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0x11</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">TeleMini v3.0 Sensor Data</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>TeleMini v3.0 uses this
+packet format for sensor data.</p>
+</div>
+<div class="paragraph">
+<p>Sensor Data packets are transmitted once per second on
+the ground, 10 times per second during ascent and once
+per second during descent and landing</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 11. Sensor Packet Contents</caption>
+<colgroup>
+<col style="width: 11.7647%;">
+<col style="width: 17.647%;">
+<col style="width: 17.647%;">
+<col style="width: 52.9413%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Offset</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Name</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">state</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Flight state</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">6</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">v_batt</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">battery voltage</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">8</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">sense_a</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">apogee continuity sense</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">10</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">sense_m</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">main continuity sense</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">12</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int32_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pres</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pressure sensor (Pa * 10)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">16</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">temp</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">temperature sensor (°C * 100)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">18</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">acceleration</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">m/s² * 16</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">20</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">speed</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">m/s * 16</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">22</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">height</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">m</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">24</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">ground_pres</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Average barometer reading on ground</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">28</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pad[4]</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pad bytes</p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_configuration_data">2.6. Configuration Data</h3>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 12. Configuration Packet Type</caption>
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 75%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0x04</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Configuration Data</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>This provides a description of the software installed on the
+flight computer as well as any user-specified configuration data.</p>
+</div>
+<div class="paragraph">
+<p>Configuration data packets are transmitted once per second
+during all phases of the flight</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 13. Configuration Packet Contents</caption>
+<colgroup>
+<col style="width: 11.7647%;">
+<col style="width: 17.647%;">
+<col style="width: 17.647%;">
+<col style="width: 52.9413%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Offset</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Name</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Device type</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">6</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">flight</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Flight number</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">8</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">config_major</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Config major version</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">9</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">config_minor</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Config minor version</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">10</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">apogee_delay</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Apogee deploy delay in seconds</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">12</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">main_deploy</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Main deploy alt in meters</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">14</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">flight_log_max</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Maximum flight log size (kB)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">16</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">char</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">callsign[8]</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Radio operator identifier</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">24</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">char</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">version[8]</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Software version identifier</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_gps_location">2.7. GPS Location</h3>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 14. GPS Packet Type</caption>
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 75%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0x05</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">GPS Location</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>This packet provides all of the information available from the
+GPS receiver—position, time, speed and precision
+estimates.</p>
+</div>
+<div class="paragraph">
+<p>GPS Location packets are transmitted once per second during
+all phases of the flight</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 15. GPS Location Packet Contents</caption>
+<colgroup>
+<col style="width: 11.7647%;">
+<col style="width: 17.647%;">
+<col style="width: 17.647%;">
+<col style="width: 52.9413%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Offset</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Name</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">flags</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">See GPS Flags table below</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">6</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">altitude</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">m</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">8</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int32_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">latitude</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">degrees * 107</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">12</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int32_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">longitude</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">degrees * 107</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">16</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">year</p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">17</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">month</p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">18</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">day</p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">19</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">hour</p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">20</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">minute</p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">21</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">second</p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">22</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">pdop</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">* 5</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">23</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">hdop</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">* 5</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">24</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">vdop</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">* 5</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">25</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">mode</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">See GPS Mode table below</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">26</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">ground_speed</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">cm/s</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">28</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int16_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">climb_rate</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">cm/s</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">30</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">course</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">/ 2</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">31</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">unused[1]</p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Packed into a one byte field are status flags and the
+count of satellites used to compute the position
+fix. Note that this number may be lower than the
+number of satellites being tracked; the receiver will
+not use information from satellites with weak signals
+or which are close enough to the horizon to have
+significantly degraded position accuracy.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 16. GPS Flags</caption>
+<colgroup>
+<col style="width: 10%;">
+<col style="width: 20%;">
+<col style="width: 70%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Bits</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Name</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0-3</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">nsats</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Number of satellites in solution</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">valid</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">GPS solution is valid</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">running</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">GPS receiver is operational</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">6</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">date_valid</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Reported date is valid</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">7</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">course_valid</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">ground speed, course and climb rates are valid</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Here are all of the valid GPS operational modes. Altus
+Metrum products will only ever report 'N' (not valid),
+'A' (Autonomous) modes or 'E' (Estimated). The
+remaining modes are either testing modes or require
+additional data.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 17. GPS Mode</caption>
+<colgroup>
+<col style="width: 9.0909%;">
+<col style="width: 27.2727%;">
+<col style="width: 63.6364%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Mode</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Name</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">N</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Not Valid</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">All data are invalid</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">A</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Autonomous mode</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data are derived from satellite data</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">D</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Differential Mode</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data are augmented with differential data from a
+known ground station. The SkyTraq unit in TeleMetrum
+does not support this mode</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">E</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Estimated</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data are estimated using dead reckoning from the
+last known data</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">M</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Manual</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data were entered manually</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">S</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Simulated</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">GPS receiver testing mode</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_gps_satellite_data">2.8. GPS Satellite Data</h3>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 18. GPS Satellite Data Packet Type</caption>
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 75%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0x06</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">GPS Satellite Data</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>This packet provides space vehicle identifiers and
+signal quality information in the form of a C/N1
+number for up to 12 satellites. The order of the svids
+is not specified.</p>
+</div>
+<div class="paragraph">
+<p>GPS Satellite data are transmitted once per second
+during all phases of the flight.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 19. GPS Satellite Data Contents</caption>
+<colgroup>
+<col style="width: 11.7647%;">
+<col style="width: 17.647%;">
+<col style="width: 17.647%;">
+<col style="width: 52.9413%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Offset</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Name</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">channels</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Number of reported satellite information</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">6</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">sat_info_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">sats[12]</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">See Per-Satellite data table below</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">30</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">unused[2]</p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+</tbody>
+</table>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 20. GPS Per-Satellite data (sat_info_t)</caption>
+<colgroup>
+<col style="width: 11.7647%;">
+<col style="width: 17.647%;">
+<col style="width: 17.647%;">
+<col style="width: 52.9413%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Offset</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Name</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">svid</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Space Vehicle Identifier</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">c_n_1</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">C/N1 signal quality indicator</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_companion_data">2.9. Companion Data</h3>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 21. Companion Data Packet Type</caption>
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 75%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0x07</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Companion Data</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>When a companion board is attached to TeleMega or
+TeleMetrum, it can provide telemetry data to be
+included in the downlink. The companion board can
+provide up to 12 16-bit data values.</p>
+</div>
+<div class="paragraph">
+<p>The companion board itself specifies the transmission
+rate. On the ground and during descent, that rate is
+limited to one packet per second. During ascent, that
+rate is limited to 10 packets per second.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 22. Companion Data Contents</caption>
+<colgroup>
+<col style="width: 11.7647%;">
+<col style="width: 17.647%;">
+<col style="width: 17.647%;">
+<col style="width: 52.9413%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Offset</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data Type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Name</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">board_id</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Type of companion board attached</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">6</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">update_period</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">How often telemetry is sent, in 1/100ths of a second</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">7</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint8_t</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">channels</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Number of data channels supplied</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">8</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">uint16_t[12]</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">companion_data</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Up to 12 channels of 16-bit companion data</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_data_transmission">3. Data Transmission</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Altus Metrum devices use Texas Instruments sub-GHz digital
+radio products. Ground stations use parts with HW FEC while
+some flight computers perform FEC in software. TeleGPS is
+transmit-only.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 23. Altus Metrum Radio Parts</caption>
+<colgroup>
+<col style="width: 11.1111%;">
+<col style="width: 44.4444%;">
+<col style="width: 44.4445%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Part Number</th>
+<th class="tableblock halign-left valign-top">Description</th>
+<th class="tableblock halign-left valign-top">Used in</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">CC1111</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">10mW transceiver with integrated SoC</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">TeleDongle v0.2, TeleBT v1.0, TeleMetrum v1.x, TeleMini v1</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">CC1120</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">35mW transceiver with SW FEC</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">TeleMetrum v2, TeleMega v1</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">CC1200</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">35mW transceiver with HW FEC</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">TeleMetrum v3, TeleMega v2, TeleDongle v3.0, TeleMini v3, TeleBT v3.0, TeleGPS v2</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">CC115L</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">14mW transmitter with SW FEC</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">TeleGPS v1</p></td>
+</tr>
+</tbody>
+</table>
+<div class="sect2">
+<h3 id="_modulation_scheme">3.1. Modulation Scheme</h3>
+<div class="paragraph">
+<p>Texas Instruments provides a tool for computing
+modulation parameters given a desired modulation
+format and basic bit rate.</p>
+</div>
+<div class="paragraph">
+<p>While we might like to use something with better
+low-signal performance like BPSK, the radios we use
+don&#8217;t support that, but do support Gaussian frequency
+shift keying (GFSK). Regular frequency shift keying
+(FSK) encodes the signal by switching the carrier
+between two frequencies. The Gaussian version is
+essentially the same, but the shift between
+frequencies gently follows a gaussian curve, rather
+than switching immediately. This tames the bandwidth
+of the signal without affecting the ability to
+transmit data.</p>
+</div>
+<div class="paragraph">
+<p>For AltOS, there are three available bit rates,
+38.4kBaud, 9.6kBaud and 2.4kBaud resulting in the
+following signal parmeters:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 24. Modulation Scheme</caption>
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 33.3333%;">
+<col style="width: 33.3334%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Rate</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Deviation</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Receiver Bandwidth</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">38.4kBaud</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">20.5kHz</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">100kHz</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">9.6kBaud</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">5.125kHz</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">25kHz</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">2.4kBaud</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">1.5kHz</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">5kHz</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_error_correction">3.2. Error Correction</h3>
+<div class="paragraph">
+<p>The cc1111 and cc1200 provide forward error correction
+in hardware; on the cc1120 and cc115l that&#8217;s done in
+software. AltOS uses this to improve reception of weak
+signals. As it&#8217;s a rate 1/2 encoding, each bit of data
+takes two bits when transmitted, so the effective data
+rate is half of the raw transmitted bit rate.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 25. Error Correction</caption>
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 33.3333%;">
+<col style="width: 33.3334%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Parameter</th>
+<th class="tableblock halign-left valign-top">Value</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Error Correction</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Convolutional coding</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">1/2 rate, constraint length m=4</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Interleaving</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">4 x 4</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Reduce effect of noise burst</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Data Whitening</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">XOR with 9-bit PNR</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Rotate right with bit 8 = bit 0 xor bit 5, initial value 111111111</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_teledongle_serial_packet_format">4. TeleDongle serial packet format</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>TeleDongle does not do any interpretation of the packet data,
+instead it is configured to receive packets of a specified
+length (32 bytes in this case). For each received packet,
+TeleDongle produces a single line of text. This line starts with
+the string "TELEM " and is followed by a list of hexadecimal
+encoded bytes.</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>TELEM 224f01080b05765e00701f1a1bbeb8d7b60b070605140c000600000000000000003fa988</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The hexadecimal encoded string of bytes contains a length byte,
+the packet data, two bytes added by the cc1111 radio receiver
+hardware and finally a checksum so that the host software can
+validate that the line was transmitted without any errors.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 26. TeleDongle serial Packet Format</caption>
+<colgroup>
+<col style="width: 22.2222%;">
+<col style="width: 11.1111%;">
+<col style="width: 11.1111%;">
+<col style="width: 55.5556%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Offset</th>
+<th class="tableblock halign-left valign-top">Name</th>
+<th class="tableblock halign-left valign-top">Example</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">length</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">22</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Total length of data bytes in the line. Note that
+this includes the added RSSI and status bytes</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">1 ·· length-3</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">packet</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">4f ·· 00</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Bytes of actual packet data</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">length-2</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">rssi</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">3f</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Received signal strength. dBm = rssi / 2 - 74</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">length-1</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">lqi</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">a9</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Link Quality Indicator and CRC status. Bit 7
+is set when the CRC is correct</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">length</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">checksum</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">88</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">(0x5a + sum(bytes 1 ·· length-1)) % 256</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_history_and_motivation">5. History and Motivation</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The original AltoOS telemetry mechanism encoded everything
+available piece of information on the TeleMetrum hardware into a
+single unified packet. Initially, the packets contained very
+little data—some raw sensor readings along with the current GPS
+coordinates when a GPS receiver was connected. Over time, the
+amount of data grew to include sensor calibration data, GPS
+satellite information and a host of internal state information
+designed to help diagnose flight failures in case of a loss of
+the on-board flight data.</p>
+</div>
+<div class="paragraph">
+<p>Because every packet contained all of the data, packets were
+huge—95 bytes long. Much of the information was also specific to
+the TeleMetrum hardware. With the introduction of the TeleMini
+flight computer, most of the data contained in the telemetry
+packets was unavailable. Initially, a shorter, but still
+comprehensive packet was implemented. This required that the
+ground station be pre-configured as to which kind of packet to
+expect.</p>
+</div>
+<div class="paragraph">
+<p>The development of several companion boards also made the
+shortcomings evident—each companion board would want to include
+telemetry data in the radio link; with the original design, the
+packet would have to hold the new data as well, requiring
+additional TeleMetrum and ground station changes.</p>
+</div>
+</div>
+</div>
+</div>
+<div id="footer">
+<div id="footer-text">
+Version v1.9.6<br>
+Last updated 2020-10-22 16:37:06 -0600
+</div>
+</div>
+</body>
+</html>
\ No newline at end of file