b9a684b611ab67ce7223b1448ce76b53354c5217
[web/altusmetrum] / AltOS / doc / companion.html
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!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 Companion Port</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 Companion Port</h2></div><div><h3 class="subtitle"><em>Protocol 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 © 2012 Keith Packard</p></div><div><div class="legalnotice"><a id="idm13"></a><p>
3     This document is released under the terms of the
4     <a class="ulink" href="http://creativecommons.org/licenses/by-sa/3.0/" target="_top">
5       Creative Commons ShareAlike 3.0
6     </a>
7     license.
8   </p></div></div><div><a href="companion-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="#_companion_port">1. Companion Port</a></span></dt><dt><span class="section"><a href="#_companion_spi_protocol">2. Companion SPI Protocol</a></span></dt><dt><span class="section"><a href="#_spi_message_formats">3. SPI Message Formats</a></span></dt><dd><dl><dt><span class="section"><a href="#_setup_reply_message">3.1. SETUP reply message</a></span></dt><dt><span class="section"><a href="#_fetch_reply_message">3.2. FETCH reply message</a></span></dt></dl></dd><dt><span class="section"><a href="#_history_and_motivation">4. History and Motivation</a></span></dt></dl></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="_companion_port"></a>1. Companion Port</h2></div></div></div><p>Many Altus Metrum products come with an eight pin Micro MaTch
9 connector, called the Companion Port. This is often used to
10 program devices using a programming cable. However, it can
11 also be used to connect TeleMetrum to external companion
12 boards (hence the name).</p><p>The Companion Port provides two different functions:</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
13 Power. Both battery-level and 3.3V regulated power are
14 available. Note that the amount of regulated power is not
15 huge; TeleMetrum contains a 150mA regulator and uses, at
16 peak, about 120mA or so. For applications needing more than
17 a few dozen mA, placing a separate regulator on them and
18 using the battery for power is probably a good idea.
19 </li><li class="listitem">
20 SPI. The flight computer operates as a SPI master, using
21 a protocol defined in this document. Companion boards
22 provide a matching SPI slave implementation which supplies
23 telemetry information for the radio downlink during flight
24 </li></ul></div></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="_companion_spi_protocol"></a>2. Companion SPI Protocol</h2></div></div></div><p>The flight computer implements a SPI master communications
25 channel over the companion port, and uses this to get
26 information about a connected companion board and then to get
27 telemetry data for transmission during flight.</p><p>At startup time, the flight computer sends a setup request
28 packet, and the companion board returns a board identifier,
29 the desired telemetry update period and the number of data
30 channels provided. The flight computer doesn’t interpret the
31 telemetry data at all, simply packing it up and sending it
32 over the link.  Telemetry packets are 32 bytes long, and
33 companion packets use 8 bytes as a header leaving room for a
34 maximum of 12 16-bit data values.</p><p>Because of the limits of the AVR processors used in the first
35 two companion boards, the SPI data rate is set to 187.5kbaud.</p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="_spi_message_formats"></a>3. SPI Message Formats</h2></div></div></div><p>This section first defines the command message format sent from
36 the flight computer to the companion board, and then the various
37 reply message formats for each type of command message.</p><div class="table"><a id="idm38"></a><p class="title"><strong>Table 1. Companion Command Message</strong></p><div class="table-contents"><table class="table" summary="Companion Command Message" 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>command</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Command identifier</p></td></tr><tr><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>1</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>flight_state</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Current flight computer state</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>Flight computer clock (100 ticks/second)</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>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>Flight computer serial number</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; " align="left" valign="top"><p>8</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p></p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p></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="idm109"></a><p class="title"><strong>Table 2. Companion Command Identifiers</strong></p><div class="table-contents"><table class="table" summary="Companion Command Identifiers" 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>Value</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>1</p></td><td style="border-right: 1px solid #78079a; border-bottom: 1px solid #78079a; " align="left" valign="top"><p>SETUP</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Supply the flight computer with companion
38 information</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>FETCH</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Return telemetry information</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>3</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>NOTIFY</p></td><td style="" align="left" valign="top"><p>Tell companion board when flight state changes</p></td></tr></tbody></table></div></div><br class="table-break" /><p>The flight computer will send a SETUP message shortly after
39 power-up and will then send FETCH messages no more often than
40 the rate specified in the SETUP reply. NOTIFY messages will be
41 sent whenever the flight state changes.</p><p><span class="emphasis"><em>flight_state</em></span> records the current state of the flight,
42 whether on the pad, under power, coasting to apogee or
43 descending on the drogue or main chute.</p><p><span class="emphasis"><em>tick</em></span> provides the current flight computer clock, which
44 be used to synchronize data recorded on the flight computer
45 with that recorded on the companion board in post-flight analysis.</p><p><span class="emphasis"><em>serial</em></span> is the product serial number of the flight computer,
46 <span class="emphasis"><em>flight</em></span> is the flight sequence number. Together, these two
47 uniquely identify the flight and can be recorded with any
48 companion board data logging to associate the companion data
49 with the proper flight.</p><p>NOTIFY commands require no reply at all, they are used solely
50 to inform the companion board when the state of the flight, as
51 computed by the flight computer, changes. Companion boards can
52 use this to change data collection parameters, disabling data
53 logging until the flight starts and terminating it when the
54 flight ends.</p><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="_setup_reply_message"></a>3.1. SETUP reply message</h3></div></div></div><div class="table"><a id="idm155"></a><p class="title"><strong>Table 3. SETUP reply contents</strong></p><div class="table-contents"><table class="table" summary="SETUP reply 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>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>board_id</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>Board identifier</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>board_id_inverse</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>~board_id—used to tell if a board is present</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>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>Minimum time (in 100Hz ticks) between FETCH commands</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 data channels to retrieve in FETCH command</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>6</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p></p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p></p></td><td style="" align="left" valign="top"><p></p></td></tr></tbody></table></div></div><br class="table-break" /><p>The SETUP reply contains enough information to uniquely
55 identify the companion board to the end user as well as for
56 the flight computer to know how many data values to expect in
57 reply to a FETCH command, and how often to fetch that data.</p><p>To detect the presence of a companion board, the flight
58 computer checks to make sure that board_id_inverse is the
59 bit-wise inverse of board_id. Current companion boards use
60 USB product ID as the board_id, but the flight computer does
61 not interpret this data and so it can be any value.</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="_fetch_reply_message"></a>3.2. FETCH reply message</h3></div></div></div><div class="table"><a id="idm221"></a><p class="title"><strong>Table 4. FETCH reply contents</strong></p><div class="table-contents"><table class="table" summary="FETCH reply 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>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>data0</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>0th data item</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>data1</p></td><td style="border-bottom: 1px solid #78079a; " align="left" valign="top"><p>1st data item</p></td></tr><tr><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p>…</p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p></p></td><td style="border-right: 1px solid #78079a; " align="left" valign="top"><p></p></td><td style="" align="left" valign="top"><p></p></td></tr></tbody></table></div></div><br class="table-break" /><p>The FETCH reply contains arbitrary data to be reported
62 over the flight computer telemetry link. The number of
63 16-bit data items must match the <span class="emphasis"><em>channels</em></span> value
64 provided in the SETUP reply message.</p></div></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="_history_and_motivation"></a>4. History and Motivation</h2></div></div></div><p>To allow cross-programming, the original TeleMetrum and
65 TeleDongle designs needed to include some kind of
66 connector. With that in place, adding the ability to connect
67 external cards to TeleMetrum was fairly simple. We set the
68 software piece of this puzzle aside until we had a companion
69 board to use.</p><p>The first companion board was TeleScience. Designed to collect
70 temperature data from the nose and fin of the airframe, the main
71 requirement for the companion port was that it be able to report
72 telemetry data during flight as a back-up in case the
73 TeleScience on-board data was lost.</p><p>The second companion board, TelePyro, provides 8 additional
74 channels for deployment, staging or other activities. To avoid
75 re-programming the TeleMetrum to use TelePyro, we decided to
76 provide enough information over the companion link for it to
77 independently control those channels.</p><p>Providing a standard, constant interface between the flight
78 computer and companion boards allows for the base flight
79 computer firmware to include support for companion boards.</p></div></div></body></html>