summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/.gitignore3
-rw-r--r--doc/Makefile57
-rw-r--r--doc/altos.xsl1291
-rw-r--r--doc/altusmetrum.xsl2495
-rw-r--r--doc/companion.xsl347
-rw-r--r--doc/megametrum-outline.pdfbin0 -> 4349 bytes
-rw-r--r--doc/megametrum-outline.svg244
-rw-r--r--doc/release-notes-0.7.1.xsl57
-rw-r--r--doc/release-notes-0.8.xsl56
-rw-r--r--doc/release-notes-0.9.2.xsl20
-rw-r--r--doc/release-notes-0.9.xsl31
-rw-r--r--doc/release-notes-1.0.1.xsl103
-rw-r--r--doc/release-notes-1.1.xsl94
-rw-r--r--doc/telemetrum-outline.pdfbin0 -> 2047 bytes
-rw-r--r--doc/telemetrum-outline.svg207
-rw-r--r--doc/telemetry.xsl806
16 files changed, 5811 insertions, 0 deletions
diff --git a/doc/.gitignore b/doc/.gitignore
new file mode 100644
index 00000000..54ca39bc
--- /dev/null
+++ b/doc/.gitignore
@@ -0,0 +1,3 @@
+*.html
+*.pdf
+*.fo
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 00000000..fbe8bc11
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,57 @@
+#
+# http://docbook.sourceforge.net/release/xsl/current/README
+#
+
+RELNOTES=\
+ release-notes-0.7.1.html \
+ release-notes-0.8.html \
+ release-notes-0.9.html \
+ release-notes-0.9.2.html \
+ release-notes-1.0.1.html \
+ release-notes-1.1.html
+
+RELNOTES_XSL=$(RELNOTES:.html=.xsl)
+HTML=altusmetrum.html altos.html telemetry.html companion.html $(RELNOTES)
+PDF=altusmetrum.pdf altos.pdf telemetry.pdf companion.pdf
+DOC=$(HTML) $(PDF)
+HTMLSTYLE=/usr/share/xml/docbook/stylesheet/docbook-xsl/html/docbook.xsl
+FOSTYLE=/usr/share/xml/docbook/stylesheet/docbook-xsl/fo/docbook.xsl
+PDFSTYLE=
+
+.SUFFIXES: .xsl .html .fo .pdf
+
+XSLTFLAGS=--stringparam section.autolabel 1 --xinclude
+
+.xsl.html:
+ xsltproc $(XSLTFLAGS) -o $@ $(HTMLSTYLE) $*.xsl
+
+.xsl.fo:
+ xsltproc $(XSLTFLAGS) -o $@ $(FOSTYLE) $*.xsl
+
+.fo.pdf:
+ fop -fo $*.fo -pdf $@
+
+all: $(HTML) $(PDF)
+
+install: all
+
+publish: $(DOC)
+ cp $(DOC) /home/bdale/web/altusmetrum/AltOS/doc/
+ (cd /home/bdale/web/altusmetrum ; \
+ git add /home/bdale/web/altusmetrum/AltOS/doc/* ; \
+ echo "update docs" | \
+ git commit -F - /home/bdale/web/altusmetrum/AltOS/doc/* ; \
+ git push)
+
+clean:
+ rm -f $(HTML) $(PDF) *.fo
+
+distclean:
+ rm -f $(HTML) $(PDF) *.fo
+
+altusmetrum.html: $(RELNOTES_XSL)
+altusmetrum.fo: $(RELNOTES_XSL)
+
+indent: altusmetrum.xsl
+ xmlindent -i 2 < altusmetrum.xsl > altusmetrum.new
+
diff --git a/doc/altos.xsl b/doc/altos.xsl
new file mode 100644
index 00000000..37bb58da
--- /dev/null
+++ b/doc/altos.xsl
@@ -0,0 +1,1291 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd">
+
+<book>
+ <title>AltOS</title>
+ <subtitle>Altos Metrum Operating System</subtitle>
+ <bookinfo>
+ <author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ </author>
+ <copyright>
+ <year>2010</year>
+ <holder>Keith Packard</holder>
+ </copyright>
+ <legalnotice>
+ <para>
+ This document is released under the terms of the
+ <ulink url="http://creativecommons.org/licenses/by-sa/3.0/">
+ Creative Commons ShareAlike 3.0
+ </ulink>
+ license.
+ </para>
+ </legalnotice>
+ <revhistory>
+ <revision>
+ <revnumber>0.1</revnumber>
+ <date>22 November 2010</date>
+ <revremark>Initial content</revremark>
+ </revision>
+ </revhistory>
+ </bookinfo>
+ <chapter>
+ <title>Overview</title>
+ <para>
+ AltOS is a operating system built for the 8051-compatible
+ processor found in the TI cc1111 microcontroller. It's designed
+ to be small and easy to program with. The main features are:
+ <itemizedlist>
+ <listitem>
+ <para>Multi-tasking. While the 8051 doesn't provide separate
+ address spaces, it's often easier to write code that operates
+ in separate threads instead of tying everything into one giant
+ event loop.
+ </para>
+ </listitem>
+ <listitem>
+ <para>Non-preemptive. This increases latency for thread
+ switching but reduces the number of places where context
+ switching can occur. It also simplifies the operating system
+ design somewhat. Nothing in the target system (rocket flight
+ control) has tight timing requirements, and so this seems like
+ a reasonable compromise.
+ </para>
+ </listitem>
+ <listitem>
+ <para>Sleep/wakeup scheduling. Taken directly from ancient
+ Unix designs, these two provide the fundemental scheduling
+ primitive within AltOS.
+ </para>
+ </listitem>
+ <listitem>
+ <para>Mutexes. As a locking primitive, mutexes are easier to
+ use than semaphores, at least in my experience.
+ </para>
+ </listitem>
+ <listitem>
+ <para>Timers. Tasks can set an alarm which will abort any
+ pending sleep, allowing operations to time-out instead of
+ blocking forever.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ The device drivers and other subsystems in AltOS are
+ conventionally enabled by invoking their _init() function from
+ the 'main' function before that calls
+ ao_start_scheduler(). These functions initialize the pin
+ assignments, add various commands to the command processor and
+ may add tasks to the scheduler to handle the device. A typical
+ main program, thus, looks like:
+ <programlisting>
+ void
+ main(void)
+ {
+ ao_clock_init();
+
+ /* Turn on the LED until the system is stable */
+ ao_led_init(LEDS_AVAILABLE);
+ ao_led_on(AO_LED_RED);
+ ao_timer_init();
+ ao_cmd_init();
+ ao_usb_init();
+ ao_monitor_init(AO_LED_GREEN, TRUE);
+ ao_rssi_init(AO_LED_RED);
+ ao_radio_init();
+ ao_packet_slave_init();
+ ao_packet_master_init();
+ #if HAS_DBG
+ ao_dbg_init();
+ #endif
+ ao_config_init();
+ ao_start_scheduler();
+ }
+ </programlisting>
+ As you can see, a long sequence of subsystems are initialized
+ and then the scheduler is started.
+ </para>
+ </chapter>
+ <chapter>
+ <title>Programming the 8051 with SDCC</title>
+ <para>
+ The 8051 is a primitive 8-bit processor, designed in the mists
+ of time in as few transistors as possible. The architecture is
+ highly irregular and includes several separate memory
+ spaces. Furthermore, accessing stack variables is slow, and the
+ stack itself is of limited size. While SDCC papers over the
+ instruction set, it is not completely able to hide the memory
+ architecture from the application designer.
+ </para>
+ <section>
+ <title>8051 memory spaces</title>
+ <para>
+ The __data/__xdata/__code memory spaces below were completely
+ separate in the original 8051 design. In the cc1111, this
+ isn't true—they all live in a single unified 64kB address
+ space, and so it's possible to convert any address into a
+ unique 16-bit address. SDCC doesn't know this, and so a
+ 'global' address to SDCC consumes 3 bytes of memory, 1 byte as
+ a tag indicating the memory space and 2 bytes of offset within
+ that space. AltOS avoids these 3-byte addresses as much as
+ possible; using them involves a function call per byte
+ access. The result is that nearly every variable declaration
+ is decorated with a memory space identifier which clutters the
+ code but makes the resulting code far smaller and more
+ efficient.
+ </para>
+ <section>
+ <title>__data</title>
+ <para>
+ The 8051 can directly address these 128 bytes of
+ memory. This makes them precious so they should be
+ reserved for frequently addressed values. Oh, just to
+ confuse things further, the 8 general registers in the
+ CPU are actually stored in this memory space. There are
+ magic instructions to 'bank switch' among 4 banks of
+ these registers located at 0x00 - 0x1F. AltOS uses only
+ the first bank at 0x00 - 0x07, leaving the other 24
+ bytes available for other data.
+ </para>
+ </section>
+ <section>
+ <title>__idata</title>
+ <para>
+ There are an additional 128 bytes of internal memory
+ that share the same address space as __data but which
+ cannot be directly addressed. The stack normally
+ occupies this space and so AltOS doesn't place any
+ static storage here.
+ </para>
+ </section>
+ <section>
+ <title>__xdata</title>
+ <para>
+ This is additional general memory accessed through a
+ single 16-bit address register. The CC1111F32 has 32kB
+ of memory available here. Most program data should live
+ in this memory space.
+ </para>
+ </section>
+ <section>
+ <title>__pdata</title>
+ <para>
+ This is an alias for the first 256 bytes of __xdata
+ memory, but uses a shorter addressing mode with
+ single global 8-bit value for the high 8 bits of the
+ address and any of several 8-bit registers for the low 8
+ bits. AltOS uses a few bits of this memory, it should
+ probably use more.
+ </para>
+ </section>
+ <section>
+ <title>__code</title>
+ <para>
+ All executable code must live in this address space, but
+ you can stick read-only data here too. It is addressed
+ using the 16-bit address register and special 'code'
+ access opcodes. Anything read-only should live in this space.
+ </para>
+ </section>
+ <section>
+ <title>__bit</title>
+ <para>
+ The 8051 has 128 bits of bit-addressible memory that
+ lives in the __data segment from 0x20 through
+ 0x2f. Special instructions access these bits
+ in a single atomic operation. This isn't so much a
+ separate address space as a special addressing mode for
+ a few bytes in the __data segment.
+ </para>
+ </section>
+ <section>
+ <title>__sfr, __sfr16, __sfr32, __sbit</title>
+ <para>
+ Access to physical registers in the device use this mode
+ which declares the variable name, it's type and the
+ address it lives at. No memory is allocated for these
+ variables.
+ </para>
+ </section>
+ </section>
+ <section>
+ <title>Function calls on the 8051</title>
+ <para>
+ Because stack addressing is expensive, and stack space
+ limited, the default function call declaration in SDCC
+ allocates all parameters and local variables in static global
+ memory. Just like fortran. This makes these functions
+ non-reentrant, and also consume space for parameters and
+ locals even when they are not running. The benefit is smaller
+ code and faster execution.
+ </para>
+ <section>
+ <title>__reentrant functions</title>
+ <para>
+ All functions which are re-entrant, either due to recursion
+ or due to a potential context switch while executing, should
+ be marked as __reentrant so that their parameters and local
+ variables get allocated on the stack. This ensures that
+ these values are not overwritten by another invocation of
+ the function.
+ </para>
+ <para>
+ Functions which use significant amounts of space for
+ arguments and/or local variables and which are not often
+ invoked can also be marked as __reentrant. The resulting
+ code will be larger, but the savings in memory are
+ frequently worthwhile.
+ </para>
+ </section>
+ <section>
+ <title>Non __reentrant functions</title>
+ <para>
+ All parameters and locals in non-reentrant functions can
+ have data space decoration so that they are allocated in
+ __xdata, __pdata or __data space as desired. This can avoid
+ consuming __data space for infrequently used variables in
+ frequently used functions.
+ </para>
+ <para>
+ All library functions called by SDCC, including functions
+ for multiplying and dividing large data types, are
+ non-reentrant. Because of this, interrupt handlers must not
+ invoke any library functions, including the multiply and
+ divide code.
+ </para>
+ </section>
+ <section>
+ <title>__interrupt functions</title>
+ <para>
+ Interrupt functions are declared with with an __interrupt
+ decoration that includes the interrupt number. SDCC saves
+ and restores all of the registers in these functions and
+ uses the 'reti' instruction at the end so that they operate
+ as stand-alone interrupt handlers. Interrupt functions may
+ call the ao_wakeup function to wake AltOS tasks.
+ </para>
+ </section>
+ <section>
+ <title>__critical functions and statements</title>
+ <para>
+ SDCC has built-in support for suspending interrupts during
+ critical code. Functions marked as __critical will have
+ interrupts suspended for the whole period of
+ execution. Individual statements may also be marked as
+ __critical which blocks interrupts during the execution of
+ that statement. Keeping critical sections as short as
+ possible is key to ensuring that interrupts are handled as
+ quickly as possible.
+ </para>
+ </section>
+ </section>
+ </chapter>
+ <chapter>
+ <title>Task functions</title>
+ <para>
+ This chapter documents how to create, destroy and schedule AltOS tasks.
+ </para>
+ <section>
+ <title>ao_add_task</title>
+ <programlisting>
+ void
+ ao_add_task(__xdata struct ao_task * task,
+ void (*start)(void),
+ __code char *name);
+ </programlisting>
+ <para>
+ This initializes the statically allocated task structure,
+ assigns a name to it (not used for anything but the task
+ display), and the start address. It does not switch to the
+ new task. 'start' must not ever return; there is no place
+ to return to.
+ </para>
+ </section>
+ <section>
+ <title>ao_exit</title>
+ <programlisting>
+ void
+ ao_exit(void)
+ </programlisting>
+ <para>
+ This terminates the current task.
+ </para>
+ </section>
+ <section>
+ <title>ao_sleep</title>
+ <programlisting>
+ void
+ ao_sleep(__xdata void *wchan)
+ </programlisting>
+ <para>
+ This suspends the current task until 'wchan' is signaled
+ by ao_wakeup, or until the timeout, set by ao_alarm,
+ fires. If 'wchan' is signaled, ao_sleep returns 0, otherwise
+ it returns 1. This is the only way to switch to another task.
+ </para>
+ <para>
+ Because ao_wakeup wakes every task waiting on a particular
+ location, ao_sleep should be used in a loop that first
+ checks the desired condition, blocks in ao_sleep and then
+ rechecks until the condition is satisfied. If the
+ location may be signaled from an interrupt handler, the
+ code will need to block interrupts by using the __critical
+ label around the block of code. Here's a complete example:
+ <programlisting>
+ __critical while (!ao_radio_done)
+ ao_sleep(&amp;ao_radio_done);
+ </programlisting>
+ </para>
+ </section>
+ <section>
+ <title>ao_wakeup</title>
+ <programlisting>
+ void
+ ao_wakeup(__xdata void *wchan)
+ </programlisting>
+ <para>
+ Wake all tasks blocked on 'wchan'. This makes them
+ available to be run again, but does not actually switch
+ to another task. Here's an example of using this:
+ <programlisting>
+ if (RFIF &amp; RFIF_IM_DONE) {
+ ao_radio_done = 1;
+ ao_wakeup(&amp;ao_radio_done);
+ RFIF &amp;= ~RFIF_IM_DONE;
+ }
+ </programlisting>
+ Note that this need not be enclosed in __critical as the
+ ao_sleep block can only be run from normal mode, and so
+ this sequence can never be interrupted with execution of
+ the other sequence.
+ </para>
+ </section>
+ <section>
+ <title>ao_alarm</title>
+ <programlisting>
+ void
+ ao_alarm(uint16_t delay)
+ </programlisting>
+ <para>
+ Schedules an alarm to fire in at least 'delay' ticks. If
+ the task is asleep when the alarm fires, it will wakeup
+ and ao_sleep will return 1.
+ <programlisting>
+ ao_alarm(ao_packet_master_delay);
+ __critical while (!ao_radio_dma_done)
+ if (ao_sleep(&amp;ao_radio_dma_done) != 0)
+ ao_radio_abort();
+ </programlisting>
+ In this example, a timeout is set before waiting for
+ incoming radio data. If no data is received before the
+ timeout fires, ao_sleep will return 1 and then this code
+ will abort the radio receive operation.
+ </para>
+ </section>
+ <section>
+ <title>ao_start_scheduler</title>
+ <programlisting>
+ void
+ ao_start_scheduler(void)
+ </programlisting>
+ <para>
+ This is called from 'main' when the system is all
+ initialized and ready to run. It will not return.
+ </para>
+ </section>
+ <section>
+ <title>ao_clock_init</title>
+ <programlisting>
+ void
+ ao_clock_init(void)
+ </programlisting>
+ <para>
+ This turns on the external 48MHz clock then switches the
+ hardware to using it. This is required by many of the
+ internal devices like USB. It should be called by the
+ 'main' function first, before initializing any of the
+ other devices in the system.
+ </para>
+ </section>
+ </chapter>
+ <chapter>
+ <title>Timer Functions</title>
+ <para>
+ AltOS sets up one of the cc1111 timers to run at 100Hz and
+ exposes this tick as the fundemental unit of time. At each
+ interrupt, AltOS increments the counter, and schedules any tasks
+ waiting for that time to pass, then fires off the ADC system to
+ collect current data readings. Doing this from the ISR ensures
+ that the ADC values are sampled at a regular rate, independent
+ of any scheduling jitter.
+ </para>
+ <section>
+ <title>ao_time</title>
+ <programlisting>
+ uint16_t
+ ao_time(void)
+ </programlisting>
+ <para>
+ Returns the current system tick count. Note that this is
+ only a 16 bit value, and so it wraps every 655.36 seconds.
+ </para>
+ </section>
+ <section>
+ <title>ao_delay</title>
+ <programlisting>
+ void
+ ao_delay(uint16_t ticks);
+ </programlisting>
+ <para>
+ Suspend the current task for at least 'ticks' clock units.
+ </para>
+ </section>
+ <section>
+ <title>ao_timer_set_adc_interval</title>
+ <programlisting>
+ void
+ ao_timer_set_adc_interval(uint8_t interval);
+ </programlisting>
+ <para>
+ This sets the number of ticks between ADC samples. If set
+ to 0, no ADC samples are generated. AltOS uses this to
+ slow down the ADC sampling rate to save power.
+ </para>
+ </section>
+ <section>
+ <title>ao_timer_init</title>
+ <programlisting>
+ void
+ ao_timer_init(void)
+ </programlisting>
+ <para>
+ This turns on the 100Hz tick using the CC1111 timer 1. It
+ is required for any of the time-based functions to
+ work. It should be called by 'main' before ao_start_scheduler.
+ </para>
+ </section>
+ </chapter>
+ <chapter>
+ <title>AltOS Mutexes</title>
+ <para>
+ AltOS provides mutexes as a basic synchronization primitive. Each
+ mutexes is simply a byte of memory which holds 0 when the mutex
+ is free or the task id of the owning task when the mutex is
+ owned. Mutex calls are checked—attempting to acquire a mutex
+ already held by the current task or releasing a mutex not held
+ by the current task will both cause a panic.
+ </para>
+ <section>
+ <title>ao_mutex_get</title>
+ <programlisting>
+ void
+ ao_mutex_get(__xdata uint8_t *mutex);
+ </programlisting>
+ <para>
+ Acquires the specified mutex, blocking if the mutex is
+ owned by another task.
+ </para>
+ </section>
+ <section>
+ <title>ao_mutex_put</title>
+ <programlisting>
+ void
+ ao_mutex_put(__xdata uint8_t *mutex);
+ </programlisting>
+ <para>
+ Releases the specified mutex, waking up all tasks waiting
+ for it.
+ </para>
+ </section>
+ </chapter>
+ <chapter>
+ <title>CC1111 DMA engine</title>
+ <para>
+ The CC1111 contains a useful bit of extra hardware in the form
+ of five programmable DMA engines. They can be configured to copy
+ data in memory, or between memory and devices (or even between
+ two devices). AltOS exposes a general interface to this hardware
+ and uses it to handle radio and SPI data.
+ </para>
+ <para>
+ Code using a DMA engine should allocate one at startup
+ time. There is no provision to free them, and if you run out,
+ AltOS will simply panic.
+ </para>
+ <para>
+ During operation, the DMA engine is initialized with the
+ transfer parameters. Then it is started, at which point it
+ awaits a suitable event to start copying data. When copying data
+ from hardware to memory, that trigger event is supplied by the
+ hardware device. When copying data from memory to hardware, the
+ transfer is usually initiated by software.
+ </para>
+ <section>
+ <title>ao_dma_alloc</title>
+ <programlisting>
+ uint8_t
+ ao_dma_alloc(__xdata uint8_t *done)
+ </programlisting>
+ <para>
+ Allocates a DMA engine, returning the identifier. Whenever
+ this DMA engine completes a transfer. 'done' is cleared
+ when the DMA is started, and then receives the
+ AO_DMA_DONE bit on a successful transfer or the
+ AO_DMA_ABORTED bit if ao_dma_abort was called. Note that
+ it is possible to get both bits if the transfer was
+ aborted after it had finished.
+ </para>
+ </section>
+ <section>
+ <title>ao_dma_set_transfer</title>
+ <programlisting>
+ void
+ ao_dma_set_transfer(uint8_t id,
+ void __xdata *srcaddr,
+ void __xdata *dstaddr,
+ uint16_t count,
+ uint8_t cfg0,
+ uint8_t cfg1)
+ </programlisting>
+ <para>
+ Initializes the specified dma engine to copy data
+ from 'srcaddr' to 'dstaddr' for 'count' units. cfg0 and
+ cfg1 are values directly out of the CC1111 documentation
+ and tell the DMA engine what the transfer unit size,
+ direction and step are.
+ </para>
+ </section>
+ <section>
+ <title>ao_dma_start</title>
+ <programlisting>
+ void
+ ao_dma_start(uint8_t id);
+ </programlisting>
+ <para>
+ Arm the specified DMA engine and await a signal from
+ either hardware or software to start transferring data.
+ </para>
+ </section>
+ <section>
+ <title>ao_dma_trigger</title>
+ <programlisting>
+ void
+ ao_dma_trigger(uint8_t id)
+ </programlisting>
+ <para>
+ Trigger the specified DMA engine to start copying data.
+ </para>
+ </section>
+ <section>
+ <title>ao_dma_abort</title>
+ <programlisting>
+ void
+ ao_dma_abort(uint8_t id)
+ </programlisting>
+ <para>
+ Terminate any in-progress DMA transation, marking its
+ 'done' variable with the AO_DMA_ABORTED bit.
+ </para>
+ </section>
+ </chapter>
+ <chapter>
+ <title>SDCC Stdio interface</title>
+ <para>
+ AltOS offers a stdio interface over both USB and the RF packet
+ link. This provides for control of the device localy or
+ remotely. This is hooked up to the stdio functions in SDCC by
+ providing the standard putchar/getchar/flush functions. These
+ automatically multiplex the two available communication
+ channels; output is always delivered to the channel which
+ provided the most recent input.
+ </para>
+ <section>
+ <title>putchar</title>
+ <programlisting>
+ void
+ putchar(char c)
+ </programlisting>
+ <para>
+ Delivers a single character to the current console
+ device.
+ </para>
+ </section>
+ <section>
+ <title>getchar</title>
+ <programlisting>
+ char
+ getchar(void)
+ </programlisting>
+ <para>
+ Reads a single character from any of the available
+ console devices. The current console device is set to
+ that which delivered this character. This blocks until
+ a character is available.
+ </para>
+ </section>
+ <section>
+ <title>flush</title>
+ <programlisting>
+ void
+ flush(void)
+ </programlisting>
+ <para>
+ Flushes the current console device output buffer. Any
+ pending characters will be delivered to the target device.
+ xo </para>
+ </section>
+ <section>
+ <title>ao_add_stdio</title>
+ <programlisting>
+ void
+ ao_add_stdio(char (*pollchar)(void),
+ void (*putchar)(char),
+ void (*flush)(void))
+ </programlisting>
+ <para>
+ This adds another console device to the available
+ list.
+ </para>
+ <para>
+ 'pollchar' returns either an available character or
+ AO_READ_AGAIN if none is available. Significantly, it does
+ not block. The device driver must set 'ao_stdin_ready' to
+ 1 and call ao_wakeup(&amp;ao_stdin_ready) when it receives
+ input to tell getchar that more data is available, at
+ which point 'pollchar' will be called again.
+ </para>
+ <para>
+ 'putchar' queues a character for output, flushing if the output buffer is
+ full. It may block in this case.
+ </para>
+ <para>
+ 'flush' forces the output buffer to be flushed. It may
+ block until the buffer is delivered, but it is not
+ required to do so.
+ </para>
+ </section>
+ </chapter>
+ <chapter>
+ <title>Command line interface</title>
+ <para>
+ AltOS includes a simple command line parser which is hooked up
+ to the stdio interfaces permitting remote control of the device
+ over USB or the RF link as desired. Each command uses a single
+ character to invoke it, the remaining characters on the line are
+ available as parameters to the command.
+ </para>
+ <section>
+ <title>ao_cmd_register</title>
+ <programlisting>
+ void
+ ao_cmd_register(__code struct ao_cmds *cmds)
+ </programlisting>
+ <para>
+ This registers a set of commands with the command
+ parser. There is a fixed limit on the number of command
+ sets, the system will panic if too many are registered.
+ Each command is defined by a struct ao_cmds entry:
+ <programlisting>
+ struct ao_cmds {
+ char cmd;
+ void (*func)(void);
+ const char *help;
+ };
+ </programlisting>
+ 'cmd' is the character naming the command. 'func' is the
+ function to invoke and 'help' is a string displayed by the
+ '?' command. Syntax errors found while executing 'func'
+ should be indicated by modifying the global ao_cmd_status
+ variable with one of the following values:
+ <variablelist>
+ <varlistentry>
+ <title>ao_cmd_success</title>
+ <listitem>
+ <para>
+ The command was parsed successfully. There is no
+ need to assign this value, it is the default.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <title>ao_cmd_lex_error</title>
+ <listitem>
+ <para>
+ A token in the line was invalid, such as a number
+ containing invalid characters. The low-level
+ lexing functions already assign this value as needed.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <title>ao_syntax_error</title>
+ <listitem>
+ <para>
+ The command line is invalid for some reason other
+ than invalid tokens.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+ </section>
+ <section>
+ <title>ao_cmd_lex</title>
+ <programlisting>
+ void
+ ao_cmd_lex(void);
+ </programlisting>
+ <para>
+ This gets the next character out of the command line
+ buffer and sticks it into ao_cmd_lex_c. At the end of the
+ line, ao_cmd_lex_c will get a newline ('\n') character.
+ </para>
+ </section>
+ <section>
+ <title>ao_cmd_put16</title>
+ <programlisting>
+ void
+ ao_cmd_put16(uint16_t v);
+ </programlisting>
+ <para>
+ Writes 'v' as four hexadecimal characters.
+ </para>
+ </section>
+ <section>
+ <title>ao_cmd_put8</title>
+ <programlisting>
+ void
+ ao_cmd_put8(uint8_t v);
+ </programlisting>
+ <para>
+ Writes 'v' as two hexadecimal characters.
+ </para>
+ </section>
+ <section>
+ <title>ao_cmd_white</title>
+ <programlisting>
+ void
+ ao_cmd_white(void)
+ </programlisting>
+ <para>
+ This skips whitespace by calling ao_cmd_lex while
+ ao_cmd_lex_c is either a space or tab. It does not skip
+ any characters if ao_cmd_lex_c already non-white.
+ </para>
+ </section>
+ <section>
+ <title>ao_cmd_hex</title>
+ <programlisting>
+ void
+ ao_cmd_hex(void)
+ </programlisting>
+ <para>
+ This reads a 16-bit hexadecimal value from the command
+ line with optional leading whitespace. The resulting value
+ is stored in ao_cmd_lex_i;
+ </para>
+ </section>
+ <section>
+ <title>ao_cmd_decimal</title>
+ <programlisting>
+ void
+ ao_cmd_decimal(void)
+ </programlisting>
+ <para>
+ This reads a 32-bit decimal value from the command
+ line with optional leading whitespace. The resulting value
+ is stored in ao_cmd_lex_u32 and the low 16 bits are stored
+ in ao_cmd_lex_i;
+ </para>
+ </section>
+ <section>
+ <title>ao_match_word</title>
+ <programlisting>
+ uint8_t
+ ao_match_word(__code char *word)
+ </programlisting>
+ <para>
+ This checks to make sure that 'word' occurs on the command
+ line. It does not skip leading white space. If 'word' is
+ found, then 1 is returned. Otherwise, ao_cmd_status is set to
+ ao_cmd_syntax_error and 0 is returned.
+ </para>
+ </section>
+ <section>
+ <title>ao_cmd_init</title>
+ <programlisting>
+ void
+ ao_cmd_init(void
+ </programlisting>
+ <para>
+ Initializes the command system, setting up the built-in
+ commands and adding a task to run the command processing
+ loop. It should be called by 'main' before ao_start_scheduler.
+ </para>
+ </section>
+ </chapter>
+ <chapter>
+ <title>CC1111 USB target device</title>
+ <para>
+ The CC1111 contains a full-speed USB target device. It can be
+ programmed to offer any kind of USB target, but to simplify
+ interactions with a variety of operating systems, AltOS provides
+ only a single target device profile, that of a USB modem which
+ has native drivers for Linux, Windows and Mac OS X. It would be
+ easy to change the code to provide an alternate target device if
+ necessary.
+ </para>
+ <para>
+ To the rest of the system, the USB device looks like a simple
+ two-way byte stream. It can be hooked into the command line
+ interface if desired, offering control of the device over the
+ USB link. Alternatively, the functions can be accessed directly
+ to provide for USB-specific I/O.
+ </para>
+ <section>
+ <title>ao_usb_flush</title>
+ <programlisting>
+ void
+ ao_usb_flush(void);
+ </programlisting>
+ <para>
+ Flushes any pending USB output. This queues an 'IN' packet
+ to be delivered to the USB host if there is pending data,
+ or if the last IN packet was full to indicate to the host
+ that there isn't any more pending data available.
+ </para>
+ </section>
+ <section>
+ <title>ao_usb_putchar</title>
+ <programlisting>
+ void
+ ao_usb_putchar(char c);
+ </programlisting>
+ <para>
+ If there is a pending 'IN' packet awaiting delivery to the
+ host, this blocks until that has been fetched. Then, this
+ adds a byte to the pending IN packet for delivery to the
+ USB host. If the USB packet is full, this queues the 'IN'
+ packet for delivery.
+ </para>
+ </section>
+ <section>
+ <title>ao_usb_pollchar</title>
+ <programlisting>
+ char
+ ao_usb_pollchar(void);
+ </programlisting>
+ <para>
+ If there are no characters remaining in the last 'OUT'
+ packet received, this returns AO_READ_AGAIN. Otherwise, it
+ returns the next character, reporting to the host that it
+ is ready for more data when the last character is gone.
+ </para>
+ </section>
+ <section>
+ <title>ao_usb_getchar</title>
+ <programlisting>
+ char
+ ao_usb_getchar(void);
+ </programlisting>
+ <para>
+ This uses ao_pollchar to receive the next character,
+ blocking while ao_pollchar returns AO_READ_AGAIN.
+ </para>
+ </section>
+ <section>
+ <title>ao_usb_disable</title>
+ <programlisting>
+ void
+ ao_usb_disable(void);
+ </programlisting>
+ <para>
+ This turns off the USB controller. It will no longer
+ respond to host requests, nor return characters. Calling
+ any of the i/o routines while the USB device is disabled
+ is undefined, and likely to break things. Disabling the
+ USB device when not needed saves power.
+ </para>
+ <para>
+ Note that neither TeleDongle nor TeleMetrum are able to
+ signal to the USB host that they have disconnected, so
+ after disabling the USB device, it's likely that the cable
+ will need to be disconnected and reconnected before it
+ will work again.
+ </para>
+ </section>
+ <section>
+ <title>ao_usb_enable</title>
+ <programlisting>
+ void
+ ao_usb_enable(void);
+ </programlisting>
+ <para>
+ This turns the USB controller on again after it has been
+ disabled. See the note above about needing to physically
+ remove and re-insert the cable to get the host to
+ re-initialize the USB link.
+ </para>
+ </section>
+ <section>
+ <title>ao_usb_init</title>
+ <programlisting>
+ void
+ ao_usb_init(void);
+ </programlisting>
+ <para>
+ This turns the USB controller on, adds a task to handle
+ the control end point and adds the usb I/O functions to
+ the stdio system. Call this from main before
+ ao_start_scheduler.
+ </para>
+ </section>
+ </chapter>
+ <chapter>
+ <title>CC1111 Serial peripheral</title>
+ <para>
+ The CC1111 provides two USART peripherals. AltOS uses one for
+ asynch serial data, generally to communicate with a GPS device,
+ and the other for a SPI bus. The UART is configured to operate
+ in 8-bits, no parity, 1 stop bit framing. The default
+ configuration has clock settings for 4800, 9600 and 57600 baud
+ operation. Additional speeds can be added by computing
+ appropriate clock values.
+ </para>
+ <para>
+ To prevent loss of data, AltOS provides receive and transmit
+ fifos of 32 characters each.
+ </para>
+ <section>
+ <title>ao_serial_getchar</title>
+ <programlisting>
+ char
+ ao_serial_getchar(void);
+ </programlisting>
+ <para>
+ Returns the next character from the receive fifo, blocking
+ until a character is received if the fifo is empty.
+ </para>
+ </section>
+ <section>
+ <title>ao_serial_putchar</title>
+ <programlisting>
+ void
+ ao_serial_putchar(char c);
+ </programlisting>
+ <para>
+ Adds a character to the transmit fifo, blocking if the
+ fifo is full. Starts transmitting characters.
+ </para>
+ </section>
+ <section>
+ <title>ao_serial_drain</title>
+ <programlisting>
+ void
+ ao_serial_drain(void);
+ </programlisting>
+ <para>
+ Blocks until the transmit fifo is empty. Used internally
+ when changing serial speeds.
+ </para>
+ </section>
+ <section>
+ <title>ao_serial_set_speed</title>
+ <programlisting>
+ void
+ ao_serial_set_speed(uint8_t speed);
+ </programlisting>
+ <para>
+ Changes the serial baud rate to one of
+ AO_SERIAL_SPEED_4800, AO_SERIAL_SPEED_9600 or
+ AO_SERIAL_SPEED_57600. This first flushes the transmit
+ fifo using ao_serial_drain.
+ </para>
+ </section>
+ <section>
+ <title>ao_serial_init</title>
+ <programlisting>
+ void
+ ao_serial_init(void)
+ </programlisting>
+ <para>
+ Initializes the serial peripheral. Call this from 'main'
+ before jumping to ao_start_scheduler. The default speed
+ setting is AO_SERIAL_SPEED_4800.
+ </para>
+ </section>
+ </chapter>
+ <chapter>
+ <title>CC1111 Radio peripheral</title>
+ <para>
+ The CC1111 radio transceiver sends and receives digital packets
+ with forward error correction and detection. The AltOS driver is
+ fairly specific to the needs of the TeleMetrum and TeleDongle
+ devices, using it for other tasks may require customization of
+ the driver itself. There are three basic modes of operation:
+ <orderedlist>
+ <listitem>
+ <para>
+ Telemetry mode. In this mode, TeleMetrum transmits telemetry
+ frames at a fixed rate. The frames are of fixed size. This
+ is strictly a one-way communication from TeleMetrum to
+ TeleDongle.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Packet mode. In this mode, the radio is used to create a
+ reliable duplex byte stream between TeleDongle and
+ TeleMetrum. This is an asymmetrical protocol with
+ TeleMetrum only transmitting in response to a packet sent
+ from TeleDongle. Thus getting data from TeleMetrum to
+ TeleDongle requires polling. The polling rate is adaptive,
+ when no data has been received for a while, the rate slows
+ down. The packets are checked at both ends and invalid
+ data are ignored.
+ </para>
+ <para>
+ On the TeleMetrum side, the packet link is hooked into the
+ stdio mechanism, providing an alternate data path for the
+ command processor. It is enabled when the unit boots up in
+ 'idle' mode.
+ </para>
+ <para>
+ On the TeleDongle side, the packet link is enabled with a
+ command; data from the stdio package is forwarded over the
+ packet link providing a connection from the USB command
+ stream to the remote TeleMetrum device.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Radio Direction Finding mode. In this mode, TeleMetrum
+ constructs a special packet that sounds like an audio tone
+ when received by a conventional narrow-band FM
+ receiver. This is designed to provide a beacon to track
+ the device when other location mechanisms fail.
+ </para>
+ </listitem>
+ </orderedlist>
+ </para>
+ <section>
+ <title>ao_radio_set_telemetry</title>
+ <programlisting>
+ void
+ ao_radio_set_telemetry(void);
+ </programlisting>
+ <para>
+ Configures the radio to send or receive telemetry
+ packets. This includes packet length, modulation scheme and
+ other RF parameters. It does not include the base frequency
+ or channel though. Those are set at the time of transmission
+ or reception, in case the values are changed by the user.
+ </para>
+ </section>
+ <section>
+ <title>ao_radio_set_packet</title>
+ <programlisting>
+ void
+ ao_radio_set_packet(void);
+ </programlisting>
+ <para>
+ Configures the radio to send or receive packet data. This
+ includes packet length, modulation scheme and other RF
+ parameters. It does not include the base frequency or
+ channel though. Those are set at the time of transmission or
+ reception, in case the values are changed by the user.
+ </para>
+ </section>
+ <section>
+ <title>ao_radio_set_rdf</title>
+ <programlisting>
+ void
+ ao_radio_set_rdf(void);
+ </programlisting>
+ <para>
+ Configures the radio to send RDF 'packets'. An RDF 'packet'
+ is a sequence of hex 0x55 bytes sent at a base bit rate of
+ 2kbps using a 5kHz deviation. All of the error correction
+ and data whitening logic is turned off so that the resulting
+ modulation is received as a 1kHz tone by a conventional 70cm
+ FM audio receiver.
+ </para>
+ </section>
+ <section>
+ <title>ao_radio_idle</title>
+ <programlisting>
+ void
+ ao_radio_idle(void);
+ </programlisting>
+ <para>
+ Sets the radio device to idle mode, waiting until it reaches
+ that state. This will terminate any in-progress transmit or
+ receive operation.
+ </para>
+ </section>
+ <section>
+ <title>ao_radio_get</title>
+ <programlisting>
+ void
+ ao_radio_get(void);
+ </programlisting>
+ <para>
+ Acquires the radio mutex and then configures the radio
+ frequency using the global radio calibration and channel
+ values.
+ </para>
+ </section>
+ <section>
+ <title>ao_radio_put</title>
+ <programlisting>
+ void
+ ao_radio_put(void);
+ </programlisting>
+ <para>
+ Releases the radio mutex.
+ </para>
+ </section>
+ <section>
+ <title>ao_radio_abort</title>
+ <programlisting>
+ void
+ ao_radio_abort(void);
+ </programlisting>
+ <para>
+ Aborts any transmission or reception process by aborting the
+ associated DMA object and calling ao_radio_idle to terminate
+ the radio operation.
+ </para>
+ </section>
+ <para>
+ In telemetry mode, you can send or receive a telemetry
+ packet. The data from receiving a packet also includes the RSSI
+ and status values supplied by the receiver. These are added
+ after the telemetry data.
+ </para>
+ <section>
+ <title>ao_radio_send</title>
+ <programlisting>
+ void
+ ao_radio_send(__xdata struct ao_telemetry *telemetry);
+ </programlisting>
+ <para>
+ This sends the specific telemetry packet, waiting for the
+ transmission to complete. The radio must have been set to
+ telemetry mode. This function calls ao_radio_get() before
+ sending, and ao_radio_put() afterwards, to correctly
+ serialize access to the radio device.
+ </para>
+ </section>
+ <section>
+ <title>ao_radio_recv</title>
+ <programlisting>
+ void
+ ao_radio_recv(__xdata struct ao_radio_recv *radio);
+ </programlisting>
+ <para>
+ This blocks waiting for a telemetry packet to be received.
+ The radio must have been set to telemetry mode. This
+ function calls ao_radio_get() before receiving, and
+ ao_radio_put() afterwards, to correctly serialize access
+ to the radio device. This returns non-zero if a packet was
+ received, or zero if the operation was aborted (from some
+ other task calling ao_radio_abort()).
+ </para>
+ </section>
+ <para>
+ In radio direction finding mode, there's just one function to
+ use
+ </para>
+ <section>
+ <title>ao_radio_rdf</title>
+ <programlisting>
+ void
+ ao_radio_rdf(int ms);
+ </programlisting>
+ <para>
+ This sends an RDF packet lasting for the specified amount
+ of time. The maximum length is 1020 ms.
+ </para>
+ </section>
+ <para>
+ Packet mode is asymmetrical and is configured at compile time
+ for either master or slave mode (but not both). The basic I/O
+ functions look the same at both ends, but the internals are
+ different, along with the initialization steps.
+ </para>
+ <section>
+ <title>ao_packet_putchar</title>
+ <programlisting>
+ void
+ ao_packet_putchar(char c);
+ </programlisting>
+ <para>
+ If the output queue is full, this first blocks waiting for
+ that data to be delivered. Then, queues a character for
+ packet transmission. On the master side, this will
+ transmit a packet if the output buffer is full. On the
+ slave side, any pending data will be sent the next time
+ the master polls for data.
+ </para>
+ </section>
+ <section>
+ <title>ao_packet_pollchar</title>
+ <programlisting>
+ char
+ ao_packet_pollchar(void);
+ </programlisting>
+ <para>
+ This returns a pending input character if available,
+ otherwise returns AO_READ_AGAIN. On the master side, if
+ this empties the buffer, it triggers a poll for more data.
+ </para>
+ </section>
+ <section>
+ <title>ao_packet_slave_start</title>
+ <programlisting>
+ void
+ ao_packet_slave_start(void);
+ </programlisting>
+ <para>
+ This is available only on the slave side and starts a task
+ to listen for packet data.
+ </para>
+ </section>
+ <section>
+ <title>ao_packet_slave_stop</title>
+ <programlisting>
+ void
+ ao_packet_slave_stop(void);
+ </programlisting>
+ <para>
+ Disables the packet slave task, stopping the radio receiver.
+ </para>
+ </section>
+ <section>
+ <title>ao_packet_slave_init</title>
+ <programlisting>
+ void
+ ao_packet_slave_init(void);
+ </programlisting>
+ <para>
+ Adds the packet stdio functions to the stdio package so
+ that when packet slave mode is enabled, characters will
+ get send and received through the stdio functions.
+ </para>
+ </section>
+ <section>
+ <title>ao_packet_master_init</title>
+ <programlisting>
+ void
+ ao_packet_master_init(void);
+ </programlisting>
+ <para>
+ Adds the 'p' packet forward command to start packet mode.
+ </para>
+ </section>
+ </chapter>
+</book>
diff --git a/doc/altusmetrum.xsl b/doc/altusmetrum.xsl
new file mode 100644
index 00000000..8339ca43
--- /dev/null
+++ b/doc/altusmetrum.xsl
@@ -0,0 +1,2495 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd">
+<book>
+ <title>The Altus Metrum System</title>
+ <subtitle>An Owner's Manual for TeleMetrum, TeleMini and TeleDongle Devices</subtitle>
+ <bookinfo>
+ <author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ </author>
+ <author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ </author>
+ <author>
+ <firstname>Bob</firstname>
+ <surname>Finch</surname>
+ </author>
+ <author>
+ <firstname>Anthony</firstname>
+ <surname>Towns</surname>
+ </author>
+ <copyright>
+ <year>2011</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+ </copyright>
+ <legalnotice>
+ <para>
+ This document is released under the terms of the
+ <ulink url="http://creativecommons.org/licenses/by-sa/3.0/">
+ Creative Commons ShareAlike 3.0
+ </ulink>
+ license.
+ </para>
+ </legalnotice>
+ <revhistory>
+ <revision>
+ <revnumber>1.0</revnumber>
+ <date>24 August 2011</date>
+ <revremark>
+ Updated for software version 1.0. Note that 1.0 represents a
+ telemetry format change, meaning both ends of a link
+ (TeleMetrum/TeleMini and TeleDongle) must be updated or
+ communications will fail.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>0.9</revnumber>
+ <date>18 January 2011</date>
+ <revremark>
+ Updated for software version 0.9. Note that 0.9 represents a
+ telemetry format change, meaning both ends of a link (TeleMetrum and
+ TeleDongle) must be updated or communications will fail.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>0.8</revnumber>
+ <date>24 November 2010</date>
+ <revremark>Updated for software version 0.8 </revremark>
+ </revision>
+ </revhistory>
+ </bookinfo>
+ <acknowledgements>
+ <para>
+ Thanks to Bob Finch, W9YA, NAR 12965, TRA 12350 for writing "The
+ Mere-Mortals Quick Start/Usage Guide to the Altus Metrum Starter
+ Kit" which formed the basis of the original Getting Started chapter
+ in this manual. Bob was one of our first customers for a production
+ TeleMetrum, and his continued enthusiasm and contributions
+ are immensely gratifying and highly appreciated!
+ </para>
+ <para>
+ And thanks to Anthony (AJ) Towns for major contributions including
+ the AltosUI graphing and site map code and associated documentation.
+ Free software means that our customers and friends can become our
+ collaborators, and we certainly appreciate this level of
+ contribution!
+ </para>
+ <para>
+ Have fun using these products, and we hope to meet all of you
+ out on the rocket flight line somewhere.
+ <literallayout>
+Bdale Garbee, KB0G
+NAR #87103, TRA #12201
+
+Keith Packard, KD7SQG
+NAR #88757, TRA #12200
+ </literallayout>
+ </para>
+ </acknowledgements>
+ <chapter>
+ <title>Introduction and Overview</title>
+ <para>
+ Welcome to the Altus Metrum community! Our circuits and software reflect
+ our passion for both hobby rocketry and Free Software. We hope their
+ capabilities and performance will delight you in every way, but by
+ releasing all of our hardware and software designs under open licenses,
+ we also hope to empower you to take as active a role in our collective
+ future as you wish!
+ </para>
+ <para>
+ The first device created for our community was TeleMetrum, a dual
+ deploy altimeter with fully integrated GPS and radio telemetry
+ as standard features, and a "companion interface" that will
+ support optional capabilities in the future.
+ </para>
+ <para>
+ The newest device is TeleMini, a dual deploy altimeter with
+ radio telemetry and radio direction finding. This device is only
+ 13mm by 38mm (½ inch by 1½ inches) and can fit easily in an 18mm
+ air-frame.
+ </para>
+ <para>
+ Complementing TeleMetrum and TeleMini is TeleDongle, a USB to RF
+ interface for communicating with the altimeters. Combined with your
+ choice of antenna and
+ notebook computer, TeleDongle and our associated user interface software
+ form a complete ground station capable of logging and displaying in-flight
+ telemetry, aiding rocket recovery, then processing and archiving flight
+ data for analysis and review.
+ </para>
+ <para>
+ More products will be added to the Altus Metrum family over time, and
+ we currently envision that this will be a single, comprehensive manual
+ for the entire product family.
+ </para>
+ </chapter>
+ <chapter>
+ <title>Getting Started</title>
+ <para>
+ The first thing to do after you check the inventory of parts in your
+ "starter kit" is to charge the battery.
+ </para>
+ <para>
+ The TeleMetrum battery can be charged by plugging it into the
+ corresponding socket of the TeleMetrum and then using the USB A to
+ mini B
+ cable to plug the TeleMetrum into your computer's USB socket. The
+ TeleMetrum circuitry will charge the battery whenever it is plugged
+ in, because the TeleMetrum's on-off switch does NOT control the
+ charging circuitry.
+ </para>
+ <para>
+ When the GPS chip is initially searching for
+ satellites, TeleMetrum will consume more current than it can pull
+ from the USB port, so the battery must be attached in order to get
+ satellite lock. Once GPS is locked, the current consumption goes back
+ down enough to enable charging while
+ running. So it's a good idea to fully charge the battery as your
+ first item of business so there is no issue getting and maintaining
+ satellite lock. The yellow charge indicator led will go out when the
+ battery is nearly full and the charger goes to trickle charge. It
+ can take several hours to fully recharge a deeply discharged battery.
+ </para>
+ <para>
+ The TeleMini battery can be charged by disconnecting it from the
+ TeleMini board and plugging it into a standalone battery charger
+ board, and connecting that via a USB cable to a laptop or other USB
+ power source
+ </para>
+ <para>
+ The other active device in the starter kit is the TeleDongle USB to
+ RF interface. If you plug it in to your Mac or Linux computer it should
+ "just work", showing up as a serial port device. Windows systems need
+ driver information that is part of the AltOS download to know that the
+ existing USB modem driver will work. We therefore recommend installing
+ our software before plugging in TeleDongle if you are using a Windows
+ computer. If you are using Linux and are having problems, try moving
+ to a fresher kernel (2.6.33 or newer), as the USB serial driver had
+ ugly bugs in some earlier versions.
+ </para>
+ <para>
+ Next you should obtain and install the AltOS software. These include
+ the AltosUI ground station program, current firmware images for
+ TeleMetrum, TeleMini and TeleDongle, and a number of standalone
+ utilities that are rarely needed. Pre-built binary packages are
+ available for Linux, Microsoft Windows, and recent MacOSX versions.
+ Full source code and build instructions are also available.
+ The latest version may always be downloaded from
+ <ulink url="http://altusmetrum.org/AltOS"/>.
+ </para>
+ </chapter>
+ <chapter>
+ <title>Handling Precautions</title>
+ <para>
+ All Altus Metrum products are sophisticated electronic devices.
+ When handled gently and properly installed in an air-frame, they
+ will deliver impressive results. However, as with all electronic
+ devices, there are some precautions you must take.
+ </para>
+ <para>
+ The Lithium Polymer rechargeable batteries have an
+ extraordinary power density. This is great because we can fly with
+ much less battery mass than if we used alkaline batteries or previous
+ generation rechargeable batteries... but if they are punctured
+ or their leads are allowed to short, they can and will release their
+ energy very rapidly!
+ Thus we recommend that you take some care when handling our batteries
+ and consider giving them some extra protection in your air-frame. We
+ often wrap them in suitable scraps of closed-cell packing foam before
+ strapping them down, for example.
+ </para>
+ <para>
+ The barometric sensors used on both TeleMetrum and TeleMini are
+ sensitive to sunlight. In normal TeleMetrum mounting situations, it
+ and all of the other surface mount components
+ are "down" towards whatever the underlying mounting surface is, so
+ this is not normally a problem. Please consider this, though, when
+ designing an installation, for example, in an air-frame with a
+ see-through plastic payload bay. It is particularly important to
+ consider this with TeleMini, both because the baro sensor is on the
+ "top" of the board, and because many model rockets with payload bays
+ use clear plastic for the payload bay! Replacing these with an opaque
+ cardboard tube, painting them, or wrapping them with a layer of masking
+ tape are all reasonable approaches to keep the sensor out of direct
+ sunlight.
+ </para>
+ <para>
+ The barometric sensor sampling port must be able to "breathe",
+ both by not being covered by foam or tape or other materials that might
+ directly block the hole on the top of the sensor, and also by having a
+ suitable static vent to outside air.
+ </para>
+ <para>
+ As with all other rocketry electronics, Altus Metrum altimeters must
+ be protected from exposure to corrosive motor exhaust and ejection
+ charge gasses.
+ </para>
+ </chapter>
+ <chapter>
+ <title>Hardware Overview</title>
+ <para>
+ TeleMetrum is a 1 inch by 2.75 inch circuit board. It was designed to
+ fit inside coupler for 29mm air-frame tubing, but using it in a tube that
+ small in diameter may require some creativity in mounting and wiring
+ to succeed! The presence of an accelerometer means TeleMetrum should
+ be aligned along the flight axis of the airframe, and by default the 1/4
+ wave UHF wire antenna should be on the nose-cone end of the board. The
+ antenna wire is about 7 inches long, and wiring for a power switch and
+ the e-matches for apogee and main ejection charges depart from the
+ fin can end of the board, meaning an ideal "simple" avionics
+ bay for TeleMetrum should have at least 10 inches of interior length.
+ </para>
+ <para>
+ TeleMini is a 0.5 inch by 1.5 inch circuit board. It was designed to
+ fit inside an 18mm air-frame tube, but using it in a tube that
+ small in diameter may require some creativity in mounting and wiring
+ to succeed! Since there is no accelerometer, TeleMini can be mounted
+ in any convenient orientation. The default 1/4
+ wave UHF wire antenna attached to the center of one end of
+ the board is about 7 inches long, and wiring for a power switch and
+ the e-matches for apogee and main ejection charges depart from the
+ other end of the board, meaning an ideal "simple" avionics
+ bay for TeleMini should have at least 9 inches of interior length.
+ </para>
+ <para>
+ A typical TeleMetrum or TeleMini installation involves attaching
+ only a suitable Lithium Polymer battery, a single pole switch for
+ power on/off, and two pairs of wires connecting e-matches for the
+ apogee and main ejection charges. All Altus Metrum products are
+ designed for use with single-cell batteries with 3.7 volts nominal.
+ </para>
+ <para>
+ By default, we use the unregulated output of the Li-Po battery directly
+ to fire ejection charges. This works marvelously with standard
+ low-current e-matches like the J-Tek from MJG Technologies, and with
+ Quest Q2G2 igniters. However, if you want or need to use a separate
+ pyro battery, check out the "External Pyro Battery" section in this
+ manual for instructions on how to wire that up. The altimeters are
+ designed to work with an external pyro battery of no more than 15 volts.
+ </para>
+ <para>
+ Ejection charges are wired directly to the screw terminal block
+ at the aft end of the altimeter. You'll need a very small straight
+ blade screwdriver for these screws, such as you might find in a
+ jeweler's screwdriver set.
+ </para>
+ <para>
+ TeleMetrum also uses the screw terminal block for the power
+ switch leads. On TeleMini, the power switch leads are soldered
+ directly to the board and can be connected directly to a switch.
+ </para>
+ <para>
+ For most air-frames, the integrated antennas are more than
+ adequate. However, if you are installing in a carbon-fiber or
+ metal electronics bay which is opaque to RF signals, you may need to
+ use off-board external antennas instead. In this case, you can
+ order an altimeter with an SMA connector for the UHF antenna
+ connection, and, on TeleMetrum, you can unplug the integrated GPS
+ antenna and select an appropriate off-board GPS antenna with
+ cable terminating in a U.FL connector.
+ </para>
+ </chapter>
+ <chapter>
+ <title>System Operation</title>
+ <section>
+ <title>Firmware Modes </title>
+ <para>
+ The AltOS firmware build for the altimeters has two
+ fundamental modes, "idle" and "flight". Which of these modes
+ the firmware operates in is determined at start up time. For
+ TeleMetrum, the mode is controlled by the orientation of the
+ rocket (well, actually the board, of course...) at the time
+ power is switched on. If the rocket is "nose up", then
+ TeleMetrum assumes it's on a rail or rod being prepared for
+ launch, so the firmware chooses flight mode. However, if the
+ rocket is more or less horizontal, the firmware instead enters
+ idle mode. Since TeleMini doesn't have an accelerometer we can
+ use to determine orientation, "idle" mode is selected when the
+ board receives a command packet within the first five seconds
+ of operation; if no packet is received, the board enters
+ "flight" mode.
+ </para>
+ <para>
+ At power on, you will hear three beeps or see three flashes
+ ("S" in Morse code for start up) and then a pause while
+ the altimeter completes initialization and self test, and decides
+ which mode to enter next.
+ </para>
+ <para>
+ In flight or "pad" mode, the altimeter engages the flight
+ state machine, goes into transmit-only mode to
+ send telemetry, and waits for launch to be detected.
+ Flight mode is indicated by an "di-dah-dah-dit" ("P" for pad)
+ on the beeper or lights, followed by beeps or flashes
+ indicating the state of the pyrotechnic igniter continuity.
+ One beep/flash indicates apogee continuity, two beeps/flashes
+ indicate main continuity, three beeps/flashes indicate both
+ apogee and main continuity, and one longer "brap" sound or
+ rapidly alternating lights indicates no continuity. For a
+ dual deploy flight, make sure you're getting three beeps or
+ flashes before launching! For apogee-only or motor eject
+ flights, do what makes sense.
+ </para>
+ <para>
+ If idle mode is entered, you will hear an audible "di-dit" or see
+ two short flashes ("I" for idle), and the flight state machine is
+ disengaged, thus no ejection charges will fire. The altimeters also
+ listen for the radio link when in idle mode for requests sent via
+ TeleDongle. Commands can be issued to a TeleMetrum in idle mode
+ over either
+ USB or the radio link equivalently. TeleMini only has the radio link.
+ Idle mode is useful for configuring the altimeter, for extracting data
+ from the on-board storage chip after flight, and for ground testing
+ pyro charges.
+ </para>
+ <para>
+ One "neat trick" of particular value when TeleMetrum is used with
+ very large air-frames, is that you can power the board up while the
+ rocket is horizontal, such that it comes up in idle mode. Then you can
+ raise the air-frame to launch position, and issue a 'reset' command
+ via TeleDongle over the radio link to cause the altimeter to reboot and
+ come up in flight mode. This is much safer than standing on the top
+ step of a rickety step-ladder or hanging off the side of a launch
+ tower with a screw-driver trying to turn on your avionics before
+ installing igniters!
+ </para>
+ </section>
+ <section>
+ <title>GPS </title>
+ <para>
+ TeleMetrum includes a complete GPS receiver. A complete explanation
+ of how GPS works is beyond the scope of this manual, but the bottom
+ line is that the TeleMetrum GPS receiver needs to lock onto at least
+ four satellites to obtain a solid 3 dimensional position fix and know
+ what time it is.
+ </para>
+ <para>
+ TeleMetrum provides backup power to the GPS chip any time a
+ battery is connected. This allows the receiver to "warm start" on
+ the launch rail much faster than if every power-on were a GPS
+ "cold start". In typical operations, powering up TeleMetrum
+ on the flight line in idle mode while performing final air-frame
+ preparation will be sufficient to allow the GPS receiver to cold
+ start and acquire lock. Then the board can be powered down during
+ RSO review and installation on a launch rod or rail. When the board
+ is turned back on, the GPS system should lock very quickly, typically
+ long before igniter installation and return to the flight line are
+ complete.
+ </para>
+ </section>
+ <section>
+ <title>Controlling An Altimeter Over The Radio Link</title>
+ <para>
+ One of the unique features of the Altus Metrum system is
+ the ability to create a two way command link between TeleDongle
+ and an altimeter using the digital radio transceivers built into
+ each device. This allows you to interact with the altimeter from
+ afar, as if it were directly connected to the computer.
+ </para>
+ <para>
+ Any operation which can be performed with TeleMetrum can
+ either be done with TeleMetrum directly connected to the
+ computer via the USB cable, or through the radio
+ link. TeleMini doesn't provide a USB connector and so it is
+ always communicated with over radio. Select the appropriate
+ TeleDongle device when the list of devices is presented and
+ AltosUI will interact with an altimeter over the radio link.
+ </para>
+ <para>
+ One oddity in the current interface is how AltosUI selects the
+ frequency for radio communications. Instead of providing
+ an interface to specifically configure the frequency, it uses
+ whatever frequency was most recently selected for the target
+ TeleDongle device in Monitor Flight mode. If you haven't ever
+ used that mode with the TeleDongle in question, select the
+ Monitor Flight button from the top level UI, and pick the
+ appropriate TeleDongle device. Once the flight monitoring
+ window is open, select the desired frequency and then close it
+ down again. All radio communications will now use that frequency.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Save Flight Data—Recover flight data from the rocket without
+ opening it up.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Configure altimeter apogee delays or main deploy heights
+ to respond to changing launch conditions. You can also
+ 'reboot' the altimeter. Use this to remotely enable the
+ flight computer by turning TeleMetrum on in "idle" mode,
+ then once the air-frame is oriented for launch, you can
+ reboot the altimeter and have it restart in pad mode
+ without having to climb the scary ladder.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Fire Igniters—Test your deployment charges without snaking
+ wires out through holes in the air-frame. Simply assembly the
+ rocket as if for flight with the apogee and main charges
+ loaded, then remotely command the altimeter to fire the
+ igniters.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Operation over the radio link for configuring an altimeter, ground
+ testing igniters, and so forth uses the same RF frequencies as flight
+ telemetry. To configure the desired TeleDongle frequency, select
+ the monitor flight tab, then use the frequency selector and
+ close the window before performing other desired radio operations.
+ </para>
+ <para>
+ TeleMetrum only enables radio commanding in 'idle' mode, so
+ make sure you have TeleMetrum lying horizontally when you turn
+ it on. Otherwise, TeleMetrum will start in 'pad' mode ready for
+ flight, and will not be listening for command packets from TeleDongle.
+ </para>
+ <para>
+ TeleMini listens for a command packet for five seconds after
+ first being turned on, if it doesn't hear anything, it enters
+ 'pad' mode, ready for flight and will no longer listen for
+ command packets. The easiest way to connect to TeleMini is to
+ initiate the command and select the TeleDongle device. At this
+ point, the TeleDongle will be attempting to communicate with
+ the TeleMini. Now turn TeleMini on, and it should immediately
+ start communicating with the TeleDongle and the desired
+ operation can be performed.
+ </para>
+ <para>
+ You can monitor the operation of the radio link by watching the
+ lights on the devices. The red LED will flash each time a packet
+ is tramsitted, while the green LED will light up on TeleDongle when
+ it is waiting to receive a packet from the altimeter.
+ </para>
+ </section>
+ <section>
+ <title>Ground Testing </title>
+ <para>
+ An important aspect of preparing a rocket using electronic deployment
+ for flight is ground testing the recovery system. Thanks
+ to the bi-directional radio link central to the Altus Metrum system,
+ this can be accomplished in a TeleMetrum or TeleMini equipped rocket
+ with less work than you may be accustomed to with other systems. It
+ can even be fun!
+ </para>
+ <para>
+ Just prep the rocket for flight, then power up the altimeter
+ in "idle" mode (placing air-frame horizontal for TeleMetrum or
+ selected the Configure Altimeter tab for TeleMini). This will cause
+ the firmware to go into "idle" mode, in which the normal flight
+ state machine is disabled and charges will not fire without
+ manual command. You can now command the altimeter to fire the apogee
+ or main charges from a safe distance using your computer and
+ TeleDongle and the Fire Igniter tab to complete ejection testing.
+ </para>
+ </section>
+ <section>
+ <title>Radio Link </title>
+ <para>
+ The chip our boards are based on incorporates an RF transceiver, but
+ it's not a full duplex system... each end can only be transmitting or
+ receiving at any given moment. So we had to decide how to manage the
+ link.
+ </para>
+ <para>
+ By design, the altimeter firmware listens for the radio link when
+ it's in "idle mode", which
+ allows us to use the radio link to configure the rocket, do things like
+ ejection tests, and extract data after a flight without having to
+ crack open the air-frame. However, when the board is in "flight
+ mode", the altimeter only
+ transmits and doesn't listen at all. That's because we want to put
+ ultimate priority on event detection and getting telemetry out of
+ the rocket through
+ the radio in case the rocket crashes and we aren't able to extract
+ data later...
+ </para>
+ <para>
+ We don't use a 'normal packet radio' mode like APRS because they're
+ just too inefficient. The GFSK modulation we use is FSK with the
+ base-band pulses passed through a
+ Gaussian filter before they go into the modulator to limit the
+ transmitted bandwidth. When combined with the hardware forward error
+ correction support in the cc1111 chip, this allows us to have a very
+ robust 38.4 kilobit data link with only 10 milliwatts of transmit
+ power, a whip antenna in the rocket, and a hand-held Yagi on the
+ ground. We've had flights to above 21k feet AGL with great reception,
+ and calculations suggest we should be good to well over 40k feet AGL
+ with a 5-element yagi on the ground. We hope to fly boards to higher
+ altitudes over time, and would of course appreciate customer feedback
+ on performance in higher altitude flights!
+ </para>
+ </section>
+ <section>
+ <title>Configurable Parameters</title>
+ <para>
+ Configuring an Altus Metrum altimeter for flight is very
+ simple. Even on our baro-only TeleMini board, the use of a Kalman
+ filter means there is no need to set a "mach delay". The few
+ configurable parameters can all be set using AltosUI over USB or
+ or radio link via TeleDongle.
+ </para>
+ <section>
+ <title>Radio Frequency</title>
+ <para>
+ Altus Metrum boards support radio frequencies in the 70cm
+ band. By default, the configuration interface provides a
+ list of 10 "standard" frequencies in 100kHz channels starting at
+ 434.550MHz. However, the firmware supports use of
+ any 50kHz multiple within the 70cm band. At any given
+ launch, we highly recommend coordinating when and by whom each
+ frequency will be used to avoid interference. And of course, both
+ altimeter and TeleDongle must be configured to the same
+ frequency to successfully communicate with each other.
+ </para>
+ </section>
+ <section>
+ <title>Apogee Delay</title>
+ <para>
+ Apogee delay is the number of seconds after the altimeter detects flight
+ apogee that the drogue charge should be fired. In most cases, this
+ should be left at the default of 0. However, if you are flying
+ redundant electronics such as for an L3 certification, you may wish
+ to set one of your altimeters to a positive delay so that both
+ primary and backup pyrotechnic charges do not fire simultaneously.
+ </para>
+ <para>
+ The Altus Metrum apogee detection algorithm fires exactly at
+ apogee. If you are also flying an altimeter like the
+ PerfectFlite MAWD, which only supports selecting 0 or 1
+ seconds of apogee delay, you may wish to set the MAWD to 0
+ seconds delay and set the TeleMetrum to fire your backup 2
+ or 3 seconds later to avoid any chance of both charges
+ firing simultaneously. We've flown several air-frames this
+ way quite happily, including Keith's successful L3 cert.
+ </para>
+ </section>
+ <section>
+ <title>Main Deployment Altitude</title>
+ <para>
+ By default, the altimeter will fire the main deployment charge at an
+ elevation of 250 meters (about 820 feet) above ground. We think this
+ is a good elevation for most air-frames, but feel free to change this
+ to suit. In particular, if you are flying two altimeters, you may
+ wish to set the
+ deployment elevation for the backup altimeter to be something lower
+ than the primary so that both pyrotechnic charges don't fire
+ simultaneously.
+ </para>
+ </section>
+ <section>
+ <title>Maximum Flight Log</title>
+ <para>
+ TeleMetrum version 1.1 and 1.2 have 2MB of on-board flash storage,
+ enough to hold over 40 minutes of data at full data rate
+ (100 samples/second). TeleMetrum 1.0 has 1MB of on-board
+ storage. As data are stored at a reduced rate during descent
+ (10 samples/second), there's plenty of space to store many
+ flights worth of data.
+ </para>
+ <para>
+ The on-board flash is partitioned into separate flight logs,
+ each of a fixed maximum size. Increase the maximum size of
+ each log and you reduce the number of flights that can be
+ stored. Decrease the size and TeleMetrum can store more
+ flights.
+ </para>
+ <para>
+ All of the configuration data is also stored in the flash
+ memory, which consumes 64kB on TeleMetrum v1.1/v1.2 and 256B on
+ TeleMetrum v1.0. This configuration space is not available
+ for storing flight log data.
+ </para>
+ <para>
+ To compute the amount of space needed for a single flight,
+ you can multiply the expected ascent time (in seconds) by
+ 800, multiply the expected descent time (in seconds) by 80
+ and add the two together. That will slightly under-estimate
+ the storage (in bytes) needed for the flight. For instance,
+ a flight spending 20 seconds in ascent and 150 seconds in
+ descent will take about (20 * 800) + (150 * 80) = 28000
+ bytes of storage. You could store dozens of these flights in
+ the on-board flash.
+ </para>
+ <para>
+ The default size, 192kB, allows for 10 flights of storage on
+ TeleMetrum v1.1/v1.2 and 5 flights on TeleMetrum v1.0. This
+ ensures that you won't need to erase the memory before
+ flying each time while still allowing more than sufficient
+ storage for each flight.
+ </para>
+ <para>
+ As TeleMini does not contain an accelerometer, it stores
+ data at 10 samples per second during ascent and one sample
+ per second during descent. Each sample is a two byte reading
+ from the barometer. These are stored in 5kB of
+ on-chip flash memory which can hold 256 seconds at the
+ ascent rate or 2560 seconds at the descent rate. Because of
+ the limited storage, TeleMini cannot hold data for more than
+ one flight, and so must be erased after each flight or it
+ will not capture data for subsequent flights.
+ </para>
+ </section>
+ <section>
+ <title>Ignite Mode</title>
+ <para>
+ Instead of firing one charge at apogee and another charge at
+ a fixed height above the ground, you can configure the
+ altimeter to fire both at apogee or both during
+ descent. This was added to support an airframe that has two
+ TeleMetrum computers, one in the fin can and one in the
+ nose.
+ </para>
+ <para>
+ Providing the ability to use both igniters for apogee or
+ main allows some level of redundancy without needing two
+ flight computers. In Redundant Apogee or Redundant Main
+ mode, the two charges will be fired two seconds apart.
+ </para>
+ </section>
+ <section>
+ <title>Pad Orientation</title>
+ <para>
+ TeleMetrum measures acceleration along the axis of the
+ board. Which way the board is oriented affects the sign of
+ the acceleration value. Instead of trying to guess which way
+ the board is mounted in the air frame, TeleMetrum must be
+ explicitly configured for either Antenna Up or Antenna
+ Down. The default, Antenna Up, expects the end of the
+ TeleMetrum board connected to the 70cm antenna to be nearest
+ the nose of the rocket, with the end containing the screw
+ terminals nearest the tail.
+ </para>
+ </section>
+ </section>
+
+ </chapter>
+ <chapter>
+
+ <title>AltosUI</title>
+ <para>
+ The AltosUI program provides a graphical user interface for
+ interacting with the Altus Metrum product family, including
+ TeleMetrum, TeleMini and TeleDongle. AltosUI can monitor telemetry data,
+ configure TeleMetrum, TeleMini and TeleDongle devices and many other
+ tasks. The primary interface window provides a selection of
+ buttons, one for each major activity in the system. This manual
+ is split into chapters, each of which documents one of the tasks
+ provided from the top-level toolbar.
+ </para>
+ <section>
+ <title>Monitor Flight</title>
+ <subtitle>Receive, Record and Display Telemetry Data</subtitle>
+ <para>
+ Selecting this item brings up a dialog box listing all of the
+ connected TeleDongle devices. When you choose one of these,
+ AltosUI will create a window to display telemetry data as
+ received by the selected TeleDongle device.
+ </para>
+ <para>
+ All telemetry data received are automatically recorded in
+ suitable log files. The name of the files includes the current
+ date and rocket serial and flight numbers.
+ </para>
+ <para>
+ The radio frequency being monitored by the TeleDongle device is
+ displayed at the top of the window. You can configure the
+ frequency by clicking on the frequency box and selecting the desired
+ frequency. AltosUI remembers the last frequency selected for each
+ TeleDongle and selects that automatically the next time you use
+ that device.
+ </para>
+ <para>
+ Below the TeleDongle frequency selector, the window contains a few
+ significant pieces of information about the altimeter providing
+ the telemetry data stream:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>The configured call-sign</para>
+ </listitem>
+ <listitem>
+ <para>The device serial number</para>
+ </listitem>
+ <listitem>
+ <para>The flight number. Each altimeter remembers how many
+ times it has flown.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The rocket flight state. Each flight passes through several
+ states including Pad, Boost, Fast, Coast, Drogue, Main and
+ Landed.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The Received Signal Strength Indicator value. This lets
+ you know how strong a signal TeleDongle is receiving. The
+ radio inside TeleDongle operates down to about -99dBm;
+ weaker signals may not be receivable. The packet link uses
+ error detection and correction techniques which prevent
+ incorrect data from being reported.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Finally, the largest portion of the window contains a set of
+ tabs, each of which contain some information about the rocket.
+ They're arranged in 'flight order' so that as the flight
+ progresses, the selected tab automatically switches to display
+ data relevant to the current state of the flight. You can select
+ other tabs at any time. The final 'table' tab displays all of
+ the raw telemetry values in one place in a spreadsheet-like format.
+ </para>
+ <section>
+ <title>Launch Pad</title>
+ <para>
+ The 'Launch Pad' tab shows information used to decide when the
+ rocket is ready for flight. The first elements include red/green
+ indicators, if any of these is red, you'll want to evaluate
+ whether the rocket is ready to launch:
+ <itemizedlist>
+ <listitem>
+ <para>
+ Battery Voltage. This indicates whether the Li-Po battery
+ powering the TeleMetrum has sufficient charge to last for
+ the duration of the flight. A value of more than
+ 3.7V is required for a 'GO' status.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Apogee Igniter Voltage. This indicates whether the apogee
+ igniter has continuity. If the igniter has a low
+ resistance, then the voltage measured here will be close
+ to the Li-Po battery voltage. A value greater than 3.2V is
+ required for a 'GO' status.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Main Igniter Voltage. This indicates whether the main
+ igniter has continuity. If the igniter has a low
+ resistance, then the voltage measured here will be close
+ to the Li-Po battery voltage. A value greater than 3.2V is
+ required for a 'GO' status.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ On-board Data Logging. This indicates whether there is
+ space remaining on-board to store flight data for the
+ upcoming flight. If you've downloaded data, but failed
+ to erase flights, there may not be any space
+ left. TeleMetrum can store multiple flights, depending
+ on the configured maximum flight log size. TeleMini
+ stores only a single flight, so it will need to be
+ downloaded and erased after each flight to capture
+ data. This only affects on-board flight logging; the
+ altimeter will still transmit telemetry and fire
+ ejection charges at the proper times.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ GPS Locked. For a TeleMetrum device, this indicates whether the GPS receiver is
+ currently able to compute position information. GPS requires
+ at least 4 satellites to compute an accurate position.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ GPS Ready. For a TeleMetrum device, this indicates whether GPS has reported at least
+ 10 consecutive positions without losing lock. This ensures
+ that the GPS receiver has reliable reception from the
+ satellites.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ The Launchpad tab also shows the computed launch pad position
+ and altitude, averaging many reported positions to improve the
+ accuracy of the fix.
+ </para>
+ </para>
+ </section>
+ <section>
+ <title>Ascent</title>
+ <para>
+ This tab is shown during Boost, Fast and Coast
+ phases. The information displayed here helps monitor the
+ rocket as it heads towards apogee.
+ </para>
+ <para>
+ The height, speed and acceleration are shown along with the
+ maximum values for each of them. This allows you to quickly
+ answer the most commonly asked questions you'll hear during
+ flight.
+ </para>
+ <para>
+ The current latitude and longitude reported by the TeleMetrum GPS are
+ also shown. Note that under high acceleration, these values
+ may not get updated as the GPS receiver loses position
+ fix. Once the rocket starts coasting, the receiver should
+ start reporting position again.
+ </para>
+ <para>
+ Finally, the current igniter voltages are reported as in the
+ Launch Pad tab. This can help diagnose deployment failures
+ caused by wiring which comes loose under high acceleration.
+ </para>
+ </section>
+ <section>
+ <title>Descent</title>
+ <para>
+ Once the rocket has reached apogee and (we hope) activated the
+ apogee charge, attention switches to tracking the rocket on
+ the way back to the ground, and for dual-deploy flights,
+ waiting for the main charge to fire.
+ </para>
+ <para>
+ To monitor whether the apogee charge operated correctly, the
+ current descent rate is reported along with the current
+ height. Good descent rates vary based on the choice of recovery
+ components, but generally range from 15-30m/s on drogue and should
+ be below 10m/s when under the main parachute in a dual-deploy flight.
+ </para>
+ <para>
+ For TeleMetrum altimeters, you can locate the rocket in the sky
+ using the elevation and
+ bearing information to figure out where to look. Elevation is
+ in degrees above the horizon. Bearing is reported in degrees
+ relative to true north. Range can help figure out how big the
+ rocket will appear. Note that all of these values are relative
+ to the pad location. If the elevation is near 90°, the rocket
+ is over the pad, not over you.
+ </para>
+ <para>
+ Finally, the igniter voltages are reported in this tab as
+ well, both to monitor the main charge as well as to see what
+ the status of the apogee charge is. Note that some commercial
+ e-matches are designed to retain continuity even after being
+ fired, and will continue to show as green or return from red to
+ green after firing.
+ </para>
+ </section>
+ <section>
+ <title>Landed</title>
+ <para>
+ Once the rocket is on the ground, attention switches to
+ recovery. While the radio signal is often lost once the
+ rocket is on the ground, the last reported GPS position is
+ generally within a short distance of the actual landing location.
+ </para>
+ <para>
+ The last reported GPS position is reported both by
+ latitude and longitude as well as a bearing and distance from
+ the launch pad. The distance should give you a good idea of
+ whether to walk or hitch a ride. Take the reported
+ latitude and longitude and enter them into your hand-held GPS
+ unit and have that compute a track to the landing location.
+ </para>
+ <para>
+ Both TeleMini and TeleMetrum will continue to transmit RDF
+ tones after landing, allowing you to locate the rocket by
+ following the radio signal if necessary. You may need to get
+ away from the clutter of the flight line, or even get up on
+ a hill (or your neighbor's RV roof) to receive the RDF signal.
+ </para>
+ <para>
+ The maximum height, speed and acceleration reported
+ during the flight are displayed for your admiring observers.
+ The accuracy of these immediate values depends on the quality
+ of your radio link and how many packets were received.
+ Recovering the on-board data after flight will likely yield
+ more precise results.
+ </para>
+ <para>
+ To get more detailed information about the flight, you can
+ click on the 'Graph Flight' button which will bring up a
+ graph window for the current flight.
+ </para>
+ </section>
+ <section>
+ <title>Site Map</title>
+ <para>
+ When the TeleMetrum has a GPS fix, the Site Map tab will map
+ the rocket's position to make it easier for you to locate the
+ rocket, both while it is in the air, and when it has landed. The
+ rocket's state is indicated by color: white for pad, red for
+ boost, pink for fast, yellow for coast, light blue for drogue,
+ dark blue for main, and black for landed.
+ </para>
+ <para>
+ The map's scale is approximately 3m (10ft) per pixel. The map
+ can be dragged using the left mouse button. The map will attempt
+ to keep the rocket roughly centered while data is being received.
+ </para>
+ <para>
+ Images are fetched automatically via the Google Maps Static API,
+ and cached on disk for reuse. If map images cannot be downloaded,
+ the rocket's path will be traced on a dark gray background
+ instead.
+ </para>
+ <para>
+ You can pre-load images for your favorite launch sites
+ before you leave home; check out the 'Preload Maps' section below.
+ </para>
+ </section>
+ </section>
+ <section>
+ <title>Save Flight Data</title>
+ <para>
+ The altimeter records flight data to its internal flash memory.
+ TeleMetrum data is recorded at a much higher rate than the telemetry
+ system can handle, and is not subject to radio drop-outs. As
+ such, it provides a more complete and precise record of the
+ flight. The 'Save Flight Data' button allows you to read the
+ flash memory and write it to disk. As TeleMini has only a barometer, it
+ records data at the same rate as the telemetry signal, but there will be
+ no data lost due to telemetry drop-outs.
+ </para>
+ <para>
+ Clicking on the 'Save Flight Data' button brings up a list of
+ connected TeleMetrum and TeleDongle devices. If you select a
+ TeleMetrum device, the flight data will be downloaded from that
+ device directly. If you select a TeleDongle device, flight data
+ will be downloaded from an altimeter over radio link via the
+ specified TeleDongle. See the chapter on Controlling An Altimeter
+ Over The Radio Link for more information.
+ </para>
+ <para>
+ After the device has been selected, a dialog showing the
+ flight data saved in the device will be shown allowing you to
+ select which flights to download and which to delete. With
+ version 0.9 or newer firmware, you must erase flights in order
+ for the space they consume to be reused by another
+ flight. This prevents accidentally losing flight data
+ if you neglect to download data before flying again. Note that
+ if there is no more space available in the device, then no
+ data will be recorded during the next flight.
+ </para>
+ <para>
+ The file name for each flight log is computed automatically
+ from the recorded flight date, altimeter serial number and
+ flight number information.
+ </para>
+ </section>
+ <section>
+ <title>Replay Flight</title>
+ <para>
+ Select this button and you are prompted to select a flight
+ record file, either a .telem file recording telemetry data or a
+ .eeprom file containing flight data saved from the altimeter
+ flash memory.
+ </para>
+ <para>
+ Once a flight record is selected, the flight monitor interface
+ is displayed and the flight is re-enacted in real time. Check
+ the Monitor Flight chapter above to learn how this window operates.
+ </para>
+ </section>
+ <section>
+ <title>Graph Data</title>
+ <para>
+ Select this button and you are prompted to select a flight
+ record file, either a .telem file recording telemetry data or a
+ .eeprom file containing flight data saved from
+ flash memory.
+ </para>
+ <para>
+ Once a flight record is selected, a window with two tabs is
+ opened. The first tab contains a graph with acceleration
+ (blue), velocity (green) and altitude (red) of the flight,
+ measured in metric units. The
+ apogee(yellow) and main(magenta) igniter voltages are also
+ displayed; high voltages indicate continuity, low voltages
+ indicate open circuits. The second tab contains some basic
+ flight statistics.
+ </para>
+ <para>
+ The graph can be zoomed into a particular area by clicking and
+ dragging down and to the right. Once zoomed, the graph can be
+ reset by clicking and dragging up and to the left. Holding down
+ control and clicking and dragging allows the graph to be panned.
+ The right mouse button causes a pop-up menu to be displayed, giving
+ you the option save or print the plot.
+ </para>
+ <para>
+ Note that telemetry files will generally produce poor graphs
+ due to the lower sampling rate and missed telemetry packets.
+ Use saved flight data in .eeprom files for graphing where possible.
+ </para>
+ </section>
+ <section>
+ <title>Export Data</title>
+ <para>
+ This tool takes the raw data files and makes them available for
+ external analysis. When you select this button, you are prompted to
+ select a flight
+ data file (either .eeprom or .telem will do, remember that
+ .eeprom files contain higher resolution and more continuous
+ data). Next, a second dialog appears which is used to select
+ where to write the resulting file. It has a selector to choose
+ between CSV and KML file formats.
+ </para>
+ <section>
+ <title>Comma Separated Value Format</title>
+ <para>
+ This is a text file containing the data in a form suitable for
+ import into a spreadsheet or other external data analysis
+ tool. The first few lines of the file contain the version and
+ configuration information from the altimeter, then
+ there is a single header line which labels all of the
+ fields. All of these lines start with a '#' character which
+ many tools can be configured to skip over.
+ </para>
+ <para>
+ The remaining lines of the file contain the data, with each
+ field separated by a comma and at least one space. All of
+ the sensor values are converted to standard units, with the
+ barometric data reported in both pressure, altitude and
+ height above pad units.
+ </para>
+ </section>
+ <section>
+ <title>Keyhole Markup Language (for Google Earth)</title>
+ <para>
+ This is the format used by Google Earth to provide an overlay
+ within that application. With this, you can use Google Earth to
+ see the whole flight path in 3D.
+ </para>
+ </section>
+ </section>
+ <section>
+ <title>Configure Altimeter</title>
+ <para>
+ Select this button and then select either a TeleMetrum or
+ TeleDongle Device from the list provided. Selecting a TeleDongle
+ device will use the radio link to configure a remote altimeter.
+ </para>
+ <para>
+ The first few lines of the dialog provide information about the
+ connected device, including the product name,
+ software version and hardware serial number. Below that are the
+ individual configuration entries.
+ </para>
+ <para>
+ At the bottom of the dialog, there are four buttons:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Save. This writes any changes to the
+ configuration parameter block in flash memory. If you don't
+ press this button, any changes you make will be lost.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Reset. This resets the dialog to the most recently saved values,
+ erasing any changes you have made.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Reboot. This reboots the device. Use this to
+ switch from idle to pad mode by rebooting once the rocket is
+ oriented for flight, or to confirm changes you think you saved
+ are really saved.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Close. This closes the dialog. Any unsaved changes will be
+ lost.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ The rest of the dialog contains the parameters to be configured.
+ </para>
+ <section>
+ <title>Main Deploy Altitude</title>
+ <para>
+ This sets the altitude (above the recorded pad altitude) at
+ which the 'main' igniter will fire. The drop-down menu shows
+ some common values, but you can edit the text directly and
+ choose whatever you like. If the apogee charge fires below
+ this altitude, then the main charge will fire two seconds
+ after the apogee charge fires.
+ </para>
+ </section>
+ <section>
+ <title>Apogee Delay</title>
+ <para>
+ When flying redundant electronics, it's often important to
+ ensure that multiple apogee charges don't fire at precisely
+ the same time, as that can over pressurize the apogee deployment
+ bay and cause a structural failure of the air-frame. The Apogee
+ Delay parameter tells the flight computer to fire the apogee
+ charge a certain number of seconds after apogee has been
+ detected.
+ </para>
+ </section>
+ <section>
+ <title>Radio Frequency</title>
+ <para>
+ This configures which of the configured frequencies to use for both
+ telemetry and packet command mode. Note that if you set this
+ value via packet command mode, you will have to reconfigure
+ the TeleDongle frequency before you will be able to use packet
+ command mode again.
+ </para>
+ </section>
+ <section>
+ <title>Radio Calibration</title>
+ <para>
+ The radios in every Altus Metrum device are calibrated at the
+ factory to ensure that they transmit and receive on the
+ specified frequency. If you need to you can adjust the calibration
+ by changing this value. Do not do this without understanding what
+ the value means, read the appendix on calibration and/or the source
+ code for more information. To change a TeleDongle's calibration,
+ you must reprogram the unit completely.
+ </para>
+ </section>
+ <section>
+ <title>Callsign</title>
+ <para>
+ This sets the call sign included in each telemetry packet. Set this
+ as needed to conform to your local radio regulations.
+ </para>
+ </section>
+ <section>
+ <title>Maximum Flight Log Size</title>
+ <para>
+ This sets the space (in kilobytes) allocated for each flight
+ log. The available space will be divided into chunks of this
+ size. A smaller value will allow more flights to be stored,
+ a larger value will record data from longer flights.
+ </para>
+ </section>
+ <section>
+ <title>Ignite Mode</title>
+ <para>
+ TeleMetrum and TeleMini provide two igniter channels as they
+ were originally designed as dual-deploy flight
+ computers. This configuration parameter allows the two
+ channels to be used in different configurations.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Dual Deploy. This is the usual mode of operation; the
+ 'apogee' channel is fired at apogee and the 'main'
+ channel at the height above ground specified by the
+ 'Main Deploy Altitude' during descent.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Redundant Apogee. This fires both channels at
+ apogee, the 'apogee' channel first followed after a two second
+ delay by the 'main' channel.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Redundant Main. This fires both channels at the
+ height above ground specified by the Main Deploy
+ Altitude setting during descent. The 'apogee'
+ channel is fired first, followed after a two second
+ delay by the 'main' channel.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Pad Orientation</title>
+ <para>
+ Because it includes an accelerometer, TeleMetrum is
+ sensitive to the orientation of the board. By default, it
+ expects the antenna end to point forward. This parameter
+ allows that default to be changed, permitting the board to
+ be mounted with the antenna pointing aft instead.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Antenna Up. In this mode, the antenna end of the
+ TeleMetrum board must point forward, in line with the
+ expected flight path.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Antenna Down. In this mode, the antenna end of the
+ TeleMetrum board must point aft, in line with the
+ expected flight path.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ </section>
+ <section>
+ <title>Configure AltosUI</title>
+ <para>
+ This button presents a dialog so that you can configure the AltosUI global settings.
+ </para>
+ <section>
+ <title>Voice Settings</title>
+ <para>
+ AltosUI provides voice announcements during flight so that you
+ can keep your eyes on the sky and still get information about
+ the current flight status. However, sometimes you don't want
+ to hear them.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>Enable—turns all voice announcements on and off</para>
+ </listitem>
+ <listitem>
+ <para>
+ Test Voice—Plays a short message allowing you to verify
+ that the audio system is working and the volume settings
+ are reasonable
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Log Directory</title>
+ <para>
+ AltosUI logs all telemetry data and saves all TeleMetrum flash
+ data to this directory. This directory is also used as the
+ staring point when selecting data files for display or export.
+ </para>
+ <para>
+ Click on the directory name to bring up a directory choosing
+ dialog, select a new directory and click 'Select Directory' to
+ change where AltosUI reads and writes data files.
+ </para>
+ </section>
+ <section>
+ <title>Callsign</title>
+ <para>
+ This value is transmitted in each command packet sent from
+ TeleDongle and received from an altimeter. It is not used in
+ telemetry mode, as the callsign configured in the altimeter board
+ is included in all telemetry packets. Configure this
+ with the AltosUI operators call sign as needed to comply with
+ your local radio regulations.
+ </para>
+ </section>
+ <section>
+ <title>Font Size</title>
+ <para>
+ Selects the set of fonts used in the flight monitor
+ window. Choose between the small, medium and large sets.
+ </para>
+ </section>
+ <section>
+ <title>Serial Debug</title>
+ <para>
+ This causes all communication with a connected device to be
+ dumped to the console from which AltosUI was started. If
+ you've started it from an icon or menu entry, the output
+ will simply be discarded. This mode can be useful to debug
+ various serial communication issues.
+ </para>
+ </section>
+ <section>
+ <title>Manage Frequencies</title>
+ <para>
+ This brings up a dialog where you can configure the set of
+ frequencies shown in the various frequency menus. You can
+ add as many as you like, or even reconfigure the default
+ set. Changing this list does not affect the frequency
+ settings of any devices, it only changes the set of
+ frequencies shown in the menus.
+ </para>
+ </section>
+ </section>
+ <section>
+ <title>Flash Image</title>
+ <para>
+ This reprograms any Altus Metrum device by using a TeleMetrum
+ or TeleDongle as a programming dongle. Please read the
+ directions for flashing devices in the Updating Device
+ Firmware chapter below.
+ </para>
+ <para>
+ Once you have the programmer and target devices connected,
+ push the 'Flash Image' button. That will present a dialog box
+ listing all of the connected devices. Carefully select the
+ programmer device, not the device to be programmed.
+ </para>
+ <para>
+ Next, select the image to flash to the device. These are named
+ with the product name and firmware version. The file selector
+ will start in the directory containing the firmware included
+ with the AltosUI package. Navigate to the directory containing
+ the desired firmware if it isn't there.
+ </para>
+ <para>
+ Next, a small dialog containing the device serial number and
+ RF calibration values should appear. If these values are
+ incorrect (possibly due to a corrupted image in the device),
+ enter the correct values here.
+ </para>
+ <para>
+ Finally, a dialog containing a progress bar will follow the
+ programming process.
+ </para>
+ <para>
+ When programming is complete, the target device will
+ reboot. Note that if the target device is connected via USB, you
+ will have to unplug it and then plug it back in for the USB
+ connection to reset so that you can communicate with the device
+ again.
+ </para>
+ </section>
+ <section>
+ <title>Fire Igniter</title>
+ <para>
+ This activates the igniter circuits in TeleMetrum to help test
+ recovery systems deployment. Because this command can operate
+ over the Packet Command Link, you can prepare the rocket as
+ for flight and then test the recovery system without needing
+ to snake wires inside the air-frame.
+ </para>
+ <para>
+ Selecting the 'Fire Igniter' button brings up the usual device
+ selection dialog. Pick the desired TeleDongle or TeleMetrum
+ device. This brings up another window which shows the current
+ continuity test status for both apogee and main charges.
+ </para>
+ <para>
+ Next, select the desired igniter to fire. This will enable the
+ 'Arm' button.
+ </para>
+ <para>
+ Select the 'Arm' button. This enables the 'Fire' button. The
+ word 'Arm' is replaced by a countdown timer indicating that
+ you have 10 seconds to press the 'Fire' button or the system
+ will deactivate, at which point you start over again at
+ selecting the desired igniter.
+ </para>
+ </section>
+ <section>
+ <title>Scan Channels</title>
+ <para>
+ This listens for telemetry packets on all of the configured
+ frequencies, displaying information about each device it
+ receives a packet from. You can select which of the three
+ telemetry formats should be tried; by default, it only listens
+ for the standard telemetry packets used in v1.0 and later
+ firmware.
+ </para>
+ </section>
+ <section>
+ <title>Load Maps</title>
+ <para>
+ Before heading out to a new launch site, you can use this to
+ load satellite images in case you don't have internet
+ connectivity at the site. This loads a fairly large area
+ around the launch site, which should cover any flight you're likely to make.
+ </para>
+ <para>
+ There's a drop-down menu of launch sites we know about; if
+ your favorites aren't there, please let us know the lat/lon
+ and name of the site. The contents of this list are actually
+ downloaded at run-time, so as new sites are sent in, they'll
+ get automatically added to this list.
+ </para>
+ <para>
+ If the launch site isn't in the list, you can manually enter the lat/lon values
+ </para>
+ <para>
+ Clicking the 'Load Map' button will fetch images from Google
+ Maps; note that Google limits how many images you can fetch at
+ once, so if you load more than one launch site, you may get
+ some gray areas in the map which indicate that Google is tired
+ of sending data to you. Try again later.
+ </para>
+ </section>
+ <section>
+ <title>Monitor Idle</title>
+ <para>
+ This brings up a dialog similar to the Monitor Flight UI,
+ except it works with the altimeter in "idle" mode by sending
+ query commands to discover the current state rather than
+ listening for telemetry packets.
+ </para>
+ </section>
+ </chapter>
+ <chapter>
+ <title>Using Altus Metrum Products</title>
+ <section>
+ <title>Being Legal</title>
+ <para>
+ First off, in the US, you need an <ulink url="http://www.altusmetrum.org/Radio/">amateur radio license</ulink> or
+ other authorization to legally operate the radio transmitters that are part
+ of our products.
+ </para>
+ </section>
+ <section>
+ <title>In the Rocket</title>
+ <para>
+ In the rocket itself, you just need a <ulink url="http://www.altusmetrum.org/TeleMetrum/">TeleMetrum</ulink> or
+ <ulink url="http://www.altusmetrum.org/TeleMini/">TeleMini</ulink> board and
+ a single-cell, 3.7 volt nominal Li-Po rechargeable battery. An
+ 850mAh battery weighs less than a 9V alkaline battery, and will
+ run a TeleMetrum for hours.
+ A 110mAh battery weighs less than a triple A battery and will run a TeleMetrum for
+ a few hours, or a TeleMini for much (much) longer.
+ </para>
+ <para>
+ By default, we ship the altimeters with a simple wire antenna. If your
+ electronics bay or the air-frame it resides within is made of carbon fiber,
+ which is opaque to RF signals, you may choose to have an SMA connector
+ installed so that you can run a coaxial cable to an antenna mounted
+ elsewhere in the rocket.
+ </para>
+ </section>
+ <section>
+ <title>On the Ground</title>
+ <para>
+ To receive the data stream from the rocket, you need an antenna and short
+ feed-line connected to one of our <ulink url="http://www.altusmetrum.org/TeleDongle/">TeleDongle</ulink> units. The
+ TeleDongle in turn plugs directly into the USB port on a notebook
+ computer. Because TeleDongle looks like a simple serial port, your computer
+ does not require special device drivers... just plug it in.
+ </para>
+ <para>
+ The GUI tool, AltosUI, is written in Java and runs across
+ Linux, Mac OS and Windows. There's also a suite of C tools
+ for Linux which can perform most of the same tasks.
+ </para>
+ <para>
+ After the flight, you can use the radio link to extract the more detailed data
+ logged in either TeleMetrum or TeleMini devices, or you can use a mini USB cable to plug into the
+ TeleMetrum board directly. Pulling out the data without having to open up
+ the rocket is pretty cool! A USB cable is also how you charge the Li-Po
+ battery, so you'll want one of those anyway... the same cable used by lots
+ of digital cameras and other modern electronic stuff will work fine.
+ </para>
+ <para>
+ If your TeleMetrum-equipped rocket lands out of sight, you may enjoy having a hand-held GPS
+ receiver, so that you can put in a way-point for the last reported rocket
+ position before touch-down. This makes looking for your rocket a lot like
+ Geo-Caching... just go to the way-point and look around starting from there.
+ </para>
+ <para>
+ You may also enjoy having a ham radio "HT" that covers the 70cm band... you
+ can use that with your antenna to direction-find the rocket on the ground
+ the same way you can use a Walston or Beeline tracker. This can be handy
+ if the rocket is hiding in sage brush or a tree, or if the last GPS position
+ doesn't get you close enough because the rocket dropped into a canyon, or
+ the wind is blowing it across a dry lake bed, or something like that... Keith
+ and Bdale both currently own and use the Yaesu VX-7R at launches.
+ </para>
+ <para>
+ So, to recap, on the ground the hardware you'll need includes:
+ <orderedlist inheritnum='inherit' numeration='arabic'>
+ <listitem>
+ an antenna and feed-line
+ </listitem>
+ <listitem>
+ a TeleDongle
+ </listitem>
+ <listitem>
+ a notebook computer
+ </listitem>
+ <listitem>
+ optionally, a hand-held GPS receiver
+ </listitem>
+ <listitem>
+ optionally, an HT or receiver covering 435 MHz
+ </listitem>
+ </orderedlist>
+ </para>
+ <para>
+ The best hand-held commercial directional antennas we've found for radio
+ direction finding rockets are from
+ <ulink url="http://www.arrowantennas.com/" >
+ Arrow Antennas.
+ </ulink>
+ The 440-3 and 440-5 are both good choices for finding a
+ TeleMetrum- or TeleMini- equipped rocket when used with a suitable 70cm HT.
+ </para>
+ </section>
+ <section>
+ <title>Data Analysis</title>
+ <para>
+ Our software makes it easy to log the data from each flight, both the
+ telemetry received during the flight itself, and the more
+ complete data log recorded in the flash memory on the altimeter
+ board. Once this data is on your computer, our post-flight tools make it
+ easy to quickly get to the numbers everyone wants, like apogee altitude,
+ max acceleration, and max velocity. You can also generate and view a
+ standard set of plots showing the altitude, acceleration, and
+ velocity of the rocket during flight. And you can even export a TeleMetrum data file
+ usable with Google Maps and Google Earth for visualizing the flight path
+ in two or three dimensions!
+ </para>
+ <para>
+ Our ultimate goal is to emit a set of files for each flight that can be
+ published as a web page per flight, or just viewed on your local disk with
+ a web browser.
+ </para>
+ </section>
+ <section>
+ <title>Future Plans</title>
+ <para>
+ In the future, we intend to offer "companion boards" for the rocket that will
+ plug in to TeleMetrum to collect additional data, provide more pyro channels,
+ and so forth.
+ </para>
+ <para>
+ We are also working on the design of a hand-held ground terminal that will
+ allow monitoring the rocket's status, collecting data during flight, and
+ logging data after flight without the need for a notebook computer on the
+ flight line. Particularly since it is so difficult to read most notebook
+ screens in direct sunlight, we think this will be a great thing to have.
+ </para>
+ <para>
+ Because all of our work is open, both the hardware designs and the software,
+ if you have some great idea for an addition to the current Altus Metrum family,
+ feel free to dive in and help! Or let us know what you'd like to see that
+ we aren't already working on, and maybe we'll get excited about it too...
+ </para>
+ </section>
+ </chapter>
+ <chapter>
+ <title>Altimeter Installation Recommendations</title>
+ <para>
+ Building high-power rockets that fly safely is hard enough. Mix
+ in some sophisticated electronics and a bunch of radio energy
+ and oftentimes you find few perfect solutions. This chapter
+ contains some suggestions about how to install Altus Metrum
+ products into the rocket air-frame, including how to safely and
+ reliably mix a variety of electronics into the same air-frame.
+ </para>
+ <section>
+ <title>Mounting the Altimeter</title>
+ <para>
+ The first consideration is to ensure that the altimeter is
+ securely fastened to the air-frame. For TeleMetrum, we use
+ nylon standoffs and nylon screws; they're good to at least 50G
+ and cannot cause any electrical issues on the board. For
+ TeleMini, we usually cut small pieces of 1/16" balsa to fit
+ under the screw holes, and then take 2x56 nylon screws and
+ screw them through the TeleMini mounting holes, through the
+ balsa and into the underlying material.
+ </para>
+ <orderedlist inheritnum='inherit' numeration='arabic'>
+ <listitem>
+ Make sure TeleMetrum is aligned precisely along the axis of
+ acceleration so that the accelerometer can accurately
+ capture data during the flight.
+ </listitem>
+ <listitem>
+ Watch for any metal touching components on the
+ board. Shorting out connections on the bottom of the board
+ can cause the altimeter to fail during flight.
+ </listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Dealing with the Antenna</title>
+ <para>
+ The antenna supplied is just a piece of solid, insulated,
+ wire. If it gets damaged or broken, it can be easily
+ replaced. It should be kept straight and not cut; bending or
+ cutting it will change the resonant frequency and/or
+ impedance, making it a less efficient radiator and thus
+ reducing the range of the telemetry signal.
+ </para>
+ <para>
+ Keeping metal away from the antenna will provide better range
+ and a more even radiation pattern. In most rockets, it's not
+ entirely possible to isolate the antenna from metal
+ components; there are often bolts, all-thread and wires from other
+ electronics to contend with. Just be aware that the more stuff
+ like this around the antenna, the lower the range.
+ </para>
+ <para>
+ Make sure the antenna is not inside a tube made or covered
+ with conducting material. Carbon fiber is the most common
+ culprit here -- CF is a good conductor and will effectively
+ shield the antenna, dramatically reducing signal strength and
+ range. Metallic flake paint is another effective shielding
+ material which is to be avoided around any antennas.
+ </para>
+ <para>
+ If the ebay is large enough, it can be convenient to simply
+ mount the altimeter at one end and stretch the antenna out
+ inside. Taping the antenna to the sled can keep it straight
+ under acceleration. If there are metal rods, keep the
+ antenna as far away as possible.
+ </para>
+ <para>
+ For a shorter ebay, it's quite practical to have the antenna
+ run through a bulkhead and into an adjacent bay. Drill a small
+ hole in the bulkhead, pass the antenna wire through it and
+ then seal it up with glue or clay. We've also used acrylic
+ tubing to create a cavity for the antenna wire. This works a
+ bit better in that the antenna is known to stay straight and
+ not get folded by recovery components in the bay. Angle the
+ tubing towards the side wall of the rocket and it ends up
+ consuming very little space.
+ </para>
+ <para>
+ If you need to place the antenna at a distance from the
+ altimeter, you can replace the antenna with an edge-mounted
+ SMA connector, and then run 50Ω coax from the board to the
+ antenna. Building a remote antenna is beyond the scope of this
+ manual.
+ </para>
+ </section>
+ <section>
+ <title>Preserving GPS Reception</title>
+ <para>
+ The GPS antenna and receiver in TeleMetrum are highly
+ sensitive and normally have no trouble tracking enough
+ satellites to provide accurate position information for
+ recovering the rocket. However, there are many ways to
+ attenuate the GPS signal.
+ <orderedlist inheritnum='inherit' numeration='arabic'>
+ <listitem>
+ Conductive tubing or coatings. Carbon fiber and metal
+ tubing, or metallic paint will all dramatically attenuate the
+ GPS signal. We've never heard of anyone successfully
+ receiving GPS from inside these materials.
+ </listitem>
+ <listitem>
+ Metal components near the GPS patch antenna. These will
+ de-tune the patch antenna, changing the resonant frequency
+ away from the L1 carrier and reduce the effectiveness of the
+ antenna. You can place as much stuff as you like beneath the
+ antenna as that's covered with a ground plane. But, keep
+ wires and metal out from above the patch antenna.
+ </listitem>
+ </orderedlist>
+ </para>
+ </section>
+ <section>
+ <title>Radio Frequency Interference</title>
+ <para>
+ Any altimeter will generate RFI; the digital circuits use
+ high-frequency clocks that spray radio interference across a
+ wide band. Altus Metrum altimeters generate intentional radio
+ signals as well, increasing the amount of RF energy around the board.
+ </para>
+ <para>
+ Rocketry altimeters also use precise sensors measuring air
+ pressure and acceleration. Tiny changes in voltage can cause
+ these sensor readings to vary by a huge amount. When the
+ sensors start mis-reporting data, the altimeter can either
+ fire the igniters at the wrong time, or not fire them at all.
+ </para>
+ <para>
+ Voltages are induced when radio frequency energy is
+ transmitted from one circuit to another. Here are things that
+ influence the induced voltage and current:
+ </para>
+ <itemizedlist>
+ <listitem>
+ Keep wires from different circuits apart. Moving circuits
+ further apart will reduce RFI.
+ </listitem>
+ <listitem>
+ Avoid parallel wires from different circuits. The longer two
+ wires run parallel to one another, the larger the amount of
+ transferred energy. Cross wires at right angles to reduce
+ RFI.
+ </listitem>
+ <listitem>
+ Twist wires from the same circuits. Two wires the same
+ distance from the transmitter will get the same amount of
+ induced energy which will then cancel out. Any time you have
+ a wire pair running together, twist the pair together to
+ even out distances and reduce RFI. For altimeters, this
+ includes battery leads, switch hookups and igniter
+ circuits.
+ </listitem>
+ <listitem>
+ Avoid resonant lengths. Know what frequencies are present
+ in the environment and avoid having wire lengths near a
+ natural resonant length. Altusmetrum products transmit on the
+ 70cm amateur band, so you should avoid lengths that are a
+ simple ratio of that length; essentially any multiple of 1/4
+ of the wavelength (17.5cm).
+ </listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>The Barometric Sensor</title>
+ <para>
+ Altusmetrum altimeters measure altitude with a barometric
+ sensor, essentially measuring the amount of air above the
+ rocket to figure out how high it is. A large number of
+ measurements are taken as the altimeter initializes itself to
+ figure out the pad altitude. Subsequent measurements are then
+ used to compute the height above the pad.
+ </para>
+ <para>
+ To accurately measure atmospheric pressure, the ebay
+ containing the altimeter must be vented outside the
+ air-frame. The vent must be placed in a region of linear
+ airflow, have smooth edges, and away from areas of increasing or
+ decreasing pressure.
+ </para>
+ <para>
+ The barometric sensor in the altimeter is quite sensitive to
+ chemical damage from the products of APCP or BP combustion, so
+ make sure the ebay is carefully sealed from any compartment
+ which contains ejection charges or motors.
+ </para>
+ </section>
+ <section>
+ <title>Ground Testing</title>
+ <para>
+ The most important aspect of any installation is careful
+ ground testing. Bringing an air-frame up to the LCO table which
+ hasn't been ground tested can lead to delays or ejection
+ charges firing on the pad, or, even worse, a recovery system
+ failure.
+ </para>
+ <para>
+ Do a 'full systems' test that includes wiring up all igniters
+ without any BP and turning on all of the electronics in flight
+ mode. This will catch any mistakes in wiring and any residual
+ RFI issues that might accidentally fire igniters at the wrong
+ time. Let the air-frame sit for several minutes, checking for
+ adequate telemetry signal strength and GPS lock. If any igniters
+ fire unexpectedly, find and resolve the issue before loading any
+ BP charges!
+ </para>
+ <para>
+ Ground test the ejection charges. Prepare the rocket for
+ flight, loading ejection charges and igniters. Completely
+ assemble the air-frame and then use the 'Fire Igniters'
+ interface through a TeleDongle to command each charge to
+ fire. Make sure the charge is sufficient to robustly separate
+ the air-frame and deploy the recovery system.
+ </para>
+ </section>
+ </chapter>
+ <chapter>
+ <title>Updating Device Firmware</title>
+ <para>
+ The big concept to understand is that you have to use a
+ TeleDongle as a programmer to update a TeleMetrum or TeleMini,
+ and a TeleMetrum or other TeleDongle to program the TeleDongle
+ Due to limited memory resources in the cc1111, we don't support
+ programming directly over USB.
+ </para>
+ <para>
+ You may wish to begin by ensuring you have current firmware images.
+ These are distributed as part of the AltOS software bundle that
+ also includes the AltosUI ground station program. Newer ground
+ station versions typically work fine with older firmware versions,
+ so you don't need to update your devices just to try out new
+ software features. You can always download the most recent
+ version from <ulink url="http://www.altusmetrum.org/AltOS/"/>.
+ </para>
+ <para>
+ We recommend updating the altimeter first, before updating TeleDongle.
+ </para>
+ <section>
+ <title>Updating TeleMetrum Firmware</title>
+ <orderedlist inheritnum='inherit' numeration='arabic'>
+ <listitem>
+ Find the 'programming cable' that you got as part of the starter
+ kit, that has a red 8-pin MicroMaTch connector on one end and a
+ red 4-pin MicroMaTch connector on the other end.
+ </listitem>
+ <listitem>
+ Take the 2 screws out of the TeleDongle case to get access
+ to the circuit board.
+ </listitem>
+ <listitem>
+ Plug the 8-pin end of the programming cable to the
+ matching connector on the TeleDongle, and the 4-pin end to the
+ matching connector on the TeleMetrum.
+ Note that each MicroMaTch connector has an alignment pin that
+ goes through a hole in the PC board when you have the cable
+ oriented correctly.
+ </listitem>
+ <listitem>
+ Attach a battery to the TeleMetrum board.
+ </listitem>
+ <listitem>
+ Plug the TeleDongle into your computer's USB port, and power
+ up the TeleMetrum.
+ </listitem>
+ <listitem>
+ Run AltosUI, and select 'Flash Image' from the File menu.
+ </listitem>
+ <listitem>
+ Pick the TeleDongle device from the list, identifying it as the
+ programming device.
+ </listitem>
+ <listitem>
+ Select the image you want put on the TeleMetrum, which should have a
+ name in the form telemetrum-v1.2-1.0.0.ihx. It should be visible
+ in the default directory, if not you may have to poke around
+ your system to find it.
+ </listitem>
+ <listitem>
+ Make sure the configuration parameters are reasonable
+ looking. If the serial number and/or RF configuration
+ values aren't right, you'll need to change them.
+ </listitem>
+ <listitem>
+ Hit the 'OK' button and the software should proceed to flash
+ the TeleMetrum with new firmware, showing a progress bar.
+ </listitem>
+ <listitem>
+ Confirm that the TeleMetrum board seems to have updated OK, which you
+ can do by plugging in to it over USB and using a terminal program
+ to connect to the board and issue the 'v' command to check
+ the version, etc.
+ </listitem>
+ <listitem>
+ If something goes wrong, give it another try.
+ </listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Updating TeleMini Firmware</title>
+ <orderedlist inheritnum='inherit' numeration='arabic'>
+ <listitem>
+ You'll need a special 'programming cable' to reprogram the
+ TeleMini. It's available on the Altus Metrum web store, or
+ you can make your own using an 8-pin MicroMaTch connector on
+ one end and a set of four pins on the other.
+ </listitem>
+ <listitem>
+ Take the 2 screws out of the TeleDongle case to get access
+ to the circuit board.
+ </listitem>
+ <listitem>
+ Plug the 8-pin end of the programming cable to the matching
+ connector on the TeleDongle, and the 4-pins into the holes
+ in the TeleMini circuit board. Note that the MicroMaTch
+ connector has an alignment pin that goes through a hole in
+ the PC board when you have the cable oriented correctly, and
+ that pin 1 on the TeleMini board is marked with a square pad
+ while the other pins have round pads.
+ </listitem>
+ <listitem>
+ Attach a battery to the TeleMini board.
+ </listitem>
+ <listitem>
+ Plug the TeleDongle into your computer's USB port, and power
+ up the TeleMini
+ </listitem>
+ <listitem>
+ Run AltosUI, and select 'Flash Image' from the File menu.
+ </listitem>
+ <listitem>
+ Pick the TeleDongle device from the list, identifying it as the
+ programming device.
+ </listitem>
+ <listitem>
+ Select the image you want put on the TeleMini, which should have a
+ name in the form telemini-v1.0-1.0.0.ihx. It should be visible
+ in the default directory, if not you may have to poke around
+ your system to find it.
+ </listitem>
+ <listitem>
+ Make sure the configuration parameters are reasonable
+ looking. If the serial number and/or RF configuration
+ values aren't right, you'll need to change them.
+ </listitem>
+ <listitem>
+ Hit the 'OK' button and the software should proceed to flash
+ the TeleMini with new firmware, showing a progress bar.
+ </listitem>
+ <listitem>
+ Confirm that the TeleMini board seems to have updated OK, which you
+ can do by configuring it over the radio link through the TeleDongle, or
+ letting it come up in "flight" mode and listening for telemetry.
+ </listitem>
+ <listitem>
+ If something goes wrong, give it another try.
+ </listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Updating TeleDongle Firmware</title>
+ <para>
+ Updating TeleDongle's firmware is just like updating TeleMetrum or TeleMini
+ firmware, but you use either a TeleMetrum or another TeleDongle as the programmer.
+ </para>
+ <orderedlist inheritnum='inherit' numeration='arabic'>
+ <listitem>
+ Find the 'programming cable' that you got as part of the starter
+ kit, that has a red 8-pin MicroMaTch connector on one end and a
+ red 4-pin MicroMaTch connector on the other end.
+ </listitem>
+ <listitem>
+ Find the USB cable that you got as part of the starter kit, and
+ plug the "mini" end in to the mating connector on TeleMetrum or TeleDongle.
+ </listitem>
+ <listitem>
+ Take the 2 screws out of the TeleDongle case to get access
+ to the circuit board.
+ </listitem>
+ <listitem>
+ Plug the 8-pin end of the programming cable to the
+ matching connector on the programmer, and the 4-pin end to the
+ matching connector on the TeleDongle.
+ Note that each MicroMaTch connector has an alignment pin that
+ goes through a hole in the PC board when you have the cable
+ oriented correctly.
+ </listitem>
+ <listitem>
+ Attach a battery to the TeleMetrum board if you're using one.
+ </listitem>
+ <listitem>
+ Plug both the programmer and the TeleDongle into your computer's USB
+ ports, and power up the programmer.
+ </listitem>
+ <listitem>
+ Run AltosUI, and select 'Flash Image' from the File menu.
+ </listitem>
+ <listitem>
+ Pick the programmer device from the list, identifying it as the
+ programming device.
+ </listitem>
+ <listitem>
+ Select the image you want put on the TeleDongle, which should have a
+ name in the form teledongle-v0.2-1.0.0.ihx. It should be visible
+ in the default directory, if not you may have to poke around
+ your system to find it.
+ </listitem>
+ <listitem>
+ Make sure the configuration parameters are reasonable
+ looking. If the serial number and/or RF configuration
+ values aren't right, you'll need to change them. The TeleDongle
+ serial number is on the "bottom" of the circuit board, and can
+ usually be read through the translucent blue plastic case without
+ needing to remove the board from the case.
+ </listitem>
+ <listitem>
+ Hit the 'OK' button and the software should proceed to flash
+ the TeleDongle with new firmware, showing a progress bar.
+ </listitem>
+ <listitem>
+ Confirm that the TeleDongle board seems to have updated OK, which you
+ can do by plugging in to it over USB and using a terminal program
+ to connect to the board and issue the 'v' command to check
+ the version, etc. Once you're happy, remove the programming cable
+ and put the cover back on the TeleDongle.
+ </listitem>
+ <listitem>
+ If something goes wrong, give it another try.
+ </listitem>
+ </orderedlist>
+ <para>
+ Be careful removing the programming cable from the locking 8-pin
+ connector on TeleMetrum. You'll need a fingernail or perhaps a thin
+ screwdriver or knife blade to gently pry the locking ears out
+ slightly to extract the connector. We used a locking connector on
+ TeleMetrum to help ensure that the cabling to companion boards
+ used in a rocket don't ever come loose accidentally in flight.
+ </para>
+ </section>
+ </chapter>
+ <chapter>
+ <title>Hardware Specifications</title>
+ <section>
+ <title>TeleMetrum Specifications</title>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Recording altimeter for model rocketry.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Supports dual deployment (can fire 2 ejection charges).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ 70cm ham-band transceiver for telemetry down-link.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Barometric pressure sensor good to 45k feet MSL.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ 1-axis high-g accelerometer for motor characterization, capable of
+ +/- 50g using default part.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ On-board, integrated GPS receiver with 5Hz update rate capability.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ On-board 1 megabyte non-volatile memory for flight data storage.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ USB interface for battery charging, configuration, and data recovery.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Fully integrated support for Li-Po rechargeable batteries.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Uses Li-Po to fire e-matches, can be modified to support
+ optional separate pyro battery if needed.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ 2.75 x 1 inch board designed to fit inside 29mm air-frame coupler tube.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>TeleMini Specifications</title>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Recording altimeter for model rocketry.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Supports dual deployment (can fire 2 ejection charges).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ 70cm ham-band transceiver for telemetry down-link.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Barometric pressure sensor good to 45k feet MSL.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ On-board 5 kilobyte non-volatile memory for flight data storage.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ RF interface for battery charging, configuration, and data recovery.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Support for Li-Po rechargeable batteries, using an external charger.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Uses Li-Po to fire e-matches, can be modified to support
+ optional separate pyro battery if needed.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ 1.5 x .5 inch board designed to fit inside 18mm air-frame coupler tube.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ </chapter>
+ <chapter>
+ <title>FAQ</title>
+ <para>
+ TeleMetrum seems to shut off when disconnected from the
+ computer. Make sure the battery is adequately charged. Remember the
+ unit will pull more power than the USB port can deliver before the
+ GPS enters "locked" mode. The battery charges best when TeleMetrum
+ is turned off.
+ </para>
+ <para>
+ It's impossible to stop the TeleDongle when it's in "p" mode, I have
+ to unplug the USB cable? Make sure you have tried to "escape out" of
+ this mode. If this doesn't work the reboot procedure for the
+ TeleDongle *is* to simply unplug it. 'cu' however will retain it's
+ outgoing buffer IF your "escape out" ('~~') does not work.
+ At this point using either 'ao-view' (or possibly
+ 'cutemon') instead of 'cu' will 'clear' the issue and allow renewed
+ communication.
+ </para>
+ <para>
+ The amber LED (on the TeleMetrum) lights up when both
+ battery and USB are connected. Does this mean it's charging?
+ Yes, the yellow LED indicates the charging at the 'regular' rate.
+ If the led is out but the unit is still plugged into a USB port,
+ then the battery is being charged at a 'trickle' rate.
+ </para>
+ <para>
+ There are no "dit-dah-dah-dit" sound or lights like the manual mentions?
+ That's the "pad" mode. Weak batteries might be the problem.
+ It is also possible that the TeleMetrum is horizontal and the output
+ is instead a "dit-dit" meaning 'idle'. For TeleMini, it's possible that
+ it received a command packet which would have left it in "pad" mode.
+ </para>
+ <para>
+ How do I save flight data?
+ Live telemetry is written to file(s) whenever AltosUI is connected
+ to the TeleDongle. The file area defaults to ~/TeleMetrum
+ but is easily changed using the menus in AltosUI. The files that
+ are written end in '.telem'. The after-flight
+ data-dumped files will end in .eeprom and represent continuous data
+ unlike the .telem files that are subject to losses
+ along the RF data path.
+ See the above instructions on what and how to save the eeprom stored
+ data after physically retrieving your altimeter. Make sure to save
+ the on-board data after each flight; while the TeleMetrum can store
+ multiple flights, you never know when you'll lose the altimeter...
+ </para>
+ </chapter>
+ <appendix>
+ <title>Notes for Older Software</title>
+ <para>
+ <emphasis>
+ Before AltosUI was written, using Altus Metrum devices required
+ some finesse with the Linux command line. There was a limited
+ GUI tool, ao-view, which provided functionality similar to the
+ Monitor Flight window in AltosUI, but everything else was a
+ fairly 80's experience. This appendix includes documentation for
+ using that software.
+ </emphasis>
+ </para>
+ <para>
+ Both TeleMetrum and TeleDongle can be directly communicated
+ with using USB ports. The first thing you should try after getting
+ both units plugged into to your computer's USB port(s) is to run
+ 'ao-list' from a terminal-window to see what port-device-name each
+ device has been assigned by the operating system.
+ You will need this information to access the devices via their
+ respective on-board firmware and data using other command line
+ programs in the AltOS software suite.
+ </para>
+ <para>
+ TeleMini can be communicated with through a TeleDongle device
+ over the radio link. When first booted, TeleMini listens for a
+ TeleDongle device and if it receives a packet, it goes into
+ 'idle' mode. Otherwise, it goes into 'pad' mode and waits to be
+ launched. The easiest way to get it talking is to start the
+ communication link on the TeleDongle and the power up the
+ TeleMini board.
+ </para>
+ <para>
+ To access the device's firmware for configuration you need a terminal
+ program such as you would use to talk to a modem. The software
+ authors prefer using the program 'cu' which comes from the UUCP package
+ on most Unix-like systems such as Linux. An example command line for
+ cu might be 'cu -l /dev/ttyACM0', substituting the correct number
+ indicated from running the
+ ao-list program. Another reasonable terminal program for Linux is
+ 'cutecom'. The default 'escape'
+ character used by CU (i.e. the character you use to
+ issue commands to cu itself instead of sending the command as input
+ to the connected device) is a '~'. You will need this for use in
+ only two different ways during normal operations. First is to exit
+ the program by sending a '~.' which is called a 'escape-disconnect'
+ and allows you to close-out from 'cu'. The
+ second use will be outlined later.
+ </para>
+ <para>
+ All of the Altus Metrum devices share the concept of a two level
+ command set in their firmware.
+ The first layer has several single letter commands. Once
+ you are using 'cu' (or 'cutecom') sending (typing) a '?'
+ returns a full list of these
+ commands. The second level are configuration sub-commands accessed
+ using the 'c' command, for
+ instance typing 'c?' will give you this second level of commands
+ (all of which require the
+ letter 'c' to access). Please note that most configuration options
+ are stored only in Flash memory; TeleDongle doesn't provide any storage
+ for these options and so they'll all be lost when you unplug it.
+ </para>
+ <para>
+ Try setting these configuration ('c' or second level menu) values. A good
+ place to start is by setting your call sign. By default, the boards
+ use 'N0CALL' which is cute, but not exactly legal!
+ Spend a few minutes getting comfortable with the units, their
+ firmware, and 'cu' (or possibly 'cutecom').
+ For instance, try to send
+ (type) a 'c r 2' and verify the channel change by sending a 'c s'.
+ Verify you can connect and disconnect from the units while in your
+ terminal program by sending the escape-disconnect mentioned above.
+ </para>
+ <para>
+ To set the radio frequency, use the 'c R' command to specify the
+ radio transceiver configuration parameter. This parameter is computed
+ using the desired frequency, 'F', the radio calibration parameter, 'C' (showed by the 'c s' command) and
+ the standard calibration reference frequency, 'S', (normally 434.550MHz):
+ <programlisting>
+ R = F / S * C
+ </programlisting>
+ Round the result to the nearest integer value.
+ As with all 'c' sub-commands, follow this with a 'c w' to write the
+ change to the parameter block in the on-board flash on
+ your altimeter board if you want the change to stay in place across reboots.
+ </para>
+ <para>
+ To set the apogee delay, use the 'c d' command.
+ As with all 'c' sub-commands, follow this with a 'c w' to write the
+ change to the parameter block in the on-board DataFlash chip.
+ </para>
+ <para>
+ To set the main deployment altitude, use the 'c m' command.
+ As with all 'c' sub-commands, follow this with a 'c w' to write the
+ change to the parameter block in the on-board DataFlash chip.
+ </para>
+ <para>
+ To calibrate the radio frequency, connect the UHF antenna port to a
+ frequency counter, set the board to 434.550MHz, and use the 'C'
+ command to generate a CW carrier. Wait for the transmitter temperature
+ to stabilize and the frequency to settle down.
+ Then, divide 434.550 MHz by the
+ measured frequency and multiply by the current radio cal value show
+ in the 'c s' command. For an unprogrammed board, the default value
+ is 1186611. Take the resulting integer and program it using the 'c f'
+ command. Testing with the 'C' command again should show a carrier
+ within a few tens of Hertz of the intended frequency.
+ As with all 'c' sub-commands, follow this with a 'c w' to write the
+ change to the parameter block in the on-board DataFlash chip.
+ </para>
+ <para>
+ Note that the 'reboot' command, which is very useful on the altimeters,
+ will likely just cause problems with the dongle. The *correct* way
+ to reset the dongle is just to unplug and re-plug it.
+ </para>
+ <para>
+ A fun thing to do at the launch site and something you can do while
+ learning how to use these units is to play with the radio link access
+ between an altimeter and the TeleDongle. Be aware that you *must* create
+ some physical separation between the devices, otherwise the link will
+ not function due to signal overload in the receivers in each device.
+ </para>
+ <para>
+ Now might be a good time to take a break and read the rest of this
+ manual, particularly about the two "modes" that the altimeters
+ can be placed in. TeleMetrum uses the position of the device when booting
+ up will determine whether the unit is in "pad" or "idle" mode. TeleMini
+ enters "idle" mode when it receives a command packet within the first 5 seconds
+ of being powered up, otherwise it enters "pad" mode.
+ </para>
+ <para>
+ You can access an altimeter in idle mode from the TeleDongle's USB
+ connection using the radio link
+ by issuing a 'p' command to the TeleDongle. Practice connecting and
+ disconnecting ('~~' while using 'cu') from the altimeter. If
+ you cannot escape out of the "p" command, (by using a '~~' when in
+ CU) then it is likely that your kernel has issues. Try a newer version.
+ </para>
+ <para>
+ Using this radio link allows you to configure the altimeter, test
+ fire e-matches and igniters from the flight line, check pyro-match
+ continuity and so forth. You can leave the unit turned on while it
+ is in 'idle mode' and then place the
+ rocket vertically on the launch pad, walk away and then issue a
+ reboot command. The altimeter will reboot and start sending data
+ having changed to the "pad" mode. If the TeleDongle is not receiving
+ this data, you can disconnect 'cu' from the TeleDongle using the
+ procedures mentioned above and THEN connect to the TeleDongle from
+ inside 'ao-view'. If this doesn't work, disconnect from the
+ TeleDongle, unplug it, and try again after plugging it back in.
+ </para>
+ <para>
+ In order to reduce the chance of accidental firing of pyrotechnic
+ charges, the command to fire a charge is intentionally somewhat
+ difficult to type, and the built-in help is slightly cryptic to
+ prevent accidental echoing of characters from the help text back at
+ the board from firing a charge. The command to fire the apogee
+ drogue charge is 'i DoIt drogue' and the command to fire the main
+ charge is 'i DoIt main'.
+ </para>
+ <para>
+ On TeleMetrum, the GPS will eventually find enough satellites, lock in on them,
+ and 'ao-view' will both auditorily announce and visually indicate
+ that GPS is ready.
+ Now you can launch knowing that you have a good data path and
+ good satellite lock for flight data and recovery. Remember
+ you MUST tell ao-view to connect to the TeleDongle explicitly in
+ order for ao-view to be able to receive data.
+ </para>
+ <para>
+ The altimeters provide RDF (radio direction finding) tones on
+ the pad, during descent and after landing. These can be used to
+ locate the rocket using a directional antenna; the signal
+ strength providing an indication of the direction from receiver to rocket.
+ </para>
+ <para>
+ TeleMetrum also provides GPS tracking data, which can further simplify
+ locating the rocket once it has landed. (The last good GPS data
+ received before touch-down will be on the data screen of 'ao-view'.)
+ </para>
+ <para>
+ Once you have recovered the rocket you can download the eeprom
+ contents using either 'ao-dumplog' (or possibly 'ao-eeprom'), over
+ either a USB cable or over the radio link using TeleDongle.
+ And by following the man page for 'ao-postflight' you can create
+ various data output reports, graphs, and even KML data to see the
+ flight trajectory in Google-earth. (Moving the viewing angle making
+ sure to connect the yellow lines while in Google-earth is the proper
+ technique.)
+ </para>
+ <para>
+ As for ao-view.... some things are in the menu but don't do anything
+ very useful. The developers have stopped working on ao-view to focus
+ on a new, cross-platform ground station program. So ao-view may or
+ may not be updated in the future. Mostly you just use
+ the Log and Device menus. It has a wonderful display of the incoming
+ flight data and I am sure you will enjoy what it has to say to you
+ once you enable the voice output!
+ </para>
+ </appendix>
+ <appendix>
+ <title>Calibration</title>
+ <para>
+ There are only two calibrations required for a TeleMetrum board, and
+ only one for TeleDongle and TeleMini. All boards are shipped from
+ the factory pre-calibrated, but the procedures are documented here
+ in case they are ever needed. Re-calibration is not supported by
+ AltosUI, you must connect to the board with a serial terminal program
+ and interact directly with the on-board command interpreter to effect
+ calibration.
+ </para>
+ <section>
+ <title>Radio Frequency</title>
+ <para>
+ The radio frequency is synthesized from a clock based on the 48 MHz
+ crystal on the board. The actual frequency of this oscillator
+ must be measured to generate a calibration constant. While our
+ GFSK modulation
+ bandwidth is wide enough to allow boards to communicate even when
+ their oscillators are not on exactly the same frequency, performance
+ is best when they are closely matched.
+ Radio frequency calibration requires a calibrated frequency counter.
+ Fortunately, once set, the variation in frequency due to aging and
+ temperature changes is small enough that re-calibration by customers
+ should generally not be required.
+ </para>
+ <para>
+ To calibrate the radio frequency, connect the UHF antenna port to a
+ frequency counter, set the board to 434.550MHz, and use the 'C'
+ command in the on-board command interpreter to generate a CW
+ carrier. For TeleMetrum, this is best done over USB. For TeleMini,
+ note that the only way to escape the 'C' command is via power cycle
+ since the board will no longer be listening for commands once it
+ starts generating a CW carrier.
+ </para>
+ <para>
+ Wait for the transmitter temperature to stabilize and the frequency
+ to settle down. Then, divide 434.550 MHz by the
+ measured frequency and multiply by the current radio cal value show
+ in the 'c s' command. For an unprogrammed board, the default value
+ is 1186611. Take the resulting integer and program it using the 'c f'
+ command. Testing with the 'C' command again should show a carrier
+ within a few tens of Hertz of the intended frequency.
+ As with all 'c' sub-commands, follow this with a 'c w' to write the
+ change to the parameter block in the on-board DataFlash chip.
+ </para>
+ <para>
+ Note that any time you re-do the radio frequency calibration, the
+ radio frequency is reset to the default 434.550 Mhz. If you want
+ to use another frequency, you will have to set that again after
+ calibration is completed.
+ </para>
+ </section>
+ <section>
+ <title>TeleMetrum Accelerometer</title>
+ <para>
+ The TeleMetrum accelerometer we use has its own 5 volt power
+ supply and
+ the output must be passed through a resistive voltage divider to match
+ the input of our 3.3 volt ADC. This means that unlike the barometric
+ sensor, the output of the acceleration sensor is not ratio-metric to
+ the ADC converter, and calibration is required. Explicitly
+ calibrating the accelerometers also allows us to load any device
+ from a Freescale family that includes at least +/- 40g, 50g, 100g,
+ and 200g parts. Using gravity,
+ a simple 2-point calibration yields acceptable results capturing both
+ the different sensitivities and ranges of the different accelerometer
+ parts and any variation in power supply voltages or resistor values
+ in the divider network.
+ </para>
+ <para>
+ To calibrate the acceleration sensor, use the 'c a 0' command. You
+ will be prompted to orient the board vertically with the UHF antenna
+ up and press a key, then to orient the board vertically with the
+ UHF antenna down and press a key. Note that the accuracy of this
+ calibration depends primarily on how perfectly vertical and still
+ the board is held during the cal process. As with all 'c'
+ sub-commands, follow this with a 'c w' to write the
+ change to the parameter block in the on-board DataFlash chip.
+ </para>
+ <para>
+ The +1g and -1g calibration points are included in each telemetry
+ frame and are part of the header stored in onboard flash to be
+ downloaded after flight. We always store and return raw ADC
+ samples for each sensor... so nothing is permanently "lost" or
+ "damaged" if the calibration is poor.
+ </para>
+ <para>
+ In the unlikely event an accel cal goes badly, it is possible
+ that TeleMetrum may always come up in 'pad mode' and as such not be
+ listening to either the USB or radio link. If that happens,
+ there is a special hook in the firmware to force the board back
+ in to 'idle mode' so you can re-do the cal. To use this hook, you
+ just need to ground the SPI clock pin at power-on. This pin is
+ available as pin 2 on the 8-pin companion connector, and pin 1 is
+ ground. So either carefully install a fine-gauge wire jumper
+ between the two pins closest to the index hole end of the 8-pin
+ connector, or plug in the programming cable to the 8-pin connector
+ and use a small screwdriver or similar to short the two pins closest
+ to the index post on the 4-pin end of the programming cable, and
+ power up the board. It should come up in 'idle mode' (two beeps),
+ allowing a re-cal.
+ </para>
+ </section>
+ </appendix>
+ <appendix
+ xmlns:xi="http://www.w3.org/2001/XInclude">
+ <title>Release Notes</title>
+ <xi:include href="release-notes-1.1.xsl" xpointer="xpointer(/article/*)"/>
+ <xi:include href="release-notes-1.0.1.xsl" xpointer="xpointer(/article/*)"/>
+ <xi:include href="release-notes-0.9.2.xsl" xpointer="xpointer(/article/*)"/>
+ <xi:include href="release-notes-0.9.xsl" xpointer="xpointer(/article/*)"/>
+ <xi:include href="release-notes-0.8.xsl" xpointer="xpointer(/article/*)"/>
+ <xi:include href="release-notes-0.7.1.xsl" xpointer="xpointer(/article/*)"/>
+ </appendix>
+</book>
+
+<!-- LocalWords: Altusmetrum
+-->
diff --git a/doc/companion.xsl b/doc/companion.xsl
new file mode 100644
index 00000000..1215d9af
--- /dev/null
+++ b/doc/companion.xsl
@@ -0,0 +1,347 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd">
+
+<article>
+ <articleinfo>
+ <title>AltOS Companion Port</title>
+ <subtitle>Protocol Definitions</subtitle>
+ <author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ </author>
+ <copyright>
+ <year>2012</year>
+ <holder>Keith Packard</holder>
+ </copyright>
+ <legalnotice>
+ <para>
+ This document is released under the terms of the
+ <ulink url="http://creativecommons.org/licenses/by-sa/3.0/">
+ Creative Commons ShareAlike 3.0
+ </ulink>
+ license.
+ </para>
+ </legalnotice>
+ <revhistory>
+ <revision>
+ <revnumber>0.1</revnumber>
+ <date>13 January 2012</date>
+ <revremark>Initial content</revremark>
+ </revision>
+ </revhistory>
+ </articleinfo>
+ <section>
+ <title>Companion Port</title>
+ <para>
+ Many Altus Metrum products come with an eight pin Micro MaTch
+ connector, called the Companion Port. This is often used to
+ program devices using a programming cable. However, it can also
+ be used to connect TeleMetrum to external companion boards
+ (hence the name).
+ </para>
+ <para>
+ The Companion Port provides two different functions:
+ <itemizedlist>
+ <listitem>
+ Power. Both battery-level and 3.3V regulated power are
+ available. Note that the amount of regulated power is not
+ huge; TeleMetrum contains a 150mA regulator and uses, at
+ peak, about 120mA or so. For applications needing more than
+ a few dozen mA, placing a separate regulator on them and
+ using the battery for power is probably a good idea.
+ </listitem>
+ <listitem>
+ SPI. The flight computer operates as a SPI master, using
+ a protocol defined in this document. Companion boards
+ provide a matching SPI slave implementation which supplies
+ telemetry information for the radio downlink during flight
+ </listitem>
+ </itemizedlist>
+ </para>
+ </section>
+ <section>
+ <title>Companion SPI Protocol</title>
+ <para>
+ The flight computer implements a SPI master communications
+ channel over the companion port, and uses this to get
+ information about a connected companion board and then to get
+ telemetry data for transmission during flight.
+ </para>
+ <para>
+ At startup time, the flight computer sends a setup request
+ packet, and the companion board returns a board identifier, the
+ desired telemetry update period and the number of data channels
+ provided. The flight computer doesn't interpret the telemetry
+ data at all, simply packing it up and sending it over the link.
+ Telemetry packets are 32 bytes long, and companion packets use 8
+ bytes as a header leaving room for a maximum of 12 16-bit data
+ values.
+ </para>
+ <para>
+ Because of the limits of the AVR processors used in the first
+ two companion boards, the SPI data rate is set to 187.5kbaud.
+ </para>
+ </section>
+ <section>
+ <title>SPI Message Formats</title>
+ This section first defines the command message format sent from
+ the flight computer to the companion board, and then the various
+ reply message formats for each type of command message.
+ <section>
+ <title>Command Message</title>
+ <table frame='all'>
+ <title>Companion Command Message</title>
+ <tgroup cols='4' align='center' colsep='1' rowsep='1'>
+ <colspec align='center' colwidth='*' colname='Offset'/>
+ <colspec align='center' colwidth='3*' colname='Data Type'/>
+ <colspec align='left' colwidth='3*' colname='Name'/>
+ <colspec align='left' colwidth='9*' colname='Description'/>
+ <thead>
+ <row>
+ <entry align='center'>Offset</entry>
+ <entry align='center'>Data Type</entry>
+ <entry align='center'>Name</entry>
+ <entry align='center'>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>0</entry>
+ <entry>uint8_t</entry>
+ <entry>command</entry>
+ <entry>Command identifier</entry>
+ </row>
+ <row>
+ <entry>1</entry>
+ <entry>uint8_t</entry>
+ <entry>flight_state</entry>
+ <entry>Current flight computer state</entry>
+ </row>
+ <row>
+ <entry>2</entry>
+ <entry>uint16_t</entry>
+ <entry>tick</entry>
+ <entry>Flight computer clock (100 ticks/second)</entry>
+ </row>
+ <row>
+ <entry>4</entry>
+ <entry>uint16_t</entry>
+ <entry>serial</entry>
+ <entry>Flight computer serial number</entry>
+ </row>
+ <row>
+ <entry>6</entry>
+ <entry>uint16_t</entry>
+ <entry>flight</entry>
+ <entry>Flight number</entry>
+ </row>
+ <row>
+ <entry>8</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <table frame='all'>
+ <title>Companion Command Identifiers</title>
+ <tgroup cols='3' align='center' colsep='1' rowsep='1'>
+ <colspec align='center' colwidth='*' colname='Value'/>
+ <colspec align='left' colwidth='3*' colname='Name'/>
+ <colspec align='left' colwidth='9*' colname='Description'/>
+ <thead>
+ <row>
+ <entry>Value</entry>
+ <entry>Name</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>1</entry>
+ <entry>SETUP</entry>
+ <entry>Supply the flight computer with companion
+ information</entry>
+ </row>
+ <row>
+ <entry>2</entry>
+ <entry>FETCH</entry>
+ <entry>Return telemetry information</entry>
+ </row>
+ <row>
+ <entry>3</entry>
+ <entry>NOTIFY</entry>
+ <entry>Tell companion board when flight state
+ changes</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>
+ The flight computer will send a SETUP message shortly after
+ power-up and will then send FETCH messages no more often than
+ the rate specified in the SETUP reply. NOTIFY messages will be
+ sent whenever the flight state changes.
+ </para>
+ <para>
+ 'flight_state' records the current state of the flight,
+ whether on the pad, under power, coasting to apogee or
+ descending on the drogue or main chute.
+ </para>
+ <para>
+ 'tick' provides the current flight computer clock, which
+ be used to synchronize data recorded on the flight computer
+ with that recorded on the companion board in post-flight analysis.
+ </para>
+ <para>
+ 'serial' is the product serial number of the flight computer,
+ 'flight' is the flight sequence number. Together, these two
+ uniquely identify the flight and can be recorded with any
+ companion board data logging to associate the companion data
+ with the proper flight.
+ </para>
+ <para>
+ NOTIFY commands require no reply at all, they are used solely
+ to inform the companion board when the state of the flight, as
+ computed by the flight computer, changes. Companion boards can
+ use this to change data collection parameters, disabling data
+ logging until the flight starts and terminating it when the
+ flight ends.
+ </para>
+ </section>
+ <section>
+ <title>SETUP reply message</title>
+ <table frame='all'>
+ <title>SETUP reply contents</title>
+ <tgroup cols='4' align='center' colsep='1' rowsep='1'>
+ <colspec align='center' colwidth='*' colname='Offset'/>
+ <colspec align='center' colwidth='3*' colname='Data Type'/>
+ <colspec align='left' colwidth='3*' colname='Name'/>
+ <colspec align='left' colwidth='9*' colname='Description'/>
+ <thead>
+ <row>
+ <entry align='center'>Offset</entry>
+ <entry align='center'>Data Type</entry>
+ <entry align='center'>Name</entry>
+ <entry align='center'>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>0</entry>
+ <entry>uint16_t</entry>
+ <entry>board_id</entry>
+ <entry>Board identifier</entry>
+ </row>
+ <row>
+ <entry>2</entry>
+ <entry>uint16_t</entry>
+ <entry>board_id_inverse</entry>
+ <entry>~board_id—used to tell if a board is present</entry>
+ </row>
+ <row>
+ <entry>4</entry>
+ <entry>uint8_t</entry>
+ <entry>update_period</entry>
+ <entry>Minimum time (in 100Hz ticks) between FETCH commands</entry>
+ </row>
+ <row>
+ <entry>5</entry>
+ <entry>uint8_t</entry>
+ <entry>channels</entry>
+ <entry>Number of data channels to retrieve in FETCH command</entry>
+ </row>
+ <row>
+ <entry>6</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>
+ The SETUP reply contains enough information to uniquely
+ identify the companion board to the end user as well as for
+ the flight computer to know how many data values to expect in
+ reply to a FETCH command, and how often to fetch that data.
+ </para>
+ <para>
+ To detect the presence of a companion board, the flight
+ computer checks to make sure that board_id_inverse is the
+ bit-wise inverse of board_id. Current companion boards use
+ USB product ID as the board_id, but the flight computer does
+ not interpret this data and so it can be any value.
+ </para>
+ </section>
+ <section>
+ <title>FETCH reply message</title>
+ <table frame='all'>
+ <title>FETCH reply contents</title>
+ <tgroup cols='4' align='center' colsep='1' rowsep='1'>
+ <colspec align='center' colwidth='*' colname='Offset'/>
+ <colspec align='center' colwidth='3*' colname='Data Type'/>
+ <colspec align='left' colwidth='3*' colname='Name'/>
+ <colspec align='left' colwidth='9*' colname='Description'/>
+ <thead>
+ <row>
+ <entry align='center'>Offset</entry>
+ <entry align='center'>Data Type</entry>
+ <entry align='center'>Name</entry>
+ <entry align='center'>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>0</entry>
+ <entry>uint16_t</entry>
+ <entry>data0</entry>
+ <entry>0th data item</entry>
+ </row>
+ <row>
+ <entry>2</entry>
+ <entry>uint16_t</entry>
+ <entry>data1</entry>
+ <entry>1st data item</entry>
+ </row>
+ <row>
+ <entry>...</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>
+ The FETCH reply contains arbitrary data to be reported over
+ the flight computer telemetry link. The number of 16-bit data items
+ must match the 'channels' value provided in the SETUP reply
+ message.
+ </para>
+ </section>
+ </section>
+ <section>
+ <title>History and Motivation</title>
+ <para>
+ To allow cross-programming, the original TeleMetrum and
+ TeleDongle designs needed to include some kind of
+ connector. With that in place, adding the ability to connect
+ external cards to TeleMetrum was fairly simple. We set the
+ software piece of this puzzle aside until we had a companion
+ board to use.
+ </para>
+ <para>
+ The first companion board was TeleScience. Designed to collect
+ temperature data from the nose and fin of the airframe, the main
+ requirement for the companion port was that it be able to report
+ telemetry data during flight as a back-up in case the
+ TeleScience on-board data was lost.
+ </para>
+ <para>
+ The second companion board, TelePyro, provides 8 additional
+ channels for deployment, staging or other activities. To avoid
+ re-programming the TeleMetrum to use TelePyro, we decided to
+ provide enough information over the companion link for it to
+ independently control those channels.
+ </para>
+ <para>
+ Providing a standard, constant interface between the flight
+ computer and companion boards allows for the base flight
+ computer firmware to include support for companion boards.
+ </para>
+ </section>
+</article>
diff --git a/doc/megametrum-outline.pdf b/doc/megametrum-outline.pdf
new file mode 100644
index 00000000..f8fc26e2
--- /dev/null
+++ b/doc/megametrum-outline.pdf
Binary files differ
diff --git a/doc/megametrum-outline.svg b/doc/megametrum-outline.svg
new file mode 100644
index 00000000..e8d74d38
--- /dev/null
+++ b/doc/megametrum-outline.svg
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="427.5"
+ height="270"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="megametrum-outline.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path3866"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1783851"
+ inkscape:cx="315.40175"
+ inkscape:cy="122.33575"
+ inkscape:document-units="in"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1527"
+ inkscape:window-height="1313"
+ inkscape:window-x="813"
+ inkscape:window-y="166"
+ inkscape:window-maximized="0"
+ units="in"
+ showguides="true"
+ inkscape:guide-bbox="true">
+ <sodipodi:guide
+ position="0,0"
+ orientation="0,427.5"
+ id="guide3005" />
+ <sodipodi:guide
+ position="427.5,0"
+ orientation="-270,0"
+ id="guide3007" />
+ <sodipodi:guide
+ position="427.5,270"
+ orientation="0,-427.5"
+ id="guide3009" />
+ <sodipodi:guide
+ position="0,270"
+ orientation="270,0"
+ id="guide3011" />
+ <inkscape:grid
+ type="xygrid"
+ id="grid3013"
+ empspacing="4"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ units="in"
+ spacingx="0.025in"
+ spacingy="0.025in" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-782.35975)">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:0.54555845;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2816"
+ width="291.95444"
+ height="111.95444"
+ x="90.272781"
+ y="850.13251" />
+ <g
+ inkscape:tile-y0="681.11218"
+ inkscape:tile-x0="90"
+ id="use3601"
+ transform="matrix(0.97131843,0,0,0.97528987,8.397686,191.32255)">
+ <path
+ sodipodi:type="arc"
+ style="fill:none;stroke:#000000;stroke-width:1.41507304;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3611"
+ sodipodi:cx="116"
+ sodipodi:cy="739.36218"
+ sodipodi:rx="17"
+ sodipodi:ry="18"
+ d="m 133,739.36218 c 0,9.94113 -7.61116,18 -17,18 -9.38884,0 -17,-8.05887 -17,-18 0,-9.94112 7.61116,-18 17,-18 9.38884,0 17,8.05888 17,18 z"
+ transform="matrix(0.32722728,0,0,0.3090422,57.632964,458.24316)" />
+ <path
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.10785132;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 95.625,692.36218 0,-11.25"
+ id="path3613"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path3615"
+ d="m 90,686.73718 11.25,0"
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.09;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ inkscape:tile-y0="681.11218"
+ inkscape:tile-x0="90"
+ id="use3603"
+ transform="matrix(0.97186116,0,0,0.97241431,278.34851,193.3134)">
+ <path
+ sodipodi:type="arc"
+ style="fill:none;stroke:#000000;stroke-width:1.41507304;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3619"
+ sodipodi:cx="116"
+ sodipodi:cy="739.36218"
+ sodipodi:rx="17"
+ sodipodi:ry="18"
+ d="m 133,739.36218 c 0,9.94113 -7.61116,18 -17,18 -9.38884,0 -17,-8.05887 -17,-18 0,-9.94112 7.61116,-18 17,-18 9.38884,0 17,8.05888 17,18 z"
+ transform="matrix(0.32722728,0,0,0.3090422,57.632964,458.24316)" />
+ <path
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.10785132;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 95.625,692.36218 0,-11.25"
+ id="path3621"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path3623"
+ d="m 90,686.73718 11.25,0"
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.09;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ inkscape:tile-y0="681.11218"
+ inkscape:tile-x0="90"
+ id="use3605"
+ transform="matrix(0.97475506,0,0,0.97241431,278.08835,283.31323)">
+ <path
+ sodipodi:type="arc"
+ style="fill:none;stroke:#000000;stroke-width:1.41507304;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3627"
+ sodipodi:cx="116"
+ sodipodi:cy="739.36218"
+ sodipodi:rx="17"
+ sodipodi:ry="18"
+ d="m 133,739.36218 c 0,9.94113 -7.61116,18 -17,18 -9.38884,0 -17,-8.05887 -17,-18 0,-9.94112 7.61116,-18 17,-18 9.38884,0 17,8.05888 17,18 z"
+ transform="matrix(0.32722728,0,0,0.3090422,57.632964,458.24316)" />
+ <path
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.10785132;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 95.625,692.36218 0,-11.25"
+ id="path3629"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path3631"
+ d="m 90,686.73718 11.25,0"
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.09;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ inkscape:tile-y0="681.11218"
+ inkscape:tile-x0="90"
+ id="use3607"
+ transform="matrix(0.97186116,0,0,0.97241431,8.3485628,283.31356)">
+ <path
+ sodipodi:type="arc"
+ style="fill:none;stroke:#000000;stroke-width:1.41507304;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3635"
+ sodipodi:cx="116"
+ sodipodi:cy="739.36218"
+ sodipodi:rx="17"
+ sodipodi:ry="18"
+ d="m 133,739.36218 c 0,9.94113 -7.61116,18 -17,18 -9.38884,0 -17,-8.05887 -17,-18 0,-9.94112 7.61116,-18 17,-18 9.38884,0 17,8.05888 17,18 z"
+ transform="matrix(0.32722728,0,0,0.3090422,57.632964,458.24316)" />
+ <path
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.10785132;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 95.625,692.36218 0,-11.25"
+ id="path3637"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path3639"
+ d="m 90,686.73718 11.25,0"
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.09;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Lend);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 135,903.85975 157.5,0"
+ id="path2829"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Minion Pro;-inkscape-font-specification:Minion Pro"
+ x="888.10974"
+ y="-303.75"
+ id="text4236"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ x="888.10974"
+ y="-303.75"
+ id="tspan4242">UP</tspan></text>
+ </g>
+</svg>
diff --git a/doc/release-notes-0.7.1.xsl b/doc/release-notes-0.7.1.xsl
new file mode 100644
index 00000000..75158a02
--- /dev/null
+++ b/doc/release-notes-0.7.1.xsl
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd">
+
+<article>
+ <para>
+Version 0.7.1 is the first release containing our new cross-platform Java-based user interface. AltosUI can:
+ </para>
+ <itemizedlist>
+ <listitem>
+ Receive and log telemetry from a connected TeleDongle
+ device. All data received is saved to log files named with the
+ current date and the connected rocket serial and flight
+ numbers. There is no mode in which telemetry data will not be
+ saved.
+ </listitem>
+ <listitem>
+ Download logged data from TeleMetrum devices, either through a
+ direct USB connection or over the air through a TeleDongle
+ device.
+ </listitem>
+ <listitem>
+ Configure a TeleMetrum device, setting the radio channel,
+ callsign, apogee delay and main deploy height. This can be done
+ through either a USB connection or over a radio link via a
+ TeleDongle device.
+ </listitem>
+ <listitem>
+ Replay a flight in real-time. This takes a saved telemetry log
+ or eeprom download and replays it through the user interface so
+ you can relive your favorite rocket flights.
+ </listitem>
+ <listitem>
+ Reprogram Altus Metrum devices. Using an Altus Metrum device
+ connected via USB, another Altus Metrum device can be
+ reprogrammed using the supplied programming cable between the
+ two devices.
+ </listitem>
+ <listitem>
+ Export Flight data to a comma-separated-values file. This takes
+ either telemetry or on-board flight data and generates data
+ suitable for use in external applications. All data is exported
+ using standard units so that no device-specific knowledge is
+ needed to handle the data.
+ </listitem>
+ <listitem>
+ Speak to you during the flight. Instead of spending the flight
+ hunched over your laptop looking at the screen, enjoy the view
+ while the computer tells you what’s going on up there. During
+ ascent, you hear the current flight state and altitude
+ information. During descent, you get azimuth, elevation and
+ range information to try and help you find your rocket in the
+ air. Once on the ground, the direction and distance are
+ reported.
+ </listitem>
+ </itemizedlist>
+</article>
diff --git a/doc/release-notes-0.8.xsl b/doc/release-notes-0.8.xsl
new file mode 100644
index 00000000..c54f97e9
--- /dev/null
+++ b/doc/release-notes-0.8.xsl
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd">
+
+<article>
+ <para>
+ Version 0.8 offers a major upgrade in the AltosUI
+ interface. Significant new features include:
+ </para>
+ <itemizedlist>
+ <listitem>
+ Post-flight graphing tool. This lets you explore the behaviour
+ of your rocket after flight with a scroll-able and zoom-able
+ chart showing the altitude, speed and acceleration of the
+ airframe along with events recorded by the flight computer. You
+ can export graphs to PNG files, or print them directly.
+ </listitem>
+ <listitem>
+ Real-time moving map which overlays the in-progress flight on
+ satellite imagery fetched from Google Maps. This lets you see in
+ pictures where your rocket has landed, allowing you to plan
+ recovery activities more accurately.
+ </listitem>
+ <listitem>
+ Wireless recovery system testing. Prep your rocket for flight
+ and test fire the deployment charges to make sure things work as
+ expected. All without threading wires through holes in your
+ airframe.
+ </listitem>
+ <listitem>
+ Optimized flight status displays. Each flight state now has it's
+ own custom 'tab' in the flight monitoring window so you can
+ focus on the most important details. Pre-flight, the system
+ shows a set of red/green status indicators for battery voltage,
+ apogee/main igniter continutity and GPS reception. Wait until
+ they're all green and your rocket is ready for flight. There are
+ also tabs for ascent, descent and landing along with the
+ original tabular view of the data.
+ </listitem>
+ <listitem>
+ Monitor multiple flights simultaneously. If you have more than
+ one TeleDongle, you can monitor a flight with each one on the
+ same computer.
+ </listitem>
+ <listitem>
+ Automatic flight monitoring at startup. Plug TeleDongle into the
+ machine before starting AltosUI and it will automatically
+ connect to it and prepare to monitor a flight.
+ </listitem>
+ <listitem>
+ Exports Google Earth flight tracks. Using the Keyhole Markup
+ Language (.kml) file format, this provides a 3D view of your
+ rocket flight through the Google Earth program.
+ </listitem>
+ </itemizedlist>
+</article>
diff --git a/doc/release-notes-0.9.2.xsl b/doc/release-notes-0.9.2.xsl
new file mode 100644
index 00000000..e5f66c60
--- /dev/null
+++ b/doc/release-notes-0.9.2.xsl
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd">
+
+<article>
+ <para>
+ Version 0.9.2 is an AltosUI bug-fix release, with no firmware changes.
+ </para>
+ <itemizedlist>
+ <listitem>
+ Fix plotting problems due to missing file in the Mac OS install image.
+ </listitem>
+ <listitem>
+ Always read whole eeprom blocks, mark empty records invalid, display parsing errors to user.
+ </listitem>
+ <listitem>
+ Add software version to Configure AltosUI dialog
+ </listitem>
+ </itemizedlist>
+</article>
diff --git a/doc/release-notes-0.9.xsl b/doc/release-notes-0.9.xsl
new file mode 100644
index 00000000..547f46b1
--- /dev/null
+++ b/doc/release-notes-0.9.xsl
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd">
+
+<article>
+ <para>
+ Version 0.9 adds a few new firmware features and accompanying
+ AltosUI changes, along with new hardware support.
+ </para>
+ <itemizedlist>
+ <listitem>
+ Support for TeleMetrum v1.1 hardware. Sources for the flash
+ memory part used in v1.0 dried up, so v1.1 uses a different part
+ which required a new driver and support for explicit flight log
+ erasing.
+ </listitem>
+ <listitem>
+ Multiple flight log support. This stores more than one flight
+ log in the on-board flash memory. It also requires the user to
+ explicitly erase flights so that you won't lose flight logs just
+ because you fly the same board twice in one day.
+ </listitem>
+ <listitem>
+ Telemetry support for devices with serial number >=
+ 256. Previous versions used a telemetry packet format that
+ provided only 8 bits for the device serial number. This change
+ requires that both ends of the telemetry link be running the 0.9
+ firmware or they will not communicate.
+ </listitem>
+ </itemizedlist>
+</article>
diff --git a/doc/release-notes-1.0.1.xsl b/doc/release-notes-1.0.1.xsl
new file mode 100644
index 00000000..1e9fcabc
--- /dev/null
+++ b/doc/release-notes-1.0.1.xsl
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd">
+
+<article>
+ <para>
+ Version 1.0.1 is a major release, adding support for the TeleMini
+ device and lots of new AltosUI features
+ </para>
+ <para>
+ AltOS Firmware Changes
+ <itemizedlist>
+ <listitem>
+ Add TeleMini v1.0 support. Firmware images for TeleMini are
+ included in AltOS releases.
+ </listitem>
+ <listitem>
+ Change telemetry to be encoded in multiple 32-byte packets. This
+ enables support for TeleMini and other devices without requiring
+ further updates to the TeleDongle firmware.
+ </listitem>
+ <listitem>
+ Support operation of TeleMetrum with the antenna pointing
+ aft. Previous firmware versions required the antenna to be
+ pointing upwards, now there is a configuration option allowing
+ the antenna to point aft, to aid installation in some airframes.
+ </listitem>
+ <listitem>
+ Ability to disable telemetry. For airframes where an antenna
+ just isn't possible, or where radio transmissions might cause
+ trouble with other electronics, there's a configuration option
+ to disable all telemetry. Note that the board will still
+ enable the radio link in idle mode.
+ </listitem>
+ <listitem>
+ Arbitrary frequency selection. The radios in Altus Metrum
+ devices can be programmed to a wide range of frequencies, so
+ instead of limiting devices to 10 pre-selected 'channels', the
+ new firmware allows the user to choose any frequency in the
+ 70cm band. Note that the RF matching circuit on the boards is
+ tuned for around 435MHz, so frequencies far from that may
+ reduce the available range.
+ </listitem>
+ <listitem>
+ Kalman-filter based flight-tracking. The model based sensor
+ fusion approach of a Kalman filter means that AltOS now
+ computes apogee much more accurately than before, generally
+ within a fraction of a second. In addition, this approach
+ allows the baro-only TeleMini device to correctly identify
+ Mach transitions, avoiding the error-prone selection of a Mach
+ delay.
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ AltosUI Changes
+ <itemizedlist>
+ <listitem>
+ Wait for altimeter when using packet mode. Instead of quicly
+ timing out when trying to initialize a packet mode
+ configuration connection, AltosUI now waits indefinitely for
+ the remote device to appear, providing a cancel button should
+ the user get bored. This is necessary as the TeleMini can only
+ be placed in "Idle" mode if AltosUI is polling it.
+ </listitem>
+ <listitem>
+ Add main/apogee voltage graphs to the data plot. This provides
+ a visual indication if the igniters fail before being fired.
+ </listitem>
+ <listitem>
+ Scan for altimeter devices by watching the defined telemetry
+ frequencies. This avoids the problem of remembering what
+ frequency a device was configured to use, which is especially
+ important with TeleMini which does not include a USB connection.
+ </listitem>
+ <listitem>
+ Monitor altimeter state in "Idle" mode. This provides much of
+ the information presented in the "Pad" dialog from the Monitor
+ Flight command, monitoring the igniters, battery and GPS
+ status withing requiring the flight computer to be armed and
+ ready for flight.
+ </listitem>
+ <listitem>
+ Pre-load map images from home. For those launch sites which
+ don't provide free Wi-Fi, this allows you to download the
+ necessary satellite images given the location of the launch
+ site. A list of known launch sites is maintained at
+ altusmetrum.org which AltosUI downloads to populate a menu; if
+ you've got a launch site not on that list, please send the
+ name of it, latitude and longitude along with a link to the
+ web site of the controlling club to the altusmetrum mailing list.
+ </listitem>
+ <listitem>
+ Flight statistics are now displayed in the Graph data
+ window. These include max height/speed/accel, average descent
+ rates and a few other bits of information. The Graph Data
+ window can now be reached from the 'Landed' tab in the Monitor
+ Flight window so you can immediately see the results of a
+ flight.
+ </listitem>
+ </itemizedlist>
+ </para>
+</article>
diff --git a/doc/release-notes-1.1.xsl b/doc/release-notes-1.1.xsl
new file mode 100644
index 00000000..79ea39ee
--- /dev/null
+++ b/doc/release-notes-1.1.xsl
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd">
+
+<article>
+ <para>
+ Version 1.1 is a minor release. It provides a few new features in AltosUI
+ and the AltOS firmware and fixes bugs.
+ </para>
+ <para>
+ AltOS Firmware Changes
+ <itemizedlist>
+ <listitem>
+ Add apogee-lockout value. Overrides the apogee detection logic to
+ prevent incorrect apogee charge firing.
+ </listitem>
+ <listitem>
+ Fix a bug where the data reported in telemetry packets was
+ from 320ms ago.
+ </listitem>
+ <listitem>
+ Force the radio frequency to 434.550MHz when the debug clock
+ pin is connected to ground at boot time. This provides a way
+ to talk to a TeleMini which is configured to some unknown frequency.
+ </listitem>
+ <listitem>
+ Provide RSSI values for Monitor Idle mode. This makes it easy to check radio
+ range without needing to go to flight mode.
+ </listitem>
+ <listitem>
+ Fix a bug which caused the old received telemetry packets to
+ be retransmitted over the USB link when the radio was turned
+ off and back on.
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ AltosUI Changes
+ <itemizedlist>
+ <listitem>
+ Fix a bug that caused GPS ready to happen too quickly. The
+ software was using every telemetry packet to signal new GPS
+ data, which caused GPS ready to be signalled after 10 packets
+ instead of 10 GPS updates.
+ </listitem>
+ <listitem>
+ Fix Google Earth data export to work with recent versions. The
+ google earth file loading code got a lot pickier, requiring
+ some minor white space changes in the export code.
+ </listitem>
+ <listitem>
+ Make the look-n-feel configurable, providing a choice from
+ the available options.
+ </listitem>
+ <listitem>
+ Add an 'Age' element to mark how long since a telemetry packet
+ has been received. Useful to quickly gauge whether
+ communications with the rocket are still active.
+ </listitem>
+ <listitem>
+ Add 'Configure Ground Station' dialog to set the radio
+ frequency used by a particular TeleDongle without having to go
+ through the flight monitor UI.
+ </listitem>
+ <listitem>
+ Add configuration for the new apogee-lockout value. A menu provides a list of
+ reasonable values, or the value can be set by hand.
+ </listitem>
+ <listitem>
+ Re-compute time spent in each state for the flight graph; this
+ figures out the actual boost and landing times instead of
+ using the conservative values provide by the flight
+ electronics. This improves the accuracy of the boost
+ acceleration and main descent rate computations.
+ </listitem>
+ <listitem>
+ Make AltosUI run on Mac OS Lion. The default Java heap space
+ was dramatically reduced for this release causing much of the
+ UI to fail randomly. This most often affected the satellite
+ mapping download and displays.
+ </listitem>
+ <listitem>
+ Change how data are displayed in the 'table' tab of the flight
+ monitoring window. This eliminates entries duplicated from the
+ header and adds both current altitude and pad altitude, which
+ are useful in 'Monitor Idle' mode.
+ </listitem>
+ <listitem>
+ Add Imperial units mode to present data in feet instead of
+ meters.
+ </listitem>
+ </itemizedlist>
+ </para>
+</article>
diff --git a/doc/telemetrum-outline.pdf b/doc/telemetrum-outline.pdf
new file mode 100644
index 00000000..09ce5577
--- /dev/null
+++ b/doc/telemetrum-outline.pdf
Binary files differ
diff --git a/doc/telemetrum-outline.svg b/doc/telemetrum-outline.svg
new file mode 100644
index 00000000..aee63ed2
--- /dev/null
+++ b/doc/telemetrum-outline.svg
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="427.5"
+ height="270"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="telemetrum-outline.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path3866"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.1459933"
+ inkscape:cx="182.36411"
+ inkscape:cy="261.60668"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1146"
+ inkscape:window-height="846"
+ inkscape:window-x="0"
+ inkscape:window-y="20"
+ inkscape:window-maximized="0"
+ units="in" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-782.35975)">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2816"
+ width="247.38385"
+ height="89.893326"
+ x="90.0625"
+ y="872.40637" />
+ <g
+ inkscape:tile-y0="681.11218"
+ inkscape:tile-x0="90"
+ id="use3601"
+ transform="translate(28.141535,264.43715)">
+ <path
+ sodipodi:type="arc"
+ style="fill:none;stroke:#000000;stroke-width:1.41507304;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3611"
+ sodipodi:cx="116"
+ sodipodi:cy="739.36218"
+ sodipodi:rx="17"
+ sodipodi:ry="18"
+ d="m 133,739.36218 c 0,9.94113 -7.61116,18 -17,18 -9.38884,0 -17,-8.05887 -17,-18 0,-9.94112 7.61116,-18 17,-18 9.38884,0 17,8.05888 17,18 z"
+ transform="matrix(0.32722728,0,0,0.3090422,57.632964,458.24316)" />
+ <path
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.10785132;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 95.625,692.36218 0,-11.25"
+ id="path3613"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path3615"
+ d="m 90,686.73718 11.25,0"
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.09;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ <g
+ inkscape:tile-y0="681.11218"
+ inkscape:tile-x0="90"
+ id="use3603"
+ transform="translate(230.64154,196.89215)">
+ <path
+ sodipodi:type="arc"
+ style="fill:none;stroke:#000000;stroke-width:1.41507304;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3619"
+ sodipodi:cx="116"
+ sodipodi:cy="739.36218"
+ sodipodi:rx="17"
+ sodipodi:ry="18"
+ d="m 133,739.36218 c 0,9.94113 -7.61116,18 -17,18 -9.38884,0 -17,-8.05887 -17,-18 0,-9.94112 7.61116,-18 17,-18 9.38884,0 17,8.05888 17,18 z"
+ transform="matrix(0.32722728,0,0,0.3090422,57.632964,458.24316)" />
+ <path
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.10785132;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 95.625,692.36218 0,-11.25"
+ id="path3621"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path3623"
+ d="m 90,686.73718 11.25,0"
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.09;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ <g
+ inkscape:tile-y0="681.11218"
+ inkscape:tile-x0="90"
+ id="use3605"
+ transform="translate(230.64154,264.39215)">
+ <path
+ sodipodi:type="arc"
+ style="fill:none;stroke:#000000;stroke-width:1.41507304;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3627"
+ sodipodi:cx="116"
+ sodipodi:cy="739.36218"
+ sodipodi:rx="17"
+ sodipodi:ry="18"
+ d="m 133,739.36218 c 0,9.94113 -7.61116,18 -17,18 -9.38884,0 -17,-8.05887 -17,-18 0,-9.94112 7.61116,-18 17,-18 9.38884,0 17,8.05888 17,18 z"
+ transform="matrix(0.32722728,0,0,0.3090422,57.632964,458.24316)" />
+ <path
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.10785132;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 95.625,692.36218 0,-11.25"
+ id="path3629"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path3631"
+ d="m 90,686.73718 11.25,0"
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.09;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ <g
+ inkscape:tile-y0="681.11218"
+ inkscape:tile-x0="90"
+ id="use3607"
+ transform="translate(28.141535,196.89215)">
+ <path
+ sodipodi:type="arc"
+ style="fill:none;stroke:#000000;stroke-width:1.41507304;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3635"
+ sodipodi:cx="116"
+ sodipodi:cy="739.36218"
+ sodipodi:rx="17"
+ sodipodi:ry="18"
+ d="m 133,739.36218 c 0,9.94113 -7.61116,18 -17,18 -9.38884,0 -17,-8.05887 -17,-18 0,-9.94112 7.61116,-18 17,-18 9.38884,0 17,8.05888 17,18 z"
+ transform="matrix(0.32722728,0,0,0.3090422,57.632964,458.24316)" />
+ <path
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.10785132;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 95.625,692.36218 0,-11.25"
+ id="path3637"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path3639"
+ d="m 90,686.73718 11.25,0"
+ style="color:#000000;fill:#67615b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.09;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ <path
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.80000000000000004;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow2Lend)"
+ d="m 135,135 157.5,0"
+ id="path2829"
+ transform="translate(0,782.35975)"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Minion Pro;-inkscape-font-specification:Minion Pro"
+ x="903.51935"
+ y="-305.87912"
+ id="text4236"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ x="903.51935"
+ y="-305.87912"
+ id="tspan4242">UP</tspan></text>
+ </g>
+</svg>
diff --git a/doc/telemetry.xsl b/doc/telemetry.xsl
new file mode 100644
index 00000000..fa66bff9
--- /dev/null
+++ b/doc/telemetry.xsl
@@ -0,0 +1,806 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd">
+
+<article>
+ <articleinfo>
+ <title>AltOS Telemetry</title>
+ <subtitle>Packet Definitions</subtitle>
+ <author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ </author>
+ <copyright>
+ <year>2011</year>
+ <holder>Keith Packard</holder>
+ </copyright>
+ <legalnotice>
+ <para>
+ This document is released under the terms of the
+ <ulink url="http://creativecommons.org/licenses/by-sa/3.0/">
+ Creative Commons ShareAlike 3.0
+ </ulink>
+ license.
+ </para>
+ </legalnotice>
+ <revhistory>
+ <revision>
+ <revnumber>0.1</revnumber>
+ <date>01 July 2011</date>
+ <revremark>Initial content</revremark>
+ </revision>
+ </revhistory>
+ </articleinfo>
+ <section>
+ <title>Packet Format Design</title>
+ <para>
+ 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.
+ </para>
+ <para>
+ 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.
+ </para>
+ <para>
+ 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.
+ </para>
+ </section>
+ <section>
+ <title>Packet Formats</title>
+ This section first defines the packet header common to all packets
+ and then the per-packet data layout.
+ <section>
+ <title>Packet Header</title>
+ <table frame='all'>
+ <title>Telemetry Packet Header</title>
+ <tgroup cols='4' align='center' colsep='1' rowsep='1'>
+ <colspec align='center' colwidth='*' colname='Offset'/>
+ <colspec align='center' colwidth='3*' colname='Data Type'/>
+ <colspec align='left' colwidth='3*' colname='Name'/>
+ <colspec align='left' colwidth='9*' colname='Description'/>
+ <thead>
+ <row>
+ <entry align='center'>Offset</entry>
+ <entry align='center'>Data Type</entry>
+ <entry align='center'>Name</entry>
+ <entry align='center'>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>0</entry>
+ <entry>uint16_t</entry>
+ <entry>serial</entry>
+ <entry>Device serial Number</entry>
+ </row>
+ <row>
+ <entry>2</entry>
+ <entry>uint16_t</entry>
+ <entry>tick</entry>
+ <entry>Device time in 100ths of a second</entry>
+ </row>
+ <row>
+ <entry>4</entry>
+ <entry>uint8_t</entry>
+ <entry>type</entry>
+ <entry>Packet type</entry>
+ </row>
+ <row>
+ <entry>5</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>
+ 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.
+ </para>
+ </section>
+ <section>
+ <title>Sensor Data</title>
+ <informaltable frame='none' label='' tocentry='0'>
+ <tgroup cols='2' align='center' colsep='1' rowsep='1'>
+ <colspec align='center' colwidth='*' colname='Offset'/>
+ <colspec align='left' colwidth='3*' colname='Description'/>
+ <thead>
+ <row>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>0x01</entry>
+ <entry>TeleMetrum Sensor Data</entry>
+ </row>
+ <row>
+ <entry>0x02</entry>
+ <entry>TeleMini Sensor Data</entry>
+ </row>
+ <row>
+ <entry>0x03</entry>
+ <entry>TeleNano Sensor Data</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+ TeleMetrum, TeleMini and TeleNano share this same packet
+ format for sensor data. Each uses a distinct packet type so
+ that the receiver knows which data values are valid and which
+ are undefined.
+ </para>
+ <para>
+ 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
+ </para>
+ <table frame='all'>
+ <title>Sensor Packet Contents</title>
+ <tgroup cols='4' align='center' colsep='1' rowsep='1'>
+ <colspec align='center' colwidth='*' colname='Offset'/>
+ <colspec align='center' colwidth='3*' colname='Data Type'/>
+ <colspec align='left' colwidth='3*' colname='Name'/>
+ <colspec align='left' colwidth='9*' colname='Description'/>
+ <thead>
+ <row>
+ <entry align='center'>Offset</entry>
+ <entry align='center'>Data Type</entry>
+ <entry align='center'>Name</entry>
+ <entry align='center'>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>5</entry><entry>uint8_t</entry><entry>state</entry><entry>Flight state</entry>
+ </row>
+ <row>
+ <entry>6</entry><entry>int16_t</entry><entry>accel</entry><entry>accelerometer (TM only)</entry>
+ </row>
+ <row>
+ <entry>8</entry><entry>int16_t</entry><entry>pres</entry><entry>pressure sensor</entry>
+ </row>
+ <row>
+ <entry>10</entry><entry>int16_t</entry><entry>temp</entry><entry>temperature sensor</entry>
+ </row>
+ <row>
+ <entry>12</entry><entry>int16_t</entry><entry>v_batt</entry><entry>battery voltage</entry>
+ </row>
+ <row>
+ <entry>14</entry><entry>int16_t</entry><entry>sense_d</entry><entry>drogue continuity sense (TM/Tm)</entry>
+ </row>
+ <row>
+ <entry>16</entry><entry>int16_t</entry><entry>sense_m</entry><entry>main continuity sense (TM/Tm)</entry>
+ </row>
+ <row>
+ <entry>18</entry><entry>int16_t</entry><entry>acceleration</entry><entry>m/s² * 16</entry>
+ </row>
+ <row>
+ <entry>20</entry><entry>int16_t</entry><entry>speed</entry><entry>m/s * 16</entry>
+ </row>
+ <row>
+ <entry>22</entry><entry>int16_t</entry><entry>height</entry><entry>m</entry>
+ </row>
+ <row>
+ <entry>24</entry><entry>int16_t</entry><entry>ground_pres</entry><entry>Average barometer reading on ground</entry>
+ </row>
+ <row>
+ <entry>26</entry><entry>int16_t</entry><entry>ground_accel</entry><entry>TM</entry>
+ </row>
+ <row>
+ <entry>28</entry><entry>int16_t</entry><entry>accel_plus_g</entry><entry>TM</entry>
+ </row>
+ <row>
+ <entry>30</entry><entry>int16_t</entry><entry>accel_minus_g</entry><entry>TM</entry>
+ </row>
+ <row>
+ <entry>32</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ <section>
+ <title>Configuration Data</title>
+ <informaltable frame='none' label='' tocentry='0'>
+ <tgroup cols='2' align='center' colsep='1' rowsep='1'>
+ <colspec align='center' colwidth='*' colname='Offset'/>
+ <colspec align='left' colwidth='3*' colname='Description'/>
+ <thead>
+ <row>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>0x04</entry>
+ <entry>Configuration Data</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+ This provides a description of the software installed on the
+ flight computer as well as any user-specified configuration data.
+ </para>
+ <para>
+ Configuration data packets are transmitted once per second
+ during all phases of the flight
+ </para>
+ <table frame='all'>
+ <title>Sensor Packet Contents</title>
+ <tgroup cols='4' align='center' colsep='1' rowsep='1'>
+ <colspec align='center' colwidth='*' colname='Offset'/>
+ <colspec align='center' colwidth='3*' colname='Data Type'/>
+ <colspec align='left' colwidth='3*' colname='Name'/>
+ <colspec align='left' colwidth='9*' colname='Description'/>
+ <thead>
+ <row>
+ <entry align='center'>Offset</entry>
+ <entry align='center'>Data Type</entry>
+ <entry align='center'>Name</entry>
+ <entry align='center'>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>5</entry><entry>uint8_t</entry><entry>type</entry><entry>Device type</entry>
+ </row>
+ <row>
+ <entry>6</entry><entry>uint16_t</entry><entry>flight</entry><entry>Flight number</entry>
+ </row>
+ <row>
+ <entry>8</entry><entry>uint8_t</entry><entry>config_major</entry><entry>Config major version</entry>
+ </row>
+ <row>
+ <entry>9</entry><entry>uint8_t</entry><entry>config_minor</entry><entry>Config minor version</entry>
+ </row>
+ <row>
+ <entry>10</entry><entry>uint16_t</entry><entry>apogee_delay</entry>
+ <entry>Apogee deploy delay in seconds</entry>
+ </row>
+ <row>
+ <entry>12</entry><entry>uint16_t</entry><entry>main_deploy</entry><entry>Main deploy alt in meters</entry>
+ </row>
+ <row>
+ <entry>14</entry><entry>uint16_t</entry><entry>flight_log_max</entry>
+ <entry>Maximum flight log size (kB)</entry>
+ </row>
+ <row>
+ <entry>16</entry><entry>char</entry><entry>callsign[8]</entry><entry>Radio operator identifier</entry>
+ </row>
+ <row>
+ <entry>24</entry><entry>char</entry><entry>version[8]</entry><entry>Software version identifier</entry>
+ </row>
+ <row>
+ <entry>32</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ <section>
+ <title>GPS Location</title>
+ <informaltable frame='none' label='' tocentry='0'>
+ <tgroup cols='2' align='center' colsep='1' rowsep='1'>
+ <colspec align='center' colwidth='*' colname='Offset'/>
+ <colspec align='left' colwidth='3*' colname='Description'/>
+ <thead>
+ <row>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>0x05</entry>
+ <entry>GPS Location</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+ This packet provides all of the information available from the
+ Venus SkyTraq GPS receiver—position, time, speed and precision
+ estimates.
+ </para>
+ <para>
+ GPS Location packets are transmitted once per second during
+ all phases of the flight
+ </para>
+ <table frame='all'>
+ <title>GPS Location Packet Contents</title>
+ <tgroup cols='4' align='center' colsep='1' rowsep='1'>
+ <colspec align='center' colwidth='*' colname='Offset'/>
+ <colspec align='center' colwidth='3*' colname='Data Type'/>
+ <colspec align='left' colwidth='3*' colname='Name'/>
+ <colspec align='left' colwidth='9*' colname='Description'/>
+ <thead>
+ <row>
+ <entry align='center'>Offset</entry>
+ <entry align='center'>Data Type</entry>
+ <entry align='center'>Name</entry>
+ <entry align='center'>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>5</entry><entry>uint8_t</entry><entry>flags</entry>
+ <entry>See GPS Flags table below</entry>
+ </row>
+ <row>
+ <entry>6</entry><entry>int16_t</entry><entry>altitude</entry><entry>m</entry>
+ </row>
+ <row>
+ <entry>8</entry><entry>int32_t</entry><entry>latitude</entry><entry>degrees * 10<superscript>7</superscript></entry>
+ </row>
+ <row>
+ <entry>12</entry><entry>int32_t</entry><entry>longitude</entry><entry>degrees * 10<superscript>7</superscript></entry>
+ </row>
+ <row>
+ <entry>16</entry><entry>uint8_t</entry><entry>year</entry>
+ </row>
+ <row>
+ <entry>17</entry><entry>uint8_t</entry><entry>month</entry>
+ </row>
+ <row>
+ <entry>18</entry><entry>uint8_t</entry><entry>day</entry>
+ </row>
+ <row>
+ <entry>19</entry><entry>uint8_t</entry><entry>hour</entry>
+ </row>
+ <row>
+ <entry>20</entry><entry>uint8_t</entry><entry>minute</entry>
+ </row>
+ <row>
+ <entry>21</entry><entry>uint8_t</entry><entry>second</entry>
+ </row>
+ <row>
+ <entry>22</entry><entry>uint8_t</entry><entry>pdop</entry><entry>* 5</entry>
+ </row>
+ <row>
+ <entry>23</entry><entry>uint8_t</entry><entry>hdop</entry><entry>* 5</entry>
+ </row>
+ <row>
+ <entry>24</entry><entry>uint8_t</entry><entry>vdop</entry><entry>* 5</entry>
+ </row>
+ <row>
+ <entry>25</entry><entry>uint8_t</entry><entry>mode</entry>
+ <entry>See GPS Mode table below</entry>
+ </row>
+ <row>
+ <entry>26</entry><entry>uint16_t</entry><entry>ground_speed</entry><entry>cm/s</entry>
+ </row>
+ <row>
+ <entry>28</entry><entry>int16_t</entry><entry>climb_rate</entry><entry>cm/s</entry>
+ </row>
+ <row>
+ <entry>30</entry><entry>uint8_t</entry><entry>course</entry><entry>/ 2</entry>
+ </row>
+ <row>
+ <entry>31</entry><entry>uint8_t</entry><entry>unused[1]</entry>
+ </row>
+ <row>
+ <entry>32</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>
+ 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.
+ </para>
+ <table frame='all'>
+ <title>GPS Flags</title>
+ <tgroup cols='3' colsep='1' rowsep='1'>
+ <colspec align='center' colwidth='*' colname='bits'/>
+ <colspec align='left' colwidth='2*' colname='name'/>
+ <colspec align='left' colwidth='7*' colname='description'/>
+ <thead>
+ <row>
+ <entry align='center'>Bits</entry>
+ <entry align='center'>Name</entry>
+ <entry align='center'>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>0-3</entry>
+ <entry>nsats</entry>
+ <entry>Number of satellites in solution</entry>
+ </row>
+ <row>
+ <entry>4</entry>
+ <entry>valid</entry>
+ <entry>GPS solution is valid</entry>
+ </row>
+ <row>
+ <entry>5</entry>
+ <entry>running</entry>
+ <entry>GPS receiver is operational</entry>
+ </row>
+ <row>
+ <entry>6</entry>
+ <entry>date_valid</entry>
+ <entry>Reported date is valid</entry>
+ </row>
+ <row>
+ <entry>7</entry>
+ <entry>course_valid</entry>
+ <entry>ground speed, course and climb rates are valid</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>
+ 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.
+ </para>
+ <table frame='all'>
+ <title>GPS Mode</title>
+ <tgroup cols='3' colsep='1' rowsep='1'>
+ <colspec align='center' colwidth='*' colname='value'/>
+ <colspec align='center' colwidth='3*' colname='name'/>
+ <colspec align='left' colwidth='7*' colname='description'/>
+ <thead>
+ <row>
+ <entry align='center'>Mode</entry>
+ <entry align='center'>Name</entry>
+ <entry align='center'>Decsription</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>N</entry>
+ <entry>Not Valid</entry>
+ <entry>All data are invalid</entry>
+ </row>
+ <row>
+ <entry>A</entry>
+ <entry>Autonomous mode</entry>
+ <entry>Data are derived from satellite data</entry>
+ </row>
+ <row>
+ <entry>D</entry>
+ <entry>Differential Mode</entry>
+ <entry>
+ Data are augmented with differential data from a
+ known ground station. The SkyTraq unit in TeleMetrum
+ does not support this mode
+ </entry>
+ </row>
+ <row>
+ <entry>E</entry>
+ <entry>Estimated</entry>
+ <entry>
+ Data are estimated using dead reckoning from the
+ last known data
+ </entry>
+ </row>
+ <row>
+ <entry>M</entry>
+ <entry>Manual</entry>
+ <entry>Data were entered manually</entry>
+ </row>
+ <row>
+ <entry>S</entry>
+ <entry>Simulated</entry>
+ <entry>GPS receiver testing mode</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ <section>
+ <title>GPS Satellite Data</title>
+ <informaltable frame='none' label='' tocentry='0'>
+ <tgroup cols='2' align='center' colsep='1' rowsep='1'>
+ <colspec align='center' colwidth='*' colname='Offset'/>
+ <colspec align='left' colwidth='3*' colname='Description'/>
+ <thead>
+ <row>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>0x06</entry>
+ <entry>GPS Satellite Data</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+ 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.
+ </para>
+ <para>
+ GPS Satellite data are transmitted once per second during all
+ phases of the flight.
+ </para>
+ <table frame='all'>
+ <title>GPS Satellite Data Contents</title>
+ <tgroup cols='4' align='center' colsep='1' rowsep='1'>
+ <colspec align='right' colwidth='*' colname='Offset'/>
+ <colspec align='center' colwidth='3*' colname='Data Type'/>
+ <colspec align='left' colwidth='3*' colname='Name'/>
+ <colspec align='left' colwidth='9*' colname='Description'/>
+ <thead>
+ <row>
+ <entry align='center'>Offset</entry>
+ <entry align='center'>Data Type</entry>
+ <entry align='center'>Name</entry>
+ <entry align='center'>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>5</entry><entry>uint8_t</entry><entry>channels</entry>
+ <entry>Number of reported satellite information</entry>
+ </row>
+ <row>
+ <entry>6</entry><entry>sat_info_t</entry><entry>sats[12]</entry>
+ <entry>See Per-Satellite data table below</entry>
+ </row>
+ <row>
+ <entry>30</entry><entry>uint8_t</entry><entry>unused[2]</entry>
+ </row>
+ <row>
+ <entry>32</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <table frame='all'>
+ <title>GPS Per-Satellite data (sat_info_t)</title>
+ <tgroup cols='4' align='center' colsep='1' rowsep='1'>
+ <colspec align='right' colwidth='*' colname='Offset'/>
+ <colspec align='center' colwidth='3*' colname='Data Type'/>
+ <colspec align='left' colwidth='3*' colname='Name'/>
+ <colspec align='left' colwidth='9*' colname='Description'/>
+ <thead>
+ <row>
+ <entry align='center'>Offset</entry>
+ <entry align='center'>Data Type</entry>
+ <entry align='center'>Name</entry>
+ <entry align='center'>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>0</entry><entry>uint8_t</entry><entry>svid</entry>
+ <entry>Space Vehicle Identifier</entry>
+ </row>
+ <row>
+ <entry>1</entry><entry>uint8_t</entry><entry>c_n_1</entry>
+ <entry>C/N1 signal quality indicator</entry>
+ </row>
+ <row>
+ <entry>2</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ </section>
+ <section>
+ <title>Data Transmission</title>
+ <para>
+ Altus Metrum devices use the Texas Instruments CC1111
+ microcontroller which includes an integrated sub-GHz digital
+ transceiver. This transceiver is used to both transmit and
+ receive the telemetry packets. This section discusses what
+ modulation scheme is used and how this device is configured.
+ </para>
+ <section>
+ <title>Modulation Scheme</title>
+ <para>
+ Texas Instruments provides a tool for computing modulation
+ parameters given a desired modulation format and basic bit
+ rate. For AltOS, the basic bit rate was specified as 38 kBaud,
+ resulting in the following signal parmeters:
+ </para>
+ <table>
+ <tgroup cols='3'>
+ <colspec align="center" colwidth="*" colname="parameter"/>
+ <colspec align="center" text-align="." colwidth="*" colname="value"/>
+ <colspec align="center" colwidth="*" colname="description"/>
+ <thead>
+ <row>
+ <entry align='center'>Parameter</entry>
+ <entry align='center'>Value</entry>
+ <entry align='center'>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Modulation</entry>
+ <entry>GFSK</entry>
+ <entry>Gaussian Frequency Shift Keying</entry>
+ </row>
+ <row>
+ <entry>Deviation</entry>
+ <entry>20.507812 kHz</entry>
+ <entry>Frequency modulation</entry>
+ </row>
+ <row>
+ <entry>Data rate</entry>
+ <entry>38.360596 kBaud</entry>
+ <entry>Raw bit rate</entry>
+ </row>
+ <row>
+ <entry>RX Filter Bandwidth</entry>
+ <entry>93.75 kHz</entry>
+ <entry>Receiver Band pass filter bandwidth</entry>
+ </row>
+ <row>
+ <entry>IF Frequency</entry>
+ <entry>140.62 kHz</entry>
+ <entry>Receiver intermediate frequency</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ <section>
+ <para>
+ The cc1111 provides forward error correction in hardware,
+ which AltOS uses to improve reception of weak signals. The
+ overall effect of this is to halve the available bandwidth for
+ data from 38 kBaud to 19 kBaud.
+ </para>
+ <title>Error Correction</title>
+ <table>
+ <tgroup cols='3'>
+ <colspec align="center" colwidth="*" colname="parameter"/>
+ <colspec align="center" colwidth="*" colname="value"/>
+ <colspec align="center" colwidth="*" colname="description"/>
+ <thead>
+ <row>
+ <entry align='center'>Parameter</entry>
+ <entry align='center'>Value</entry>
+ <entry align='center'>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Error Correction</entry>
+ <entry>Convolutional coding FEC</entry>
+ <entry>1/2 code, constraint length m=4</entry>
+ </row>
+ <row>
+ <entry>Interleaving</entry>
+ <entry>4 x 4</entry>
+ <entry>Reduce effect of noise burst</entry>
+ </row>
+ <row>
+ <entry>Data Whitening</entry>
+ <entry>XOR with 9-bit PNR</entry>
+ <entry>Rotate right with bit 8 = bit 0 xor bit 5, initial
+ value 111111111</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ </section>
+ <section>
+ <title>TeleDongle packet format</title>
+ <para>
+ 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.
+ </para>
+ <programlisting>TELEM 224f01080b05765e00701f1a1bbeb8d7b60b070605140c000600000000000000003fa988</programlisting>
+ <para>
+ 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.
+ </para>
+ <table>
+ <tgroup cols='4'>
+ <colspec align="center" colwidth="2*" colname="offset"/>
+ <colspec align="center" colwidth="*" colname="name"/>
+ <colspec align="center" colwidth="*" colname="value"/>
+ <colspec align="center" colwidth="5*" colname="description"/>
+ <thead>
+ <row>
+ <entry align='center'>Offset</entry>
+ <entry align='center'>Name</entry>
+ <entry align='center'>Example</entry>
+ <entry align='center'>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>0</entry>
+ <entry>length</entry>
+ <entry>22</entry>
+ <entry>Total length of data bytes in the line. Note that
+ this includes the added RSSI and status bytes</entry>
+ </row>
+ <row>
+ <entry>1 ·· length-3</entry>
+ <entry>packet</entry>
+ <entry>4f ·· 00</entry>
+ <entry>Bytes of actual packet data</entry>
+ </row>
+ <row>
+ <entry>length-2</entry>
+ <entry>rssi</entry>
+ <entry>3f</entry>
+ <entry>Received signal strength. dBm = rssi / 2 - 74</entry>
+ </row>
+ <row>
+ <entry>length-1</entry>
+ <entry>lqi</entry>
+ <entry>a9</entry>
+ <entry>Link Quality Indicator and CRC status. Bit 7
+ is set when the CRC is correct</entry>
+ </row>
+ <row>
+ <entry>length</entry>
+ <entry>checksum</entry>
+ <entry>88</entry>
+ <entry>(0x5a + sum(bytes 1 ·· length-1)) % 256</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ <section>
+ <title>History and Motivation</title>
+ <para>
+ 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.
+ </para>
+ <para>
+ 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.
+ </para>
+ <para>
+ 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.
+ </para>
+ </section>
+</article>