update docs
[web/altusmetrum] / AltOS / doc / telemetry.html
index 5113c2a274a1609925b8fecda2ffb4b0f2fcfc2a..ac37b9f39de3a07afebc6f1258e1839d5a0fdd4c 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.78.1"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="article"><div class="titlepage"><div><div><h2 class="title"><a name="idm45387730255632"></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"><a name="idm45387703834864"></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 style="border-style:solid; 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 class="toc"><dt><span class="section"><a href="#idm45387702977984">1. Packet Format Design</a></span></dt><dt><span class="section"><a href="#idm45387702974992">2. Packet Formats</a></span></dt><dd><dl><dt><span class="section"><a href="#idm45387702973792">2.1. Packet Header</a></span></dt><dt><span class="section"><a href="#idm45387703730528">2.2. TeleMetrum v1.x, TeleMini and TeleNano Sensor Data</a></span></dt><dt><span class="section"><a href="#idm45387697986624">2.3. TeleMega Sensor  Data</a></span></dt><dt><span class="section"><a href="#idm45387697911584">2.4. TeleMetrum v2 Sensor  Data</a></span></dt><dt><span class="section"><a href="#idm45387697850976">2.5. Configuration Data</a></span></dt><dt><span class="section"><a href="#idm45387697816944">2.6. GPS Location</a></span></dt><dt><span class="section"><a href="#idm45387697735648">2.7. GPS Satellite Data</a></span></dt><dt><span class="section"><a href="#idm45387697697056">2.8. Companion Data Data</a></span></dt></dl></dd><dt><span class="section"><a href="#idm45387697670160">3. Data Transmission</a></span></dt><dd><dl><dt><span class="section"><a href="#idm45387697655920">3.1. Modulation Scheme</a></span></dt><dt><span class="section"><a href="#idm45387697642000">3.2. Error Correction</a></span></dt></dl></dd><dt><span class="section"><a href="#idm45387697628320">4. TeleDongle packet format</a></span></dt><dt><span class="section"><a href="#idm45387697606544">5. History and Motivation</a></span></dt></dl></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idm45387702977984"></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"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idm45387702974992"></a>2. Packet Formats</h2></div></div></div><p>
-      This section first defines the packet header common to all packets
-      and then the per-packet data layout.
-    </p><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="idm45387702973792"></a>2.1. Packet Header</h3></div></div></div><div class="table"><a name="idm45387702973120"></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"><div class="titlepage"><div><div><h3 class="title"><a name="idm45387703730528"></a>2.2. TeleMetrum v1.x, TeleMini and TeleNano 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 v1.x 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 v1.x, 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="idm45387703907952"></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"><div class="titlepage"><div><div><h3 class="title"><a name="idm45387697986624"></a>2.3. TeleMega 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">0x08</td><td align="left">TeleMega IMU Sensor Data</td></tr><tr><td align="center">0x09</td><td align="left">TeleMega Kalman and Voltage Data</td></tr></tbody></table></div><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't change very fast, and the Kalman
-       values can be reconstructed from the IMU data.
-      </p><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><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><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><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 class="table"><a name="idm45387697973568"></a><p class="title"><b>Table 3. TeleMega IMU Sensor Packet Contents</b></p><div class="table-contents"><table summary="TeleMega IMU 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">orient</td><td align="left">Angle from vertical in degrees</td></tr><tr><td align="center">6</td><td align="center">int16_t</td><td align="left">accel</td><td align="left">High G accelerometer</td></tr><tr><td align="center">8</td><td align="center">int32_t</td><td align="left">pres</td><td align="left">pressure (Pa * 10)</td></tr><tr><td align="center">12</td><td align="center">int16_t</td><td align="left">temp</td><td align="left">temperature (°C * 100)</td></tr><tr><td align="center">14</td><td align="center">int16_t</td><td align="left">accel_x</td><td align="left">X axis acceleration (across)</td></tr><tr><td align="center">16</td><td align="center">int16_t</td><td align="left">accel_y</td><td align="left">Y axis acceleration (along)</td></tr><tr><td align="center">18</td><td align="center">int16_t</td><td align="left">accel_z</td><td align="left">Z axis acceleration (through)</td></tr><tr><td align="center">20</td><td align="center">int16_t</td><td align="left">gyro_x</td><td align="left">X axis rotation (across)</td></tr><tr><td align="center">22</td><td align="center">int16_t</td><td align="left">gyro_y</td><td align="left">Y axis rotation (along)</td></tr><tr><td align="center">24</td><td align="center">int16_t</td><td align="left">gyro_z</td><td align="left">Z axis rotation (through)</td></tr><tr><td align="center">26</td><td align="center">int16_t</td><td align="left">mag_x</td><td align="left">X field strength (across)</td></tr><tr><td align="center">28</td><td align="center">int16_t</td><td align="left">mag_y</td><td align="left">Y field strength (along)</td></tr><tr><td align="center">30</td><td align="center">int16_t</td><td align="left">mag_z</td><td align="left">Z field strength (through)</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 class="table"><a name="idm45387697940912"></a><p class="title"><b>Table 4. TeleMega Kalman and Voltage Data Packet Contents</b></p><div class="table-contents"><table summary="TeleMega Kalman and Voltage Data 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">v_batt</td><td align="left">battery voltage</td></tr><tr><td align="center">8</td><td align="center">int16_t</td><td align="left">v_pyro</td><td align="left">pyro battery voltage</td></tr><tr><td align="center">10</td><td align="center">int8_t[6]</td><td align="left">sense</td><td align="left">pyro continuity sense</td></tr><tr><td align="center">16</td><td align="center">int32_t</td><td align="left">ground_pres</td><td align="left">Average barometer reading on ground</td></tr><tr><td align="center">20</td><td align="center">int16_t</td><td align="left">ground_accel</td><td align="left">Average accelerometer reading on ground</td></tr><tr><td align="center">22</td><td align="center">int16_t</td><td align="left">accel_plus_g</td><td align="left">Accel calibration at +1g</td></tr><tr><td align="center">24</td><td align="center">int16_t</td><td align="left">accel_minus_g</td><td align="left">Accel calibration at -1g</td></tr><tr><td align="center">26</td><td align="center">int16_t</td><td align="left">acceleration</td><td align="left">m/s² * 16</td></tr><tr><td align="center">28</td><td align="center">int16_t</td><td align="left">speed</td><td align="left">m/s * 16</td></tr><tr><td align="center">30</td><td align="center">int16_t</td><td align="left">height</td><td align="left">m</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"><div class="titlepage"><div><div><h3 class="title"><a name="idm45387697911584"></a>2.4. TeleMetrum v2 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">0x0A</td><td align="left">TeleMetrum v2 Sensor Data</td></tr><tr><td align="center">0x0B</td><td align="left">TeleMetrum v2 Calibration Data</td></tr></tbody></table></div><p>
-       TeleMetrum v2 has higher resolution barometric data than
-       TeleMetrum v1, and so the constant calibration data is
-       split out into a separate packet.
-      </p><p>
-       TeleMetrum v2 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><p>
-       TeleMetrum v2 Calibration Data packets are always transmitted once per second.
-      </p><div class="table"><a name="idm45387697900336"></a><p class="title"><b>Table 5. TeleMetrum v2 Sensor Packet Contents</b></p><div class="table-contents"><table summary="TeleMetrum v2 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</td></tr><tr><td align="center">8</td><td align="center">int32_t</td><td align="left">pres</td><td align="left">pressure sensor (Pa * 10)</td></tr><tr><td align="center">12</td><td align="center">int16_t</td><td align="left">temp</td><td align="left">temperature sensor (°C * 100)</td></tr><tr><td align="center">14</td><td align="center">int16_t</td><td align="left">acceleration</td><td align="left">m/s² * 16</td></tr><tr><td align="center">16</td><td align="center">int16_t</td><td align="left">speed</td><td align="left">m/s * 16</td></tr><tr><td align="center">18</td><td align="center">int16_t</td><td align="left">height</td><td align="left">m</td></tr><tr><td align="center">20</td><td align="center">int16_t</td><td align="left">v_batt</td><td align="left">battery voltage</td></tr><tr><td align="center">22</td><td align="center">int16_t</td><td align="left">sense_d</td><td align="left">drogue continuity sense</td></tr><tr><td align="center">24</td><td align="center">int16_t</td><td align="left">sense_m</td><td align="left">main continuity sense</td></tr><tr><td align="center">26</td><td align="center">pad[6]</td><td align="left">pad bytes</td><td align="left"> </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 class="table"><a name="idm45387697871200"></a><p class="title"><b>Table 6. TeleMetrum v2 Calibration Data Packet Contents</b></p><div class="table-contents"><table summary="TeleMetrum v2 Calibration Data 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">pad[3]</td><td align="left">pad bytes</td><td align="left"> </td></tr><tr><td align="center">8</td><td align="center">int32_t</td><td align="left">ground_pres</td><td align="left">Average barometer reading on ground</td></tr><tr><td align="center">12</td><td align="center">int16_t</td><td align="left">ground_accel</td><td align="left">Average accelerometer reading on ground</td></tr><tr><td align="center">14</td><td align="center">int16_t</td><td align="left">accel_plus_g</td><td align="left">Accel calibration at +1g</td></tr><tr><td align="center">16</td><td align="center">int16_t</td><td align="left">accel_minus_g</td><td align="left">Accel calibration at -1g</td></tr><tr><td align="center">18</td><td align="center">pad[14]</td><td align="left">pad bytes</td><td align="left"> </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"><div class="titlepage"><div><div><h3 class="title"><a name="idm45387697850976"></a>2.5. 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="idm45387697841824"></a><p class="title"><b>Table 7. 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"><div class="titlepage"><div><div><h3 class="title"><a name="idm45387697816944"></a>2.6. 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
-       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="idm45387697807664"></a><p class="title"><b>Table 8. 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="idm45387697769600"></a><p class="title"><b>Table 9. 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="idm45387697753216"></a><p class="title"><b>Table 10. 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"><div class="titlepage"><div><div><h3 class="title"><a name="idm45387697735648"></a>2.7. 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="idm45387697726464"></a><p class="title"><b>Table 11. 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="idm45387697711184"></a><p class="title"><b>Table 12. 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 class="section"><div class="titlepage"><div><div><h3 class="title"><a name="idm45387697697056"></a>2.8. Companion Data 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">0x07</td><td align="left">Companion Data Data</td></tr></tbody></table></div><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><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 class="table"><a name="idm45387697687744"></a><p class="title"><b>Table 13. Companion Data Contents</b></p><div class="table-contents"><table summary="Companion 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">board_id</td><td align="left">Type of companion board attached</td></tr><tr><td align="right">6</td><td align="center">uint8_t</td><td align="left">update_period</td><td align="left">How often telemetry is sent, in 1/100ths of a second</td></tr><tr><td align="right">7</td><td align="center">uint8_t</td><td align="left">channels</td><td align="left">Number of data channels supplied</td></tr><tr><td align="right">8</td><td align="center">uint16_t[12]</td><td align="left">companion_data</td><td align="left">Up to 12 channels of 16-bit companion data</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></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idm45387697670160"></a>3. Data Transmission</h2></div></div></div><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 class="table"><a name="idm45387697668896"></a><p class="title"><b>Table 14. Altus Metrum Radio Parts</b></p><div class="table-contents"><table summary="Altus Metrum Radio Parts" border="1"><colgroup><col align="center" class="Part Number"><col align="center" class="Description"><col align="left" class="Used in"></colgroup><thead><tr><th align="center">Part Number</th><th align="center">Description</th><th align="center">Used in</th></tr></thead><tbody><tr><td align="center">CC1111</td><td align="center">10mW transceiver with integrated SoC</td><td align="left">TeleDongle v0.2, TeleBT v1.0, TeleMetrum v1.x, TeleMini</td></tr><tr><td align="center">CC1120</td><td align="center">35mW transceiver with SW FEC</td><td align="left">TeleMetrum v2, TeleMega</td></tr><tr><td align="center">CC1200</td><td align="center">35mW transceiver with HW FEC</td><td align="left">TeleDongle v3.0, TeleBT v3.0</td></tr><tr><td align="center">CC115L</td><td align="center">14mW transmitter with SW FEC</td><td align="left">TeleGPS</td></tr></tbody></table></div></div><br class="table-break"><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="idm45387697655920"></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.
-
-       While we might like to use something with better low-signal
-       performance like BPSK, the radios we use don'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.
-
-       For AltOS, there are three available bit rates, 38.4kBaud,
-       9.6kBaud and 2.4kBaud resulting in the following signal
-       parmeters:
-
-      </p><div class="table"><a name="idm45387697654080"></a><p class="title"><b>Table 15. Modulation Scheme</b></p><div class="table-contents"><table summary="Modulation Scheme" border="1"><colgroup><col align="center" class="rate"><col align="center" class="deviation"><col align="center" class="bandwidth"></colgroup><thead><tr><th align="center">Rate</th><th align="center">Deviation</th><th align="center">Receiver Bandwidth</th></tr></thead><tbody><tr><td align="center">38.4kBaud</td><td align="center">20.5kHz</td><td align="center">100kHz</td></tr><tr><td align="center">9.6kBaud</td><td align="center">5.125kHz</td><td align="center">25kHz</td></tr><tr><td align="center">2.4kBaud</td><td align="center">1.5kHz</td><td align="center">5kHz</td></tr></tbody></table></div></div><br class="table-break"></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="idm45387697642000"></a>3.2. Error Correction</h3></div></div></div><p>
-       The cc1111 and cc1200 provide forward error correction in
-       hardware; on the cc1120 and cc115l that's done in
-       software. AltOS uses this to improve reception of weak
-       signals. As it'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 class="table"><a name="idm45387697640624"></a><p class="title"><b>Table 16. Error Correction</b></p><div class="table-contents"><table summary="Error Correction" 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</td><td align="center">1/2 rate, 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"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idm45387697628320"></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="idm45387697625520"></a><p class="title"><b>Table 17. Packet Format</b></p><div class="table-contents"><table summary="Packet Format" 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"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idm45387697606544"></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>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>AltOS Telemetry</title><link rel="stylesheet" type="text/css" href="am.css" /><meta name="generator" content="DocBook XSL Stylesheets V1.79.1" /></head><body><div xml:lang="en" class="article" lang="en"><div class="titlepage"><div><div><h2 class="title"><a id="idm1"></a>AltOS Telemetry</h2></div><div><h3 class="subtitle"><em>Packet Definitions</em></h3></div><div><div class="author"><h3 class="author"><span class="firstname">Keith</span> <span class="surname">Packard</span></h3><code class="email">&lt;<a class="email" href="mailto:keithp@keithp.com">keithp@keithp.com</a>&gt;</code></div></div><div><p class="copyright">Copyright © 2011 Keith Packard</p></div><div><div class="legalnotice"><a id="idm13"></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><a href="telemetry-revhistory.html">Revision History</a></div></div><hr /></div><div class="toc"><p><strong>Table of Contents</strong></p><dl class="toc"><dt><span class="section"><a href="#_packet_format_design">1. Packet Format Design</a></span></dt><dt><span class="section"><a href="#_packet_formats">2. Packet Formats</a></span></dt><dd><dl><dt><span class="section"><a href="#_packet_header">2.1. Packet Header</a></span></dt><dt><span class="section"><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></span></dt><dt><span class="section"><a href="#_telemega_sensor_data">2.3. TeleMega Sensor Data</a></span></dt><dt><span class="section"><a href="#_telemetrum_v2_sensor_data">2.4. TeleMetrum v2 Sensor Data</a></span></dt><dt><span class="section"><a href="#_telemini_v3_0_sensor_data">2.5. TeleMini v3.0 Sensor Data</a></span></dt><dt><span class="section"><a href="#_configuration_data">2.6. Configuration Data</a></span></dt><dt><span class="section"><a href="#_gps_location">2.7. GPS Location</a></span></dt><dt><span class="section"><a href="#_gps_satellite_data">2.8. GPS Satellite Data</a></span></dt><dt><span class="section"><a href="#_companion_data">2.9. Companion Data</a></span></dt></dl></dd><dt><span class="section"><a href="#_data_transmission">3. Data Transmission</a></span></dt><dd><dl><dt><span class="section"><a href="#_modulation_scheme">3.1. Modulation Scheme</a></span></dt><dt><span class="section"><a href="#_error_correction">3.2. Error Correction</a></span></dt></dl></dd><dt><span class="section"><a href="#_teledongle_serial_packet_format">4. TeleDongle serial packet format</a></span></dt><dt><span class="section"><a href="#_history_and_motivation">5. History and Motivation</a></span></dt></dl></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="_packet_format_design"></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"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="_packet_formats"></a>2. Packet Formats</h2></div></div></div><p>This section first defines the packet header common to all packets
+and then the per-packet data layout.</p><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="_packet_header"></a>2.1. Packet Header</h3></div></div></div><div class="table"><a id="idm31"></a><p class="title"><strong>Table 1. Telemetry Packet Header</strong></p><div class="table-contents"><table class="table" summary="Telemetry Packet Header" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /><col class="col_4" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Offset</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Data Type</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Name</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>0</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>serial</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Device serial Number</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>2</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>tick</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Device time in 100ths of a second</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>4</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>type</p></td><td style="" align="left" valign="top"><p>Packet type</p></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"><div class="titlepage"><div><div><h3 class="title"><a id="_telemetrum_v1_x_telemini_v1_0_and_telenano_sensor_data"></a>2.2. TeleMetrum v1.x, TeleMini v1.0 and TeleNano Sensor Data</h3></div></div></div><div class="table"><a id="idm78"></a><p class="title"><strong>Table 2. Sensor Packet Type</strong></p><div class="table-contents"><table class="table" summary="Sensor Packet Type" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Type</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>0x01</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>TeleMetrum v1.x Sensor Data</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>0x02</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>TeleMini v1.0 Sensor Data</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>0x03</p></td><td style="" align="left" valign="top"><p>TeleNano Sensor Data</p></td></tr></tbody></table></div></div><br class="table-break" /><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><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 id="idm106"></a><p class="title"><strong>Table 3. Sensor Packet Contents</strong></p><div class="table-contents"><table class="table" summary="Sensor Packet Contents" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /><col class="col_4" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Offset</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Data Type</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Name</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>5</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>state</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Flight state</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>6</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>accel</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>accelerometer (TM only)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>8</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>pres</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>pressure sensor</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>10</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>temp</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>temperature sensor</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>12</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>v_batt</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>battery voltage</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>14</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>sense_d</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>drogue continuity sense (TM/Tm)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>16</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>sense_m</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>main continuity sense (TM/Tm)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>18</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>acceleration</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>m/s² * 16</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>20</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>speed</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>m/s * 16</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>22</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>height</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>m</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>24</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>ground_pres</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Average barometer reading on ground</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>26</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>ground_accel</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>TM</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>28</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>accel_plus_g</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>TM</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>30</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>accel_minus_g</p></td><td style="" align="left" valign="top"><p>TM</p></td></tr></tbody></table></div></div><br class="table-break" /></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="_telemega_sensor_data"></a>2.3. TeleMega Sensor Data</h3></div></div></div><div class="table"><a id="idm251"></a><p class="title"><strong>Table 4. TeleMega Packet Type</strong></p><div class="table-contents"><table class="table" summary="TeleMega Packet Type" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Type</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>0x08</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>TeleMega IMU Sensor Data</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>0x09</p></td><td style="" align="left" valign="top"><p>TeleMega Kalman and Voltage Data</p></td></tr></tbody></table></div></div><br class="table-break" /><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’t change very fast, and the Kalman
+values can be reconstructed from the IMU data.</p><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><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><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><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 class="table"><a id="idm277"></a><p class="title"><strong>Table 5. TeleMega IMU Sensor Packet Contents</strong></p><div class="table-contents"><table class="table" summary="TeleMega IMU Sensor Packet Contents" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /><col class="col_4" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Offset</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Data Type</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Name</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>5</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>orient</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Angle from vertical in degrees</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>6</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>accel</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>High G accelerometer</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>8</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int32_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>pres</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>pressure (Pa * 10)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>12</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>temp</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>temperature (°C * 100)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>14</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>accel_x</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>X axis acceleration (across)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>16</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>accel_y</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Y axis acceleration (along)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>18</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>accel_z</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Z axis acceleration (through)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>20</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>gyro_x</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>X axis rotation (across)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>22</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>gyro_y</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Y axis rotation (along)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>24</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>gyro_z</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Z axis rotation (through)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>26</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>mag_x</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>X field strength (across)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>28</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>mag_y</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Y field strength (along)</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>30</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>mag_z</p></td><td style="" align="left" valign="top"><p>Z field strength (through)</p></td></tr></tbody></table></div></div><br class="table-break" /><div class="table"><a id="idm411"></a><p class="title"><strong>Table 6. TeleMega Kalman and Voltage Data Packet Contents</strong></p><div class="table-contents"><table class="table" summary="TeleMega Kalman and Voltage Data Packet Contents" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /><col class="col_4" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Offset</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Data Type</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Name</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>5</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>state</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Flight state</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>6</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>v_batt</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>battery voltage</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>8</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>v_pyro</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>pyro battery voltage</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>10</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int8_t[6]</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>sense</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>pyro continuity sense</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>16</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int32_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>ground_pres</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Average barometer reading on ground</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>20</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>ground_accel</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Average accelerometer reading on ground</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>22</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>accel_plus_g</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Accel calibration at +1g</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>24</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>accel_minus_g</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Accel calibration at -1g</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>26</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>acceleration</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>m/s² * 16</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>28</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>speed</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>m/s * 16</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>30</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>height</p></td><td style="" align="left" valign="top"><p>m</p></td></tr></tbody></table></div></div><br class="table-break" /></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="_telemetrum_v2_sensor_data"></a>2.4. TeleMetrum v2 Sensor Data</h3></div></div></div><div class="table"><a id="idm529"></a><p class="title"><strong>Table 7. TeleMetrum v2 Packet Type</strong></p><div class="table-contents"><table class="table" summary="TeleMetrum v2 Packet Type" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Type</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>0x0A</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>TeleMetrum v2 Sensor Data</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>0x0B</p></td><td style="" align="left" valign="top"><p>TeleMetrum v2 Calibration Data</p></td></tr></tbody></table></div></div><br class="table-break" /><p>TeleMetrum v2 has higher resolution barometric data than
+TeleMetrum v1, and so the constant calibration data is
+split out into a separate packet.</p><p>TeleMetrum v2 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><p>TeleMetrum v2 Calibration Data packets are always transmitted once per second.</p><div class="table"><a id="idm553"></a><p class="title"><strong>Table 8. TeleMetrum v2 Sensor Packet Contents</strong></p><div class="table-contents"><table class="table" summary="TeleMetrum v2 Sensor Packet Contents" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /><col class="col_4" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Offset</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Data Type</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Name</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>5</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>state</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Flight state</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>6</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>accel</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>accelerometer</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>8</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int32_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>pres</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>pressure sensor (Pa * 10)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>12</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>temp</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>temperature sensor (°C * 100)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>14</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>acceleration</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>m/s² * 16</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>16</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>speed</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>m/s * 16</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>18</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>height</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>m</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>20</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>v_batt</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>battery voltage</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>22</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>sense_d</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>drogue continuity sense</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>24</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>sense_m</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>main continuity sense</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>26</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>pad[6]</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>pad bytes</p></td><td style="" align="left" valign="top"><p></p></td></tr></tbody></table></div></div><br class="table-break" /><div class="table"><a id="idm669"></a><p class="title"><strong>Table 9. TeleMetrum v2 Calibration Data Packet Contents</strong></p><div class="table-contents"><table class="table" summary="TeleMetrum v2 Calibration Data Packet Contents" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /><col class="col_4" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Offset</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Data Type</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Name</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>5</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>pad[3]</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>pad bytes</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p></p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>8</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int32_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>ground_pres</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Average barometer reading on ground</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>12</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>ground_accel</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Average accelerometer reading on ground</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>14</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>accel_plus_g</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Accel calibration at +1g</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>16</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>accel_minus_g</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Accel calibration at -1g</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>18</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>pad[14]</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>pad bytes</p></td><td style="" align="left" valign="top"><p></p></td></tr></tbody></table></div></div><br class="table-break" /></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="_telemini_v3_0_sensor_data"></a>2.5. TeleMini v3.0 Sensor Data</h3></div></div></div><div class="table"><a id="idm742"></a><p class="title"><strong>Table 10. Sensor Packet Type</strong></p><div class="table-contents"><table class="table" summary="Sensor Packet Type" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Type</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>0x11</p></td><td style="" align="left" valign="top"><p>TeleMini v3.0 Sensor Data</p></td></tr></tbody></table></div></div><br class="table-break" /><p>TeleMini v3.0 uses this
+packet format for sensor data.</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 id="idm760"></a><p class="title"><strong>Table 11. Sensor Packet Contents</strong></p><div class="table-contents"><table class="table" summary="Sensor Packet Contents" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /><col class="col_4" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Offset</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Data Type</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Name</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>5</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>state</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Flight state</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>6</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>v_batt</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>battery voltage</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>8</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>sense_a</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>apogee continuity sense</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>10</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>sense_m</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>main continuity sense</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>12</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int32_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>pres</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>pressure sensor (Pa * 10)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>16</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>temp</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>temperature sensor (°C * 100)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>18</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>acceleration</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>m/s² * 16</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>20</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>speed</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>m/s * 16</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>22</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>height</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>m</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>24</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>ground_pres</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Average barometer reading on ground</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>28</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>pad[4]</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>pad bytes</p></td><td style="" align="left" valign="top"><p></p></td></tr></tbody></table></div></div><br class="table-break" /></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="_configuration_data"></a>2.6. Configuration Data</h3></div></div></div><div class="table"><a id="idm878"></a><p class="title"><strong>Table 12. Configuration Packet Type</strong></p><div class="table-contents"><table class="table" summary="Configuration Packet Type" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Type</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>0x04</p></td><td style="" align="left" valign="top"><p>Configuration Data</p></td></tr></tbody></table></div></div><br class="table-break" /><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 id="idm896"></a><p class="title"><strong>Table 13. Configuration Packet Contents</strong></p><div class="table-contents"><table class="table" summary="Configuration Packet Contents" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /><col class="col_4" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Offset</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Data Type</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Name</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>5</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>type</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Device type</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>6</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>flight</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Flight number</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>8</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>config_major</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Config major version</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>9</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>config_minor</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Config minor version</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>10</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>apogee_delay</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Apogee deploy delay in seconds</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>12</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>main_deploy</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Main deploy alt in meters</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>14</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>flight_log_max</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Maximum flight log size (kB)</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>16</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>char</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>callsign[8]</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Radio operator identifier</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>24</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>char</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>version[8]</p></td><td style="" align="left" valign="top"><p>Software version identifier</p></td></tr></tbody></table></div></div><br class="table-break" /></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="_gps_location"></a>2.7. GPS Location</h3></div></div></div><div class="table"><a id="idm996"></a><p class="title"><strong>Table 14. GPS Packet Type</strong></p><div class="table-contents"><table class="table" summary="GPS Packet Type" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Type</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>0x05</p></td><td style="" align="left" valign="top"><p>GPS Location</p></td></tr></tbody></table></div></div><br class="table-break" /><p>This packet provides all of the information available from the
+GPS receiver—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 id="idm1014"></a><p class="title"><strong>Table 15. GPS Location Packet Contents</strong></p><div class="table-contents"><table class="table" summary="GPS Location Packet Contents" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /><col class="col_4" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Offset</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Data Type</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Name</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>5</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>flags</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>See GPS Flags table below</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>6</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>altitude</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>m</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>8</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int32_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>latitude</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>degrees * 107</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>12</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int32_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>longitude</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>degrees * 107</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>16</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>year</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p></p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>17</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>month</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p></p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>18</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>day</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p></p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>19</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>hour</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p></p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>20</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>minute</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p></p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>21</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>second</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p></p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>22</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>pdop</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>* 5</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>23</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>hdop</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>* 5</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>24</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>vdop</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>* 5</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>25</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>mode</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>See GPS Mode table below</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>26</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>ground_speed</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>cm/s</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>28</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>int16_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>climb_rate</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>cm/s</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>30</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>course</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>/ 2</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>31</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>unused[1]</p></td><td style="" align="left" valign="top"><p></p></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 id="idm1194"></a><p class="title"><strong>Table 16. GPS Flags</strong></p><div class="table-contents"><table class="table" summary="GPS Flags" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Bits</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Name</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>0-3</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>nsats</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Number of satellites in solution</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>4</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>valid</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>GPS solution is valid</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>5</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>running</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>GPS receiver is operational</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>6</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>date_valid</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Reported date is valid</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>7</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>course_valid</p></td><td style="" align="left" valign="top"><p>ground speed, course and climb rates are valid</p></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 <span class="emphasis"><em>N</em></span> (not valid),
+<span class="emphasis"><em>A</em></span> (Autonomous) modes or <span class="emphasis"><em>E</em></span> (Estimated). The
+remaining modes are either testing modes or require
+additional data.</p><div class="table"><a id="idm1247"></a><p class="title"><strong>Table 17. GPS Mode</strong></p><div class="table-contents"><table class="table" summary="GPS Mode" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Mode</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Name</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>N</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Not Valid</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>All data are invalid</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>A</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Autonomous mode</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Data are derived from satellite data</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>D</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Differential Mode</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>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 style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>E</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Estimated</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Data are estimated using dead reckoning from the
+last known data</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>M</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Manual</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Data were entered manually</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>S</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>Simulated</p></td><td style="" align="left" valign="top"><p>GPS receiver testing mode</p></td></tr></tbody></table></div></div><br class="table-break" /></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="_gps_satellite_data"></a>2.8. GPS Satellite Data</h3></div></div></div><div class="table"><a id="idm1305"></a><p class="title"><strong>Table 18. GPS Satellite Data Packet Type</strong></p><div class="table-contents"><table class="table" summary="GPS Satellite Data Packet Type" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Type</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>0x06</p></td><td style="" align="left" valign="top"><p>GPS Satellite Data</p></td></tr></tbody></table></div></div><br class="table-break" /><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 id="idm1323"></a><p class="title"><strong>Table 19. GPS Satellite Data Contents</strong></p><div class="table-contents"><table class="table" summary="GPS Satellite Data Contents" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /><col class="col_4" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Offset</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Data Type</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Name</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>5</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>channels</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Number of reported satellite information</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>6</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>sat_info_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>sats[12]</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>See Per-Satellite data table below</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>30</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>unused[2]</p></td><td style="" align="left" valign="top"><p></p></td></tr></tbody></table></div></div><br class="table-break" /><div class="table"><a id="idm1367"></a><p class="title"><strong>Table 20. GPS Per-Satellite data (sat_info_t)</strong></p><div class="table-contents"><table class="table" summary="GPS Per-Satellite data (sat_info_t)" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /><col class="col_4" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Offset</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Data Type</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Name</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>0</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>svid</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Space Vehicle Identifier</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>1</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>c_n_1</p></td><td style="" align="left" valign="top"><p>C/N1 signal quality indicator</p></td></tr></tbody></table></div></div><br class="table-break" /></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="_companion_data"></a>2.9. Companion Data</h3></div></div></div><div class="table"><a id="idm1404"></a><p class="title"><strong>Table 21. Companion Data Packet Type</strong></p><div class="table-contents"><table class="table" summary="Companion Data Packet Type" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Type</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>0x07</p></td><td style="" align="left" valign="top"><p>Companion Data</p></td></tr></tbody></table></div></div><br class="table-break" /><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><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 class="table"><a id="idm1422"></a><p class="title"><strong>Table 22. Companion Data Contents</strong></p><div class="table-contents"><table class="table" summary="Companion Data Contents" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /><col class="col_4" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Offset</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Data Type</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Name</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>5</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>board_id</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Type of companion board attached</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>6</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>update_period</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>How often telemetry is sent, in 1/100ths of a second</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>7</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>uint8_t</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>channels</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Number of data channels supplied</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>8</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>uint16_t[12]</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>companion_data</p></td><td style="" align="left" valign="top"><p>Up to 12 channels of 16-bit companion data</p></td></tr></tbody></table></div></div><br class="table-break" /></div></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="_data_transmission"></a>3. Data Transmission</h2></div></div></div><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 class="table"><a id="idm1478"></a><p class="title"><strong>Table 23. Altus Metrum Radio Parts</strong></p><div class="table-contents"><table class="table" summary="Altus Metrum Radio Parts" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Part Number</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Used in</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>CC1111</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>10mW transceiver with integrated SoC</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>TeleDongle v0.2, TeleBT v1.0, TeleMetrum v1.x, TeleMini</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>CC1120</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>35mW transceiver with SW FEC</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>TeleMetrum v2, TeleMega</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>CC1200</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>35mW transceiver with HW FEC</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>TeleDongle v3.0, TeleBT v3.0</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>CC115L</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>14mW transmitter with SW FEC</p></td><td style="" align="left" valign="top"><p>TeleGPS</p></td></tr></tbody></table></div></div><br class="table-break" /><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="_modulation_scheme"></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.</p><p>While we might like to use something with better
+low-signal performance like BPSK, the radios we use
+don’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><p>For AltOS, there are three available bit rates,
+38.4kBaud, 9.6kBaud and 2.4kBaud resulting in the
+following signal parmeters:</p><div class="table"><a id="idm1525"></a><p class="title"><strong>Table 24. Modulation Scheme</strong></p><div class="table-contents"><table class="table" summary="Modulation Scheme" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Rate</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Deviation</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Receiver Bandwidth</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>38.4kBaud</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>20.5kHz</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>100kHz</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>9.6kBaud</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>5.125kHz</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>25kHz</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>2.4kBaud</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>1.5kHz</p></td><td style="" align="left" valign="top"><p>5kHz</p></td></tr></tbody></table></div></div><br class="table-break" /></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="_error_correction"></a>3.2. Error Correction</h3></div></div></div><p>The cc1111 and cc1200 provide forward error correction
+in hardware; on the cc1120 and cc115l that’s done in
+software. AltOS uses this to improve reception of weak
+signals. As it’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 class="table"><a id="idm1563"></a><p class="title"><strong>Table 25. Error Correction</strong></p><div class="table-contents"><table class="table" summary="Error Correction" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Parameter</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Value</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Error Correction</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Convolutional coding</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>1/2 rate, constraint length m=4</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Interleaving</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>4 x 4</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Reduce effect of noise burst</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>Data Whitening</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>XOR with 9-bit PNR</p></td><td style="" align="left" valign="top"><p>Rotate right with bit 8 = bit 0 xor bit 5, initial value 111111111</p></td></tr></tbody></table></div></div><br class="table-break" /></div></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="_teledongle_serial_packet_format"></a>4. TeleDongle serial 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="literallayout">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 id="idm1603"></a><p class="title"><strong>Table 26. TeleDongle serial Packet Format</strong></p><div class="table-contents"><table class="table" summary="TeleDongle serial Packet Format" cellpadding="4px" style="border-collapse: collapse;border-top: 1px solid #78079a; border-bottom: 1px solid #78079a; border-left: 1px solid #78079a; border-right: 1px solid #78079a; "><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /><col class="col_4" /></colgroup><tbody><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Offset</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Name</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Example</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Description</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>0</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>length</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>22</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Total length of data bytes in the line. Note that
+this includes the added RSSI and status bytes</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>1 ·· length-3</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>packet</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>4f ·· 00</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Bytes of actual packet data</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>length-2</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>rssi</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>3f</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Received signal strength. dBm = rssi / 2 - 74</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>length-1</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>lqi</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>a9</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Link Quality Indicator and CRC status. Bit 7
+is set when the CRC is correct</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>length</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>checksum</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>88</p></td><td style="" align="left" valign="top"><p>(0x5a + sum(bytes 1 ·· length-1)) % 256</p></td></tr></tbody></table></div></div><br class="table-break" /></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="_history_and_motivation"></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—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—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—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>
\ No newline at end of file